HEX(Xilinx MCS)文件格式详解

作者:whik1194,文章来源:CSDN博客

注:本文由作者授权转发,如需转载请联系作者本人

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:数据,示例:0B0010006164647265737320676170A7
01:文件结束,示例:00000001FF
02:扩展段地址,示例:020000021200EA
03:起始段地址,示例:0400000300003800C1
04:扩展线性地址,示例:02000004FFFFFC
05:起始线性地址,示例:04000005000000CD2A

详细描述,可以查看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文件格式有什么区别