文/Edward
“Hex文件里面究竟存储的是什么内容,为什么将它一顿操作后下载到单片机里面之后就可以使得单片机神奇的按照我们想要的方式工作起来呢?”好奇的你有没有思考过这个问题?今天我们就来展开这个Hex文件的内容,一探到底,揭开它神秘的面纱。
认识它
我们一般将Hex文件称为单片机上面的可执行文件,或者叫它十六进制文件。Hex的由来也是截取了十六进制英文“hexadecimal”的前面三个字母。其实,可以下载到单片机内部的可执行文件不止Hex文件一种,其它的还有二进制文件,elf文件等,但是不可置否的是,现在Hex文件是使用最多的单片机可执行文件格式。
Hex 全称Intel HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个Hex记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。大多数EPROM编程器或模拟器使用Intel HEX文件。
打开它
打开Hex文件,非常简单,你可以使用电脑上面自带的记事本工具打开,也可以使用我们最常用的J-flash去打开,也可以使用notepad++去打开。
如图1所示,使用记事本去打开Hex文件。
图1 记事本打开Hex文件
记事本是我们所能接触到的最方便的打开Hex文件的工具,除此之外,Notepad++也可以打开Hex文件。用Notepad++打开Hex文件,它除了可以将Hex文件的有效信息都显示出来之外,还可以根据Hex文件约定的格式,分别高亮出不同颜色,以代表不同的字段信息。使读者更为醒目,如图2所示。
图2 Notepad++打开Hex文件
当然最专业的打开Hex文件的工具,还是J-flash,因为它是专门用来为单片机烧写程序的软件。如图3所示。
图3 J-flash打开Hex文件
问题思考1
使用上面的三个软件中的任意软件都可以打开并且查看Hex文件。但是有好奇心强的读者就可能会问了,图3中右边那一串看着像乱码的东西到底是什么呢?上面还写着ASCII。
其实这上面表示的是Hex文件中每一个十六进制字符所对应的ASCII码,如果这个字符对应ASCII码的不在打印区内,就用“.”代替。
问题思考2
回答到这里,可能深入思考的读者又会有问题了,我们使用Notepad++或者记事本这样的工具打开一个文件,它们最终会以对应的编码去打开。比如我们打开一个文件,这个文件里面存储了一个二进制数值0x41,那如果我们使用ASCII码去打开,那么自然而然会将0x41的ASCII码显示出来。反过来说,如果我们使用Notepad++这样子的工具去打开一个Hex文件,而它显示了图2的内容,那么这个Hex文件内部最终存储的难道是这些十六进制数的ASCII码?
这个问题答案是,Hex文件是一种以文本形式存储的文件,它不像二进制文件一样以二进制的形式去存储。
比如同样一串二进制数字“0500D600D2A9D28C222A”,如果将其存入二进制文件,那么它存入的势必就是“0500D600D2A9D28C222A”这样子的信息了。因此如果我们使用Notepad++这样的工具去打开bin文件,必定多数都是乱码,因为绝大多数二进制以ASCII码打开都显示不了。
而同样这串数字如果存入Hex文件中,其实际存储的就是“0500D600D2A9D28C222A”的ASCII码,如0的ASCII码为0x30,5的ASCII码为0x35,依次类推。
因此,如果我们以后进行文件的OTA推送时,一定要注意这个问题。
而由于存储方式的不同,因此同一份程序如果用Hex文件存储至少比用Bin文件存储要大一倍。
那么Hex文件与Bin文件相比,除了易于读取之外,没有很大的优点,为什么我们还要坚持不懈地使用它呢?
我们知道,单片机下载程序必要的一个要素就是这个程序下载到单片机的起始地址。Bin文件是不带有任何地址信息的,因此我们下载Bin文件的时候一定要主动地去指明这个起始地址,一旦丢失或者忘记这个地址,程序都将无法正常运行。但是Hex文件它天生就会将程序的地址信息一并记录在内notepad++16进制,因此使用Hex文件下载程序会变得更加方便。
解剖它
我们还是使用Notepad++来打开Hex文件。如图4所示。
图4 打开的Hex文件
用Notepad++可以一目了然地看出这个Hex文件每一行数据中的关键字段。接着,我们一起来探索这个文件。
首先我们需要知道,一个Hex文件的每一行都是以ASCII码的“:”(0x31)开始的。而每一行Hex文件可以被分成五个关键字段,如图5所示。
图5 Hex文件字段
从图5中可以看出,Hex文件以每一行为一个整体,定义了数据的长度notepad++16进制,数据类型和存储地址:
第一个字节 0x02表示本行数据的长度;
第二、三字节 0x00 0x00表示本行数据的起始地址;
第四字节 0x04表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05。
具体的数据类型如表1所示。
表1数据类型字段中的详细解释
字段
名称
含义
’00’
Data Rrecord
用来记录数据,HEX文件的大部分记录都是数据记录
’01’
End of File Record
用来标识文件结束,放在文件的最后,标识HEX文件的结尾
’02’
Extended Segment Address Record
用来标识扩展段地址的记录
’03’
Start Segment Address Record
开始段地址记录
’04’
Extended Linear Address Record
用来标识扩展线性地址的记录
’05’
Start Linear Address Record
开始线性地址记录
然后是数据,0x08 0x00
最后一个字节 0xf2为校验和,校验和的算法为:计算 0xf2前所有16进制码的累加和(不计进位),检验和 = 0x100 – 累加和。
Hex文件的数据类型字段中,’04’ ’05’,都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。对于后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。
HEX文件都是由记录(RECORD)组成的。在HEX文件里面,每一行代表一个记录。记录的基本格式为:
:020000040800F2
:1000000048B6002085010008B1450008252B0108ED
:10001000B9450008C1450008C945000800000000B6
:00000001FF
对上面的HEX文件进行分析:
当我们用J-flash去下载Hex文件的时候,这个软件也会如我们分析一样,将整个Hex文件一行行写入到单片机中的特定基地址的偏移值中。
———END———
限 时 特 惠:本站每日持续更新海量各大内部创业教程,一年会员只需128元,全站资源免费下载点击查看详情
站 长 微 信:jiumai99