您的位置  > 互联网

关于烧录文件在典型的应用程序中,编译器或汇编器将程序的源代码

在典型的应用中,编译器或汇编器将程序的源代码(例如C或汇编语言)转换为机器代码并将其输出到文件。 然后,程序员导入该文件,将机器代码“烧录”到 ROM(或闪存)或传输到目标系统进行加载和执行。

这个存放机器代码的文件就是烧录文件,它是用来烧录到微控制器(如MCU、NOR/NAND Flash等)内部的Flash中的程序文​​件。 烧录文件可以有多种格式,比如bin、Hex、S19等,下面对这些文件格式进行完整分析。

▍2. bin文件

这种文件格式是最简单、最直接的,直接存储Flash的原始数据。 Bin 文件有其优点和缺点——简单和直接既是优点也是缺点。

因为它存储的是原始数据,所以我们可以通过文件地址直接找到对应地址的内容。 它的缺点是什么? 正是因为文件地址与地址对应,所以文件地址是连续的。 因此,如果地址是一个很大的值(例如),并且IC上的地址空间不连续,就会很麻烦。

也许你会说,把空格填上0x00或者0xFF,那你就得想想bin文件有多大了。

面对这个问题,SREC、HEX等文件格式应运而生。

▍3. 十六进制文件

本文讨论的HEX指的是Intel-HEX,它是Intel开发的一种格式。

英特尔十六进制的描述

Intel HEX 由由换行符或回车符或两者分隔的 ASCII 文本行组成。 每个文本行包含编码多个二进制数字的十六进制字符。 二进制数可以表示数据、内存地址或其他值,具体取决于它们在行中的位置以及行的类型和长度。 每行文本称为一个()。

Intel Hex格式包含6部分,其格式如下:

示例::0EA

格式开始

例子

02

0000

02

1200

EA

起始码,1 个字符,是 ASCII 冒号“:”。

字节计数,2个十六进制数字,表示该数据区有多少个字节(十六进制数字对)。 最大值为 255 (0xFF)。 16 (0x10) 和 32 (0x20) 是最常用的。

,4个十六进制数字,表示数据的起始16位地址偏移量。 物理地址通常是该偏移量加上基地址。 基地址默认为0,可以通过各种类型改变。 基地址和地址偏移量通常是大端值。

type,2个十六进制数字,00~05,表示不同数据段的含义。

数据,一系列数据,表示为2n个十六进制数字,具体内容取决于实际应用数据。

, 2 个十六进制数字来验证此内容。

我们直接用一个例子来解释一下Intel Hex:

示例::37A1E 数据的总和为:03 + 00 + 30 + 00 + 02 + 33 + 7A = E2。 E2的补码是1E,它是这个数据的补码。

文本行末尾

在Hex文件中,每行有一条记录,因此后面跟着一个结束符,即行终止符(可以简单理解为换行符)。 这取决于系统环境。 例如,Linux使用一个LF(即0A),而另一个是CR LF(0D 0A)。

类型

标准类型有6种(00~05):

十六进制编码类型描述示例

00

数据

数据段,即数据和16位起始地址

:7

01

文件结束

结束行通常是文件的最后一行,数据区通常为空。

:

02

SS

数据字段包含与80x86实模式寻址兼容的16位段基地址(因此字节数为02)。 地址字段(通常为 0000)被忽略。

:0EA

03

开始

对于 80x86 处理器,指定 CS:IP 寄存器的初始内容。 地址字段为0000,字节数为04,前两个字节为CS值,后两个字节为IP值。

:

04

允许 32 位寻址(最大 4GiB)。 地址字段被忽略(通常为 0000),字节数始终为 02。

:

05

开始

地址字段为0000(未使用),字节数为04。这四个数据字节表示加载到80386及更高版本CPU上的EIP寄存器中的32位值。

:

看一下十六进制文件是什么样的:

该十六进制的实际内容是:

如您所见,地址不必以 开头。

姓名格式

特殊名称有时用于指代使用特定记录类型子集的 HEX 文件格式。 例如:

I8HEX文件只使用()

该文件仅使用03()

该文件仅使用,01,04,和05()

▍4. SREC文件

SREC 描述 该SREC 与十六进制格式类似。 它是由S-制定的,通常称为S-。 这种格式就是我们平常看到的,SREC、S19、S28、S37。 SREC文件后缀有很多,例如:.s19、.s28、.s37、.s、.s1、.s2、.s3、.sx、.srec、.mot

SREC格式

例子:

克苏姆

13

7AF0

61

SREC 格式文件由一系列 ASCII 文本记录组成。 记录从左到右具有以下结构:

、两个字符、一个大写“S”(0x53),然后是一个数字 0 到 9,定义记录的类型。

,两个十六进制数字,表示记录其余部分(地址 + 数据 + 校验和)后面的字节数(十六进制数字对)。 对于 16 位地址字段,该字段的最小值为 3 加 1 校验和字节,最大值为 255 (0xFF)。

,由记录类型确定的四/六/八十十六进制数。 地址字节以大端格式排列。

数据(2n 个十六进制数字的序列),用于 n 个字节的数据。 对于 S1/S2/S3 记录,每条记录通常最多为 32 个字节,因为它适合 80 个字符宽的终端屏幕,尽管 16 个字节可以更轻松地直观地解码特定地址的每个字节。

,两个十六进制数字,是字节数,即地址和数据字段的两个十六进制数字对表示的值之和的最低有效字节的补码。 有关详细校验和示例,请参阅示例部分。

