MDK编译生成的HEX、map与htm文件分析

MDK编译生成的HEX、map与htm文件分析

hex文件

Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。Intel HEX文件经常被用于将程序或数据传输存储到ROM、EPROM,大多数编程器和模拟器使用Intel HEX文件。
很多编译器的支持生成HEX格式的烧录文件,尤其是Keil c。但是编程器能够下载的往往是BIN格式,因此HEX转BIN是每个编程器都必须支持的功能。HEX格式文件以行为单位,每行由“:”(0x3a)开始,以回车键结束(0x0d,0x0a)。行内的数据都是由两个字符表示一个16进制字节,比如”01”就表示数0x01;”0a”,就表示0x0a。对于16位的地址,则高位在前低位在后,比如地址0x010a,在HEX格式文件中就表示为字符串”010a”。

:llaaaatt[dd…]cc

: 每个Intel HEX记录都由冒号开头.

ll 是数据长度域,它代表记录当中数据字节(dd…)的数量.

aaaa 是地址域,它代表记录当中数据的起始地址.

tt 是代表HEX记录类型的域,它可能是以下数据当中的一个:

  • 00 – 数据记录
  • 01 – 文件结束记录
  • 02 – 扩展段地址记录
  • 04 – 扩展线性地址记录

dd 是数据域,它代表一个字节的数据.一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符.

cc 是校验和域,它表示这个记录的校验和.校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足.

hex和bin文件

HEX 文件是包括地址信息的,而BIN文件格式只包括了数据本身。在烧写或下载HEX文件的时候,一般都不需要用户指定地址,因为HEX文件内部的信息已经包括了地址。而烧写BIN文件的时候,用户是一定需要指定地址信息的。

根据启动过程分析bin文件
在这里插入图片描述

这个是某个STM32的bin文件,这里根据启动过程可以知道
SP = 0X200021B8
PC = 0X080002AD
这是上电启动,先给SP值,后赋值PC,这时PC指向的地址就是复位中断服务函数,我们查看相应的map文件,截图如下:
在这里插入图片描述
从截图中可以看出,0X080002AD值就是复位中断服务函数的地址
我们再看一个截图,map中的映像文件,似乎没有找到0X080002AD这个值,不够却找到0X080002AC,这点有疑问
在这里插入图片描述
在仿真中可以看出,这里的SP值是对的,但是PC值却不是0X080002AD,而是0X080002AC,并且可以看出Reset_Handler = 0X080002AC,这里暂时不是很明白,不过有说是因为是在Thumb状态下执行,所以赋值PC的LSB必须为1。参考链接:http://news.eeworld.com.cn/mcu/article_2016063027290.html
后续有时间再研究

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:不同文件中函数的调用关系
在这里插入图片描述
比如这句:main.o(i.main) refers to main.o(i.PrintfLogo) for PrintfLogo 表示 main.c 文件中的 main
函数调用了 PrintfLogo。

Removing Unused input sections from the image:这部分主要是被删除的冗余函数,也就是添加到工程里面,但是没有调用到的,下面是部分被删除冗余函数的截图效果:
在这里插入图片描述

Image Symbol Table:Image Symbol Table 主要分为两类,分别是 Local Symbols 和 Global Symbols。
Local Symbols 记录了用 static 声明的全局变量地址和大小,C 文件中函数的地址和用 static 声明的函数代码大小,汇编文件中的标号地址(作用域限本文件),下面是部分截图:
在这里插入图片描述
Global Symbols 记录了全局变量的地址和大小,C 文件中函数的地址及其代码大小,汇编文件中的标号地址(作用域全工程),下面是部分截图:
在这里插入图片描述

Memory Map of the image:映像文件可以分为加载域(Load Region)和运行域(Execution Region):加载域反映了 ARM 可执行映像文件的各个段存放在存储器中的位置关系。 下面是部分截图,另外映像中的入口点就是程序开始执行的位置。
在这里插入图片描述
运行域反映了 ARM 可执行映像文件各个段真正执行时在存储器中的位置关系,简单的说,加载域就是程序在 Flash 中的实际存储,而运行域是芯片上电后的运行状态

Image component sizes:映像组件大小,
在这里插入图片描述

  • Code (inc. Data) :显示代码占用了多少字节。 在此映像中,有 19110字节的代码, 其中包括 2070字节的内联数据 (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) :链接器根据需要插入填充,以强制字节对齐。
    在这里插入图片描述
  • Grand Totals:显示映像的真实大小。
  • ELF Image Totals:ELF(Executable and Linking Format)可执行链接格式映像文件大小。
  • ROM Totals:显示包含映像所需的 ROM 的最小大小。这不包括 ZI 数据和存储在 ROM 中的调试信息。
htm文件

此文件的最大作用就是基本统计了所有被调用函数的栈 stack 使用情况(不考虑中断嵌套)。 下面是整个工程的最大栈需求:
在这里插入图片描述
具体到每个函数也给出最大的栈深度 Max Depth,同时也给出函数本身的代码量大小和使用的栈大
小,比如函数 bsp_InitExtIO,最大栈深度是 152 字节。函数本身占用代码大小(Thumb 指令集)28 字节,使用栈 8 字节。
在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值