我有一个关于如何在符号表中放置符号以及如何从C中引用这些符号的问题。
因此,假设我有一个启动程序集文件,其中一些基本的东西在调用main()之前完成。它所做的一件事就是导出几个定义堆栈的符号。
St_Length EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
EXPORT St_Length
EXPORT ra_Stack
ra_Stack SPACE St_Length
然后在我想要引用那些符号的source.c文件中,我有类似的东西:
extern uint32_t St_Length; /* exported from asm.s */
void func( void )
{
uint32_t i;
for(i = 0; i < (uint32_t)(&St_Length); ++i)
\\do something
}
这似乎工作正常,即它实际上将执行该循环0x400次。我的问题是为什么我必须使用&符号来获取我认为应该是符号的值,而不是符号的地址?
注意:这适用于使用Keil提供的工具链的ARM Cortex-M3。
感谢您的帮助。
编辑:以下是生成的地图文件中符号表的相关部分:
Global Symbols
Symbol Name Value Ov Type Size Object(Section)
St_Length 0x00000400 Number 0 startup_stm32f10x_md.o ABSOLUTE
对符号表'type'列的任何解释也都非常有用。
答案 0 :(得分:0)
因为您使用EQU
已将St_Length
定义为地址0x400
的符号。要在某个适当的地址将其定义为变量,您应该尝试以下方式:
St_Length DCD 0x400
(把它放在你的数据区。)