一、要让Keil生成map文件,要设置:

再重新编译,没有错误后,就会生成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同义

三、文件分析流程

第一部分:Section Cross References(模块、段的交叉引用关系)
主要是各个源文件生成的模块之间相互引用的关系。“refer to”是引用的意思,比如:

main.o(i.main) refers to led.o(i.LED_Init) for LED_Init

首先main.c和led.c会被编译成目标文件main.o和led.o。i.main是main.c中main函数的入口(也是main函数编译出的段,函数编译后以段的形式存在,函数之间的引用,也就是段与段之间的引用)。i.LED_Init是led.c中LED_Init函数的入口(也是LED_Init函数编译出的段)。因此上面这句话意思就是main.c中的main函数引用了led.c中的LED_Init函数,剩下的基本都是这类的意思。

main.o(i.main) refers to sys.o(i.Cache_Enable) for Cache_Enable
main.o(i.main) refers to stm32h7xx_hal.o(i.HAL_Init) for HAL_Init
main.o(i.main) refers to sys.o(i.Stm32_Clock_Init) for Stm32_Clock_Init
main.o(i.main) refers to delay.o(i.delay_init) for delay_init
main.o(i.main) refers to usart.o(i.uart_init) for uart_init
main.o(i.main) refers to led.o(i.LED_Init) for LED_Init

其中有关于启动代码的引用说明:

stm32f10x_vector.o(.text) refers to __main.o(!!!main) for __main
__main.o(!!!main) refers to kernel.o(.text) for __rt_entry
kernel.o(.text) refers to usertask.o(.text) for main

上面这几个对于程序意义比较重大用户在启动代码中调用了__main.o模块中的__main函数,__main又调用了kernel.o中的__rt_entry函数,最后kernel.o又调用了用户定义的main主函数。

第二部分:Removing Unused input sections from the image(移除未使用的段)
就是将库中没有用到的函数从可执行映像中删除掉,减小程序的体积。

    Removing os_mbox.o(.text), (1094 bytes).Removing os_mutex.o(.text), (1744 bytes).Removing os_sem.o(.text), (1016 bytes).

最后一栏有个总的统计结果:

2737 unused section(s) (total 289508 bytes) removed from the image.

总共移除了2737个未使用的段,共289508字节。

第三部分:Image Symbol Table(映射符号表,列出了各个段所存储的对应地址)

分为Local Symbols局部 和 Global Symbols全局。

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

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

1、Symbol Name:符号名称

2、Value:存储对应的地址;

大家会发现有0x0800xxxx、0x2000xxxx这样的地址。

0x0800xxxx指存储在FLASH里面的代码、变量等。

0x2000xxxx指存储在内存RAM中的变量Data等。

3、Ov Type:符号对应的类型

符号类型大概有几种:Number、Section、Thumb Code、Data等;

细心的朋友会发现:全局、静态变量等位于0x2000xxxx的内存RAM中。

4、Size:存储大小

这个容易理解,我们怀疑内存溢出,可以查看代码存储大小来分析。

5、Object(Section):当前符号所在段名

这里一般指所在模块(所在源文件)。

第四部分:Memory Map of the image(映像的内存分布)

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

1、Exec Addr:运行域地址

2、Load Addr:加载域地址

3、Size:存储大小

4、Type:类型

Data:数据类型

Code:代码类型

Zero:未初始化变量类型

PAD:这个类型在map文件中放在这个位置,其实它不能算这里的类型。要翻译的话,只能说的“补充类型”。

ARM处理器是32位的,如果定义一个8位或者16位变量就会剩余一部分,这里就是指的“补充”的那部分,会发现后面的其他几个选项都没有对应的值。

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

加载域就是程序在Flash中的实际存储,而运行域是芯片上电后的运行状态,因为MCU没上电时RAM中没有数据,所以此时所有的东西(包括代码、变量、初始值等)都是存放在flash中的,当上电后又要把变量等复制到RAM中才能正常运行。

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

第五部分: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 中的调试信息。

