-
08-07-2019 - |
题
我意识到,迄今为止编译器特有的,但是我期望的是,安置的远远说明应该是有意义的对那些真正地理解指针。
因此,我有两个应用程序,分享处理器的整个存储空间。
应用程序需要调function foo存在的应用程序,B。
我知道你的存储位置的功能foo。
因此,这应当工作,在应用程序:
typedef int (* __far MYFP)(int input);
void somefunc(void)
{
int returnvalue;
MYFP foo;
foo = (MYFP) 0xFFFFFA;
returnvalue = foo(39);
}
- 是__远在正确的位置在typedef?
- 我需要添加__远的(MYFP)铸的?
- 一些信息表明,呼吁foo不需要引用,什么是您的经验?
还有什么别的关于这个看起来不正确的,或许我尝试来完成这个吗?
有没有更好的方式做到这一点?
编辑:
这是一个嵌入式装置(飞思卡尔S12XEQ设备)的使用代码的战士。这是一个16位设备与24位的存储空间,所以,是的,这是分段/库存的.
-亚当
解决方案
是__远在正确的位置在typedef?
[编辑,在响应ChrisN的评论--的感谢]
这是一个编译器的依赖功能,因为它不是部分的ANSI C。根据该手册的编译器 <http://www.freescale.com/files/soft_dev_tools/doc/ref_manual/CW_Compiler_HC12_RM.pdf>,第8章,你拥有它正确放置。在其他编译器,可能需要反的顺序。这应该是很容易弄清楚,虽然由于完全两个选项之一将汇编与任何特定的编译器。
我需要添加__远的(MYFP)铸的?
不,这是部分的类型。
一些信息表明,呼吁foo不需要引用,什么是您的经验?
功能的指针可以选择地引用。下线是两个有效的做同样的事情:
foo = (MYFP)0xFFFFFA;
returnvalue = foo(39); // 1
returnvalue = (*foo)(39); // 2
还有什么别的关于这个看起来不正确的,或许我尝试来完成这个吗?
你已经做到了完全正确。
其他提示
的 __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像一个普通的功能。
注意,这个代码是稍微调整了你从实际代码我有。
这两个项目都由相同的编译/选项,因此它们使用相同的腰带?
同意代码看起来不错-在这种情况下,我会得到一个拆卸产生的代码和图出,如果它出来的权利。应该只有10说明,在大多数-然后你会知道的如果它的工作。