.map文件是STM32开发中非常重要的一个文件,在该文件中可以详细的查看单个文件、函数及用户定义的全局变量等的占用RAM和ROM(一般为片内FLASH)的空间大小,通过了解这些信息可以很方便的进行代码的优化。

在MDK5中,生成的.map文件包含的内容可以在Options for Target--->Listing中如下界面中进行配置,默认是全选的,用户也可以根据自己的需求进行选择,如只生成Total info信息。在配置好map生成选项后编译整个工程,双击Project框中的项目名称即可打开.map文件。若使用的是STM32CubeMX生成的工程,则可能双击无法打开.map文件,具体解决方法参考这篇文章:

在STM32CubeMX生成的MDK5工程上添加RT-Thread Nano后双击工程名无法打开.map文件的解决方法

默认生成的.map文件由以下几部分构成:

1)Section Cross References

该部分描述了不同函数之间(可能在同或不同文件中)的调用关系。

在.map中生成该部分信息需要勾选下图中的标签4:

.map文件中生成的信息如下所示(部分截图):

第一行startup_stm32f103xb.o(RESET) refers to startup_stm32f103xb.o(STACK) for __initial_sp说明:startup_stm32f103xb.o文件中的“RESET”段为它使用的__initial_sp引用了startup_stm32f103xb.o文件中的“STACK”段。

有时候在编译工程时会报错,提示"Undefined symbol xxx(referred from yyy.o)",这表明在链接的过程中,yyy.o文件中引用的xxx符号并没有被定义,此时我们需要打开yyy.c或yyy.s文件查看xxx是否被定义,没定义需加上定义。

.o文件是.c文件或.s文件编译后生成的目标文件,各个文件及文件内的段是相互独立的,链接器根据它们之间的相互引用将各文件链接起来。

2)Removing Unused input sections from the image.

该部分描述了被MDK编译器优化掉的在链接过程中链接器发现的并未在工程中被引用的段或函数。这里需要注意的是,这部分并非在.o文件中被删除的,而是在链接器将这些.o文件链接生成.axf文件的过程中忽略掉这些无用部分,只将有用到的部分添加进.axf文件,如此可以有效的减少代码占用空间大小。

在.map中生成该部分信息需要勾选下图中的标签7:

.map文件中生成的信息如下所示(部分截图):

在MDK中可以通过勾选Options for Target--->C/C++--->One ELF Section per Function选项进行多余函数优化,若不勾选该选项也会进行部分函数优化,但不够彻底

下面通过实例说明勾选和不勾选One ELF Section per Function对生成的工程的影响:

  • 当勾选Options for Target--->C/C++中的One ELF Section per Function后在.map文件中生成的Removing Unused input sections from the image部分总结果如下:

共优化了529个函数,减少占用空间30270Bytes

  • 当取消勾选Options for Target--->C/C++中的One ELF Section per Function后在.map文件中生成的Removing Unused input sections from the image部分总结果如下:

共优化了121个函数,减少占用空间3806Bytes

通过以上对比可发现,勾选Options for Target--->C/C++--->One ELF Section per Function相比于不勾选要减少代码空间为26464Byte(30270 - 3806 )。这部分优化的空间最终会体现在Program Size中的Code大小上(60560 - 35716 = 24844Bytes),因此该选项对工程代码的优化有很大的作用,建议要勾选上这个选项。

3)Image Symbol Table

该部分描述了Local Symbols和Global Symbols,即局部标号和全局标号。

在.map中生成该部分信息需要勾选下图中的标签3:

.map文件中生成的信息如下所示(部分截图):

Local Symbols主要指的是通过static声明的全局变量地址和大小,.c文件中函数的地址和用static声明的函数代码的大小,汇编文件中的作用域限定在本文件中的标号地址。如被限定在某个.c文件中使用的函数一般用static进行修饰防止和其它文件中的同名函数冲突,如在某个函数内部通过static声明的变量虽然具有全局的生命周期但其只能在该函数中被访问。

Global Symbols主要是指不是用static声明的全局变量的地址和大小,.c文件中和函数的地址及其代码大小,汇编文件中作用域为全工程的标号地址。

4)Memory Map of the image

该部分描述了映像文件的内存映射。

在.map中生成该部分信息需要勾选下图中的标签1:

.map文件中生成的信息如下所示(部分截图):

