摘要: 嵌入式系统编程文件格式多种多样。为方便嵌入式系统开发和深度理解各种目标系统,论文详细分析了多种主流的嵌入式可执行文件(即机器码文件)格式。比较了不同格式的异同点,并介绍了各种嵌入式文件格式的主要硬件系统及目标器件。
1 常见文件格式解析
虽然不同的开发集成环境和不同的硬件架构使得嵌入式设备中可执行文件的格式不尽相同,但基本上包含以下一些典型特征:
① 可执行文件的基本信息,如文件大小、时间、权限等。
② 与硬件架构相关的二进制代码和数据。
③ 符号表与符号重定位表。
从文件本身所包含的信息来看,嵌入式系统可执行文件主要有:纯数据类文件,记录类文件以及描述类文件。
1.1 纯数据文件格式
纯数据文件就是指文件中不包含地址和校验信息等,只包含纯粹的用户数据。纯数据文件主要包括两种:BIN格式和HEX格式。BIN格式即二进制的文 件,使用时每8位作为一个字节来用,传输BIN文件时并不进行ASCII编码。BIN文件格式是没有结束标记的。显然,BIN文件格式是除了一些压缩格式 (如ZIP和RAR)之外最节省空间的格式,它主要是用来编程存储器器件的,通常会建议将EPROM数据存储为BIN格式以作为标准文件格式来下载 [2].HEX格式相比BIN格式的区别就是,每个字节都转成了2个0~9和A~F之间值的ASCII码。整个文件是分行表示的,每行一般是16或32个 字节,行以空格加回车表示结束。
1.2 记录类文件格式
记录类文件中所有的数据行都叫做记录,每一条记录一般都分为多个域来清晰地说明记录的类型、记录中数据的数量、数据的存储地址、数据校验信息等。而 且,记录类文件一般都有关于该文件开始和结束的标记信息。各种记录类文件格式的差异就体现在不同公司定义的记录标记以及一些域格式和顺序的差别上。记录类 文件常见的就是各种MCU的烧录文件。
1.2.1 Intel HEX文件格式(.HEX)
Intel HEX是一种较老的文件格式。它是用ASCII字符来表示文件中数据域的二进制数据。文件中每一行是一条HEX记录,由一个回车和一个换行结束。 Intel HEX文件经常被用于将程序或数据传输存储到ROM、EPROM,大多数编程器和模拟器使用Intel HEX文件。
记录格式如下:
:BBAAAATTHHHH…HHHCC
:--记录开始标记。
BB--长度域,占一个字节。代表这条记录中数据的字节数,每条记录最大数据字节数是255字节,通常为32字节。长度域只计数数据域的大小。
AAAA--地址域,占两个字节,存储方式是MSB.地址域指出这条记录的第一个数据字节的地址,随后地址逐一增加以存储下面的数据。整个文件中各记录的地址顺序是不重要的,文件中有时也会有一段空的地址。
TT--类型域,1字节。表示该条记录的类型。
HH--数据域,长度受到记录类型的限制。数据记录以字节为单位。
CC--校验和,占一个字节。计算方法是将本记录中除了冒号和校验字节之外的所有字节加起来,将模除256得到的余数取补码。
Intel HEX文件格式的6种记录说明如表1所列。
表1 Intel HEX文件格式的记录类型
1.2.2 Motorola S/EXORciser/EXORmacs/32位格式
Motorola公司的产品主要基于Motorola S记录格式,这种文件格式以一种可打印的格式编码程序和数据文件来实现计算机系统间的传输,可以使下载文件实现可视化编辑。S记录由特殊排列的一串 ASCII字符序列组成,最大长度为78字节。一个文件内的S记录一般没有特定的顺序要求。目前主要有3种S记录文件格式:S19格式,地址域是16位, 最大可写64 Kb的文件;S28格式,地址域24位,最大可写16 Mb的文件;S37格式,地址域32位,最大可写4 Gb的文件。
S记录的一般格式是:类型域--长度域--地址域--数据域--校验和。S记录的各种记录类型有不同的格式和意义,具体如表2所列。
Motorola S19(又称Motorola EXORciser)格式是以S0记录开始,数据记录都是以S1标识的2字节地址类型的记录,S9标识结束记录格式。Motorola S28(又称Motorola EXORmacs)格式是以S0记录开始,数据记录都是以S2标识的3字节地址类型的记录,S8标识结束记录格式。Motorola S37(又称Motorola 32位)格式是以S0记录开始,数据记录以S3字符标识的4字节地址类型的记录,S7标识的结束记录格式。
表2 S记录的记录类型
1.2.3 TektrONix HEX/扩展的Tektronix HEX格式
Tektronix HEX格式如下所示:
/AAAABBEEDDDDDDDDCC
/:记录开始标记符。
AAAA:地址域。占两个字节,记录了第一个数据字节的地址。
BB:长度域。占1个字节,因此每条记录的最大数据个数为255字节。
EE:地址和长度数据的校验和域。大小为1个字节。
DD:数据域。最大为255个数据字节,但一般记录中为32个字节。
CC:数据的校验和域。
文件的结束记录中包括记录开始符("/")、传输地址、数值为"00"的长度以及传输地址和长度的校验和字节。一种可选择的中断记录以2个开始符("//")为记录开始,接着是一串任意的ASCII字符串。
扩展的Tektronix HEX相对Tektronix HEX格式具有较为灵活的记录类型和地址空间。它包括3种类型的记录:数据、符号和结束记录。数据记录中的是目标代码;符号记录中的是编程部分的信息,编 程器下载时符号记录是被忽略的;结束记录包括头部、下载地址和目标代码。
扩展的Tektronix HEX格式模型如下:
%BBMEEAAAAADDDDDD---DCC
%:占1个ASCII字符,标示扩展Tek HEX记录开始。
BB:长度域。占1个字节,表示该记录中除开始标志之外的字节数。
M:类型域,一个ASCII字符。类型域中:6代表数据记录,3代表符号记录,8代表结束记录。
EE:地址和长度数据的校验和,大小为1个字节。
AAAAA:地址域。地址域包括2~17个字符,第1个字符决定了地址的长度,一般为8,0代表16个字符的地址长度。地址域第1个字符之外的字符指出了数据在存储器存放的地址。
DD:数据域。包括可执行代码,下载到存储器的数据以及传输中的描述信息。
CC:校验和,占一个字节。校验和域对本条记录中除了"%"和校验数据本身之外的所有数据计算校验和。
根据是否有数据和结束记录,记录中域的数量是不一样的,2种记录都有6个字符的头以及2~17个字符的地址。
1.3 描述类文件格式
描述类文件格式的文件信息有相对丰富的文件格式,文件不仅有关于数据的记录信息,还包含了关于目标机的一些说明信息,改变硬件结构的信息或者测试信息等。该类型的文件最常见的是用于PLD和FPGA的下载文件。
1.3.1 JEDEC 文件
JEDEC(Joint Electron Device Engineering Council)标准是用于现场可编程逻辑器件的。该标准定义了在开发系统和编程器之间传输熔丝状态的数据格式。它并不涉及诸如逻辑阵列类型和输出宏单元 等设备结构信息。现场可编程逻辑器件比可编程的存储器件需要更多的测试信息,所以该标准还定义了一些简单的测试格式。JEDEC格式的合法字符包括所有可 打印的ASCII字符和4个控制字符,包括STX(Start of Text)、ETX(End of Text)、CR(Carriage Return)和LF(Line Feed)。一般使用BNF(BackusNaur Form,巴科斯诺尔范式)来定义JEDEC格式的语法。
JEDEC格式的第1个域是强制的关于设备信息设计规格书,这个域没有开始标记符。在JEDEC文件中每一个域都有域识别符以指明该域的类型,每一个域都是以星号结束。JEDEC文件各种域识别符如表3所列。
描述及定义域主要用来说明用户和厂商信息、日期和版本号等各种信息。
N--说明域。用来在JEDEC文件传输中插入说明信息,编程器是忽略这一域的。
D--器件域。编程器支持的器件并不是遵从这一域,而是由QF和QP域以及手动选择器件而决定。
QF,QP和QV--数值域。QF子域定义了器件中熔丝的数量,在器件编程或者测试域之前,这 些数值域都是必须的;只有测试域的文件不需要QF域,编程数据的文件不需要QP和QV域;QF子域向编程器指出了熔丝数据需要多少存储器,多少熔丝要被设 置到初始条件以及计算校验和所包含的熔丝数;QP子域定义了测试向量中的引脚数目或者测试条件;QV子域指出了测试向量的最大数。
器件编程域。每一个熔丝有2种可能的状态:0为低阻连接,1为高阻连接。熔丝编号从0开始一直 到最大熔丝数目。L域中L之后是该域第一个熔丝的十进制序号数字,接下来就是指示熔丝状态的二进制数字列表,熔丝号和熔丝列表之间由空格或者回车分开。F 域定义了L域中未明确定义的熔丝状态信息。C域是把从第一个熔丝开始的整个器件的熔丝状态每8位作为一个字节来计算的,最后一个字中若有未使用的位则填 0.U域允许指定JEDEC文件中的不影响逻辑和电特性的用户数据熔丝。E域允许定义不影响器件逻辑功能也不影响已有的JEDEC文件的特性,数据可以用 二进制或者十六进制来表示。J--器件标识域。提供逻辑识别码指出文件对应器件的逻辑结构,由以空格分开的分别大于等于0的2个十进制数组成:第1个是结 构码,第2个是引脚码。J域中的编码是由JEDEC组织分配的。
设备测试域。功能性的测试由测试向量包含的测试条件来定义,每一个测试向量包括n个测试条件。n是器件引脚数,测试条件如表4所列。
X--默认测试条件域。定义了未精确定义的测试向量的输入逻辑电平,即把QV域中的测试向量1 设置为默认输入测试条件。若使用X域,应当在QV和QP域之后第一个测试向量之前。V--测试向量域。由十进制的向量编号开始,之后是空格以及每个引脚的 一串测试条件。P--Pin引脚序列域。P域映射出了器件输出引脚,一般和V域一起使用。代码如下所示:
P 1 2 3 4 5 6 14 15 16 17 7 8 9 10 11 12 13 18 19 20 *
V0001 111000HLHHNNNNNNNNNN*
V0002 100000HHHLNNNNNNNNNN*
编程及测试选项类域:G为熔丝安全域。用来使能某些逻辑器件的加密熔丝,在G域发送1,即G1*;R、S、T为属性分析测试;A为访问时间域,定义了测试向量在十亿分之一秒内的传播延时。
表3 JEDEC文件各种域识别符
表4 设备引脚的各种测试条件
1.3.2 POF文件
POF文件中的包类型如表5所列。 POF(Programmer Object File, 编程目标文件) 格式提供高度压缩的数据文件,可方便有效地传输大量的逻辑器件编程信息。这种文件目前主要应用于MAX系列器件。POF文件由文件头和各种包组成,每个包 对应一个标记,指出包中的数据类型以及数据本身结构,各个包的长度和结构各异。每个数据包的最前6个字节是包类型和其余字节的数量。编程设备在读取POF 文件时,若包类型未被识别,则该包弃之不用。在一个POF文件中,除了结束标记包外,各种类型都可多次出现。有些包编程器是需要包中信息的,有些包编程器 是不使用的(跳过),有些包则是编程器只读包中信息但不直接应用该信息的(只读)。
表5 POF文件中的包类型
2 总结
为方便用户使用,目前大多数主流公司生产的编程器都能够在下载文件时自动进行某几种文件格式的检测识别以及文件格式的转换。然而这毕竟解决不了文件格式之间互不兼容的实际问题。因此,我们期望在未来几年内文件格式可以逐步走向统一,拥有一种或少数几种格式标准。