Ada*_*vis 6 c embedded pointers function-pointers
我意识到远远不是编译器特定的,但我的期望是far说明符的位置应该对那些真正理解指针的人有意义.
所以,我有两个共享处理器整个内存空间的应用程序.
App A需要调用应用程序B中存在的函数foo.
我知道函数foo的内存位置.
所以这应该适用于应用程序A:
typedef int (* __far MYFP)(int input);
void somefunc(void)
{
int returnvalue;
MYFP foo;
foo = (MYFP) 0xFFFFFA;
returnvalue = foo(39);
}
Run Code Online (Sandbox Code Playgroud)
还有什么看起来不正确,或者我可以尝试完成这个?
有一个更好的方法吗?
编辑:
这是使用Code Warrior的嵌入式设备(Freescale S12XEQ设备).它是一个具有24位存储空间的16位器件,所以是的,它是分段/存储的.
-亚当
Ski*_*izz 10
的__far关键字,至少在世界MS,被创建用于分段存储器的二进制文件时使用.您需要了解8086内存系统才能理解这一点.8086将内存划分为段,每段长度为64K,因此段中的每个地址需要16位.地址有两种形式:近和远.近地址为16位,是当前段的偏移量,CS,DS,ES,SS之一取决于指令,远为32位,由段和偏移量组成.在8086中,绝对地址为16*segment + offset,可提供1Mb的可寻址范围.
如果您没有使用分段存储器系统,并且看起来不是,那么所有地址都具有相同的位数,因此不需要近/远区别,这意味着编译器可能会忽略该关键字.
__far是否在typedef中的正确位置?
[编辑,回应ChrisN的评论 - 谢谢]
这是一个依赖于编译器的功能,因为它不是ANSI C的一部分.根据编译器手册<http://www.freescale.com/files/soft_dev_tools/doc/ref_manual/CW_Compiler_HC12_RM.pdf >,第8章,您已将其正确放置.在其他编译器中,您可能需要撤消订单.但是,这应该很容易理解,因为两个选项中的一个将使用任何给定的编译器进行编译.
我是否需要将__far添加到(MYFP)演员阵容?
不,这是该类型的一部分.
有些信息表明,对foo的调用不需要取消引用,您的体验是什么?
函数指针可以选择在C中取消引用.以下几行都是有效的完全相同的事情:
foo = (MYFP)0xFFFFFA;
returnvalue = foo(39); // 1
returnvalue = (*foo)(39); // 2
Run Code Online (Sandbox Code Playgroud)
还有什么看起来不正确,或者我可以尝试完成这个?
你完全正确地完成了它.