汽车编程器吧 关注:35贴子:85
  • 6回复贴,共1

汽车编程器之文件格式 Motorola SREC

只看楼主收藏回复

一个 S-record 格式的文件是由很多条 ASCII 记录组成的(an SREC format file consists of a series of ASCII records),一个文本行称为一个记录。如下图所示。


来自Android客户端1楼2015-05-08 18:12回复
    字节数域(Byte Count Field)
    字节数域在记录中占用 2 个字符位置,其大小表示随后的地址域(Address Field)、数据域(Data Field)、校验码域(Checksum Field)的字节数(十六进制数对)之和。也可以理解为字节数域之后所有字符长度之和除以 2。
    注释
    十六进制数对在记录中表示两个十六进制字符,实际就是一个字节数。如字符 15 表示字节值 0x15,即十进制 21。
    地址域(Address Field)
    地址域在记录中占用 4 个、6 个、8 个字符位置(十六进制数对),实际可以理解为数据域第一个字节存储在内存中的地址编码。地址域所占的字节数是由记录类型域来决定的。
    地址域占用 4 个字符位置,表示使用 2 个字节编码内存地址,可以表示的地址范围为 0x0000 ~ 0xFFFF。最大可以表示 64KB 大小。
    地址域占用 6 个字符位置,表示使用 3 个字节编码内存地址,可以表示的地址范围为 0x000000 ~ 0xFFFFFF。最大可以表示 16MB 大小。
    地址域占用 8 个字符位置,表示使用 4 个字节编码内存地址,可以表示的地址范围为 0x00000000 ~ 0xFFFFFFFF。最大可以表示 4GB 大小。
    数据域(Data Field)
    数据域在记录中占用 0~64 个字符位置。数据域的内容为加载到内存位置的数据或者描述信息(values represent the memory loadable data or descriptive information)。因为有的记录类型是没有数据的,所以数据域的最小长度为 0;数据域的最大长度为 64 个字符位置,即 32 个字节。


    来自Android客户端3楼2015-05-08 18:16
    回复
      2025-05-15 00:22:42
      广告
      校验域(Checksum Field)
      校验域在记录中占用 2 个字符位置,其值为字节数域开始到数据域结束所有十六进制数对的校验值。
      校验值的计算方法为从字节数域开始到数据域结束所有十六进制数对之和的最低有效字节的取反(the least significant byte of the ones complement of the sum of the byte values represented by the pairs of characters making up the count, the address, and the data fields)。
      例如一个 S3 记录如下
      S309610088046C880061B4
      则 S3 记录的 checksum 的计算方法如下
      checksum = FF - (09 + 61 + 00 + 88 + 04 + 6C + 88 + 00 + 61) && 0xFF = B4


      来自Android客户端4楼2015-05-08 18:17
      回复
        记录类型(type of record)
        S0 记录
        S0 记录的地址域长度为 4 个字符位置。地址域没有使用,使用 0000 填充;数据域记录了一些模块名称和版本之类的信息。
        S-record 文件格式的记录 - omicron - Omicron 2012
        S1 记录
        S1 记录的地址域长度为 4 个字符位置(即 2 字节地址)。地址域的值表示数据域加载到内存的地址;数据域为数据内容(memory loadable data)。
        S2 记录
        S2 记录的地址域长度为 6 个字符位置(即 3 字节地址)。地址域的值表示数据域加载到内存的地址;数据域为数据内容(memory loadable data)。
        S3 记录
        S3 记录的地址域长度为 8 个字符位置(即 4 字节地址)。地址域的值表示数据域加载到内存的地址;数据域为数据内容(memory loadable data)。
        S5 记录
        S5 记录的地址域长度为 4 个字符位置。地址域的值被解释为前面传输的 S1、S2、S3 记录的个数(the count of S1, S2, and S3 records previously transmitted);其数据域为空(There is no data field)。
        S-record 文件格式的记录 - omicron - Omicron 2012
        S7 记录
        S7 记录的地址域长度为 8 个字符位置(即 4 字节地址)。地址域的值被解释开始可执行的地址(the starting execution address);其数据域为空(There is no data field)。
        S8 记录
        S8 记录的地址域长度为 6 个字符位置(即 3 字节地址)。地址域的值被解释开始可执行的地址(the starting execution address);其数据域为空(There is no data field)。
        S9 记录
        S9 记录的地址域长度为 4 个字符位置(即 2 字节地址)。地址域的值被解释开始可执行的地址(the starting execution address);其数据域为空(There is no data field)。


        来自Android客户端5楼2015-05-08 18:17
        回复


          来自Android客户端6楼2015-05-08 18:20
          回复
            总结
            1 一个记录的最大长度为 78 个字符长(1 + 1 + 2 + 8 + 64 + 2 = 78)。
            2 S0 记录的地址域固定使用 0000 填充。
            3 S1、S2、S3 是数据记录。并决定了使用地址的类型,一个 16 位系统使用 S1 记录;24 位系统使用 S2 记录;32 位系统使用 S3 记录。
            4 S5 记录的地址域的值为 S1、S2、S3 记录的个数,没有数据域。
            5 S7、S8、S9 的地址域为程序的开始可执行地址,没有数据域。一个 16 位系统使用 S9 记录;24 位系统使用 S8 记录;32 位系统使用 S7 记录。
            6 通常所见的 S-record 文件后缀 S19、S28、S37 的内在意义就是 S19 只能表示 16 位的地址;S28 可以表示 24 位的地址;S37 可以表示 32 位的地址。
            7 S19 文件格式是以 S0 记录开始,数据记录都是以 S1 标识的 2 字节地址类型的记录,以 S9 记录结束。
            8 S28 文件格式是以 S0 记录开始,数据记录都是以 S2 标识的 3 字节地址类型的记录,以 S8 记录结束。
            9 S37 文件格式是以 S0 记录开始,数据记录都是以 S3 标识的 4 字节地址类型的记录,以 S7 记录结束。


            来自Android客户端7楼2015-05-08 18:21
            回复
              一个 S-record 文件内容通常如下图所示


              来自Android客户端8楼2015-05-08 18:22
              回复