文本行末尾

与十六进制文件类似。 这里就不详细说了。

类型

下表描述了 10 条可能的 S 记录。 S4 已保留且当前未定义。 S6 最初被保留,但后来在某个时候被重新定义。

S0

16位“0000”

该记录包含以一系列十六进制数字对表示的供应商特定的 ASCII 文本。 该记录的数据通常以空终止字符串的形式查看。

S1

数据

16位

该记录包含以 16 位地址字段开头的数据。 该记录通常针对AVR、PIC、8051、68xx、6502、80xx、Z80等8位微控制器。

S2

数据

24位

该记录包含以 24 位地址开始的数据。

S3

数据

32位

该记录包含以 32 位地址开头的数据。 该记录通常用于 32 位微控制器,例如 ARM 和 680x0。

S4

不适用

不适用

保留文本

S5

数数

16位计数

×

该可选记录包含 S1/S2/S3 记录的 16 位计数。

S6

数数

24位计数

×

该可选记录包含 S1/S2/S3 记录的 24 位计数。

S7

开始()

32位

×

该记录包含起始执行位置的 32 位地址。

S8

开始()

24位

×

该记录包含 24 位地址处的起始执行位置。

S9

开始()

16位

×

该记录包含 16 位地址处的起始执行位置。

顺序 尽管一些 Unix 文档指出“文件中 S 记录的顺序并不重要,并且不能假设特定的顺序”,但实际上大多数软件都对 SREC 记录进行排序。 典型的记录序列以(有时可选的)S0 头记录开始,以一个或多个 S1/S2/S3 数据记录的序列继续,可能以可选的 S5/S6 计数记录结束,并以合适的 S7/S8/ S9 终止录音。

S0

S1(一个或多个)

S5 ( )

S9

S0

S2(1个或多个)

S5 ( )

S8

S0

S3(一个或多个)

S5 ( )

S7

斯雷克

例子:

加法:13+7A+F0+0A+0A+0D+00+00+00+00+00+00+00+00+00+00+00+00+00=19E(十六进制) 掩码:保留总数最低有效字节 = 9E(十六进制)。

补码:计算最低有效字节的补码 = 61(十六进制)。

我们来看看完整的SREC文件是什么样的:

该SREC的实际内存内容为:

值得一提的是,SREC文件中有一个S0段。 该段的内容并不是存放有效数据,而是一个文件头信息,可以存放一些文件的长度、校验码等信息,这个内容在做软件发布、升级文件的时候非常有用。

▍5. 刻录文件的实际应用

只需通过IDE编译生成文件,直接烧录即可。 学习这些文件格式有什么用呢?

合并与分割文件 在进行MCU升级功能时,经常会出现两个工程,并且会生成两个烧录文件。 仿真和调试时,烧两个文件非常不方便。 发布软件时,发送两个刻录文件也很难管理。 然后你就可以根据这些文件格式要求合并所有的文件了。 如果您有一个比较大的文件,其中存储了不同的内容,您也可以将大文件拆分为两个或多个。

向原始文件添加附加信息。 升级文件往往从一个特殊的固定地址开始,这意味着升级文件是量身定做的。 无论bin还是s19文件,我们都可以在文件中附加一些头信息。 例如,对于bin文件,可以在前128字节中存储一些CRC32等信息,以方便升级程序的分析。

用特定内容填充空白处。 Hex文件和Srec文件中允许有间隙,即某些地址没有内容。 出于实际目的,这个间隙可能默认为0xFF(如ARM系列的STM32),但也可能是随机的(如小日本的RH850)。 因此,如果有必要,我们可以用0xFF或0x00来填充这些空白,以方便以后的处理,例如验证。

文件验证 在软件发布之前,我们可以对烧录的文件进行计算并获取其验证值(如CRC/XOR/SUM等)来验证烧录到实际物理地址的内容是否正确。 这需要在继续之前了解特定的文件格式。

▍6. 刻录文件处理软件

通过上面的章节,我们已经了解了文件格式。 我们怎样才能编写一个文件处理程序呢? 或者有没有现成的工具可以使用?

自己写一篇

根据实际功能需求自行实现一个软件或脚本程序。 事实上,编写这样的程序并不难,因为它的格式并不复杂。 对于MCU中的升级程序,经常需要解析这样的hex文件或者srec文件格式,也需要实现这种文件解析。 互联网上有很多这样的例子。 对于网上的例子,建议多验证和测试。

使用

这个软件非常强大。 它是用 C/C++ 编写的,并被许多其他软件引用。 例如keil也使用这个工具。

这是一个用于 EPROM 加载文件的工具。 我写的时候我是为了EPROM加载文件,我找不到很多。 我能找到的那些只做了其中的一些。 是 C++ 语言,用于文件 和 . 更多文件并且是 .

支持多种文件格式,您能想到的一切格式(最多 40 种格式):Ascii-Hex、ASM、Atmel、BASIC、B-、C、Intel-Hex、-...

事实上,它只有三个轴:,,

的工具是 和 。 所有工具、所有文件以及所有 .

可用于(连接)EPROM 加载文件,或 EPROM 加载文件,. 它的所有输入和,它也可以用于文件从 1 到 .

可用于 EPROM 加载文件,或 EPROM 加载文件,对于 .

可用于打印有关 EPROM 加载文件的信息。

这个程序不仅有click-link-(),而且还有开源代码click-link-()。 里面的实现非常值得我们学习。