第10章 STM32F429的FLASH,RAM和栈使用情况(map和htm文件)

发布者:GoldenHarmony最新更新时间:2022-04-14 来源: eefocus关键字:STM32F429  FLASH  RAM 手机看文章 扫描二维码
随时随地手机看文章

10.1 初学者重要提示

1、为了更好的学习本章知识点,可以看之前做的视频教程第11章:


http://www.armbbs.cn/forum.php?mod=viewthread&tid=15408 。


2、本章节以MDK为例进行说明,使用IAR同理。


10.2 MAP文件分析

通过map文件,可以方便的查看工程ROM/FLASH和RAM的占用情况,包括单个源文件,甚至具体到每个函数的rom大小都给出了,通过这些信息可以很好的进行代码优化。MAP文件的内容可分为如下几部分:


  Section Cross References

  Removing Unused input sections from the image

  Image Symbol Table (Local Symbols Global Symbols)

  Memory Map of the image

  Image component sizes


下面将这个几个部分的含义逐一为大家做个说明。


10.2.1 MDK配置

要生成MAP文件,MDK中如下选项要选上:

将工程全编译,且没有错误后,双击这里就可以看到生成的map文件了:

10.2.2 MAP文件相关概念

认识MAP文件前先熟悉如下概念:


  段(section) :描述映像文件的代码和数据块。

  RO: Read-Only的缩写,包括RO-data(只读数据)和RO-code(代码)。

  RW:Read-Write的缩写,主要是RW-data,RW-data由程序初始化初始值。

  ZI:  Zero-initialized的缩写,主要是ZI-data,由编译器初始化为0。

  .text:与RO-code同义。

  .constdata:与RO-data同义。

  .bss: 与ZI-data同义。

  .data:与RW-data同义

10.2.3 Section Cross References

这部分主要是不同文件中函数的调用关系(部分截图)


比如这句:main.o(i.main) refers to main.o(i.bsp_Init) for bsp_Init表示main.c文件中的main函数调用了bsp_Init。


10.2.4 Removing Unused input sections from the image

这部分主要是被删除的冗余函数,也就是添加到工程里面,但是没有调用到的,下面是部分被删除冗余函数的截图效果:

对于这个部分功能,用户最好将MDK中这个选项勾上,然后全编译工程,效果会比较好:

10.2.5 Image Symbol Table 

Image Symbol Table主要分为两类,分别是Local Symbols和Global Symbols。


  Local Symbols

Local Symbols记录了用static声明的全局变量地址和大小,C文件中函数的地址和用static声明的函数代码大小,汇编文件中的标号地址(作用域限本文件),下面是部分截图:

  Global Symbols

Global Symbols记录了全局变量的地址和大小,C文件中函数的地址及其代码大小,汇编文件中的标号地址(作用域全工程),下面是部分截图:

10.2.6 Memory Map of the image

映像文件可以分为加载域(Load Region)和运行域(Execution Region):加载域反映了ARM可执行映像文件的各个段存放在存储器中的位置关系。下面是部分截图,另外映像中的入口点就是程序开始执行的位置。

运行域反映了ARM可执行映像文件各个段真正执行时在存储器中的位置关系:

简单的说,加载域就是程序在Flash中的实际存储,而运行域是芯片上电后的运行状态,通过下面的框图可以有一个感性的认识:

通过上面的框图可以看出,RW区也是要存储到ROM/Flash里面的,在执行映像之前,必须将已初始化的RW数据从ROM中复制到RAM中的执行地址并创建ZI Section(初始化为0的变量区)。


10.2.7 Image component sizes

Image component sizes映像组件大小比较重要,比如下面内容代表的含义:


  Code (inc. Data) :显示代码占用了多少字节。 在此映像中,有19442字节的代码, 其中包括1832字节的内联数据 (inc. data),例如文字池和短字符串。

  RO Data  :显示只读数据占用了多少字节(比如const char buf[] = "123456")。这是除 Code (inc. data) 列中包括的内联数据之外的数据。

  RW Data :显示读写数据占用了多少字节。

  ZI Data  :显示零初始化的数据占用了多少字节。

  Debug  :显示调试数据占用了多少字节,例如,调试输入节以及符号和字符串。

  Object Totals  :显示链接到一起以生成映像的对象占用了多少字节。

  (incl. Generated):链接器会生成的映像内容,例如,交互操作中间代码。 如果 Object Totals 行包含此类型的数据,则会显示在该行中。本例中共有 1016 字节的 RO 数据,其中32字节是链接器生成的 RO 数据。

  (incl. Padding) :链接器根据需要插入填充,以强制字节对齐。

 

