【发布时间】:2012-01-13 23:40:58
【问题描述】:
在我的链接描述文件中,我定义了两个符号
define symbol _region_RAM_start__ = 0xC0000000;
define symbol _region_RAM_end__ = 0xC00fffff;
然后我将它们导出,如下所示
export symbol _region_RAM_start__;
export symbol _region_RAM_end__;
从应用程序代码中,我尝试访问这些符号
extern const unsigned int _region_RAM_start__;
extern const unsigned int _region_RAM_end__;
....
int GetRAMSize()
{
int size = 0;
unsigned int address_1 = _region_RAM_start__;
unsigned int address_2 = _region_RAM_end__;
size = address_2 - address_1 + 1U;
return size;
}
现在,我预计返回值为 0x00100000,但是,我得到的只是 0。
因此,当我转向调试器时,我注意到 _region_RAM_start__ 和 _region_RAM_end__ 的值分别为 0xC0000000 和 0xC00fffff,但 address_1 和 address_2 的值分别为 0。
编译器优化设置为“无”。这一直困扰着我一段时间。我在这里是否缺少一些非常明显的东西(除了“我一开始就不应该这样做”)?
解决方案 感谢 n.m.为了答案
unsigned int address_1 = (unsigned int) (&_region_RAM_start__);
否则address_1 和address_2 都包含垃圾值(即分别在地址 0xC0000000 和 0xC00fffff 处可用的值,但从这段代码的角度来看是垃圾)
【问题讨论】:
-
这是一个正确的预期行为。符号是地址的名称。
extern xyz的意思是“Linker先生,我不知道xyz的地址,请帮我解决”。 -
完美!感谢指针@n.m。所以解决方案是使用 address_1 = (unsigned int) (&_region_RAM_start__);
-
我正要问:
define语法记录在哪里,但后来我终于看到了 iar 标签。世界上还有其他链接器! :-)