Keil 中的Code,RO-data,RW-data,ZI-data
我们开发项目中,编译、链接完成后,都要看一下RAM和Flash的利用情况,尤其在有bootloader的情况下,确保自己的单片机选型能符合项目的要求。其中ARM程序的组成,是很容易混淆的。
此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在Flash中的bin映像(image)文件,这一点清注意区别。
一、Code,RO-data,RW-data,ZI-data所代表的意思
下图是车检器项目的APP利用情况:
图1
Code = 10956 Code 表示 程序代码部分,即指令
RO-data = 2196 Read Only 表示 程序定义的常量,如const关键字定义的常量数组或者长量(一般作为掉电后的标记),函数中的常量
RW-data = 76 Read Write 表示 已初始化的变量(全局和局部变量)
ZI-data = 9908 Zero Initialize 表示 未初始化的变量(全局和局部变量)
二、查找..\Lists文件夹中Project.map文件,查看使用的MCU资源:
图2
1、Flash占用
图3
由上图2和图3可知,Size:0x33ac.....13228,因此flash占用如下:
Code, RO-data, RW-data ............flash
2、RAM占用
图4
由上图2和图4可知,Size:0x2700.....9984,因此RAM占用如下:
RW-data, ZI-data...................RAM
二、单片机启动过程中Code,RO-data,RW-data,ZI-data的操作流程
1、ARM映像文件的组成
所谓ARM映像文件就是指烧录到Flash中的bin文件,也称为image文件
image文件包含了Code, RO-data, RW-data数据。
之所以image文件不包含ZI-data,是因为ZI-data都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可,包含进去浪费存储空间。
Q:为什么image中必须包含Code, RO-data, RW-data?
A:因为Code+RO-data中的指令和常量以及RW-data中初始化过的变量是不能像ZI-data那样“无中生有”的。
2、ARM运行程序的组成
所谓ARM运行程序,是指在ARM系统中正在执行的程序
3、单片机启动过程 Code,RO-data,RW-data,ZI-data的工作过程
烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全相同的,因此就有必要了解ARM运行程序是如何从Flash中的image状态达到实际运行状态
1、上电初始化时,将RW-data从flash拷贝到RAM中,因为RW-data是变量,变量不能存在Flash中,存储的数据要随计算结果随时改变。
2、上电初始化时,将ZI-data所在的RAM区域全部清零,因为ZI-data区域并不在image中,所以需要程序根据编译器给出的ZI-data地址及大小来将相应的RAM区域清零。ZI-data中也是变量,同理,变量不能存在Flash中,在程序运行的最初阶段,Flash中的指令完成了这两项工作后C程序才能正常访问变量,否则只能运行不含变量的代码。
来源:CSDN
作者:Tony5467
链接:https://blog.csdn.net/qq_20312079/article/details/104558696