下面的Library Totals显示已提取并作为单个对象添加到映像中的库成员占用了多少字节。

下面是我们经常要查看的内容:

  Grand Totals:显示映像的真实大小。

  ELF Image Totals:ELF(Executable and Linking Format)可执行链接格式映像文件大小。

  ROM Totals:显示包含映像所需的 ROM的最小大小。这不包括 ZI数据和存储在ROM 中的调试信息。

10.3 HTM文件分析

MDK将工程全编译,且没有错误后,就会生成此文件。以开发板配套例子为例,htm文件位于路径:ProjectMDK-ARM(uV5)Objects。


此文件的最大作用就是基本统计了所有被调用函数的栈stack使用情况(不考虑中断嵌套)。下面是整个工程的最大栈需求:


 

具体到每个函数也给出最大的栈深度Max Depth,同时也给出函数本身的代码量大小和使用的栈大小,比如函数bsp_InitExtIO,最大栈深度是152字节。函数本身占用代码大小(Thumb指令集)28字节,使用栈8字节。

通过这个文件,我们可以合理的配置启动文件里面的stack大小:

10.4 总结

本章节的知识点比较重要,务必要熟练掌握。平时开发工程项目时,可以多关注map文件和htm文件。

关键字:STM32F429  FLASH  RAM 引用地址:第10章 STM32F429的FLASH,RAM和栈使用情况(map和htm文件)

上一篇:第11章 STM32F429移植SEGGER的硬件异常分析
下一篇:第9章 STM32F429重要知识点数据类型,变量和堆栈

推荐阅读最新更新时间:2024-11-06 02:12