映像文件分为加载域(Load Region)和执行域(Execution Region):

加载域反映了程序中各个段存放在ROM(FLASH)存储器中时的位置关系,Load Region LR_IROM1 (Base: 0x08000000, Size: 0x0000ffb4, Max: 0x00010000, ABSOLUTE, COMPRESSED[0x0000f744])中的Base表示程序从0x08000000处开始保存,Size表示程序实际占用ROM(一般为内部FLASH)空间为0x0000ffb4 Bytes,Max表示芯片最大的ROM空间为0x00010000。

执行域是芯片上电后开始执行代码的时候的运行状态,Execution Region ER_IROM1 (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x0000ef94, Max: 0x00010000, ABSOLUTE)中的Base表示执行域从0x08000000处开始,Size表示执行域空间大小为0x0000ef94 Bytes,Max表示芯片最大的ROM空间为0x00010000。

映像中的入口点Image Entry point是程序开始执行的地方,为_main函数起始的地方,而不是Reset_Handler。

RAM上的普通变量只需4字节对齐,但是栈空间的边界需要8字节对齐。

5)Image component sizes

该部分描述了映像文件的组件大小,组件指的是单个的源文件,因为一个项目工程是由很多个.c文件组成的。这里会列举单个.c文件所占用的空间大小(RAM和ROM),具体为Code、inc.data(内联函数)、RO-Data、RW-Data、ZI-Data,并根据这些信息统计出程序占据的总RAM和ROM空间的大小。

在.map中生成该部分信息需要勾选下图中的标签5:

  1. Code:代码段,存放程序的代码部分
  2. RO-Data:只读数据段,存放程序中定义的常量
  3. RW-Data:读写数据段,存放初始化为非0值得全局变量
  4. ZI-Data:0数据段,存放初始化为0的全局变量或未初始化的全局变量(程序运行时会对未初始化的全局变量自动清0)

.map文件中生成的信息如下所示(部分截图):

从如上汇总信息可以看出,整个程序下载到STM32的ROM(FLASH)中时占用的空间大小为从0x08000000开始的38440字节 (Code + RO Data + RW Data) 。当程序运行时,占用的RAM空间大小为从0x20000000开始的11152字节(RW Data + ZI Data)。

.map文件中名词的解释:

  • section:映像文件的代码和数据块
  • RO:Read-Only,包括RO-Data(只读数据)和RO-Code(代码)
  • RW:Read-Write,指的是RW-Data,即读写数据段,存放初始化为非0值的全局变量
  • ZI:Zero-Initialized,指的是ZI-Data,0数据段,存放初始化为0的全局变量或未初始化的全局变量(程序运行时会对未初始化的全局变量自动清0)
  • .text:与RO-Code意义相同
  • .constdata:与RO-Data意义相同
  • .bss:与ZI-Data意义相同
  • .data:与RW-Data意义相同

htm文件:

基本统计了所有被调用函数的栈stack的使用情况(不考虑中断嵌套,因为中断嵌套是不可预测的),会给出函数调用时最大的栈深度,如此可以方便评估究竟需要开辟多大的栈空间。

参考资料:

安富莱:MDK生成的map和htm文件分析

《ARM Cortex-M3与ARM Cortex-M4权威指南》(第3版)

