STM32 查看 FLASH 和 RAM 使用情况

发布者:Yudie最新更新时间:2019-04-01 来源: 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主要指:PSRAM,SDRAM,SRAM,DDRAM


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


FLASH中:Code+RO Data+RW Data


运行的时候:


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

关键字:STM32  FLASH  RAM 引用地址:STM32 查看 FLASH 和 RAM 使用情况

上一篇:STM32 Flash 均衡保存算法
下一篇:STM32 编译结果 map 之 code、RO-data、RW-data、ZI-data 字段解析

推荐阅读最新更新时间:2024-03-16 16:26

STM32之串口的使用
串口的使用 1、为什么要用串口? 自上一篇写的时间是1月20号,今6月7号了,半年没更新了。 这半年发生了什么?过完年就去找公司实习,在那里自我感觉进步很大。其实在公司大多都是自学,师傅基本不会给你说什么。但这并不能说明你的师傅对你不好,带我的那个师傅只比我高一届,但他的水平比我高的好多届。他也是自学,也没人告诉他该怎么做,因为老板也不太懂。所以自学能力很重要,当然有人带你的话,这样会更好。 不说这些了,串口在调试的时候作用非常大。也学我们在学51的时候,只是将程序下载到开发板,看看是否能运行起来,通过数码管将结果显示出来,从而就知道程序设计的正确性。以前我也是这样做的,没什么不好。 在公司实习的时候,他们调试都是使用串
[单片机]
<font color='red'>STM32</font>之串口的使用
如何使用J-Link V8 烧写程序到NOR Flash
以mini2440开发板来说明 Mini2440 Memory配置: NAND flash:K9F1208(64M x 8 Bit) 64MByte NOR flash:SST39VF1601(1M x16 Bit) 2MByte SDRAM: HY57V561620 (2pcsX4Banks x 4M x 16Bit)64MByte ------------------------------------ 1.安装J-Link V8驱动,会默认安装J-Link Commander, J-
[单片机]
STM32定时器的编码器模式
/pre pre name= code class= objc /pre pre name= code class= objc /********************************************************************************** * @file: stm32定时器的编码器模式 * @date: 2015.8.2 * @author: shenhuixiang * @version: 1.0.0 **********************************************************************************
[单片机]
stm32PWM精确控制脉冲个数
/**************************** 02 **TIM2的通道1使用单脉冲模式 03 **TIM3使用门控模式用来输出PWM 04 ** 05 ****************************/ 06 //TIM2per:重装值 07 //Compare1:比较捕获1的预装载值 08 void Motor_Init(u16 TIM2per, u16 TIM3per, u16 TIM3Compare1) 09 { 10 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; 11 TIM_OCInitTypeDef TIM_OCInitStruct; 12
[单片机]
全球内存和SSD价格将在2018年回落
  在过去的这一年中,我们在PC和智能手机领域听到最多的声音就是成本上涨,其中存储芯片价格一路飙高成为“祸首”。不过,市场研究机构Gartner给出了一个令人兴奋的消息。Gartner表示,自2016年中期以来,PC 内存 的价格已经翻了一倍,4GB单条售价从12.5美元涨到了25美元,而随着NAND闪存芯片涨价, SSD 的每千兆字节的成本也出现了惊人上涨。下面就随嵌入式小编一起来了解一下相关内容吧。   不过,这种涨价势头将在本季度达到顶峰。   Gartner预测,全球 内存 和 SSD 的价格会在2018年出现明显回落,并于2019年重新陷入一个相对“冰点”。   不过,在闪存芯片降价的背景下,Gartner却不认为消费
[嵌入式]
stm32 外部中断 按键的误触发
最近在调试按键作为外部中断exti进行触发动作,发现每次按键按下和按键抬起都会多次进入中断函数,造成程序不稳定,经过反复调试和查阅资料,最后终于已经把这个问题解决,现在总结一下: 1、EXTI重复配置两次导致误触发中断的问题 如果重复两次配置EXTI的话,由于第一次已经打开中断,当进行第二次配置中断的时候,会把中断引脚首先配置成默认引脚,然后在配置成目的引脚,这样由于默认引脚是低电平,所以在切换的过程中就会进入一次中断!!具体请参见:http://bbs.elecfans.com/jishu_942011_1_1.html 2、STM32F401 外部中断误触发问题 现象:调试STM32F411低功耗的时候,使用的
[单片机]
【2440裸机】Nand Flash 简单操作
head.s文件 @****************************************************************************** @ File:head.s @ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行 @****************************************************************************** .text .global _start _start: @函数disable_watch_dog, memsetup, init_n
[单片机]
STM32基础知识:中断系统
中断系统 1 数据传输方式 无条件传输 :处理器不必了解外部设备状态,直接进行数据传输,用于指示灯和按键等简单设备.。 查询方式 :传输前,一方先查询另一方的状态,若已经准备好就传输,否则就继续查询。 中断方式 :一方通过申请中断的方式与另一方进行数据传输,收发双方可以并行工作。 直接存储器访问 :处理器内部建立片内外设和内存之间的数据传输通道,传输过程不需要处理器参与。 2 中断系统的基本概念 2.1 中断全过程 中断发生: 当CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理。 中断处理: CPU暂停当前的工作,转去处理事件B。 中断返回: 当CPU将事件B处理完毕后,再回到事件A中被暂停的地方继
[单片机]
<font color='red'>STM32</font>基础知识:中断系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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