跳转到内容

SREC

维基百科,自由的百科全书

Motorola S-record摩托罗拉公司所创立的档案格式,可以将二进制的资讯转换为用ASCII文字表示的十六进制资料,此档案格式也称为SRECORDSRECS19S28S37MOT。此档案格式常用在微处理器的闪存资料写入,EPROMEEPROM的资料写入,或是其他可编程逻辑元件的编程写入。一般的应用中,会用编译器或是组译器将程式的原始码(可能是C语言或是组合语言)转换为机器码,再输出为S-record或其他格式档案。烧录器可以读取这些档案,将机器码写入非挥发性记忆体中,或是截入到目的系统中,以便执行。

简介

[编辑]

S-record档案格式是摩托罗拉公司在1970年代中期,为了摩托罗拉6800处理器所创的档案格式。针对摩托罗拉6800处理器及其他嵌入式系统软件开发工具可以将可执行档及资料转换为S-record格式。PROM烧录器可以读取S-record,烧录到嵌入式系统的PROM或EPROM中。

其他HEX格式

[编辑]

也存在类似用途的其他ASCII档案格式。BPNF、BHLF及B10F是早期的二进制格式,不过档案较大,也没有可变性。十六进制格式用一个字元表示四个位元,相较于二进制格式用一个字元表示一个位元,档案比较精简。许多十六进制格式(包括S-record)的可变性较大,其中可以包括位址的资讯,因此其内容可以只对应PROM的一部份。Intel HEX格式常用在Intel的处理器上。Tek Hex是另一种HEX格式,其中包括了除错用的符号表

格式

[编辑]

记录结构

[编辑]
S 记录种类 位元组数量 位址 资料 检查码

SREC格式的档案包括一组的ASCII字元记录。记录从左到右的结构如下[1]

  1. 记录种类,二个字元,第一个字元为大写的S(0x53),后面是数字字元的0至9,定义记录的种类。
  2. 位元组数量,由16进制的二位数组成,表示记录中剩下的位元组数(16进制二位数表示一个位元组),此栏位的最小值为3,对应16进制的位址栏位加上一个位元组的检查码,最大值为255(0xFF)。
  3. 位址,依记录种类不同,位址可能是四位/六位/八位的16进制数字,位址会以大端序(高位元组放前面)的格式记录。
  4. 资料,由2n个16进制数字组成。若是S1/S2/S3种类的记录,每笔记录的资料一般最多是32个位元组,可以在每行80个字的终端机萤幕显示,不过记录资料若只有16个位元组,在视觉上比较容易识别
  5. 检查码,由2个16进制数字组成,是位元组数量、位址和资料对应的位元组相加后,取最低位元组英语least significant byte,再计算一补数,以下有计算检查的例子。

文字列的结束字元

[编辑]

SREC记录之间会用一个或是多个ASCII字元的行分隔字元隔开,因此每一个记录就会占一行。此作法透过直观的分隔英语delimiter记录来提高易读性,而且在HEX记录之间的填充也可以提高语法分析器的效率。

产生HEX的程式一般会依其操作系统的习惯使用对应的行分隔字元。例如,Linux程式会用单一的LF字元( 换行符号,16进制0A)作为一行的结尾[1],但Windows程式会用CR字元(回车符,16进制0D)之后接著LF字元,作为一行的结尾。

记录种类

[编辑]

以下的表格说明十种可能出现的S-records,其中的S4保留,目前没有定义,S6一开始也是保留,后来有新的定义。

记录
栏位
记录用途 位址
栏位
资料
栏位
记录
说明
S0 档案头 16-bit
"0000"
是 此记录会包括许多设备商定义的ASCII文字,每个位元组由二个16进制数字表示。此栏位的资料常会以C风格字符串的方式表示。其中的文字资料可能会包括:档案/模组名称,版本编号,日期/时间,产品名称。PCB上的记忆体IC名称、版权说明等。[1]
S1 资料 16-bit
位址
是 此记录是启始位址是16位元的资料[1],一般会用在8-bit的微处理器中,例如AVR、PIC、8051、68xx、6502、80xx、Z80。其资料栏位的位元组数量是“位元组数量”栏位的值减3(2个位元组对应16位元的位址,1个位元组对应检查码)。
S2 Data 24-bit
Address
是 此记录是启始位址是24位元的资料[1]。其资料栏位的位元组数量是“位元组数量”栏位的值减4(3个位元组对应24位元的位址,1个位元组对应检查码)。
S3 Data 32-bit
Address
是 此记录是启始位址是32位元的资料This record contains data that starts at a 32-bit address.[1],一般会用在32-bit的微处理器中,例如ARM和680x0其资料栏位的位元组数量是“位元组数量”栏位的值减5(4个位元组对应32位元的位址,1个位元组对应检查码)。
S4 保留 不适用 不适用 此记录保留
S5 个数 16位元
计数值
否 此栏位是可有可无的栏位,其中有S1 / S2 / S3记录的数量,用16位元来计数[1]。此栏位适用于记录数量小于等于65,535(0xFFFF)的情形,若是超过,会改用S6栏位。
S6 个数 24位元
计数值
否 此栏位是可有可无的栏位,其中有S1 / S2 / S3记录的数量,用24位元来计数。此栏位可以适用于记录数量大于等于65,536(0x010000),但小于等于16,777,215(0xFFFFFF)。这个较新的栏位是最新的变更[1]
S7 起始位址
(档案终止符)
32位元
位址
否 此栏位用32位元记录启始的位址[1][2],用来作为一连串S3记录的结尾。若SREC档案只用来烧录记忆体设备,不需执行位置的资料,此处的位址可以用0代替。
S8 起始位址
(档案终止符)
24位元
位址
否 此栏位用24位元记录启始的位址[1][2],用来作为一连串S2记录的结尾。若SREC档案只用来烧录记忆体设备,不需执行位置的资料,此处的位址可以用0代替。
S9 起始位址
(档案终止符)
16位元
位址
否 此栏位用16位元记录启始的位址[1][2],用来作为一连串S1记录的结尾。若SREC档案只用来烧录记忆体设备,不需执行位置的资料,此处的位址可以用0代替。

