C 使用远函数指针
我意识到far是特定于编译器的,但我的期望是,far说明符的位置对于真正理解指针的人来说应该是有意义的 因此,我有两个应用程序共享处理器的整个内存空间 应用程序A需要调用应用程序B中存在的函数foo 我知道函数foo的内存位置 所以这应该是可行的,在应用程序A中:C 使用远函数指针,c,pointers,embedded,function-pointers,C,Pointers,Embedded,Function Pointers,我意识到far是特定于编译器的,但我的期望是,far说明符的位置对于真正理解指针的人来说应该是有意义的 因此,我有两个应用程序共享处理器的整个内存空间 应用程序A需要调用应用程序B中存在的函数foo 我知道函数foo的内存位置 所以这应该是可行的,在应用程序A中: typedef int (* __far MYFP)(int input); void somefunc(void) { int returnvalue; MYFP foo; foo = (MYFP) 0xFFF
typedef int (* __far MYFP)(int input);
void somefunc(void)
{
int returnvalue;
MYFP foo;
foo = (MYFP) 0xFFFFFA;
returnvalue = foo(39);
}
- 在typedef中,_是否在正确的位置
- 我需要在(MYFP)演员阵容中添加uuu far吗
- 一些信息表明,对foo的调用不需要取消引用,您的体验如何
- 这还有什么不正确的地方,或者我可以试着做到这一点吗
- 有更好的方法吗
-Adam在创建使用分段内存的二进制文件时,使用了
\uu far
关键字,至少在MS世界是这样。您需要了解8086内存系统才能理解这一点。8086将内存划分为多个段,每个段的长度为64K,因此一个段中的每个地址需要16位。地址有两种形式:近地址和远地址。近地址为16位,是当前段的偏移量,CS、DS、ES、SS中的一个取决于指令,远地址为32位,由段和偏移量组成。在8086中,绝对地址为16*段+偏移量,可寻址范围为1Mb
如果您没有使用分段内存系统,并且看起来没有,那么所有地址的位数都相同,因此不需要进行近/远区分,这意味着编译器可能会忽略关键字。这是我正在处理的项目中的一段代码。它是范式C++,所以它使用了一些版本的Borland。它使用的CPU是一个8086克隆,因此是分段的20位内存
void softSerial0SR(unsigned16);
void (__far *softHandler)(unsigned16);
我毫无疑问地将softHandler初始化为0
那么
softHandler = softSerial0SR;
在设置代码中
要调用它,只需像调用常规函数一样调用softHandler
请注意,这段代码与我的实际代码略有不同。typedef中的u是否在右边
[编辑,回应Chris的评论--谢谢]
这是一个依赖于编译器的功能,因为它不是ANSI C的一部分。根据编译器手册第8章,您已将其正确放置。在其他编译器中,可能需要颠倒顺序。不过,这应该很容易理解,因为这两个选项中只有一个将使用任何给定的编译器编译
我需要在(MYFP)演员阵容中添加uuu far吗
不,这是类型的一部分
一些信息表明,对foo的调用不需要取消引用,您的体验如何
函数指针可以在C中随意取消引用。以下两行都是有效的,执行完全相同的操作:
foo = (MYFP)0xFFFFFA;
returnvalue = foo(39); // 1
returnvalue = (*foo)(39); // 2
这还有什么不正确的地方,或者我可以试着做到这一点吗
你做得完全正确。这两个程序都是由相同的编译器/选项构建的,因此它们使用相同的OBI?同意代码看起来很好-在这种情况下,我将对生成的代码进行反汇编,并确定结果是否正确。最多只能有10个说明-然后您就可以确定它是否有效。您能提供更多信息吗?你在哪个站台?您使用的编译器是什么?是的,它确实意味着有4096种方法可以寻址同一字节的内存。uu不仅存在于采用分段寻址的x86系列上。M68k、PowerPC和其他一些人也有这个限定符。我认为在嵌入式系统中,它仍然被使用。为了回答最初的问题,我们需要更多的信息(如平台、编译器等),我理解这一点,是的,我的内存是分段的。回答得好,只是他使用的编译器的文档说明函数指针语法应该是typedef int(*uu far MYFP)(int)。看见