单片机软件都是以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会这样?):