我们开发项目中,编译、链接完成后,都要看一下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程序才能正常访问变量,否则只能运行不含变量的代码。

Keil 中的Code,RO-data,RW-data,ZI-data的更多相关文章

  1. stm32 ARM中的RO、RW和ZI DATA

    一直以来对于ARM体系中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该有不少人也有和我同样的困惑,因此将 ...

  2. ARM MDK 编译产生:RO、RW和ZI DATA说明

    1.比如编译一个工程文件,产生如下提示信息: Program Size: Code=18938 RO-data=622 RW-data=124 ZI-data=7724 RO段.RW段和ZI段 要了解 ...

  3. Keil编译后的Code,RO,RW,ZI分别表示什么以及和芯片Flash、SRAM的对应关系

    在使用keil开发STM32应用程序时,点击Build后在Build Output窗口中经常会有如下信息:<ignore_js_op> 以前一直好奇这几个参数和实际使用的STM32芯片中F ...

  4. Keil中的code关键字

    一般说来,我们在C语言中定义的每一个变量初始化后都会占用一定的内存(RAM)空间.但是在keil中提供了一个特殊的关键字“code”,这个关键字在标准C中是没有的.其语法举例如下: unsigned ...

  5. Keil中 Program Size: Code RO-data RW-data ZI-data

    一般 MCU 包含的存储空间有:片内 Flash 与片内 RAM,RAM 相当于内存,Flash 相当于硬盘. 现在我们就一个STM32的工程为例子 linking... Program Size: ...

  6. KEIL的ARM编译器对RW和ZI段的一个处理

    按照C编译器编译的结果,一般会产生RO段,RW段,ZI段.RO是程序中的指令和常量,RW是程序中的已初始化全局变量,ZI是程序中的未初始化或初始化为零的全局变量. 那么如下的代码 int aaa; i ...

  7. 关于keil中data,idata,xdata,pdata,code的问题

    转自关于keil中data,idata,xdata,pdata,code的问题 ‍从数据存储类型来说,8051系列有片内.片外程序存储器,片内.片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类 ...

  8. RW RO ZI ROM keil中的含义

    编译的一个ARM的程序,会得到这样的信息: ============================================================================== ...

  9. Keil MDK中的Code, RO-data , RW-data, ZI-data分别代表什么意思?(转)

    一 基础知识 字节  8位半字  16位字    32位 二 解惑 Code, RO-data,RW-data,ZI-data Code为程序代码部分RO-data 表示 程序定义的常量const t ...

随机推荐

  1. 转: 根据屏幕分辨率,浏览器调用不同css

    <link type="text/csss" href="" rel="stylesheet"/> <link type= ...

  2. 铁乐学python26_hashlib+configparser+logging模块

    大部份内容摘自博客http://www.cnblogs.com/Eva-J/ hashlib模块算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢? ...

  3. U-Mail:多方面因素避免EDM邮件进垃圾箱

    有很多做邮件营销的企业客户给U-Mail来电或来函咨询一件困扰他们的事:群发邮件时,要怎么样才能降低被收件人列入垃圾邮件的概率呢?其实关于这个问题,U-Mail小编已经请资深营销专家解答过多次了,经常 ...

  4. mysql workbench的PK,NN,UQ,BIN,UN,ZF,AI

    mysql workbench建表时PK.NN.UQ.BIN.UN.ZF.AI的意思,后面几个老搞不清,随记在这便于以后方便查. [intrinsic column flags] (基本字段类型标识) ...

  5. python and、or以及and-or

    @Python: and.or以及and-or 一.and: 在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值:而是,返回它们实际进行比较的值之一. & ...

  6. URL地址理解

    / 表示相对目录的根目录./ 表示相对目录的本层目录../ 表示相对目录的上层目录

  7. 【node.js】模块系统、函数

    为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码.JSON 或者编译过的C/C++ 扩 ...

  8. kendo ui - MultiSelect 多选系列

    kendo-ui 官网:https://www.telerik.com/documentation 初始化 grid: 引入文件: <link rel="stylesheet" ...

  9. 集合之subList的缺陷

    我们经常使用subString方法来对String对象进行分割处理,同时我们也可以使用subList.subMap.subSet来对List.Map.Set进行分割处理,但是这个分割存在某些瑕疵. 一 ...

  10. 多线程之Timer和TimerTask

    Timer是一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask.TimerTask是一个抽象类,实现了Runnabl ...