STM32 KEIL里的MAP文件分析相关推荐

  1. map文件分析 stm32_使用STM32内部Flash额外的空间来存储数据

    本次分享关于STM32内部FLASH的笔记. STM32 芯片内部的 FLASH 存储器,主要用于存储我们代码.如果内部FLASH存储完我们的代码还有剩余的空间,那么这些剩余的空间我们就可以利用起来, ...

  2. STM8S103 解决Rom空间不足 Map文件分析

    STM8S103只有8KRom,很容易造成空间不足.对于空间不足,我们就要从map文件着手分析,究竟哪些函数占了多少空间,map文件分为几部分:Segments(总括了各个段所占的空间), Modul ...

  3. map文件分析 stm32_浅谈STM32的启动过程

    分享这篇文章,谈一下STM32启动流程.如果读者朋友已经有过汇编相关基础,能够够好理解本文内容.汇编语言是比C语言更接近机器底层的编程语言,能让我们更好的理解和操纵硬件底层. STM32三种启动模式 ...

  4. 二、IAR for ARM中STM32项目创建及其启动文件分析

    IAR for ARM STM32F10X官方固件库: 链接: https://pan.baidu.com/s/1U6vfGqp9IhhkvVuDXcxTtQ 提取码: 9mcx IAR for AR ...

  5. Keil的.map文件

    keil中的Map文件 1.map文件在哪里 2.map文件有什么作用 3.map文件分析 1.Section Cross References:模块.段(入口)交叉引用 2.Removing Unu ...

  6. STM32跳入HardFault Handler中断分析

    为什么80%的码农都做不了架构师?>>>    ARM芯片STM32出现HardFault Handler硬件中断一般有两种情况: 访问越界导致的Acess Violation或者内 ...

  7. STM32 map文件解析

    什么是map文件? 简单的说:map文件是通过编译器编译之后,集程序.数据及IO空间的一种映射文件. Keil生成map文件的设置如下图所示: 生成文件保存路径与Listings选择路径相同. kei ...

  8. ARM 之十 ARMCC(Keil) map 文件(映射文件)详解

    在看这篇文章之前 需要对 ARM ELF 文件有一定的了解.了解什么是域(Region).节(Section,也称为节区).段(Segment).镜像(Image).镜像文件(Image File)等 ...

  9. STM32 MDK编译后生成的 .map文件深入分析

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

最新文章

  1. LeetCode简单题之最后一块石头的重量
  2. 人类或起源于古菌?真假?
  3. AdamW优化算法 笔记
  4. sqlite3存储格式
  5. 使用halcon结合机械XY轴对相机进行9点标定
  6. 两万字深度介绍分布式系统原理,这一篇就够了
  7. python-day34--进程补充
  8. 一文快速探索视频用户网络画像与应用
  9. RISC-V MCU 应用教程之RTC自动唤醒
  10. Linux之ClamAV杀毒软件YUM安装和使用
  11. pycharm方法中划线解决方法
  12. mysql 100个标题_100个超强吸引人的标题100个吸引人的标题
  13. Apriori算法例子
  14. H3C 物联网路由器4G配置
  15. 【备忘】Spring Boot技术栈博客企业前后端
  16. Linux文本处理三剑客sed详解(正则匹配、命令示例)
  17. 测试apk-异常管控Sensor攻击者开发
  18. docker_mysql
  19. vue实例的生命周期详解
  20. 智能时代 算力赋能 | 有孚云·智算上线-聚智云算,向新而生!

热门文章

  1. python爬取网页有乱码怎么解决_python - 爬虫获取网站数据,出现乱码怎么解决。...
  2. element 修改表单值后表单验证无效_javascript自学记录:表单脚本1
  3. eeglab教程系列(9)-选择数据的epochs并进行比较
  4. JAVA实现输入一个整数,输出该数二进制表示中1的个数(《剑指offer》)
  5. 软件工程学完java后干_软件工程学习后的一些体会--------两周
  6. mysql存储过程加多个创建表_mysql 存储过程创建多个表
  7. 北京冬奥一项AI黑科技即将走进大众:实时动捕三维姿态,误差不到5毫米
  8. 跑得比TensorBoard快多了,极简可视化工具Aim发布 | Reddit高热
  9. Python初学者请注意!别这样直接运行python命令,否则电脑等于“裸奔”
  10. 「人民的希望」首批临床结果公布:2/3重症10天内有效改善,一半以上摆脱呼吸机 | 新英格兰医学重磅...