STM32 MDK编译后生成的 .map文件深入分析相关推荐

  1. MDK编译后生成bin文件占用FLASH大小说明

    转自:http://blog.csdn.net/kuangdoushi/article/details/69499933 MDK编译程序完成后,如下所示: linking... Program Siz ...

  2. c语言编译生成的目标文件拓展名,系统默认的C语言源程序文件的扩展名是(),经过编译后生成的目标文件的扩展名是(),经过连接后生成的可执行文件的扩展名是()。...

    系统序文常用的密钥分发技术有 CA 技术和[] 技术. 默认名名探究精神的重要性体现在以下哪些方面?() 如果采用偶校验,的目的可的扩0101010的校验位是(),0011011的校验位是(). 语言 ...

  3. JAVA编译成文件的说法_下列关于使用Javac命令编译后生成文件的说法中,正确的是?...

    下列关于使用Javac命令编译后生成文件的说法中,正确的是? 答:编译后生成的文件可以在Java虚拟机中运行\n\n编译后生成的文件为二进制文件\n\n编译后生成文件的后缀名为.class 线性表的链 ...

  4. 包含内部类的.java文件编译后生成几个.class文件

    如果一个类有内部类,编译将生成几个字节码文件,规则是怎样呢? 写在前,自己动手丰衣足食,结论只有个人实验支持,没有官方数据支持,欢迎自行查阅文档然后来指正,轻喷,谢谢. 1.普通类包含内部类的样例 p ...

  5. java编译生成哪些文件_java编译后生成什么文件?生成的文件包括什么?

    在大家编译完java程序的时候,都是会生成一个文件的,作为java新手不清楚java编译后生成什么文件?那么今天我们就给大家讲解一下这方面的内容,大家可以参考下文哦! java文件编译过后会生成一个c ...

  6. java源程序是由类定义_无论Java源程序包含几个类的定义,若该源程序文件以A.java命名,编译后生成的都只有一个名为A的字节码文件...

    无论Java源程序包含几个类的定义,若该源程序文件以A.java命名,编译后生成的都只有一个名为A的字节码文件 答:× 小儿头皮静脉输液时如误注入动脉,局部表现为: 答:呈树枝状苍白 人民群众既是历史 ...

  7. KEIL5 MDK编译后出现.\Output\led.axf: Error: L6218E: Undefined symbol SystemInitreferred from startup_解决方案

    KEIL5 MDK 编译后出现错误提示信息 .\Output\led.axf: Error: L6218E: Undefined symbol SystemInit (referred from st ...

  8. vue打包后出现一些map文件的解决方法

    Vue打包后出现一些map文件的解决办法: 问题: 可能很多人在做vue项目打包,打包之后js中,会自动生成一些map文件,那我们怎么把它去掉不要呢? 1.运行  cnpm run build  开始 ...

  9. c#:Reflector+Reflexil 修改编译后的dll/exe文件

    原文:c#:Reflector+Reflexil 修改编译后的dll/exe文件 不知道大家有没有这样的经历:现场实施时测试出一个bug,明明知道某个dll/exe文件只要修改一二行代码即可,但手头没 ...

最新文章

  1. PHP框架编写和应用知识点,写PHP框架需要具备那些知识?
  2. Android--表格布局
  3. Scala偏函数使用示例
  4. android view rotate,Android使用RotateImageView 旋转ImageView
  5. python的print语句有哪些_Python语句print(type([1,2,3,4]))的输出结果是。
  6. C++中若类中没有默认构造函数,如何使用对象数组
  7. 【Computer Organization笔记29】大作业展示
  8. 检测到无效的异常处理程序例程。_异常控制流(1):异常概述和基本类型
  9. 推荐系统笔记二、矩阵分解协同过滤
  10. thinkphp下nginx重写index.php
  11. 基于 CODING 的 Spring Boot 持续集成项目 1
  12. java购物系统需求分析_java网上购物系统需求分析报告.doc
  13. php蝠衭厍桴埭钨,有没办法判断输入汉字的笔划数?
  14. 北京林业大学计算机考研录取分数线,2017北京林业大学各专业考研复试分数线...
  15. 解决Gradle‘s dependency cache may be corrupt (this sometimes occurs after a network connection timeout
  16. xlsx表格怎么做汇总统计_办公软件excel表格数据统计-如何将多个EXCEL表格的数据进行汇总?...
  17. nyoj-506-洗澡
  18. 虚拟 DOM 是什么 有什么优缺点
  19. 动手学EDA--模型融合
  20. linux18.04循环登陆,在Ubuntu 18.04 Bionic Beaver Linux上启用自动登录

热门文章

  1. mybatis查询返回空,SQL数据库执行有数据!
  2. jQuery Validate 前端校验
  3. ActiveMQ Cannot send, channel has already failed: tcp:127.0.0.1:8161
  4. 面试必备:多线程学习(一)
  5. cesium 设置地球默认区域为中国 一键返回默认区域
  6. 13新功能_再聊聊灵感盒 -Marginnote 3.6.12/13新功能
  7. Java序列化报错serialVersionUID不一致
  8. c# mysql executenonquery_C#中ExecuteNonQuery()返回值注意点分析
  9. mysql 51cto 数据类型_Mysql支持的数据类型
  10. 三星s7共享网络给linux,三星Galaxy S7WiFi状态下可以共享wifi热点吗【详解】