历史上的今天
返回首页

历史上的今天

今天是:2025年02月09日(星期日)

正在发生

2021年02月09日 | STM32 查看 FLASH 和 RAM 使用情况(RO-data、RW-data、ZI-data)

2021-02-09 来源:eefocus

1、KEIL MDK 编译后的信息


Code=86496 RO-data=9064 RW-data=1452 ZI-data=16116 


1)Code 是代码占用的空间;


2)RO-data 是 Read Only 只读常量的大小,如const型;


3)RW-data 是(Read Write)初始化了的可读写变量的大小;


4)ZI-data 是(Zero Initialize) 没有初始化的可读写变量的大小,ZI-data不会被算做代码里因为不会被初始化。


1.1、Flash 占用


在烧写的时候是 FLASH 中的被占用的空间为:


Code+RO Data+RW Data


1.2、RAM 内存占用(不包括堆栈)


程序运行的时候,芯片内部 RAM 使用的空间为:


RW Data + ZI Data


示例:


Program Size: Code="18248" RO-data=320 RW-data=260 ZI-data=3952 

 

Code, RO-data,RW-data ..............flash

RW-data, ZIdata       ..............RAM

注:初始化时 RW-data 从 flash 拷贝到 RAM


生成的map文件位于list文件夹下 (KEIL)


Total RO  Size (Code + RO Data)                18568 (  18.13kB)

Total RW  Size (RW Data + ZI Data)              4212 (   4.11kB)

Total ROM Size (Code + RO Data + RW Data)      18828 (  18.39kB)

2、ARM 映像文件的组成


所谓ARM映像文件就是指烧录到ROM中的bin文件,也称为image文件。


Image文件包含了RO和RW数据,之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可,包含进去反而浪费存储空间。


RO中的指令和常量以及RW中初始化过的变量是不能像ZI那样“无中生有”。


3、ARM 程序的执行过程


烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的。


因此就有必要了解ARM程序是如何从ROM中的image到达实际运行状态的。


RO中的指令至少应该有这样的功能:


1)将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中;


2)将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。


ZI中也是变量,同理:变量不能存在ROM中,在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。


否则只能运行不含变量的代码。


示例:


1)RO


看下面两段程序,他们之间差了一条语句,这条语句就是声明一个字符常量。


因此按照我们之前说的,他们之间应该只会在RO数据中相差一个字节(字符常量为1字节)。


Prog1:

 

#include

void main(void)

{

;

}

 

Prog2

#include

const char a = 5;

void main(void)

{

;

}

Prog1编译出来后的信息如下:


================================================================================

Code RO Data RW Data ZI Data Debug

948 60 0 96 0 Grand Totals

================================================================================

Total RO Size(Code + RO Data) 1008 ( 0.98kB)

Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)

Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)

================================================================================

Prog2编译出来后的信息如下:


================================================================================

Code RO Data RW Data ZI Data Debug

948 61 0 96 0 Grand Totals

================================================================================

Total RO Size(Code + RO Data) 1009 ( 0.99kB)

Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)

Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)

================================================================================

以上两个程序编译出来后的信息可以看出:


Prog1和Prog2的RO包含了Code和RO Data两类数据。


他们的唯一区别就是Prog2的RO Data比Prog1多了1个字节。


如果增加的是一条指令而不是一个常量,则结果应该是Code数据大小有差别。


2)RW


同样再看两个程序,他们之间只相差一个“已初始化的变量”,按照之前所讲的,已初始化的变量应该是算在RW中的,所以两个程序之间应该是RW大小有区别。


Prog3:

 

#include

void main(void)

{

;

}

 

Prog4:

 

#include

char a = 5;

void main(void)

{

;

}

Prog3编译出来后的信息如下:


================================================================================

Code RO Data RW Data ZI Data Debug

948 60 0 96 0 Grand Totals

================================================================================

Total RO Size(Code + RO Data) 1008 ( 0.98kB)

Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)

Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)

================================================================================

Prog4编译出来后的信息如下:


================================================================================

Code RO Data RW Data ZI Data Debug

948 60 1 96 0 Grand Totals

================================================================================

Total RO Size(Code + RO Data) 1008 ( 0.98kB)

