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

查看: 1421|回复: 4

[STM32L4+] bin文件没有地址信息,上电后,是如何将变量copy到RAM里的?

[复制链接]

10

主题

45

回帖

18

蝴蝶豆

高级会员

最后登录
2020-8-17
发表于 2018-11-6 11:48:06 | 显示全部楼层 |阅读模式
我在想既然是将程序下载到芯片内部的Flash中的,并且程序是bin格式二级制的,没有地址信息的,那复位后,是怎么样知道将这些变量放到RAM
具体位置的?
回复

使用道具 举报

16

主题

1710

回帖

241

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2018-11-6 13:44:51 | 显示全部楼层
BIN有地址信息的,按照地址顺序排列的,可以一眼看出哪个地址是什么数据
回复 支持 反对

使用道具 举报

48

主题

3559

回帖

429

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2018-11-6 14:55:22 | 显示全部楼层
本帖最后由 toofree 于 2018-11-6 14:57 编辑

二进制数据中,包含了命令字,执行参数,参数包括地址、变量值等信息。
堆是从RAM中划出的一部分区域,用来存放程序运行中的各种变量。
变量是放在堆中的,对于全局变量上电后会有堆的初始化代码,将Flash中存放堆的初始值数据(即变量初值)全部搬移到堆中。
对于局部变量,只有在程序执行到相应子程序后,才从Flash取初始值放到RAM中。
回复 支持 反对

使用道具 举报

10

主题

45

回帖

18

蝴蝶豆

高级会员

最后登录
2020-8-17
 楼主| 发表于 2018-11-6 15:54:03 | 显示全部楼层
toofree 发表于 2018-11-6 14:55
二进制数据中,包含了命令字,执行参数,参数包括地址、变量值等信息。
堆是从RAM中划出的一部分区域,用来 ...

局部变量是放在堆中,全局变量是放在外面的,我是在想,就像全局变量,放在RAM中的位置,是怎么实现的?因为Bin文件中,没有变量的地址信息。
回复 支持 反对

使用道具 举报

10

主题

45

回帖

18

蝴蝶豆

高级会员

最后登录
2020-8-17
 楼主| 发表于 2018-11-6 17:43:54 | 显示全部楼层
这个我想通了,局部变量不占RAM,全局变量占RAM,Bin文件会存全局变量的信息,也就是说FLAH中会存变量的地址。对与已经初始化的变量,会存初始值。IAR在编译代码的时候会将怎样处理这些变量的代码一起编译进去形成一个完整的程序。放到芯片Flash里之后,无论芯片如何reset,因为flash里面存了所有不可丢失的代码和全局变量的初始值,以及全局变量的地址。这就构成了整个代码逻辑。
比方说,你如果在代码中定义了一个很大的数组,如果你没有赋初值,那么对于芯片来说,FALSH空间不变,因为FLASH只有头地址和尾地址,两个地址值。只是RAM会被占用的大些,如果你给了初始值,那么就要为这个初值分配地FLASH空间,这样会撑大flash.
回复 支持 反对

使用道具 举报

关于 意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版