Motorola S-records(S19)文件格式详解
CodeWarrior工程编译之后会生成S19文件,其中包含着对这个工程实际二进制代码的描述,如果需要实现远程下载程序等功能的话,很多就是通过这个文件作为中介来实现的,所以理解S19文件的格式十分重要。这是网上找到的资料,本人对其进行了翻译。
译者注:译者博客(http://blog.csdn.net/lin_strong),转载请保留这条。此为网上公开资源http://www.amelek.gda.pl/avr/uisp/srecord.htm,仅供学习交流使用,请勿用于商业用途。
以下对Motorola S-records的清晰完整的描述是多年前从一个Unix系统的用户手册中找到的。
Motorola S-records
名字
SREC — S-record文件和记录格式,S-record file and record format
描述
每个S-record文件都包含多行按特殊格式组织的ASCII字符串。一行S-record的长度小于或等于78字节。
记录顺序
一个文件中的S-record间的排序并不重要,不应该默认某种顺序。
记录格式
一行S-record的通用格式如下:
类型 — 一个char[2]字段。这两个字符描述了这条记录的类型(S0、S1、S2、S3、S5、S7、S8或S9)。
长度 — 一个char[2]字段。把这两个字符成对地看成一个十六进制的整型值,它代表了这条记录中剩余的字符对的个数。
地址 — 一个char[4、6或8]字段。把这些字符看做十六进制整型值,它们代表了数据字段要加载进的地址。这个字段的长度取决于描述地址所需要的字节数。两字节的地址需要4个字符、三字节的地址需要6个字符、四字节的地址需要8个字符.
数据 — 一个char[0-64]字段。取决于记录的类型,可能把它们看做描述信息;或者把这些字符看做十六进制整型值,每两个代表一个字节,这时这些字节就是要被加载进对应地址的数据。
校验和 — 一个char[2]字段。把这两个字符成对地看成一个十六进制的整型值,这个值等于长度、地址、数据字段中对应的所有字节值相加后按位取反得到的值的最低有效字节值。
每一行记录都由一个换行符结束。如果在传输到目标系统的时候需要任何额外的或者不同的结束符或延迟字符,那这是传输程序的事情。
不同类型的记录
S0 记录
记录的类型是 ‘S0’ (0x5330)。不使用地址字段,地址字段会填充0(0x0000)。这时数据字段内放的是标题信息,分为以下几个部分。
char[20]的mname字段,代表模块名字。
char[2]的ver字段,代表版本号。
char[2]的rev字段,代表修订号。
char[0-36]的描述字段,代表文本注释。
每个子字段都由ASCII字符组成,每两个代表一个字节的十六进制值,比如版本号和修订号,或者在模块名和描述中看做ASCII字符对应的十六进制值。
S1 记录
记录的类型是 ‘S1’ (0x5331)。地址字段是两字节地址。数据字段则包含着要写入地址的数据。
S2 记录
记录的类型是 ‘S2’ (0x5332)。地址字段是三字节地址。数据字段则包含着要写入地址的数据。
S3 记录
记录的类型是 ‘S3’ (0x5333)。地址字段是四字节地址。数据字段则包含着要写入地址的数据。
S5 记录
记录的类型是 ‘S5’ (0x5335)。地址字段要看做两字节的整型值,代表之前传输的S1、S2和S3记录的总数。不使用数据字段。
S7 记录
记录的类型是 ‘S7’ (0x5337)。地址字段是四字节地址,代表着代码的起始运行地址。不使用数据字段。
S8 记录
记录的类型是 ‘S8’ (0x5338)。地址字段是三字节地址,代表着代码的起始运行地址。不使用数据字段。
S9 记录
记录的类型是 ‘S9’ (0x5339)。地址字段是两字节地址,代表着代码的起始运行地址。不使用数据字段。
示例
下面给出一个典型的S-record格式的文件。
S00600004844521B
S1130000285F245F2212226A000424290008237C2A
S11300100002000800082629001853812341001813
S113002041E900084E42234300182342000824A952
S107003000144ED492
S5030004F8
S9030000FC
这个文件包含一条S0记录、四条S1记录、一条S5记录以及一条S9记录。
S0记录解释如下:
- S0:S-record类型S0,表明这是一条标题记录。
- 06:十六进制值06(十进制值6),表明后面有6个字符对(或ASCII字节)。
- 00 00:4字符的两字节地址字段,这里全是0。
- 48 44 52:ASCII字符H、D和R - “HDR”。
- 1B:校验和( 0x1B = ~(0x06 + 0x48 + 0x44 + 0x52) )
首个S1记录解释如下:
- S1:S-record类型S1,表明这是一个要放在两字节地址的数据记录。
- 13:十六进制值13(十进制值19),表明后面有19个字符对,包括一个两字节地址、16字节的二进制数据以及一个一字节校验和。
- 00 00:4字符的两字节地址字段;十六进制地址0x0000,后面的数据要加载到这里。
- 28 5F 24 5F 22 12 22 6A 00 04 24 29 00 08 23 7C:代表实际二进制值的16个字符对。
- 2A:校验和
第2和第3条S1记录都包含0x13(19)个字符对,分别由校验和13和52结束。第4条S1记录包含07个字符对,校验和为92。
S5记录解释如下:
- S5:S-record类型S5,表明这是条声明S1记录个数的计数记录。
- 03:十六进制值03(十进制值3),表明后面跟着3个字符对。
- 00 04:十六进制值0004(十进制值4),表明这条记录之前有4条数据记录。
- F8:校验和
S9记录解释如下:
- S9:S-record类型S9,表明这是条结束记录。
- 03:十六进制值03(十进制值3),表明后面跟着3个字符对。
- 00 00:地址字段,十六进制值0(十进制值0)表明代码的起始运行地址。
- FC:校验和。
注意事项
- 没有任何证据证明摩托罗拉公司曾经在S0记录的数据字段中使用过标题信息。这估计是被某个第三方使用的。
- 只有这个文档提到了一条记录的总长有78字节的限制,或说数据字段的长度有64字节的限制。为了程序更加通用,不应该默认这个限制。
- 长度字段的取值范围为0x3(2字节的地址字段+1字节的校验和)到0xff;这是指剩下的字符对的总数,包括校验和。
- 如果你要写代码来转换S-records,你应该假设一条记录可以长达514(十进制)个字符(255 * 2 = 510,再加上类型字段和长度字段的4个字符),加上可能有的结束符。换句话说,在使用C语言创建输入缓冲区时,你应该声明一个大小为515的字符数组,因为要保留一个空间给字符串结束符’\0’。
还没有评论,来说两句吧...