HEX 文件是指以hex为后缀,采用Intel-HEX编码规则的文件,可以直接使用文本编辑工具打开。通常用来对微控制器或ROM进行编程,本质上都是对存储器编程,其中包含了每个地址对应的数据。
Xilinx 用于程序固化的MCS文件虽然是以.mcs后缀命名,但其本质是hex文件,把后缀改成.hex后,可以直接使用文件工具打开,完全符合Intel-HEX文件格式。
先自己定义个文件格式
比如,我们有10个数据,需要存放在10个地址,我们可以自己定义一个文件格式:
地址a1:数据d1 地址a2:数据d2 地址a3:数据d3
文件内容就像这样:
1001:11 //地址0x1001存放数据0x11 1002:22 1003:33 1004:44 1005:55 1006:66 1007:77 1008:88 1009:99 100A:AA
如果数据量少这样表示也还算清晰,如果数据量大,这种数据存储方式就会使得文件行数非常多。
如果能把多个数据放在同一行就好了,我们改变一下文件格式:
本行数据长度n 起始地址a:数据d1数据d2....数据dn
然后上面的10行数据变成了下面这样:
041001:11223344 //1001起始的4个地址存放的数据:11 22 33 44 041005:55667788 //1005起始的4个地址存放的数据:55 66 77 88 021009:99AA //1009起始的2个地址存放的数据:99 AA
这样10行数据就被压缩到了3行,当然也可以10个数据放在一行表示:
0A1001:112233445566778899AA //1001起始的10个地址数据
为了保证文件传输的可靠性,我们还需要添加校验数据,附加在每一行的末尾,用来对本行数据进行校验。
校验算法采用累加和,只对数据部分进行求和运算,取累加和的低8位数据。
于是,上面的10组数据变成了下面这样:
041001:11223344 AA //0xAA = 0x11 + 0x22 + 0x33 + 0x44 041005:55667788 BA //0x1BA = 0x55 + 0x66 + 0x77 + 0x88 021009:99AA 43 //0x143 = 0x99 + 0xAA
这样,数据在传输过程中的完整性和准确性就大大提高了。
其实HEX文件也是以类似的方式,表示存储器的地址和数据的。
HEX文件格式详解
我们使用Notepad++打开一个Hex文件:
可以看到一些数据被不同颜色区分出来了,相同颜色的数据含义是相同的。
黑色字体的为真正的数据部分,每行末尾的一个字节数据为当前行数据的校验字节,校验和=0x100-累加和。
Notepad++有HEX文件自动校验功能,如果累加和不对最后一个字节会是红色字体。
冒号后的第一个字节数据,如02/10,分别表示当前行有2/16字节数据。
HEX文件每行数据都由4部分构成:
起始代码:+数据个数(2字节)+起始地址(4字节)+记录类型(1字节)+数据(N字节)+校验和(1字节)
其中记录类型对应:
00:数据,示例:0B 0010 00 6164647265737320676170 A7 01:文件结束,示例:00 0000 01 FF 02:扩展段地址,示例:02 0000 02 1200 EA 03:起始段地址,示例:04 0000 03 0000 3800 C1 04:扩展线性地址,示例:02 0000 04 FFFF FC 05:起始线性地址,示例:04 0000 05 0000 00CD 2A
详细描述,可以查看Wikipedia:
https://en.wikipedia.org/wiki/Intel_HEX
第一行的数据格式分析:
:02 0000 04 0800 F2 02:本行有2个字节数据 0000:本行数据的起始地址 04:本行记录类型为扩展线性地址 0800:2字节数据 F2:校验和=0x100-(02+04+08) = 0xF2
中间行数据格式分析:
:10 0010 00 CD020008CF020008D102000800000000 55 10:本行有16字节数据 0010:本行数据起始地址0x0010 00:本行记录类型为数据 CD020008CF020008D102000800000000:16字节数据 55:校验和
最后几行的数据:
:1029F00001020304060708090000000000000000AF//数据 :102A00000000000001020304010203040607080994//数据 :04 2A10 00 02040608 AE //数据 :04 0000 05 080000F9 F6 //起始线性地址 :00 0000 01 FF //文件结束
其他文件格式,比如BIN文件格式,就简单干脆了,只有数据部分,没有任何的地址信息,也没有校验信息,所以BIN格式文件使用时需要指定起始地址。
关于各种文件格式的区别可以查看:BIN、HEX、AXF、ELF文件格式有什么区别