嵌入式小知识:烧录文件是被如何存储到MCU中的?


      单片机软件都是以hex或者bin文件的形式烧录到我们的MCU中进行存储的,那你知道这些烧录的文件在MCU中是如何分布的吗?

      举一个简单的例子,编译一个STM32例程的MDK软件工程,得到输出信息如下:

      接下来详细看下Program Size的组成部分解析(我们烧录文件的组成部分):

Code:程序代码段,主要用于储存程序代码。

Ro-data:只读类型数据段,主要用于存放程序中定义的常量。

RW-data:读写类型数据段,主要用于存放被初始化为非0值的全局变量。

ZI-data:读写类型数据段,主要用于存放被初始化为0值的全局变量。

看到这里你可能会有点好奇都是读写数据类型,为什么要分为RW和ZI两个部分呢?(思考一下,文章后面会给出答案)。

      通常我们所说的MCU的存储部分主要是片内Flash和片内RAM,这里我可以简单地把片内忽略掉,那么我们烧录文件中的四个段内容,哪些需要烧录到Flash?哪些又要烧录到RAM中呢?你知道对工程Map一下,在map文件的最后会给出答案。(map的含义就是内存映射,map一下就是查看所有的代码及数据的内存映射地址),如下:

RO size:包含了Code 和RO data ,是需要存放在MCU的flash空间中。

RW size: 包含了RW 和 ZI data,是需要存放在MCU的RAM空间中。

那么是不是flash中的内容就是RO size ,RAM中的内容就是 RW size呢?

答对了一半,RAM中内容就是RW size。

而flash的中的真实内容应该是 ROM Size。是不是很神奇?(比RO SIZE多了个 RW,RW不应该是放在RAM中?WHY???)

RW的神奇之处:他虽然是读写类型的数据,但是他是非0的数据,也就是上电初始化过程中,要对其进行非0初始化,那么这些特定的非0值从哪里来呢?只能先把用于初始化的数据放到flash中了,从flash中读取值,然后写入RAM中相应的RW数据内部。

所以flash中还需要存储RW的初始数据值。


当你完成hex或者bin文件的烧录以后,MCU内部存储数据分布如下:

当MCU上电开始运行以后,存储分布会发生一些微妙的变化(看破不说破,尝试自己分析下why会这样?):

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 6
收藏 6
关注 140
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