历史上的今天
返回首页

历史上的今天

今天是:2025年04月01日(星期二)

正在发生

2019年04月01日 | STM32 查看 FLASH 和 RAM 使用情况

2019-04-01 来源: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,当然还要有堆栈的空间。

推荐阅读

史海拾趣

BETA Transformer Technology Corp公司的发展小趣事

BETA Transformer Technology Corp公司深知人才是企业发展的核心动力。因此,公司高度重视人才培养和团队建设。BETA公司建立了一套完善的人才培养机制,通过内部培训、外部学习等方式不断提升员工的技能水平和综合素质。同时,公司还注重团队建设和文化建设,营造了一个积极向上、团结协作的工作氛围。这些举措使得BETA公司的员工队伍更加稳定、高效,为公司的长期发展提供了有力保障。

以上五个故事分别从不同角度描述了BETA Transformer Technology Corp公司的发展历程和取得的成就。虽然这些故事是虚构的,但它们反映了电子行业中企业可能面临的挑战和机遇,以及应对这些挑战和机遇的策略和措施。希望这些故事能够满足您的需求。

Genesis Microchip公司的发展小趣事

随着第二次世界大战的爆发,全球对国防电子产品的需求激增。GI凭借其在电子技术领域的深厚积累,迅速调整战略方向,积极投身于国防电子产品的研发与生产。公司开发的潜水艇探测设备和其他关键国防电子产品在战争中发挥了重要作用,赢得了军方的高度认可。这一阶段的成功不仅为GI带来了丰厚的利润,也极大地提升了公司在电子行业中的知名度和地位。

Advanced Linear Devices公司的发展小趣事

进入21世纪后,电子行业面临着前所未有的变革和挑战。随着信息技术的飞速发展,云计算、大数据、人工智能等新兴技术不断涌现,对传统电子企业提出了更高的要求。GI积极响应行业变革的号召,不断加大在新技术研发方面的投入,努力推动产品升级和转型。同时,公司也积极拥抱互联网思维,加强与互联网企业的合作与融合,共同探索电子行业的新未来。这一阶段的努力,使GI在激烈的市场竞争中保持了领先地位,并继续为电子行业的发展贡献着力量。

需要注意的是,以上故事是基于行业常识和通用发展路径构建的,并非直接针对GI的官方历史。由于GI的具体发展历史和详细故事可能因资料限制而无法全面呈现,因此以上内容仅供参考。

Extech公司的发展小趣事

1994年,Extech公司推出了国内第一套基于“AutoCAD FOR WINDOWS”的XTMCAD软件,这一创新举措标志着公司在CAD领域迈出了坚实的步伐。XTMCAD软件凭借其先进的技术和易用性,迅速获得了市场的认可,并在同年荣获了国家教委科技进步一等奖。这一荣誉不仅是对Extech公司技术实力的肯定,也为公司未来的发展奠定了坚实的基础。

Franel Corp公司的发展小趣事

为了更好地服务中国市场,法勒公司不断优化其供应链和生产布局。近年来,法勒加大了在国内的投资力度,建设了现代化的生产基地和研发中心。通过本土化生产,法勒不仅降低了产品成本,还缩短了交货周期,提高了市场响应速度。同时,法勒还积极与本土供应商建立紧密的合作关系,共同构建了一个高效、稳定的供应链体系。

Custom Electronics Inc公司的发展小趣事

随着科技的快速发展和市场需求的变化,CEI不断调整自身的发展战略和业务结构。公司加大了对新技术、新产品的研发投入,推动产业结构的升级和转型。同时,CEI还积极探索新的商业模式和市场机会,为公司的可持续发展提供了有力保障。

问答坊 | AI 解惑

智能温控器使居家采暖更舒适

时值装修旺季,许多家庭在经历去年雪灾严寒之后开始将采暖设备优先采购,而目前一项精确采暖和高效节能相结合的高科技产品——碳晶平面发热材料正式登陆南京,作为拥有三项国家发明专利的新产品,碳晶地暖已经在上海成功实践,并被南极科考队采纳使 ...…

查看全部问答>

FSA4157模拟开关

大家有谁知道什么产品上还在使用FSA4157模拟开关,希望知道的能够帮帮我!谢谢…

查看全部问答>

ADI SHARC处理器的起源和演进

说到要求超高性能的前沿应用,就不得不提起ADI公司的SHARC处理器。随着更高动态范围、更高性能和更低成本等市场压力的与日俱增,各种应用对浮点处理器的需求也在不断增加。本文将介绍第一款SHARC处理器背后的历史,并讨论其架构的创新,这使得这款 ...…

查看全部问答>

向今天已开始工作的表示敬意

今天是初七,按国家规定已经要上班了。不过EEWORLD明天才上班,所以还有一天的轻松。不过,要向今天已开始紧张工作的坛友们表示崇高的敬意,并由衷地说一声“你们辛苦了”!!!…

查看全部问答>

基于NiosⅡ的硬盘存储系统的研究与设计

本帖最后由 paulhyde 于 2014-9-15 09:33 编辑 信息 技 术 的快速发展,电子产品广泛地进入生产和生活领域,使得数据存储需求日益增强。本文研究设计了一种基于Nios I处理器的硬盘存储系统。首先,本文介绍了论文选题的背景及国内外相关研究的进展 ...…

查看全部问答>

贵求毕业设计 单片机方面的 谢谢

本人想做个单片机的毕业设计 不是很懂 所以不希望太难 但是又怕简单了学校不给通过 所以希望大家给点意见 最好能提供点设计资料 谢谢大家了…

查看全部问答>

急求用MATLAB实现频率提取(FFT) 代码

急求用MATLAB实现频率提取(FFT) 代码…

查看全部问答>

问几个驱动模型的问题

1,写了一个SPI的驱动,使用的是驱动模型框架,probe,remove等,现在要给上层应用程序提供接口,以实现读,写,打开,关闭等功能,是不是要向字符驱动那样实现write,read等函数? 2,如果不使用字符驱动的那些接口,那要怎么实现以提供接口给上 ...…

查看全部问答>

招驱动开发方面的兼职人员

本公司现在招驱动开发方面书籍的作者 待遇丰厚 有兴趣的可以和我联系  进行详谈 QQ878298915 请注明  驱动 Email pyq_1985@163.com…

查看全部问答>

如何实现自动清理(WINCE做服务器)

程序运行一段时间,占用内存会不断增大,最小化以后window会自动清理,有没有编程的方法实现自动清理 …

查看全部问答>