冰冻三尺非一日之寒,滴水穿石非一日之功
参考资料:深度理解编译过程
参考资料:深度理解编译文件
引言
bin、hex、elf、axf作为嵌入式开发中比较常见的文件格式,一直在使用,从未深入理解过相关区别和联系。借本篇章做个简短总结,描述相关差异。如有错漏之处,敬请指正。
文件分类
1、bin文件
bin文件是单纯的数据文件,直接存储于flash当中。由于不包含地址信息,使用下载器时往往需要设置起始地址。也正是由于其不包含其他信息,故编译生成的文件中,bin文件所占内存最小。其查看方式也需要特定的二进制查看器。如图所示,使用J-flash打开一个二进制文件。
2、hex文件
本文所述hex文件为Intel Hex,是由Intel Hex,本质是ASCII文本行组成,由换行符或回车符或两者分隔。文件以行为单位记录数据,每行都由任意数量的十六进制数组成。它们按以下格式排列
: |
A |
B |
C |
D |
E |
|
1Byte |
2Byte |
1Byte |
N Byte |
1 Byte |
: 数据开头,固定格式
A:本行数据的长度
B:数据起始地址
C:数据类型
D:数据字节(其长度大小与A相同)
E:校验和(0x100 - 累加和)
关于C数据类型的详解
00 |
Value |
01 |
数据记录 |
02 |
文件结束记录 |
03 |
扩展段地址记录 |
04 |
扩展段地址记录 |
05 |
扩展线性地址记录 |
06 |
开始线性地址记录 |
如下是截取的部分hex文件
:020000040800F2
:200000006837002069010008750700086D07000871070008F9010008D11000080000000044
:20002000000000000000000000000000F90B000861020008000000007F010008350D000877
......
:00000001FF
代入分析 :020000040800F2
02:数据长度两个字节
0000:起始地址为0x0000
04:数据类型,扩展地址为0x0800 指示以下每行的高位地址为0x0800
0800:数据
F2:校验和 (0x100-0x0E (2+4+8) )
该行指示 以0X0800作为段扩展地址高位,以下每行高位地址为0X0800
则第二行的记录的起始地址为0X08000000
第三行的记录地址为0X08000020
3、axf文件
axf文件如何打开
axf文件是基于ARM编译器产生的包含调试信息的编译文件。使用MDK开发环境时,进入调试模式下,需要依赖于axf文件。MDK5在调试下,会通过J-LINK将axf文件下载如单片机中,用于设备调试。
axf文件的调试信息作用:
可将源代码包括注释夹在反汇编代码中,这样我们可随时切换到源代码中进行调试。
还可以对程序中的函数调用情况进行跟踪(通过Watch & Call Stack Window查看)。
对变量进行跟踪(利用Watch & Call Stack Window)。
4、elf文件
elf文件(elf文件详解)是LInux系统下产生的包含调试信息的文件,使用Readif指令可以获取、查看elf文件内容。相较于其他三种文件,elf文件包含的信息更多,也更复杂。
总结
受限于个人技术水平,相关分类可能介绍的不是很清楚。文中也贴有大佬们所写分析文章链接,感兴趣的同学可点击跳转深入理解一下。