ATmega64 堆指针
堆栈指针主要用来保存临时数据、局部变量和中断/ 子程序的返回地址。堆栈指针总是指 向堆栈的顶部。要注意AVR 的堆栈是向下生长的,即新数据推入堆栈时,堆栈指针的数 值将减小。在中断/ 子程序后从堆栈读程序计数器,未使用位( 位15) 应屏蔽。 堆栈指针指向数据SRAM 堆栈区。在此聚集了子程序堆栈和中断堆栈。调用子程序和使 能中断之前必须定义堆栈空间,且堆栈指针必须指向高于0x60 的地址空间。使用PUSH 指令将数据推入堆栈时指针减一;而子程序或中断返回地址推入堆栈时指针将减二。使 用POP 指令将数据弹出堆栈时,堆栈指针加一;而用RET 或RETI 指令从子程序或中断 返回时堆栈指针加二。 AVR的堆栈指针由I/O空间
[单片机]
ATmega64 堆<font color='red'>栈</font>指针
半导体战场往事:中日韩的内存之争
壬辰倭乱-万历朝鲜战争 中朝联合对日 来源:ICM艾森 2012年2月3日,全球著名内存生产厂商美光科技的CEO史蒂夫·阿普尔顿(Steve Appleton),在美国爱达荷州的波伊西(Boise)的一个航空展上,驾驶着一架Lancair IV-PT螺旋桨飞机,给观众们做表演。起飞后不久,飞机失去控制,紧急降落失败,直接栽向地面,当场坠毁,CEO享年51岁。 喜欢玩心跳的CEO挂了,美光股价倒是没怎么跌,大洋彼岸的一个叫坂本幸雄(Yukio Sakamoto)的日本人却急得如热锅上的蚂蚁。在上飞机前,阿普尔顿刚刚跟他谈完一份儿秘密协议,对于坂本幸雄担任社长的日本内存巨头尔必达来说,这份协议就是就保命书。 尔必达是日本芯
[半导体设计/制造]
半导体战场往事:中日韩的<font color='red'>内存</font>之争
基于TMS320C6000 DSP及DSP/BIOS系统的Flash引导自启动设计
摘要: 随着信息技术的发展,DSP在现代电子系统设计中得到了广泛的应用,并且DSP的FLASH自启动在DSP的系统设计中也占有重要的地位,DSP/BIOS是TI推出的嵌入式实时操作系统。 关键词: TMS320C6713;引导启动;DSP/BIOS实时操作系统 FLASH是非易失的重复可读写存储器,其读写速度较慢,常用来存储系统设计的程序,微处理器通过一定的方式将FLASH中的程序读取到处器内部运行,而TI公司的C6000系列的DSP内部没有FLASH,故DSP的程序需要烧到外部的FLASH中,在上电后,DSP会通过二次引导将程序从外部的FLASH读取到DSP内部RAM或SDRAM中,高速执行。TI的C6000 DSP支
[嵌入式]
基于TMS320C6000 DSP及DSP/BIOS系统的<font color='red'>Flash</font>引导自启动设计
SD卡的详细资料
1、简介 SD卡是基于flash的存储卡。 SD卡和MMC卡的区别在于初始化过程不同。 SD卡的通信协议包括SD总线和SPI两类。 SD卡使用卡内智能控制模块进行FLASH操作控制,包括协议、安全算法、数据存取、ECC算法、缺陷处理和分析、电源管理、时钟管理。 通信电压范围:2.0-3.6V;工作电压范围:2.0-3.6V 最大读写速率:10Mbyte/s 最大10 个堆叠的卡(20MHz,Vcc=2.7-3.6V) 2:卡类型 MMC卡: MultiMedia card, 有 7 个触点( 引脚),分为两种操作模式,分别为 MMC模式与SPI 模式,两种模式对引脚的定义是不同的。
[单片机]
SD卡的详细资料
stm32专题二十九:Flash 读写保护
设置Flash的读写保护,其实就是操作内部Flash的选项字节。 选项字节在内部Flash的主存储页之后,由于是Flash,不能像内存RAM一样随意写入。由于Flash的写入特性,只能将 1 写成 0,而如果要确保写入数据的绝对正确,则需要先擦除再写入。如果直接对Flash写入,则只能确保写入 0 值是正确的。 选项字节,可以认为是掉电不会丢失的寄存器(Flash空间)。就是用Flash介质来存储配置,要修改选项字节,跟修改Flash一样。 RDP 读保护字节描述(可以通过j-link或st-link读Flash 加密等): RDP配置方式: 2个数据字节 Data0 Data1 3 设置写保护 RDP
[单片机]
stm32专题二十九:<font color='red'>Flash</font> 读写保护
如何使用STM32F4中的CCM内存
我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢? 首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。 我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。 这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA访问,显然会出问题
[单片机]
如何使用STM32F4中的CCM<font color='red'>内存</font>
ATmega16 Flash程序存储器
系统内可编程的Flash 程序存储器 ATmega16具有16K字节的在线编程Flash,用于存放程序指令代码。因为所有的AVR指令为16 位或32 位,故而Flash 组织成8K x 16 位的形式。用户程序的安全性要根据Flash程序存储器的两个区:引导(Boot) 程序区和应用程序区,分开来考虑。 Flash存储器至少可以擦写10,000次。ATmega16的程序计数器(PC)为13位,因此可以寻址8K 字的程序存储器空间。引导程序区以及相关的软件安全锁定位请参见 P234“ 支持引导装入程序 – 在写的同时可以读(RWW, Read-While-Write) 的自我编程能力” ,而 P247“存储器编程” 详述了用SPI
[单片机]
ATmega16 <font color='red'>Flash</font>程序存储器
如何通过STM32CubeMX制作外部Flash的烧写驱动 (.stdlr)
前言 目前,越来越多的应用需要扩展外部的Flash来满足存储需求。那么,在调试及批量生产的过程中,需要对外扩的Flash进行烧录操作。由于STM32 ST-LINK Utility以及STM32CubeProgrammer中,对Flash支持的型号有限,只能覆盖一部分MCU和Flash的型号,无法完全满足客户的需求。而且,它提供的external loader的制作模板存在覆盖的芯片型号较少,且无法前期QSPI Flash调试的问题。本文旨在提供一种通过stm32CubeMX制作external Flash loader的方法。客户可以根据自己的型号,进行定制化的生成。本文中,以某客户实际使用的MCU(STM32H750) 和Fl
[单片机]
如何通过STM32CubeMX制作外部<font color='red'>Flash</font>的烧写驱动 (.stdlr)
小广播
设计资源 培训 开发板 精华推荐

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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