遇见往事 / 编程器与Intel HEX文件格式

今天早晨查找资料的时候,无意中发现一篇自己16年前翻译的文章,不胜感慨。


(图源 :pixabay)

欲做编程器

那时候和朋友一起创业做一些单片机相关的硬件开发,单片机开发一个重要的步骤就是将我们编写出来的程序烧写到单片机内部让其工作,而完成这个步骤需要用到一个设备叫做编程器(现在也有叫下载器的),为此我们特意花2000多大洋购入这个设备,对于当时的我们而言,这是比较巨大的一笔开销了。

尽管用我们购买的编程器可以完成程序的烧写的烧写工作,但是需要将待烧写的芯片插到编程器的芯片座上,再启动编程器软件,从一堆列表中选取芯片厂商、芯片型号,再从文件选择框中选择我们要烧写的目标文件,然后去执行烧写校验等诸多步骤,完成后再把芯片从芯片座上拔下来,插入到我们硬件电路对应的芯片座中。

这个过程很繁琐,并且有一些弊端,比如对于我们将芯片直接焊接到电路板上的情况,再想更新芯片程序基本上是没有可能了。所以为了解决这个问题,我们计划开发一款自己的编程器,一方面简化操作流程,另外一方面可以直接对已经焊接到电路板上的芯片进行操作(电路板上预留接口)。

HEX文件格式的挑战

开发自己的编程器主要可以分成两个方面的工作:一是硬件部分,负责将数据写入到对应芯片中(ICSP);一个是桌面软件,负责读取目标文件中的数据,并发送给硬件部分。桌面软件和硬件之间的按照我们自己约定的通信协议通信。

当时我们使用单片机开发软件(Keil C)主要生成两种格式的文件: bin格式以及hex格式bin格式就相当于一个二进制文件,对于桌面软件来讲,把读到的所有数据都发出去,就完工了,而hex格式则是很复杂的一个文本文件。

当时一些很多小伙伴的做法是使用两款软件,bin2hex以及hex2bin在两种格式间进行转换,也就是说,如果我们的编程器想处理hex文件,可以先调用hex2bin再处理bin文件即可。但是这样做有一个弊端,如果我想写入指定的地址区间,忽略掉其它区域(比如写eeprom的指定区域),从bin文件上,没法判断全零的区域是要擦除还是要保留的,而hex文件则没有这个问题。

因此,我们计划在桌面软件中增加hex格式的支持,对于硬件部分无需任何修改,因为它接收到是地址和数据,所有解析处理都是在软件部分完成的。这对软件部分是一个挑战,我们需要能理解和处理hex格式。

达成目标

当时能找到的资料有限,中文资料更是没有,当时最权威的一篇资料就是Keil网站上的这篇文章了:GENERAL: INTEL HEX FILE FORMAT,为了吃透Intel Hex File Format,我仔细读了N遍,并最终将其翻译成为中文。最后,基于我对Intel Hex文件格式的深刻理解,在软件中实现了Hex文件的解析和处理。在工作中使用我们自己的编程器后,大幅提升了我们的工作效率。

再后来我们创业失败散伙,几个小伙伴各奔东西,其中一个小伙伴接手了当时我们所有的设备、技术以及电子元件等,继续搞硬件开发,现在混得风生水起。前段时间我们闲聊时偶然提起那时候做的一些工具,他说我们实现的编程器现在依然是他团队成员常用的工具之一,当然了,做了一些改版,外观啥的漂亮多了,功能也愈加强大,但是核心的东西还是没有啥变化。

16年前开发的东西,现在还在发挥光和热,这真是让我很欣慰也很感概。恰巧今天翻到自己翻译的文章,那么就把它也贴区块链上吧,尽管现在看起来,翻译的不是那么完美,但是还是要比网上不少类似的介绍文章要强得多,毕竟当时倾注了我不少心血呢。


附原文及翻译内容

英文原文:
GENERAL: INTEL HEX FILE FORMAT

以下为翻译内容:
部分代码串行了,将就看吧😀


Intel HEX


Intel HEXIntel HEXASCIIIntel HEXHEX/Intel HEXROMEPROMEPROM使Intel HEX


Intel HEX5
:llaaaatt[dd...]cc

: Intel HEX.
ll ,(dd).
aaaa ,.
tt HEX,:
00  
01  
02  
04  线
dd ,..(ll).
cc ,.,256.


Intel HEX.:
:10246200464C5549442050524F46494C4500464C33
:
10 .
2462 .
00 ()
464C464C.
33 .

线(HEX386)
线32HEX386.16.线,:
:02000004FFFFFC
:
02 .
0000 ,线,0000.
04  04(线)
FFFF 16.
FC ,:
01h + NOT(02h + 00h + 00h + 04h + FFh + FFh).
线,线,Intel HEX.线,.
线.
..
                2462
线              + FFFF
                                  ------------
                         FFFF2462

(HEX86)
HEX86,4-19.,:
:020000021200EA
:
02 .
0000 .,0000.
02  02()
1200 .
EA ,:
01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).
,,Intel HEX.,.
.
..
                2462
              +  1200
                                 ---------
                    00014462

(EOF)
Intel HEX(EOF).01.EOF:
:00000001FF
:
00 .
0000 ..0000h.
01  01()
FF ,:
01h + NOT(00h + 00h + 00h + 01h).

Intel HEX:
Intel HEX:
:10001300AC12AD13AE10AF1112002F8E0E8F0F2244
:10000300E50B250DF509E50A350CF5081200132259
:03000000020023D8
:0C002300787FE4F6D8FD7581130200031D
:10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016
:04003F00A42EFE22CB
:00000001FF
H2
H3
H4
3 columns
2 columns
1 column
16 Comments