编译器生成代码的Hex浅析

科技   2024-12-11 12:02   北京  
一般来说,程序编辑好之后,如果没有编译错误,那么由编译器编译后生成Hex文件,这个文件就可以被送到编程器中,从而对器件进行烧录编程。
示例Hex文件

从上图来看,Hex就是一个16进制数文件,它具有一定格式,下面我们进行一些说明。

▲Hex典型格式

Hex文件的格式,如上图所示,共包含6个部分,开始冒号为起始记录,bb为字节个数,aaaa为地址,dd为具体的数据,ccchecksum部分。

典型的Hex示例解读
从上述示例可知,02代表这部分Hex有两个字节,0400是这部分Hex的存储地址,而00为其记录类型(后续我们会介绍一下记录类型有哪些种类),0034为数据部分,这里先存放低字节部分,后存放高字节部分。

记录类型的说明

记录类型使用两位二进制数据表示,共有四种形式,如上图表示,其中00表示数据类型,01表示文件结尾记录类型(后续我们对实际Hex进行说明)。

▲Hex文件结尾表示

这里是结尾Hex数据表示,00代表有0个数据,地址表示0x0000,记录类型为0x01checksum0xFF。

实际Hex的文件

这里我们使用一个实际的PIC16F1778的代表编译出来的Hex进行说明,第一行Hex数据是02 0000 04 0000 FA,可以看出这里有两个Hex字节,地址为0x0000,记录类型为扩展线性地址记录,数据是0000checksum0xFA,对应第一个PAGE存储空间。

第二行为04 0000 00 8031 0628 1D,这里显示为四个数据字节,地址为0x0000开始,类型为数据字节,具体数据为0x31800x2806,从program memory视图可以验证这个解读。

▲Hex解读1

第三行10 0008 00 8331 042B …0030 22,这里我们可知此处16个字节,从字节地址0x0008,换算成字地址后为0x0004开始,那么数据类型为00数据类型,后续就是具体的数据了,0x31830x2B04……等。

▲Hex解读2

▲Hex文件结尾处解读

最后一行00 0000 01 FF。这里可以看出它包含0个字节,地址为0x0000,记录类型为文件结尾0x01checksum0xFF。

倒数第二行04 000E 00 E43F FF3F 8D,这里表示四个字节,从0x000E字节地址开始,数据类型为00数据类型,具体数据为0x3FE4,0x3FFF,checksum8D,如下图所示,这里对应的字起始地址为0x8007,具体数据为0x3FE4,0x3FFF,为芯片配置位部分。

▲Hex代码末尾解读

配置位部分解读

倒数第四行为02 06B8 00 0800 38,此行代表Hex末端最后两个字节,对应字地址为0x35C,具体数据为0x0008,由上图可知。

倒数第三行为02 0000 04 0001 F9,这里同样也是一个扩展线性地址记录类型,对应第二个PAGE空间。

▲PIC16F1778/PIC16F1779memory视图

从上述存储视图中,可以看到这个芯片存储空间由8PAGE组成,每一个PAGE占用2048个字地址,对应4096个字节地址,也就是4kB,总共就是28kB空间。

相同系列芯片FLASH空间说明

以上对这个系列芯片的Hex文件格式进行了说明,作为进一步分析的基础。

END

来源:电源漫谈


版权归原作者所有,如有侵权,请联系删除


推荐阅读

培养一个优秀的嵌入式工程师有多难?

何同学抄袭风波原作者已接受道歉:不想毁掉他

C/C++大限将至,美国强硬要求2026年前全面剔除!


→点关注,不迷路←

嵌入式微处理器
关注嵌入式相关技术和资讯,你想知道的都在这里。
 最新文章