OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6249|回复: 7

STM32数据段与bss段问题

[复制链接]

14

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-7-23
在线时间
1 小时
发表于 2014-12-29 17:19:17 | 显示全部楼层 |阅读模式
5金钱
MDK编译环境,目标stm32f103,一般程序编译出来text(ro)段,data段,bss段等都在hex或者bin文件之中,烧写到目标的flash中,可是data段与bss(zi)段是怎么加载到SRAM(内存)中的,我没发现相关数据段搬用的代码啊,数据段是怎么搬运到内存之中????

最佳答案

查看完整内容[请看2#楼]

 回复【4楼】 geyang1111 : ---------------------------------        上图直接看反汇编的后的代码,地址是0x08000000也就是代码区的最后面0x8013894的地址就是对应0x20000000,大小是0x704,0x8011AE2对应的_decompress1函数,这里就是把0x8013894个地址开始,总共0x704大小的数据搬到内存里去,这区域的数据正好就是已经有初始化的全局变量的数据。 再看偏移0x704之后,对应内存地址变成0x2000 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

499

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1920
金钱
1920
注册时间
2013-11-18
在线时间
268 小时
发表于 2014-12-29 17:19:18 | 显示全部楼层
 回复【4楼】 geyang1111 :
---------------------------------


       上图直接看反汇编的后的代码,地址是0x08000000也就是代码区的最后面0x8013894的地址就是对应0x20000000,大小是0x704,0x8011AE2对应的_decompress1函数,这里就是把0x8013894个地址开始,总共0x704大小的数据搬到内存里去,这区域的数据正好就是已经有初始化的全局变量的数据。


再看偏移0x704之后,对应内存地址变成0x20000704,之后的偏移量是0xc074,调用的0x80111b90(函数_scatterload_zeroinit)



再看0x20000704的地址区域,其实就是没有初始化的全局变量,这里没有数据搬运,只是压栈在这里,并预留了变量的空间在这里。
为了验证这一点,我们再打开对应的Hex文件,来看看


HEX的数据跟反汇编对应地址上的数据是完全相同,而没初始化的全局变量,没有数据自然在HEX文件也找不到,也就是说全局变量的数据也是保存在代码的最后面,然后再搬到内存上去的。这一切都由编译自动完成的,当然我们是看不到代码用户代码的实现。希望对楼主有所帮助,
已经放下多年的FPGA,要重新再拾起来,却是如此的陌生
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11559
金钱
11559
注册时间
2014-4-1
在线时间
1318 小时
发表于 2014-12-29 17:56:30 | 显示全部楼层
data、bss是全局变量或者局部变量占用的空间,不需要搬移。

举例:
有变量a,编译之后,编译器已经给它分配了一个存储单元,这个单元是有地址的,比如0x12345678.
后面使用的时候,直接操作该地址。
所以不存在搬移的过程。

你在编译后产生的map文件里(可能是这个后缀),可以查到所有全部变量的地址。

回复

使用道具 举报

14

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-7-23
在线时间
1 小时
 楼主| 发表于 2014-12-29 18:07:44 | 显示全部楼层
回复【2楼】xuande:
---------------------------------
不知道您玩过arm9 2440没有,它需要copy程序code与data、bss到SDRAM中运行,data段要拷贝到他的运行地址,这里存在一个copy过程。。。
若按照您说的
比如:
unsigned char a = 3 __attribute__((at(内存某一个地址)));;
void main()
{
   while(1);
}
这个全局变量a编译器的确是分配了指定的内存存储单元,但没有关于该内存单元的赋值操作啊(a = 3)
回复

使用道具 举报

14

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-7-23
在线时间
1 小时
 楼主| 发表于 2014-12-29 18:10:58 | 显示全部楼层
回复【2楼】xuande:
---------------------------------
回复【2楼】xuande:
---------------------------------
因为arm9存在copy数据段的过程,所以操作该内存地址的时候,该地址的确是存在数据的,因为copy过来了
难道机制不同,过程隐藏?
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11559
金钱
11559
注册时间
2014-4-1
在线时间
1318 小时
发表于 2014-12-29 20:23:21 | 显示全部楼层
回复【3楼】geyang1111:
---------------------------------
这是你实际测试的结果吗?
也许被优化掉了。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11559
金钱
11559
注册时间
2014-4-1
在线时间
1318 小时
发表于 2014-12-29 20:27:03 | 显示全部楼层
回复【4楼】geyang1111:
---------------------------------

arm9没有深入过,但我做过51、96、MSP430、PIC、AVR、STM32、DSP、FPGA等各种器件,也算经验丰富吧。
回复

使用道具 举报

14

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-7-23
在线时间
1 小时
 楼主| 发表于 2014-12-30 09:52:45 | 显示全部楼层
回复【7楼】mzwhhwj:
---------------------------------
牛人,给你点个赞!!!!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 11:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表