手机升级系统,下载完系统都会存在一个校验过程:
其实,在MCU升级过程中,也是需要校验hex文件,如果要想升级更可靠,还可以在hex或bin升级文件后再增加校验信息。
我们之前公司做的一个远程升级的产品,就是在升级文件之后增加了CRC16校验信息,在接收完整个升级文件之后,进行校验,这样做的目的就是使升级更可靠。
今天来讲讲hex文件的校验和验证校验的内容。
hex 格式文件由 Intel 制定的一种十六进制标准文件格式,是由编译器转换而成的一种用于下载到处理器里面的ASCII文本文件。
1.解释
2.格式
其中:
: 代表行开始,固定为冒号:
BB代表Bytes,数据长度
AAAA代表Address,地址
TT代表Type,数据类型(标识)
D···D代表Date,数据
CC代表CheckSum,校验和
说明:
BB数据长度,也就是D···D这个字段的数据长度;
AAAA地址,起始地址、偏移地址,根据数据类型(TT)有关;
TT数据类型(标识):
00:数据标识
01:文件结束标识
02:扩展段地址
04:线性地址
05:线性开始地址
(地址代表高16位地址,也就是要向左移16bit)
CC校验和计算公式:
下面通过一个例子来说明hex。
说明一下:不同数据类型的数据略有差异,先再看下00(数据类型)的格式:
一个常见hex文件:
1.04类型:线性地址行
02:数据长度,这里是(0800)地址的2字节长度;
0000:偏移地址,这里数据其实无效;
04:线性地址数据类型;
0800:线性起始地址,左移16位,即:0x0800 0000;
F2:校验和
F2 = 0x100 - (0x02 + 0x04 + 0x08);
比如,修改起始地址为0600:
2.00类型:数据行
10:数据长度,这里是16字节(程序)数据的长度;
0000:偏移地址,数据第一行偏移0000地址,第二行就是偏移0010,第二行就是偏移0020,依次偏移到FFF0;如果偏移到FFF0,则会重新下一个起始地址,一段程序你就明白了:
00:线性地址数据类型;
00040020B1010008FD020008BD020008:程序数据,就是bin文件里面的纯程序数据;
44:校验和
44 = 0x100 - (0x10 + 0x04 + 0x20 + 0xB1 + 0x01 + 0x08 + 0xFD + 0x02 + 0x08 + 0xBD + 0x02 + 0x08 + 0x44) & 0xFF;
3.01类型:文件结束行
00:数据长度;
0000:偏移地址,这里数据其实无效;
01:代表文件结束;
FF:校验和
这里代表hex文件结束了,有些公司为了使hex传输(下载)更可靠,或通过工具(或命令在)结束行后面追加校验信息,一般远程升级会考虑更多校验信息(后期抽时间讲述一下远程升级)。
Hex实际占用存储区大小计算办法:
Hex实际大小=文件结束标志前面一条记录的存储起始地址+这条记录的有效数据长度。
下面算法实现hex行的校验,校验成功返回1,失败返回0:
当然,实现的算法可以各式各样,按照原理实现即可。
转帖自网络