S19 文件格式解析

发布: Edward  •  分类: Embedded  •  June 29, 2017, 3:26 p.m.  •  编辑

在嵌入式开发中,尤其是在汽车ECU开发中,HEX/S19是我们最常见的两种可执行文件的格式,里边含有MCU可以解释的指令集,通过烧录器或者Bootloader我们可以把这样格式的文件下载的MCU中,MCU就可以运行其中的代码了。因为现在大多数的工具将各种编译下载的动作都打包成了一个流程,有很多人如果没有特别关注的话,很可能对这两个文件的格式不是很了解,其实作为嵌入式开发人员,掌握可执行文件的格式是很必要的,尤其是对于开发bootloader的人员,这篇文章将简单的给大家讲解下S19文件的格式。

什么是S19

S19文件是一种利用ASCII格式来存储可执行代码的文件,是由摩托罗拉创造的,常见的文件后缀有很多种,例如 SRECORD, SREC, S19等等,其实后缀并不重要,利用记事本或者其他编辑工具打开文件以后,只要看到文件时符合S19格式的,那么就可以认为是S19文件。

文件的格式

S19文件中的每一行需要符合规定的格式,这个格式就是

Type Byte Count Address Data Checksum

如果你用文本工具打开一个S19文件,将会看到文件中的每一行都符合上述这个格式,其中

  • Type - 两个字符,表明这一行数据的类型,永远以S开头,可选的类型包括:S0,S1,S2,S3,S4,S5,S6,S7,S8,S9
  • Byte Count - 两个字符,16进制格式(最大值为FF,即255),代表字节个数,表示该行中,除了Type和Byte Count剩下的内容的字节数(地址,数据加校验和)
  • Address - 长度可以是(4,6,8个字符),代表该行数据的起始地址,16进制格式
  • Data - 长度跟数据大小有关,是16进制格式的数据本身,特别要注意的是S19文件中的数据是按大端方式来组织的
  • Checksum - 两个字符,是Byte Count,Address,Data按子节(两个字符)相加的和的补码,即所有的Byte Count,Address,Data,Checksum按字节相加后的结果最后一个子节应该是等于FF的

数据类型

由每一行数据的Type位决定了数据的类型本身,所有其他工具都应该参考该位的定义来解析数据

  • S0 - 头信息,这一行并不包含被写入MCU的数据,里边包含一些基本信息,可以以ASCII的形式包含文件名,版本,时间,公司名等等信息,这一类型的行的地址位通常为0000
  • S1 - 被写入到MCU对应地址上的数据,采用这种格式的行中的地址为16位格式,比如ABCD
  • S2 - 被写入到MCU对应地址上的数据,采用这种格式的行中的地址为24位格式,比如00ABCD
  • S3 - 被写入到MCU对应地址上的数据,采用这种格式的行中的地址为32位格式,比如0000ABCD
  • S4 - 保留类型
  • S5 - 该格式的行中的地址位代表所有S1/S2/S3信息行的行数,16位格式,也就是最大位65535,如果行数超出这个范围,将使用S6类型
  • S6 - 该格式的行中的地址位代表所有S1/S2/S3信息行的行数,24位格式
  • S7 - 代表S1类型的内容的结束,对应的地址位为0000
  • S8 - 代表S2类型的内容的结束,对应的地址位为0000
  • S9 - 代表S3类型的内容的结束,对应的地址位为0000

举例

上边的描述比较抽象,其实很简单,通过一个例子就可以了解的比较清楚了

S00F000068656C6C6F202020202000003C
S11F00007C0802A6900100049421FFF07C6C1B787C8C23783C6000003863000026
S11F001C4BFFFFE5398000007D83637880010014382100107C0803A64E800020E9
S111003848656C6C6F20776F726C642E0A0042
S5030003F9
S9030000FC

上边的S19片段展示了一个完整的数据存储,S0是文件头信息,包含着文件的基本信息,随后的三行S1表示从地址0000到003F上的所有的字节数据(以大端格式展示),S5中地址位0003代表整个片段中有3行S1格式的内容,而最后的S9则表明S1这种数据行的结束,随后可以继续出现S2/S3等格式的数据片段。

参考

https://en.wikipedia.org/wiki/SREC_(file_format)

标签: Software 软件

评论(0)

暂无评论

欢迎留言

This template was modified by Edward