2024年5月9日发(作者:)

10.16638/.1671-7988.2019.11.046

一种英特尔Hex文件的解析和填充方法

徐旭,毕乾坤

(陕西法士特汽车传动工程研究院智能传动研究所,陕西 西安 710119)

摘 要:英特尔Hex格式文件是微处理器MCU使用的一种文件格式,该种文件记录了MCU PROM中的执行程序

和数据,无论是在Simulink环境下搭建的模型或是在IDE环境下编写的代码,最终都是通过编译器编译、链接生

成Hex格式的文件。在下载Hex文件之前,需对Hex文件的内容进行解析,将内存中不连续的地址段提取出来,

并填充字节0xFF或0x00。

关键词:Hex文件;解析;填充

中图分类号:TP311 文献标识码:A 文章编号:1671-7988(2019)11-142-03

Method to Parse and Fill Intel Hex File

Xu Xu, Bi Qiankun

( Shaanxi Fast Auto Drive Engineering Research Insitute, Shaanxi Xi’an 710119 )

Abstracr: Intel Hex file is a particular file format to store programms and data which locate in MCU PROM, when

engineer develop code in Simulink or IDE, Hex file will be generated after compile, link process. Before download it into

MCU, parse the contents and check the discountinuous address, then fill it with bytes 0xFF or 0x00

Keywords: Hex file; Parse; Fill

CLC NO.: TP311 Document Code: A Article ID: 1671-7988(2019)11-142-03

种文本化的形式将这些信息记录下来,类似将MCU 内存中

1 前言

智能化的传动系统都离不开其智慧的大脑 – 控制器,无

论是液力自动变速器、AMT、或是液力缓速器都是通过控制

器对其机械、液压系统进行实时控制。软件工程师在Simulink

环境下进行控制算法、控制逻辑的设计,通过编译器将这些

高级语言进行“翻译”,最终生成一种叫做Hex格式的文件,

将Hex文件下载到TCU内部,就可以真正的将工程师的设

计运行起来。

Hex格式文件是美国英特尔公司在1988年为其生产的8

位、16位、32位处理器定义的一种文件格式。这种格式的文

件存储了MCU Program ROM内的执行代码和数据,它以一

作者简介:徐旭,电器工程师,中级工程师,陕西法士特汽车传动

研究院智能传动研究所,主要研究内容,嵌入式系统软件开发,

AutoSAR平台下的底层软件开发,Simulink代码集成。

的信息通过一面“镜子”照射出来,可以直观的供工程师进

行阅读和查看,所以这种反映MCU PROM信息的文件也被

称为镜像文件 – image file。

Hex文件是以ASCII码的形式记录MCU内部二进制内

容,可以直接通过文本编辑器等文本软件查看文件内容。

2 Record的域划分

通过文本编辑器打开Hex文件,可看到如下内容:

从图1可知,文件中的内容以行的形式依次进行排列,

根据Hex文件格式的定义,这里的每一行都视为一个Record,

图1中展示的文件共计28992行,也就对应着28992个

Record。每个Record中所包含的符号和数据都根据不同的功

能或意义定义为一个域。包括:

Record的标识符,每个Record都是以冒号“:”为开

142

徐旭 等:一种英特尔Hex文件的解析和填充方法

始;

Record的长度,表示域5中的数据或信息中是由多少

个字节组成;

Record的加载地址,表示这个Record中所包含的内

容位于MCU PROM中的哪个位置;

Record的类型,表示第5个域中所含内容的意义,所

含的是一个基地址或数据;

Record的校验和,表示这个Record中所含数据的校

验和。

图1 文本编辑器下的Hex文件内容

图2 Record的域划分

3 Record Type的含义

Record Type的值表明了这个Record的用来做什么的,

根据标准共计有6种不同的Record类型:

RecordType 0x00,表示域5中的内容是数据。

RecordType 0x01,表示这是整个hex文件中最后一个

record。

RecordType 0x02,可同时用于16位和32位格式的

MCU,表示16位地址中的高12位,低4位是0。

RecordType 0x03,可同时用于16位和32位格式的

MCU,是专门针对8086和80186这种架构的MCU,DATA

中定义的4字节数据是CS和IP寄存器中的值。

RecordType 0x04,仅针对 32位格式的MCU,表示的

是32位地址的高16位基地址,低16位是0x0000。

RecordType 0x05,这种record type仅针对32位格式

的MCU,表示的是这个hex文件内容的起始执行地址。

根据Record Type对Hex文件中的每个Record进行相应

意义的解析,从而梳理出Hex文件的起始执行地址,每个

Block的起始地址和长度。

4 Hex文件解析的实现

图1中展示的Hex文件内容,PROM从地址0x8001000

至0x803FFFFF,共计4032Kbytes。 文件以Record Type 0x04

为起始,以Record Type 0x01为结束,中间行穿插着Record

Type 0x04,分别记录了不同的linear Address,如果上一个

Record的结束地址与当前Record的起始地址不连续,则视

为Block中断。

图3 Hex文件的解析流程

步骤一:

读取文件的第一个Record,获取Block 1的高16位

地址,并更新Segment的基地址。

读取下一个Record,更新当前Record的起始地址和

结束地址,分别将值赋给如下变量。

currentRecordStartAddress,currentRecordEndAddress。

143

汽车实用技术

定义静态变量previousRecordEndAddress,获取current

RecordEndAddress的值。

步骤二:

读取下一个Record,判断Record Type的类型。

Case 1:Record Type是0x00,则更新current Record Start

Address,判断currentRecordStartAddress和previous Record

EndAddress两者之间的地址差是否为1,如果为1,则说明

地址连续,否则地址不连续,则记录为一个独立的Block。

Case 2:Record Type是0x04,则说明是一个新的Seg

-ment,获取Segment的高16位地址,并继续读取下一个

Record,重复case 1的步骤。

Case 3:Record Type是0x01,则说明这是Hex文件的结

束,停止程序的执行。

5 Hex文件填充的实现

图4 Hex文件填充流程

在进行程序下载时,下载工具会对加载的Hex文件进行

解析,每次以16字节的倍数传递解析的数据,如果文件中存

在不连续的Block时,会影响下载工具的刷写,因此,需要

144

对上述解析后的Hex文件进行地址填充,根据要求的地址范

围,对该范围中存在的地址空隙进行字节填充。

程序启动后会读取用户输入的填充起始地址和填充结束

地址,并根据输入的Hex文件开始地址进行判断,逐行比较

当前Record的结束地址和fillEndAddress,如果小于fill

EndAddress,则再判断record length是否是16个字节,如果

不是则填充字节0xFF,补齐16个字节,当currentRecordEnd

Address超过fillEndAddress时,填充结束。

对图1中的Hex文件按照地址范围0x80010000至0x803

FFFF进行填充,填充后的结果为:

图5 Hex文件填充后的Block示意图

6 总结

Hex文件作为一种存储可执行程序内容的文件,其内容

包含了要运行在MCU上的程序和数据,为了保证Hex文件

的内容可以正确的下载到MCU内部,在程序下载前对Hex

文件内容进行解析和填充是必不可少的。

通过解析和填充,可以帮助工程师更好的理解Hex的文

件内容,为产品软件调试、变量信息查看等方面提供技术帮

助,从而更好的进行产品开发和功能验证。

参考文献

[1] Hexadecimal Object File Format Specification[S]. Intel Corporation,

1988.