SREC

Motorola S-record是摩托罗拉公司所创立的档案格式，可以将二进制的资讯转换为用ASCII文字表示的十六进制资料，此档案格式也称为SRECORD、SREC、S19、S28、S37或MOT。此档案格式常用在微处理器的闪存资料写入，EPROM、EEPROM的资料写入，或是其他可编程逻辑元件的编程写入。一般的应用中，会用编译器或是组译器将程式的源代码（可能是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字元记录。记录从左到右的结构如下：

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

### 文字列的结束字元

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

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

### 记录种类

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

记录字段｜记录用途｜位址字段｜资料字段｜记录说明

S0｜档案头｜16-bit"0000"｜是｜此记录会包括许多设备商定义的ASCII文字，每个字节由二个16进制数字表示。此字段的资料常会以C风格字符串的方式表示。其中的文字资料可能会包括：档案／模组名称，版本编号，日期／时间，产品名称。PCB上的内存IC名称、版权说明等。

S1｜资料｜16-bit位址｜是｜此记录是启始位址是16位元的资料，一般会用在8-bit的微处理器中，例如AVR、PIC、8051、68xx、6502、80xx、Z80。其资料字段的字节数量是“字节数量”字段的值减3（2个字节对应16位元的位址，1个字节对应检查码）。

S2｜Data｜24-bitAddress｜是｜此记录是启始位址是24位元的资料。其资料字段的字节数量是“字节数量”字段的值减4（3个字节对应24位元的位址，1个字节对应检查码）。

S3｜Data｜32-bitAddress｜是｜此记录是启始位址是32位元的资料This record contains data that starts at a 32-bit address.，一般会用在32-bit的微处理器中，例如ARM和680x0其资料字段的字节数量是“字节数量”字段的值减5（4个字节对应32位元的位址，1个字节对应检查码）。

S4｜保留｜不适用｜不适用｜此记录保留

S5｜个数｜16位元计数值｜不适用｜此字段是可有可无的字段，其中有S1 / S2 / S3记录的数量，用16位元来计数。此字段适用于记录数量小于等于65,535（0xFFFF）的情形，若是超过，会改用S6字段。

S6｜个数｜24位元计数值｜不适用｜此字段是可有可无的字段，其中有S1 / S2 / S3记录的数量，用24位元来计数。此字段可以适用于记录数量大于等于65,536（0x010000），但小于等于16,777,215（0xFFFFFF）。这个较新的字段是最新的变更。

S7｜起始位址（档案终止符）｜32位元位址｜不适用｜此字段用32位元记录启始的位址，用来作为一连串S3记录的结尾。若SREC档案只用来烧录内存设备，不需执行位置的资料，此处的位址可以用0代替。

S8｜起始位址（档案终止符）｜24位元位址｜不适用｜此字段用24位元记录启始的位址，用来作为一连串S2记录的结尾。若SREC档案只用来烧录内存设备，不需执行位置的资料，此处的位址可以用0代替。

S9｜起始位址（档案终止符）｜16位元位址｜不适用｜此字段用16位元记录启始的位址，用来作为一连串S1记录的结尾。若SREC档案只用来烧录内存设备，不需执行位置的资料，此处的位址可以用0代替。

### 记录顺序

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

S19-格式，16位元位址的记录

- S0
- S1（一笔或多笔记录）
- S5（选择性的记录）
- S9

S28-格式，24位元位址的记录

- S0
- S2（一笔或多笔记录）
- S5（选择性的记录）
- S8

S37-格式，32位元位址的记录

- S0
- S3（一笔或多笔记录）
- S5（选择性的记录）
- S7

### 限制

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

资料字段：有些文件建议资料字段最长到32字节的资料（64个字元）。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档案最前面或是最后面的行，前面加上分号当成注解，其手册提到：“有些烧录器（尤其是MPLAB）不喜欢在档案最前面出现注解，因此我们有选项，可以把注解放在档案后面。

## 例子

不同颜色的含义

### 检查码的计算

以下是一个记录的例子：

```
<span style="background-color: #FFCCCC">S1</span><span style="background-color: #CCFFCC">13</span><span style="background-color: #CCCCFF">7AF0</span><span style="background-color: #CCFFFF">0A0A0D00000000000000000000000000</span><span style="background-color: #CCCCCC">61</span>
```

其检查码计算方式如下：

- 加总：将每个字节相加13 + 7A+F0 + 0A+0A+0D+00+00+00+00+00+00+00+00+00+00+00+00+00 = `19E` （16进制）
- 取最低字节：总和的最低字节 = `9E`（16进制）。
- 取补数：计算最低字节的一补数 = 61（16进制）。

### 16位元的内存位址

```
<span style="background-color: #FFCCCC">S0</span><span style="background-color: #CCFFCC">0F</span><span style="background-color: #CCCCFF">0000</span><span style="background-color: #CCFFFF">68656C6C6F20202020200000</span><span style="background-color: #CCCCCC">3C</span>

<span style="background-color: #FFCCCC">S1</span><span style="background-color: #CCFFCC">1F</span><span style="background-color: #CCCCFF">0000</span><span style="background-color: #CCFFFF">7C0802A6900100049421FFF07C6C1B787C8C23783C60000038630000</span><span style="background-color: #CCCCCC">26</span>

<span style="background-color: #FFCCCC">S1</span><span style="background-color: #CCFFCC">1F</span><span style="background-color: #CCCCFF">001C</span><span style="background-color: #CCFFFF">4BFFFFE5398000007D83637880010014382100107C0803A64E800020</span><span style="background-color: #CCCCCC">E9</span>

<span style="background-color: #FFCCCC">S1</span><span style="background-color: #CCFFCC">11</span><span style="background-color: #CCCCFF">0038</span><span style="background-color: #CCFFFF">48656C6C6F20776F726C642E0A00</span><span style="background-color: #CCCCCC">42</span>

<span style="background-color: #FFCCCC">S5</span><span style="background-color: #CCFFCC">03</span><span style="background-color: #CCCCFF">0003</span><span style="background-color: #CCFFFF"></span><span style="background-color: #CCCCCC">F9</span>

<span style="background-color: #FFCCCC">S9</span><span style="background-color: #CCFFCC">03</span><span style="background-color: #CCCCFF">0000</span><span style="background-color: #CCFFFF"></span><span style="background-color: #CCCCCC">FC</span>
```

## 相关条目

- 二进制对应文字的编码，不同编码算法的比较
- Intel HEX，Intel的HEX档案格式
- Tektronix extended HEX，Tektronix的HEX档案格式

## 延伸阅读

- 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)."

## 外部链接

- RFC 4194 - The S Hexdump Format - IETF

软件

- SRecord is a collection of tools for manipulating SREC format files.
- BIN2MOT, BINARY to Motorola S-Record file converter utility.
- SRecordizer is a tool for viewing, editing, and error checking S19 format files.
- bincopy is a python package for manipulating SREC format files.

## 基本资料

- 日语原文：S-record
- 域：

<image>

- 扩展名：`.s19`, `.s28`, `.s37`, `.s`, `.s1`, `.s2`, `.s3`, `.sx`, `.srec`, `.exo`, `.mot`, `.mxt`
- 开发者：摩托罗拉