Total RW Size(RW Data + ZI Data) 97 ( 0.09kB)

Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)

================================================================================

可以看出Prog3和Prog4之间确实只有RW Data之间相差了1个字节,这个字节正是被初始化过的一个字符型变量“a”所引起的。


3)ZI


再看两个程序,他们之间的差别是一个未初始化的变量“a”,从之前的了解中,应该可以推测,这两个程序之间应该只有ZI大小有差别。


Prog3:

 

#include

void main(void)

{

;

}

 

Prog4:

 

#include

char a;

void main(void)

{

;

}

Prog3编译出来后的信息如下:


================================================================================

Code RO Data RW Data ZI Data Debug

948 60 0 96 0 Grand Totals

================================================================================

Total RO Size(Code + RO Data) 1008 ( 0.98kB)

Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)

Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)

================================================================================

Prog4编译出来后的信息如下:


================================================================================

Code RO Data RW Data ZI Data Debug

948 60 0 97 0 Grand Totals

================================================================================

Total RO Size(Code + RO Data) 1008 ( 0.98kB)

Total RW Size(RW Data + ZI Data) 97 ( 0.09kB)

Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)

================================================================================

编译的结果完全符合推测,只有ZI数据相差了1个字节。


这个字节正是未初始化的一个字符型变量“a”所引起的。


注意:


如果一个变量被初始化为0,则该变量的处理方法与未初始化华变量一样放在ZI区域。


即:ARM C程序中,所有的未初始化变量都会被自动初始化为0。


总结:


1) C中的指令以及常量被编译后是RO类型数据;


2) C中的未被初始化或初始化为0的变量编译后是ZI类型数据;


3) C中的已被初始化成非0值的变量编译后市RW类型数据。


附:


程序的编译命令(假定C程序名为tst.c):


armcc -c -o tst.o tst.c

armlink -noremove -elf -nodebug -info totals -info sizes -map -list aa.map -o tst.elf tst.o


编译后的信息就在aa.map文件中。


ROM主要指:NAND Flash,Nor Flash


RAM主要指:PSRAM,SDRAM,SRAM,DDRAM


简单的说就是在烧写完的时候是:


FLASH中:Code+RO Data+RW Data


运行的时候:


RAM: RW Data + ZI Data,当然还要有堆栈的空间。



refer:


https://blog.csdn.net/xkzju2010/article/details/51323901


推荐阅读

史海拾趣

Engelking Elektronik GmbH公司的发展小趣事

为了进一步提升技术实力和产品竞争力,Engelking Elektronik积极寻求与高校和研究机构的合作。通过与多家知名科技院校的合作,公司获得了多项技术专利和研发成果。其中,一项重要的技术突破是开发了一种新型的高效能电子元件,该元件在能效和可靠性方面均达到了行业领先水平。这一成果不仅为公司带来了可观的经济效益,也提升了公司在业界的地位。

Actel公司的发展小趣事

作为一家有社会责任感的企业,Engelking Elektronik始终关注环保和可持续发展问题。公司积极采用环保材料和清洁能源,减少生产过程中的污染排放和资源浪费。此外,Engelking Elektronik还积极参与公益活动和慈善捐赠,回馈社会。公司坚信只有关注社会责任和可持续发展才能实现企业的长期繁荣和稳定。

聚辰(Giantec)公司的发展小趣事

港源公司深知品质是企业生存之本。公司先后通过了ISO9001质量管理体系认证、ISO14001环境体系认证、ISO45001职业健康安全管理体系认证以及IATF16949汽车质量体系认证等国际权威认证。这些认证不仅证明了港源公司在品质管理方面的卓越能力,还为公司赢得了国内外客户的广泛信赖和好评。港源公司坚持“诚信、创新、和谐、共赢”的企业核心价值观,致力于为客户提供高品质、高可靠性的产品和服务。

Advantech公司的发展小趣事

港源公司深知品质是企业生存之本。公司先后通过了ISO9001质量管理体系认证、ISO14001环境体系认证、ISO45001职业健康安全管理体系认证以及IATF16949汽车质量体系认证等国际权威认证。这些认证不仅证明了港源公司在品质管理方面的卓越能力,还为公司赢得了国内外客户的广泛信赖和好评。港源公司坚持“诚信、创新、和谐、共赢”的企业核心价值观,致力于为客户提供高品质、高可靠性的产品和服务。

