0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32的map文件详细教程

汽车玩家 来源:嵌入式大杂烩 作者:嵌入式大杂烩 2020-04-04 17:19 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前几个月针对公司自己的芯片写了个程序,这个程序有个硬性要求,就是能用的FLASH空间只有4KB,之前已经写得差不多了,最终占用空间3.6KB。这不,最近又得加需求,还剩一点点FLASH空间可以使用,这该如何是好。需求已经加过来了,不行也得行啊。所以就得去优化之前的代码了,这就得研究比较底层的东西了。

我们的芯片与其它的MCU芯片用起来都差不多一样。我们在用ST的时候,编译完成,会生成很多文件,其中有一个.map文件,里面包含的信息就是工程 ROM/FLASH 和 RAM 的占用情况 。之前只是关心.map文件的最后几行的 ROM/FLASH占用信息,如:

STM32的map文件详细教程

这次就得认真的学习一下这个文件了,只有清楚的知道这些信息才可以很好的进行代码优化 。下面我们来一起学习一下STM32的.map文件。(以下内容来自于野火及安富莱教程文档)

map文件

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

STM32的map文件详细教程

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

STM32的map文件详细教程

map文件的内容可分为如下几部分:

1、节区的跨文件引用(Section Cross References) 2、删除无用节区(Removing Unused input sections from the image) 3、符号映像表(Image Symbol Table (Local Symbols Global Symbols) 4、存储器映像索引(Memory Map of the image) 5、映像组件大小(Image component sizes)

1、节区的跨文件引用

STM32的map文件详细教程

这部分主要是不同文件中函数的调用关系。在这部分中,详细列出了各个.o 文件之间的符号引用。由于.o 文件是由 asm 或 c/c++源文件编译后生成的,各个文件及文件内的节区间互相独立,链接器根据它们之间的互相引用链接起来,链接的详细信息在这个Section Cross References一一列出。

例如,开头部分说明的是 startup_stm32f429_439xx.o 文件中的“RESET”节区分为它使用的__initial_sp符号引用了同文件“STACK”节区。也许我们对启动文件不熟悉,不清楚这究竟是什么,那我们继续浏览,可看到 main.o文件的引用说明,如说明 main.o 文件的 i.main 节区为它使用的 LED_GPIO_Config 符号引用了 bsp_led.o 文件的 i.LED_GPIO_Config 节区。

有时在构建工程的时候,编译器会输出 “Undefined symbol xxx (referred from xxx.o)” 这样的提示,该提示的原因就是在链接过程中,某个文件无法在外部找到它引用的标号,因而产生链接错误。

2、删除无用节区

map 文件的第二部分是删除无用节区的说明,见代码清单 51-11。

STM32的map文件详细教程

这部分列出了在链接过程它发现工程中未被引用的节区,这些未被引用的节区将会被删除(指不加入到.axf 文件,不是指在.o 文件删除),这样可以防止这些无用数据占用程序空间。

例如,上面的信息中说明 startup_stm32f429_439xx.o 中的 HEAP(在启动文件中定义的用于动态分配的“堆”区)以及 stm32f4xx_adc.o 的各个节区都被删除了,因为在我们这个工程中没有使用动态内存分配,也没有引用任何 stm32f4xx_adc.c 中的内容。由此也可以知道,虽然我们把 STM32 标准库的各个外设对应的 c 库文件都添加到了工程,但不必担心这会使工程变得臃肿,因为未被引用的节区内容不会被加入到最终的机器码文件中。

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

STM32的map文件详细教程

3、符号映像表

map 文件的第三部分是符号映像表(Image Symbol Table), 见代码清单 51-12。

STM32的map文件详细教程

这个表列出了被引用的各个符号在存储器中的具体地址、占据的空间大小等信息。如我们可以查到LED_GPIO_Config 符号存储在 0x080002a5 地址,它属于 Thumb Code 类型,大小为 106 字节,它所在的节区为 bsp_led.o 文件的 i.LED_GPIO_Config 节区。

4、存储器映像索引

map 文件的第四部分是存储器映像索引(Memory Map of the image), 见代码清单:

STM32的map文件详细教程

映像文件可以分为加载域(Load Region)和运行域(Execution Region) 。简单的说,加载域就是程序在 Flash 中的实际存储,而运行域是芯片上电后的运行状态,通过下面的框图可以有一个感性的认识:

STM32的map文件详细教程

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

本工程的存储器映像索引分为 ER_IROM1 及 RW_IRAM1 部分,它们分别对应 STM32内部 FLASH 及 SRAM 的空间。相对于符号映像表,这个索引表描述的单位是节区,而且它描述的主要信息中包含了节区的类型及属性,由此可以区分 Code、 RO-data、 RW-data及 ZI-data。

例如,从上面的表中我们可以看到 i.LED_GPIO_Config 节区存储在内部 FLASH 的0x080002a4 地址,大小为 0x00000074,类型为 Code,属性为 RO。而程序的 STACK 节区(栈空间)存储在 SRAM 的 0x20000000 地址,大小为 0x00000400,类型为 Zero,属性为RW(即 RW-data) 。

5、映像组件大小

map 文件的最后一部分是包含映像组件大小的信息(Image component sizes),这也是最常查询的内容,见代码清单 :

STM32的map文件详细教程

这部分包含了各个使用到的*.o 文件的空间汇总信息、整个工程的空间汇总信息以及占用不同类型存储器的空间汇总信息,它们分类描述了具体占据的 Code、 RO-data、 RW-data及 ZI-data 的大小,并根据这些大小统计出占据的 ROM 总空间。

综合整个 map 文件的信息,可以分析出,当程序下载到 STM32 的内部 FLASH 时,需要使用的内部 FLASH 是从 0x0800 0000 地址开始的大小为 1456 字节的空间;当程序运行时,需要使用的内部 SRAM 是从 0x20000000 地址开始的大小为 1024 字节的空间。

总结

对照着这个map文件再看看我的程序,就可以知道哪里占的flash空间多了。硬件相关的部分已经用寄存器来操作,协议处理部分占用的flash空间最多。

最后,对于.map文件,我们一般只需要了解最后几行即可。如果想要深入学习,可以参照野火及安富莱的教程文档进行学习。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FlaSh
    +关注

    关注

    10

    文章

    1715

    浏览量

    154744
  • STM32
    +关注

    关注

    2305

    文章

    11124

    浏览量

    371261
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    请问如何打开map文件

    如何打开map文件
    发表于 11-28 07:17

    请问Keil中的map文件到底是什么意思?

    Keil中的map文件到底是什么意思?里面是如何进行相关执行操作的
    发表于 11-25 06:59

    在Keil5中查看栈大小

    为需要的大小,然后保存并重新编译工程,新的栈大小即可生效。 2、查看.map文件: 方法说明:在Keil MDK中编译工程后,会生成一个.map文件,该
    发表于 11-14 06:32

    STM32CubeIDE使用教程

    内容详细,适合转向STM32CubeIDE,它免费,没有代码容量限制
    发表于 09-02 16:16 6次下载

    【正点原子STM32MP257开发板试用】基于 DeepLab 模型的图像分割

    import NeuralNetwork def load_label_map(label_file): \"\"\"从标签文件加载类别映射关系(每行一个类别
    发表于 06-21 21:11

    飞凌嵌入式ElfBoard ELF 1板卡-uboot编译system.map/uboot.map

    情况。u-boot.map中包含了链接过程中涉及到的目标文件以及其所依赖的库文件中的各个符号的地址信息,以及我们所涉及到的函数所在目录信息,这里不再展开讲,有兴趣的同学可以自己查看研究。
    发表于 05-22 11:22

    STM32G431移植FreeModbus

    STM32G431移植FreeModbus 的代码已通过验证,在WeActStudio的STM32G431CoreBoard上进行多次测试,均可正常读取寄存器数值。STM32G431CoreBoard可在我上传的相关
    发表于 04-19 16:50 1次下载

    S32G3有没有办法从.map文件确定SRAM使用情况?

    我有 NXP S32G3 板。我有 .map 文件。有没有办法从 .map 文件确定 SRAM 使用情况。 非常感谢帮助。
    发表于 04-08 06:00

    STM32CubeMX无法打开.ioc文件怎么解决?

    我的STM32CubeMX不能打开别人的工程文件,双击打开.ioc文件后会全白,只剩左上角有个home,什么也点不了,但是我自己可以创建工程,也可以打开我自己创建的工程。请问我该如何解决
    发表于 03-12 07:39

    STM32的上电启动过程分享

    、PC然后是“启动文件”,一般主要是项目文件里面的startup_xxxxx.s文件。xa0 xa0 其实不光STM32系列单片机是这样,我们接触的NXP的微控制器、TI的MSP430
    发表于 03-07 08:09

    STM32H743对关键中断函数,使用ITCM搬至RAM运行,仿真进入HardFault_Handler报错怎么解决?

    STM32H743对关键中断函数,使用ITCM搬至RAM运行,STM32CubeIDE仿真进入HardFault_Handler报错。其中,ITCM已查找网上多篇教程,修改了ld链接文件
    发表于 03-07 08:04

    模型无法获得mAP值等于1.00的原因是什么?

    量化了大小为 416 x 416 的 YOLOv4 模型,并获得了正确的 mAP 值。 使用以下命令量化大小为 320 x 544 的 YOLOv4 模型:pot -c
    发表于 03-07 07:21

    STM32开发板教程之STM32开发指南免费下载

    介绍了几个常用的系统文件(程序);3,实战篇,主要通过 56 个实例(绝大部分是直接操作寄存器完成的)带领大家一步步深入 STM32 的学习。   本指南为 ALIENTEK 战舰 STM32 开发板的配套教程,在开发板
    发表于 02-28 09:08 179次下载

    STM32F1开发指南

    这本书详细讲述了STM32HAL库开发的配置流程,非常详细
    发表于 01-21 15:33 3次下载

    小白必看!Gerber文件详细解读

    在电子制造领域,Gerber 文件可是大名鼎鼎,它堪称是 PCB(Printed Circuit Board,印刷电路板)制造的 “设计蓝图”。从简单的电子小玩意儿,到复杂高端的航天设备,只要涉及
    的头像 发表于 12-30 10:49 2.6w次阅读
    小白必看!Gerber<b class='flag-5'>文件</b>超<b class='flag-5'>详细</b>解读