你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32的内存变量的由来

[复制链接]
蓝凌风 发布时间:2015-1-21 10:15
今晚又在opendev.com开源电子论坛里看到有人提问STM32中的内存变量是怎么来的,我们都知道编译后的代码是写成Flash里面去的,而全局变量(其实也就是内存的一片区域)尤其是已经有初始化值的,是怎样到内存里面去的。估计如果不是研究过ARM9以上的高级ARM的人,都不会是关注这一点,因为ARM9以上的高级ARM都是在Uboot有代码来实现这一点的,而STM32中,除了那一点点的启动代码,没有更底层的代码来先说我们是怎么实现的,自然也没人去在意过。这里我同样反汇编了STM32的AXF文件来研究下,下面直接引用我在论坛里的回答,希望对大家更好理解STM32有所帮助
---------------------------------

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

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


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

HEX的数据跟反汇编对应地址上的数据是完全相同,而没初始化的全局变量,没有数据自然在HEX文件也找不到,也就是说全局变量的数据也是保存在代码的最后面,然后再搬到内存上去的。这一切都由编译自动完成的,当然我们是看不到代码用户代码的实现。


收藏 评论6 发布时间:2015-1-21 10:15

举报

6个回答
Eagleson 回答时间:2015-1-21 10:17:39
不错~~~
wxh0000mm 回答时间:2015-1-21 10:21:38
谢谢分享
dsjsjf 回答时间:2015-1-21 12:20:55
好,谢谢分享
霹雳之火 回答时间:2015-1-21 20:29:34
纯技术贴,有深度,谢谢分享
zfz0122 回答时间:2015-1-21 21:14:00
好熟悉的ID。在哪个论坛见过你
zhangdaijin 回答时间:2015-1-21 21:48:10
支持楼主

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版