Motorola S-records 16进制文件格式是嵌入式中除intel hex之外很常见的格式,下面是它的格式:
+-------------------//------------------//-----------------------+
| type(hex1) | count(hex 1) | address | data | checksum(从count累加到checksum,总和为0xFF) |
+-------------------//------------------//-----------------------+
S0 :标识记录,地址域长度为2个字节,并用0000填充,数据区记录了一些模块名称和版本之类的信息
S1 :数据记录,地址域长度为2个字节,数据区域为数据内容。
S2 :数据记录,地址域长度为3个字节,数据区域为数据内容。
S3 :数据记录,地址域长度为4个字节,数据区域为数据内容。
S5 :统计记录,地址域长度为2个字节,内容是之前数据记录(S1,S2,S3)的个数,数据区域空。
S7 : 运行记录,地址域长度为4个字节,内容是程序启动的地址,数据域空。
S8 :运行记录,地址域长度为3个字节,内容是程序启动的地址,数据域空。
S9 :运行记录,地址域长度为2个字节,内容是程序启动的地址,数据域空。
下面是一个例子,大家看看:
S02B0000433A5C446F63756D656E747320616E642053657474696E67735C7A6F75642E4143434F554E54535C7D
S208010000FFFFFFFFFA
S30800020000000000F5
S5030002FA
S9030000FC
+-------------------//------------------//-----------------------+
| type(hex1) | count(hex 1) | address | data | checksum(从count累加到checksum,总和为0xFF) |
+-------------------//------------------//-----------------------+
S0 :标识记录,地址域长度为2个字节,并用0000填充,数据区记录了一些模块名称和版本之类的信息
S1 :数据记录,地址域长度为2个字节,数据区域为数据内容。
S2 :数据记录,地址域长度为3个字节,数据区域为数据内容。
S3 :数据记录,地址域长度为4个字节,数据区域为数据内容。
S5 :统计记录,地址域长度为2个字节,内容是之前数据记录(S1,S2,S3)的个数,数据区域空。
S7 : 运行记录,地址域长度为4个字节,内容是程序启动的地址,数据域空。
S8 :运行记录,地址域长度为3个字节,内容是程序启动的地址,数据域空。
S9 :运行记录,地址域长度为2个字节,内容是程序启动的地址,数据域空。
下面是一个例子,大家看看:
S02B0000433A5C446F63756D656E747320616E642053657474696E67735C7A6F75642E4143434F554E54535C7D
S208010000FFFFFFFFFA
S30800020000000000F5
S5030002FA
S9030000FC
第一行:没什么,开个头而已。
第二行:地址0x10000有4个0xFF
第三行:地址0x20000有3个0x00
第四行:标明之前有两条数据记录
第五行:程序从0x0000地址开始运行
第二行:地址0x10000有4个0xFF
第三行:地址0x20000有3个0x00
第四行:标明之前有两条数据记录
第五行:程序从0x0000地址开始运行
关于checksum的算法和intel hex不太一样,
checksum = 0xFF - (从count段开始所有字节的总和)。
checksum = 0xFF - (从count段开始所有字节的总和)。