在链接脚本中有下列定义变量:
-
_sidata = LOADADDR(.data);
-
-
/* Initialized data sections goes into RAM, load LMA copy after code */
-
.data :
-
{
-
. = ALIGN(4);
-
_sdata = .; /* create a global symbol at data start */
-
*(.data) /* .data sections */
-
*(.data*) /* .data* sections */
-
*(.RamFunc) /* .RamFunc sections */
-
*(.RamFunc*) /* .RamFunc* sections */
-
-
. = ALIGN(4);
-
_edata = .; /* define a global symbol at data end */
-
} >RAM_D1 AT> FLASH
_sdata,_edata是初始变量的起始和结束地址。
在汇编code中可以直接引用,如:
LDR r0,=_sdata
LDR r1, =_edata
在C code中不能直接使用,需如下:
-
void initial_data()
-
{
-
extern uint32_t _sdata,_edata;
-
uint32_t start_data_addr = &_sdata;
-
uint32_t end_data_addr = &_edata;
-
......
-
}
为什么在C code中不能直接使用变量呢?
原因:
一. 在C code中直接定义变量,如:
点击(此处)折叠或打开
会导致两件事:
1. 在code中,留出4字节空间,保存数值100
2. 在C语言的符号表中,有一个名为data的项,它里边存有那4个字节空间的地址。
我们执行 data =100时,是先去符号表找到data对应的地址,然后把数值100填写到地址对应的内存里;不过在执行 int *p = &data是,会直接把符号表中data的地址赋值给p。
二. 在链接脚本中
_sdata = 100
_sdata并不是一个变量,它只是一个符号表值,并且不会在内存中留出保存它的空间的。
在C语言中,符号表中会有一个名为_sdata的项,这个项中的值(地址值)是100;
注意:这个100并没有实际存在内存中。
三.所以在C语言中,要去使用链接脚本中定义的值时,就应该 val = &_sdata;使用取址符号&去获取到它在符号表中的值。注意:这个值只是链接脚本中定义的值,并不表示某个变量的地址。
阅读(1056) | 评论(0) | 转发(0) |