Keil 中的Code,RO-data,RW-data,ZI-data

有些话、适合烂在心里 提交于 2020-02-28 18:43:21

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程序才能正常访问变量,否则只能运行不含变量的代码。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!