记录顺序

[编辑]

有些Unix文件中提到“档案中S-records的顺序不重要,不应假设其顺序。”[1],不过大部份产生SREC的软体都会按照次序排列S-records。一般的档案顺序会由一个(选择性)的S0档头记录,之后有一笔或是多笔S1/S2/S3资料记录,可能有一个S5/S6记录来说明记录个数,最后由一个适当的S7/S8/S9记录作结束。

S19-格式,16位元位址的记录
  1. S0
  2. S1(一笔或多笔记录)
  3. S5(选择性的记录)
  4. S9
S28-格式,24位元位址的记录
  1. S0
  2. S2(一笔或多笔记录)
  3. S5(选择性的记录)
  4. S8
S37-格式,32位元位址的记录
  1. S0
  2. S3(一笔或多笔记录)
  3. S5(选择性的记录)
  4. S7

限制

[编辑]

记录长度:Unix手册中提到:“每个S-record记录的长度小于等于78个字元”。手册进一步的限制资料栏位字元限制在64个字元(32个位元组)以内[1]。用8个字元表示位址的资料栏位,若资料为64个字元,总长度为78个字元(2+2+8+64+2,此计算省略了记录尾端的终止符号或是换行符号)。这个档案可以用80字元宽的列表机列印。在手册下面有说明:“此说明只是针对记录总长度在78个字元的情形,不一定适用于所有情形。”[1]。若省略此限制,S-record的最大长度为514字元:记录种类2个字元,位元组数量2个位元(其值会是0xFF=255),以及位址、资料及检查码共2*255个字元。而且需要额外的空间储存换行符号以及字串结束字元。若记录长度太长,会有一些问题:“Motorola S-record格式定义允许一行到514个字元,另外加上行终结符号。EPROM烧录器需要有够大的行暂存器来处理这么长的资料,但有这么大暂存器的EPROM烧录器不多。”[3]

资料栏位:有些文件建议资料栏位最长到32位元组的资料(64个字元)[1]。S0/S1/S2/S3的最小资料栏位长度为0,最大资料资料栏位长度视位址栏位长度而定。因为位元组数量最大值是255(0xFF),资料栏位的长度为255减1(检查码)再减去位址栏位的位元组长度)。S0/S1 records最多可以到252位元组的资料,S2 record最多可以到251位元组的资料,S3 record最多可以到250位元组的资料。

注解:SREC档案格式不支援注解,有些软体会省略开头不是S的资料行,也会省略检查码之后的栏位,有时会有这些部份来写注解(但没有相容性)。例如CCS PIC编译器支援在Intel HEX英语Intel HEX档案最前面或是最后面的行,前面加上分号当成注解,其手册提到:“有些烧录器(尤其是MPLAB)不喜欢在档案最前面出现注解,因此我们有选项,可以把注解放在档案后面。[4]

例子

[编辑]
不同颜色的含义

  记录种类   位元组数量   位址   资料   检查码

检查码的计算

[编辑]

以下是一个记录的例子:

S1137AF00A0A0D0000000000000000000000000061

其检查码计算方式如下:

  1. 加总:将每个位元组相加13 + 7A+F0 + 0A+0A+0D+00+00+00+00+00+00+00+00+00+00+00+00+00 = 19E (16进制)
  2. 取最低位元组:总和的最低位元组 = 9E(16进制)。
  3. 取补数:计算最低位元组的一补数 = 61(16进制)。

16位元的记忆体位址

[编辑]
S00F000068656C6C6F202020202000003C
S11F00007C0802A6900100049421FFF07C6C1B787C8C23783C6000003863000026
S11F001C4BFFFFE5398000007D83637880010014382100107C0803A64E800020E9
S111003848656C6C6F20776F726C642E0A0042
S5030003F9
S9030000FC

相关条目

[编辑]

参考资料

[编辑]
  1. ^ 1.00 1.01 1.02 1.03 1.04 1.05 1.06 1.07 1.08 1.09 1.10 1.11 1.12 1.13 1.14 Motorola S-records from Unix man pages.. [2014-06-30]. (原始内容存档于2014-06-20). 
  2. ^ 2.0 2.1 2.2 Motorola, Appendix C, M68000 Family Programmer's Reference Manual (PDF) rev. 1, Motorola (Freescale): C–1–C–5, 1992 [2019-07-23], ISBN 978-0137232895, (原始内容存档 (PDF)于2015-09-24) 
  3. ^ srec_examples. sourceforge.net. [2019-07-23]. (原始内容存档于2019-08-24). 
  4. ^ CCS Compiler Reference Manual PCB/PCM/PCH (PDF), Custom Computer Services, Inc.: 107, 2014-05 [2015-02-08], (原始内容存档 (PDF)于2015-03-19) 

延伸阅读

[编辑]
  • M68HC05EVM Evaluation Module User's Manual 4th, Motorola (Freescale), 1990  Appendix A, "S Record Information", page A-1, states, "For compatibility with teletypewriters, some programs may limit the number of [data] bytes to as few as 28 (56 printable characters in the S-record)."
  • M146805EVM Evaluation Module Users Manual 1st, Motorola (Freescale), 1983 
  • MCM6830L7 MIKBUG / MINIBUG ROM, Engineering Note 100, Motorola (Freescale), 1975 

外部链接

[编辑]
软体