1.单片机存储分为Flash容量和RAM总容量
RAM 相当于内存,Flash 相当于硬盘。编译器会将一个程序分类为好几个部分,分别存储在 MCU 不同的存储区。
以STM32F407VGT6为例:
CPU内核:ARM Cortex-M4
CPU最大主频:168MHz
工作电压范围:1.8V~3.6V
程序存储容量:1MB
RAM总容量:192KB
EEPROM/数据 FLASH容量:1MB
2.程序编译后会显示各部分编译后的大小
Program Size 包含以下几个部分:
1.Code:代码段,存放程序的代码部分;
2.RO-data:只读数据段,存放程序中定义的常量;
3.RW-data:读写数据段,存放初始化为非 0 值的全局变量;
4.ZI-data:0 数据段,存放未初始化的全局变量及初始化为 0 的变量;
编译完工程会生成一个. map 的文件,该文件说明了各个函数占用的尺寸和地址,在文件的最后几行也说明了上面几个字段的关系:
map 的文件各部分说明:
1.RO Size 包含了 Code 及 RO-data,表示程序占用 Flash 空间的大小;
2.RW Size 包含了 RW-data 及 ZI-data,表示运行时占用的 RAM 的大小;
3.ROM Size 包含了 Code、RO-data 以及 RW-data,表示烧写程序所占用的 Flash 空间的大小;
3.程序下载和执行说明
程序运行前,一般是将bin 或者 hex 文件烧录到MCU的Flash 中,该被烧录文件称为可执行映像文件。如下图左边部分所示,是可执行映像文件烧录到MCU后的内存分布,它包含 RO 段和 RW 段两个部分:其中 RO 段中保存了 Code、RO-data 的数据,RW 段保存了 RW-data 的数据,由于 ZI-data 都是 0,所以未包含在映像文件中。
MCU上电启动之后默认从 Flash 启动,启动之后会将 RW 段中的 RW-data(初始化的全局变量)搬运到 RAM 中,但不会搬运 RO 段,即 CPU 的执行代码从 Flash 中读取,另外根据编译器给出的 ZI 地址和大小分配出 ZI 段,并将这块 RAM 区域清零。