Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1736635
  • 博文数量: 206
  • 博客积分: 1450
  • 博客等级: 上尉
  • 技术积分: 2285
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-11 11:38
个人简介

学习永无止境!!

文章分类

全部博文(206)

文章存档

2022年(5)

2019年(3)

2018年(8)

2017年(32)

2016年(7)

2015年(13)

2014年(44)

2013年(24)

2011年(6)

2010年(17)

2009年(46)

2008年(1)

分类: C/C++

2022-08-03 11:10:42

在链接脚本中有下列定义变量:

点击(此处)折叠或打开

  1. _sidata = LOADADDR(.data);
  2. /* Initialized data sections goes into RAM, load LMA copy after code */
  3. .data :
  4. {
  5. . = ALIGN(4);
  6. _sdata = .; /* create a global symbol at data start */
  7. *(.data) /* .data sections */
  8. *(.data*) /* .data* sections */
  9. *(.RamFunc) /* .RamFunc sections */
  10. *(.RamFunc*) /* .RamFunc* sections */
  11. . = ALIGN(4);
  12. _edata = .; /* define a global symbol at data end */
  13. } >RAM_D1 AT> FLASH
_sdata,_edata是初始变量的起始和结束地址。
在汇编code中可以直接引用,如:
LDR r0,=_sdata
LDR r1,  =_edata
在C code中不能直接使用,需如下:

点击(此处)折叠或打开

  1. void initial_data()
  2. {
  3.   extern uint32_t _sdata,_edata;
  4.   uint32_t start_data_addr = &_sdata;
  5.   uint32_t end_data_addr = &_edata;
  6.   ......
  7. }
为什么在C code中不能直接使用变量呢?
原因:
一. 在C code中直接定义变量,如:

点击(此处)折叠或打开

  1. int data = 100;
会导致两件事:
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;使用取址符号&去获取到它在符号表中的值。注意:这个值只是链接脚本中定义的值,并不表示某个变量的地址。
阅读(1037) | 评论(0) | 转发(0) |
0

上一篇:HEX文件数据类型解析

下一篇:没有了

给主人留下些什么吧!~~