Fair Rite公司的发展小趣事

1952年,理查德·帕克与合作伙伴埃德蒙·斯坦威克和杰克·韦伯在纽约的Wallkill共同创立了Fair Rite产品公司。当时,电子行业正处于起步阶段,对新型电子元器件的需求日益增长。Fair Rite凭借对市场敏锐的洞察力,开始专注于铁氧体元件的研发和生产。公司初期面临资金短缺和技术挑战,但通过不断努力和创新,逐渐在市场中树立了良好的口碑。

BAE Systems公司的发展小趣事

BAE Systems公司一直致力于技术创新,不断推动电子行业的发展。公司投入大量资源进行研发,开发出了一系列先进的电子系统和产品。这些技术成果不仅提升了公司的竞争力,也为全球电子行业的技术进步做出了贡献。例如,公司在军事通信、雷达系统、导弹技术等领域都取得了重要的突破,为国家的安全和防御提供了强有力的支持。

问答坊 | AI 解惑

读《把时间当作朋友》(九):推迟满足感

《把时间当作朋友》原文: 提出“情商”(Emotional Intelligence)概念的美国著名心理学家戈尔曼 (Daniel Goleman)曾做过一个关于“推迟满足”(delaying gratification) 的实验。 找来一批四岁孩子,给他们每人一块糖,并告诉他们若能等 ...…

查看全部问答>

开关控制LED——ARM的Proteus实验

实验原理ARM的P0.1口接按钮,再通过P0.0控制LED的亮、灭。本实验的电路图以及实验均在上一个实验基础之上修改。其中电路图只多了一个开关。 Proteus仿真电路图 实验步骤略(与上一实验相同) C语言源程序/************************************* ...…

查看全部问答>

Crosstar嵌入式学院“利用/proc实现内核与用户空间通信”

Linux内核空间与用户空间的通信可通过\"/proc\"目录的文件读写来实现,如果只是控制内核中的参数而不是传输较多数据的话,用“/proc”是很合适的。另外几种内核与用户空间通信方式方式是:1)对内核设备的读写或IOCTL;2)通过/sys内存文件系统来 ...…

查看全部问答>

LM3S9997 FLASH

大家好.... 我在弄LM3S9997 可是下载不了程序。。  (原文件名:222.jpg)  引用图片下面的资料。可能发现看不问题。。觉得哪里可能有问题就说说吧。。我改的 希望过来人教教我。。还有就是读到了芯片的ID以及ROM的ID ,是不是就说 ...…

查看全部问答>

关于多文件的组织中的define

刚刚看到了我们的辛大斑竹写的一个帖子,我就把我最近看的一个问题贴出来,程序是我的一个学长写的,一般我们在写单片机程序的时候是把不同功能的文件写成一个模块,即.c文件,然后再写出对应的.h文件作出对外的接口和函数申明,当在别人地方需要使 ...…

查看全部问答>

基于MCF52259的RS232串口-CAN转换器的实现

转来一片小论文关于MCF52259的[local]1[/local]…

查看全部问答>

论坛技术请看,反应几个问题

1、关于TI教室中课程,除了第一个有进度其他的看了,没进度,不知道什么原因,希望能给个解释。 [ 本帖最后由 Sur 于 2013-12-3 21:20 编辑 ]…

查看全部问答>

加速度计工作原理

加速度计工作原理>> …

查看全部问答>

【LPC54100】资料整理及软件下载

本帖最后由 770781327 于 2015-2-13 22:28 编辑 首先么,既然有二维码,那就先看看二维码是什么资料呗。 手机扫描二维码 打开 好吧没网。那用电脑试试 好吧,这网址真没啥用。 先去官网找资料吧。 MCU完整型号:LPC54102J512BD64 http:// ...…

查看全部问答>

EEWORLD大学堂----Atmel U系列触摸屏控制芯片悬浮感应和操作演示 (中文版)

Atmel U系列触摸屏控制芯片悬浮感应和操作演示 (中文版):https://training.eeworld.com.cn/course/583…

查看全部问答>