STM32 查看 FLASH 和 RAM 使用情况(RO-data、RW-data、ZI-data)

发布者:eaff86最新更新时间:2021-02-09 来源: eefocus关键字:STM32  FLASH  RAM  使用情况 手机看文章 扫描二维码
随时随地手机看文章

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主要指:PSRAMSDRAM,SRAM,DDRAM


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


FLASH中:Code+RO Data+RW Data


运行的时候:


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



refer:


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


关键字:STM32  FLASH  RAM  使用情况 引用地址:STM32 查看 FLASH 和 RAM 使用情况(RO-data、RW-data、ZI-data)

上一篇:STM32 编译结果 map 之 code、RO-data、RW-data、ZI-data 字段解析
下一篇:readelf 命令读取 STM32 编译生成的 ELF 和 AXF 文件

推荐阅读最新更新时间:2024-11-12 16:15

分享STM32 FLASH 擦除(以及防止误擦除程序代码)、写入
编译环境:我用的是(Keil)MDK4.7.2 stm32库版本:我用的是3.5.0 一、本文不对FLASH的基础知识做详细的介绍,不懂得地方请查阅有关资料。   对STM32 内部FLASH进行编程操作,需要遵循以下流程:   FLASH解锁   清除相关标志位   擦除FLASH(先擦除后写入的原因是为了工业上制作方便,即物理实现方便)   写入FLASH   锁定FLASH 实例: #define FLASH_PAGE_SIZE ((uint16_t)0x400) //如果一页为1K大小 #define WRITE_START_ADDR ((uint32_t)0x08008000)//写入的起始地址 #define W
[单片机]
分享<font color='red'>STM32</font> <font color='red'>FLASH</font> 擦除(以及防止误擦除程序代码)、写入
STM32基础8--通用定时器(PWM控制LED)
从STM32基础7--通用定时器,STM32通用定时器可以产生PWM波形,从而控制LED亮度。下面我们更加详细的了解一下,PWM对LED的控制。 PWM控制LED硬件电路 在下面的原理图中,可以看到LED0与LED1连接到STMF407的PF9与PF10引脚上。在电路中,当PF9,PF10分别为低电平的时候,LED0与LED分别导通,也就是这个电路中,PWM周期的低电平周期,LED会被导通。 PWM周期与LED闪烁 在STM32F407中,当我们使用PWM1模式时,进行如下的设置。 当我们使用逻辑分析仪(LA)抓取,可以得到如波形,也就是说Pulse设置的为低电平的时间长度。当我们下载程序进开发板时,发现LED
[单片机]
<font color='red'>STM32</font>基础8--通用定时器(PWM控制LED)
STM32单片机的通用定时器
STM32中的定时器有多种,按功能分成2个高级控制器定时器,4个普通定时器,2个基本定时器,2个看门狗定时器,1个系统滴答定时器SysTick。 定时器的关键是定时时间的计算。比如用定时器控制继电器的开关的时候,需要延时一段时间才关闭或者开启,这时候离不开定时器定时。 通用定时器定时时间计算。1秒中断的基本实现: 通用定时器模块的入口时钟经过分频得到计数器的时钟,用CK_CNT表示,预分频器的系数为:TIMx_PSC,当TIMx_PSC=0时,表示不分频,=1时,2分频。以此类推。 公式为:CK_CNT=fclk_PSC/(PSC +1),其中PSC最大为65535. 其次是TIM5计数器的计数值的设置,TIM5计数器以
[单片机]
STM32例程详解:GPIO之JTAG_Remap
完整的工程文件夹在这里下载 http://pan.baidu.com/s/1EFgkw KEIL—MDK 4.72a调试通过 //头文件包含 ------------------------------------------------------------------*/ #include stm32f10x.h #include stm32_eval.h //译者注:意法半导体公司为其开发板上模块所写的头文件 GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体,其原型由GPIO_InitTypeDef确定 //私有 函数原型 ----------------------
[单片机]
STM32不止于芯”: 2023年STM32中国峰会暨粉丝狂欢节重磅回归深圳
2023年5月12日,中国深圳 – 服务多重电子应用领域、全球排名前列的半导体公司意法半导体(STMicroelectronics,简称ST;)将于5月12-13日在深圳蛇口希尔顿酒店举行2023年STM32中国峰会暨粉丝狂欢节。 STM32中国峰会是展示STM32产品技术和解决方案的行业盛会,2023年,我们迎来了第六届STM32中国峰会。本届峰会以“STM32不止于芯”为主题,将专注于边缘AI、网络连接、信息安全、生态系统与开发者优先计划,重点展示STM32创新产品技术如何赋能各种应用。 本届峰会将举办50多场专题会议,其中包括高管主题演讲、技术研讨会,以及ST和生态系统合作伙伴的demo演示。此外,新品展区将是本届
[单片机]
买MacBook Pro别心急,分析师:明年大降价
最低要价NT$57900的新 MacBook Pro ,是否让你觉得难以入手!不只你这么想,很多分析师也是站在消费者这边的。向来关注苹果产品的凯基投顾分析师郭明錤在最新报告中预测,昂贵的全新MacBook Pro明年就会降价。这消息应该会不少果粉感到欣慰。   苹果在台湾时间28日凌晨发表了13吋、15吋搭载OLED Touch Bar的全新MacBook Pro,以及13吋没有搭载Touch Bar的款式。原先各界都对于近两年没有「有意义」更新的MacBook满怀期待,然而不多的升级内容加上高贵的价格,反倒让苹果的新MacBook Pro遭受不少批评。   针对甫推出的新MacBook Pro,郭明錤明确在报告中指出价
[嵌入式]
OneNET平台下的STM32单片机MQTT协议数据传输源码
OneNET平台下的基于ESP8266的STM32(MQTT协议)例程是适用于自身平台下的开发板,修改过系统配置文件,其外部晶振频率为12MHz。修改过的代码可以向OneNET平台发送LED灯当前状态,GPS位置数据信息和自定义消息。 1.修改esp8266.c下的wifi账号及密码 2.修改onenet.c下的proid、auth_info和devid 3.指令说明: 1.命令直接下发: redled:1 打开红灯 greenled:1 打开绿灯 yellowled:1 打开黄灯 blueled:1 打开蓝灯 同理,1替换为0则是关闭 2.应用命令填写方式:
[单片机]
GD32和STM32有何区别?GD32如何替换STM32呢?
GD32和STM32是两种不同的微控制器系列,一般被用于嵌入式系统开发。GD32是中国华大基因(Gigadevice)公司开发的微控制器,而STM32是瑞士意法半导体(STMicroelectronics)公司开发的微控制器。 首先,我们来看一下GD32和STM32在技术规格上的区别。GD32系列采用了中国自主研发的ARM Cortex-M3和Cortex-M4内核,而STM32系列则采用了瑞士意法半导体公司的ARM Cortex-M系列处理器。从处理器性能和架构上来看,两者基本上是相似的。然而,由于GD32系列是后来者,它在一些方面对原有的STM32系列做了一些改进和增强,例如增加了更多的外设和功能模块。 其次,GD32和STM
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved