Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用远函数指针_C_Pointers_Embedded_Function Pointers - Fatal编程技术网

C 使用远函数指针

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

我意识到far是特定于编译器的,但我的期望是,far说明符的位置对于真正理解指针的人来说应该是有意义的

因此,我有两个应用程序共享处理器的整个内存空间

应用程序A需要调用应用程序B中存在的函数foo

我知道函数foo的内存位置

所以这应该是可行的,在应用程序A中:

typedef int (* __far MYFP)(int input);

void somefunc(void)
{
   int returnvalue;
   MYFP foo;

   foo = (MYFP) 0xFFFFFA;

   returnvalue = foo(39);
}
  • 在typedef中,_是否在正确的位置
  • 我需要在(MYFP)演员阵容中添加uuu far吗
  • 一些信息表明,对foo的调用不需要取消引用,您的体验如何
  • 这还有什么不正确的地方,或者我可以试着做到这一点吗

  • 有更好的方法吗

编辑:

这是在使用Code Warrior的嵌入式设备(飞思卡尔S12XEQ设备)上实现的。它是一个16位设备,具有24位内存空间,因此是的,它是分段/存储的


-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)。看见