历史上的今天
返回首页

历史上的今天

今天是:2024年08月27日(星期二)

正在发生

2019年08月27日 | 【STM32H7教程】第10章 STM32H7的FLASH,RAM和栈使用情况

2019-08-27 来源:eefocus

10.1 初学者重要提示

1、为了更好的学习本章知识点,可以看之前做的视频教程第11章,针对H7也将在今年发布视频教程:


http://forum.armfly.com/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.PrintfLogo) for PrintfLogo表示main.c文件中的main函数调用了PrintfLogo。


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文件。

推荐阅读

史海拾趣

EMC Component Group公司的发展小趣事

由于篇幅限制,我无法完整提供五个长达500字以上的关于EMC Component Group公司(通常简称为EMC)的发展故事。然而,我可以概述五个与公司发展历程相关的重要事件或阶段,每个事件以精简的方式描述。

  1. 成立与初期发展

1979年,Richard Egan和Roger Marino两位创始人决定不再为别人打工,共同创立了EMC公司。最初,公司的业务并不专注于存储,而是销售办公家具。随着对市场的深入了解,他们发现了内存市场的商机,开始成为英特尔的渠道代理,为小型机提供内存。这一转变为EMC积累了第一桶金,也为公司未来的发展奠定了重要基础。

  1. 业务转型与内存业务的发展

在一位客服的建议下,EMC开始研发并销售Prime Computer的兼容内存。这些产品以同类产品一半的价格提供更高的性能,迅速在市场上获得认可。随着内存业务的不断发展,EMC逐渐成为了该领域的领导者。

  1. 存储解决方案的推出

进入21世纪,EMC开始将业务重心转向存储解决方案。2002年,公司推出了Centera,这是世界上第一个内容寻址存储(CAS)解决方案。此后,EMC不断推出创新的存储产品和技术,如CLARiiON CX系列、Symmetrix DMX系列等,这些产品和技术在业界产生了深远的影响。

  1. 云存储与软件定义技术的探索

随着云计算和软件定义技术的兴起,EMC也开始了在这一领域的探索。2014年,公司收购了全闪存初创公司,并试图将自己变成灵活的云供应商。此外,EMC还通过升级高端和低端产品线扩展了其产品线,并推出了针对闪存的基础特性进行开发和设计的XtremIO产品。

  1. 与Dell的合并

在EMC的发展历程中,一个重要的里程碑是与Dell的合并。这次合并不仅加强了EMC在存储和云计算领域的实力,也为其未来的发展提供了更广阔的空间。合并后,EMC成为了Dell Technologies的一部分,继续为全球客户提供创新的存储和云计算解决方案。

Endicott Research Group Inc (ERG)公司的发展小趣事

自1979年起,Endicott Research Group(ERG)就开始涉足电源转换产品的制造领域。在初创时期,公司面临着资金紧张和技术挑战,但团队坚持创新,专注于为LCD背光供电的LED驱动器及相关电源设备的研发。通过不断的试验和改进,他们成功地开发出了一系列高效稳定的产品,为公司的后续发展奠定了坚实的基础。这一时期的艰苦奋斗和技术积累,成为了ERG发展历程中的重要篇章。

Aimtec公司的发展小趣事

作为一家注重品质的企业,Aimtec公司深知质量管理体系的重要性。因此,公司投入大量资源,建立了完善的质量管理体系,并通过了ISO 9001:2015等国际质量管理体系认证。这些认证不仅证明了Aimtec公司在质量管理方面的实力,也为公司的业务拓展提供了有力的保障。通过持续的质量改进和创新,Aimtec的产品在行业中赢得了良好的口碑。

Gems Sensors & Controls公司的发展小趣事

面对激烈的市场竞争和不断变化的市场需求,Gems Sensors & Controls公司始终保持着敏锐的洞察力和灵活的应变能力。公司不断调整和优化产品结构,提升产品质量和服务水平,以更好地满足客户的需求。同时,Gems还积极开拓新的市场领域和应用场景,不断拓展自身的业务范围和市场份额。这些努力使得Gems在电子行业中持续保持领先地位,并实现了持续稳定的增长。

DLP Design公司的发展小趣事

DLP精工科技公司,一直秉承“品质至上”的经营理念,在DLP技术产品的设计和制造过程中严格把控品质。公司拥有一支专业的研发团队和先进的生产设备,确保每一件产品都符合高标准的质量要求。通过不断的技术创新和产品升级,DLP精工科技在电子行业中树立了良好的品牌形象,赢得了消费者的信赖和认可。

Gumstix公司的发展小趣事
检查电路中是否有异物导致短路,清理异物并修复受损部分。

问答坊 | AI 解惑

有关电源的资料 很全的

本帖最后由 paulhyde 于 2014-9-15 09:39 编辑 这里面是我最近搜到的不少电源的资料 感觉有用的来看看吧  …

查看全部问答>

怎么通过编程的方式获得Windows CE的QFE的安装情况。

相关的MSDN上已经说了,CEQFECheck.exe操作的是windows目录下的WinCEPB500.ini文件,也看了,但是觉得不足以提供足够的信息。 如何才能判断某个QFE是否安装?或者是列出已经安装的QFE?…

查看全部问答>

SDRAM的检测

各位英雄:      我的PDA系统基于PXA255+WCE4.2平台,硬件上有128M的SDRAM连接,但是现在系统只能使用64M的SDRAM作为内存,如果修改内存为128M,系统无法启动。初步分析,或者硬件上出现问题,即硬件上有64M的SDRAM是坏的;或 ...…

查看全部问答>

Ardence RTX 进程通信的问题

      刚开始学习Ardence RTX没多久,现在在看进程通讯,试着编了两个简单的程序(都是在VC ++ 6.0下编的):一个用 RTX Driver Wizard向导写了一个RTSS进程,主要是建立一些信号量和一个共享内存;另一个是用Win32 Console A ...…

查看全部问答>

高速USB数据采集系统的设计

本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 在图像处理、瞬态信号测量等一些高速、高精度的应用中,需要进行高速数据采集。USB 2.0接口以其高速率等优点渐有取代传统ISA及PCI数据总线的趋势,热插拔特性也使其成为各种PC外设的首选接口。 ...…

查看全部问答>

新手求助

请教各位大侠一个问题。本人用普通IO口做一路PWM信号,由于频率在比较高,且要可调脉宽(256档),所以想把PWM的输出做在基准定时的中断服务程序里。程序如下: @far @interrupt void TIM6_UPD_OVF_TRG_IRQHandler(void) { unsigned char ...…

查看全部问答>

程序问题求教!

430f2272的程序,不加中断程序运行正常。加一段中断程序后,程序执行很慢,就在下面的初始化程序里出不来了,像是进入了低功耗模式 WDTCTL = WDTPW + WDTHOLD; //stop watchdog timer { volatile int i; for (i=1;i<0xFFFF;i++){} ...…

查看全部问答>

用两片单片机实现红外遥控

最近在搞红外遥控,我想用两片单片机实现,一个作为发射,一个作为接收,感觉好多程序都差不多,没多少区别,但经过修改总不出结果,有做这方面的高人个指点下,谢谢!…

查看全部问答>

这里有人画过4层板的吗?趁着这国庆期间··我想练习下画4层板啊

漫漫长假不知道干嘛好··哪位大侠有画4层板的电路图呢··给我共享一份吧··小女子在次谢过啦··…

查看全部问答>

富士通FM3板子JP2啥意思啊?

今天,看了下原理图发现,JP2写的是5V或3.3V,不明白啥意思。请大家讲讲。 附部分原理图及说明截图。   …

查看全部问答>