一. STM32程序构成
1.1. STM32的存储空间
1.1.1. RAM
1.1.1.1 单片机的RAM是SRAM.
1.1.1.2. SRAM特点
a.优点,速度快,不必配合内存刷新电路,可提高整体的工作效率,软件上不需要初始化SRAM。
b. 缺点,集成度低,功耗较大,相同的容量体积较大,而且价格较高,少量用于关键性系统以提高效率。
c. SRAM使用的系统:
(1)CPU与主存之间的高速缓存。
(2)CPU内部的L1/L2或外部的L2高速缓存。
(3)CPU外部扩充用的COAST高速缓存。
(4)单片机内存单元
1.1.2. FLASH
1.1.2.1. 单片机的flash是NorFlash
1.1.2.1. NorFlash 特点
a. NOR可以直接使用,并可在上面直接运行代码。不需要初始化
b. NOR flash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节
1.1.3. NOR FLASH 和 NAND FLASH对比
a.NOR与NAND特性的差别,主要是由于其内部“地址/数据线”是否分开导致的。由于 NOR的地址线和数据线分开,它可以按“字节”读写数据,符合 CPU 的指令译码执行要求,所以假如 NOR上存储了代码指令, CPU 给 NOR一个地址, NOR 就能向CPU 返回一个数据让 CPU 执行,中间不需要额外的处理操作。
b.由于 NAND 的数据和地址线共用,只能按“块”来读写数据,假如 NAND 上存储了代码指令, CPU 给 NAND 地址后,它无法直接返回该地址的数据,所以不符合指令译码要求。 即不支持立即执行的特性(eXecute In Place),若代码存储在NAND上,可以先把它加载到RAM存储器上,再由CPU执行。
1.2. 空间排布
1.2.1. keil编译信息分析
1.2.1.1. code: 表示程序代码部分
1.2.1.2. RO-data: 表示程序中定义的常量(如:const ,字符串)
1.2.1.3. RW-data: 表示已初始化的全局变量
1.2.1.4. ZI-data: 表示未初始化或初始化为0的全局变量
1.2.1.5. 大小计算
a. RO Size = Code + RO Data (程序占用FLASH空间)
b. RW Size = RW Data + ZI Data (运行时程序占用RAM空间)
c. ROM Size = Code + RO Data + RW Data (烧录时程序占用FLASH 空间的大小,bin文件)
PS: 为什么bin文件不包含ZI Data
答:因为ZI 数据都是0,只要程序运行前将ZI数据所在的区域(RAM区域)一律清零即可,如此节省了flash储存空间
二. 程序是否需要加载到RAM中?
2.1. 单片机是否需要?
2.1.1. 把程序从flash加载到RAM需要bootloader,(其实程序也可以直接下载到RAM中运行,只不过重启程序就没有了。在flash刷新次数受限(一般flash可以刷新1000次左右)直接烧录程序到RAM调试程序。
2.1.2. 单片机RAM较小程序太多无法加载全部程序
2.1.3. 单片机执行分三个步骤:取指令,分析指令,执行指令。取指令任务是根据PC值从地址总线上读出指令。虽然从RAM取指令速度远大于ROM,但单片机自身运行速度不高,并不影响速度
2.1.4. 总结:虽然单片机可以把程序加载到RAM, 但真的真的没必要这么干。
2.2. 运行Linux系统为什么需要?
2.2.1. linux程序比较大,很少用norflash储存程序,而是用nandFlash或sd储存,故这类储存 不符合CPU 的指令译码执行要求。
2.2.2. 运行linux系统的cpu。其运行频率非常高,远大于ROM读写速度,从rom取指会严重影响速度。故系统会把程序拷贝到RAM执行。
2.2.3. 总结:运行Linux系统时程序必须加载到RAM