Intel HEX格式文件是一种常见的用于表示程序存储器内容的文本格式,常用于将程序存储器内容导出或者导入到不同的开发工具中。它的文件扩展名通常是 .hex。
该文件格式由一系列行组成,每一行以冒号(:)开头,以回车换行符(\r\n)结尾,每一行包含以下几个部分:
起始符号:一个字符,表示该行的起始,必须为“:”。
数据长度:一个字节,表示该行所包含的数据长度,以字节为单位,范围从 0 到 255。
起始地址:两个字节,表示该行数据在存储器中的起始地址,以字节为单位,高位在前,低位在后。
记录类型:一个字节,表示该行数据的类型。常见的记录类型包括数据记录(00)、结束记录(01)等。
数据:一个或多个字节,表示该行的数据内容。数据的长度由数据长度字段指定。
校验和:一个字节,表示该行数据的校验和,为数据长度、起始地址、记录类型和数据的按位异或和的补码。
例如
:10010000214601360121470136007EFE09D2190140
//起始符号是“:”。
//数据长度是“10”。
//起始地址是“0100”。
//记录类型是“00”,表示这是一个数据记录。
//数据部分包含了16个字节的数据:“214601360121470136007EFE09D21901”。
//校验和是“40”。
//这个数据记录包含了16个字节的数据,它们对应的起始地址是0x0100~0x010F。每两个字节表示一个数据,因此这个记录实际包含了8个数据,分别是“21 46 01 36 01 21 47 01 36 00 7E FE 09 D2 19 01”。
:00000001FF
//起始符号是“:”。
//数据长度是“00”。
//起始地址是“0000”。
//记录类型是“01”,表示这是一个结束记录。
//数据部分为空。
//校验和是“FF”。
//这个记录表示文件结束。当解析Intel HEX格式文件时,如果读到了一个记录类型为“01”的记录,就表示已经读到了文件的结尾,应该停止解析。
记录类型
在Intel HEX格式文件中,一共定义了5种记录类型。它们分别是:
数据记录(Data Record),记录类型为“00”。
结束记录(End Of File Record),记录类型为“01”。
扩展段地址记录(Extended Segment Address Record),记录类型为“02”。
扩展线性地址记录(Extended Linear Address Record),记录类型为“04”。
起始段地址记录(Start Segment Address Record),记录类型为“03”。 其中,最常用的是数据记录和结束记录。其他三种记录类型则用于更高级的应用,如程序跳转、内存分段等。
举例:
数据记录(Data Record):
:10010000214601360121470136007EFE09D2190140
这是一条16字节的数据记录,其记录类型为“00”。数据部分为“214601360121470136007EFE09D21901”。结束记录(End Of File Record):
:00000001FF
这是一条长度为0的结束记录,其记录类型为“01”。文件解析器在读取到结束记录后,就会停止解析文件。扩展段地址记录(Extended Segment Address Record):
:020000021200EA
这是一条扩展段地址记录,其记录类型为“02”。它表示接下来的数据记录的地址偏移量需要加上0x1200。该记录的数据部分为“EA”,表示段地址的高字节。因此,接下来的数据记录的地址将从0x1200:0x0000开始。扩展线性地址记录(Extended Linear Address Record): 假设代码存储在第一个芯片的地址0x0000处,数据存储在第二个芯片的地址0x0000处,那么我们需要使用两个扩展线性地址记录来指定代码和数据的地址。这两个记录的格式如下:
:020000040000FA
:020000041000EA
第一个记录指定了代码的起始地址为0x0000,第二个记录指定了数据的起始地址为0x10000。
起始段地址记录(Start Segment Address Record): 起始段地址记录是在程序重定位时使用的,它可以将代码和数据的起始地址设定为不同的值。例如,假设程序的实际起始地址是0x8000,但是为了调试方便,我们将代码和数据的起始地址设定为0x0000。这时,就可以使用起始段地址记录来指定代码和数据的实际起始地址。
例如,假设代码和数据的实际起始地址为0x8000,那么我们需要使用一个起始段地址记录来指定代码和数据的起始地址。这个记录的格式如下:
:020000020800F2
这个记录指定了代码和数据的起始地址为0x8000,这个地址是由段地址0x0800左移4位得到的, 0x0800:0x0000
校验和计算
校验和是为了保证Intel HEX格式文件的数据的完整性和正确性。校验和是指把每个记录中的所有字节(除了起始符“:”和校验和本身)都相加,并取结果的低8位的补码.
例如
:10010000214601360121470136007EFE09D2190140
这条记录的数据部分是:214601360121470136007EFE09D21901
21 + 46 + 01 + 36 + 01 + 21 + 47 + 01 + 36 + 00 + 7E + FE + 09 + D2 + 19 + 01 = 256
取低8位的补码,即为“-256 mod 256”,结果为0x00。因此,这条记录的校验和为0x40。
校验和是为了保证数据的完整性和正确性。在解析Intel HEX格式文件时,每条记录的校验和都会被计算出来,并与记录中的校验和进行比较。如果计算得到的校验和与记录中的校验和不相等,就说明该记录中的数据不完整或不正确,应该丢弃这条记录。