首页 > 代码库 > ATmega128中应用的hex与bootloader的hex合并的实现

ATmega128中应用的hex与bootloader的hex合并的实现

1、合并的可行性分析

在划分区域的时候,通过设置熔丝位BOOTSZ为00,以实现对应用区及bootloader区大小的定义。

如下配置,我们设置boot区为4096个字,即8K字节大小,这样应用区就有120K字节可供使用。

技术分享

分析其应用的固件hex时我们发现,应用的固件程序总是以

:020000020000FC (表示扩展段地址从0x0000开始)开头,以 :00000001FF (表示文件已经结束)结束,

分析bootloader的固件hex时我们发现,bootloader的固件程序总是以

:020000021000EC (表示扩展段地址从0x1000开始)开头,以 :00000001FF (表示文件已经结束)结束。

这样我们会想着试一试,是否只保留一个文件结束标记(:00000001FF)便能满足既可升级又可跑业务流程的功能呢?

实际上正是如此。

 

2、手工拼接

这样在手工合并时,我们只要将boot的hex复制到应用的hex之前,且删除boot的hex的结束标记即可。具体的样例如下:

:020000021000EC:10E000000C9467F418951895189518951895189507:10E010001895189518951895189518951895189598:10EA50006F776E6C6F61640D0A002D20275227209E:10EA6000526573746172740D0A002D2027422720AD:10EA700052756E204170706C69636174696F6E0DC0:10EA80000A0054696D65204F7574210D0A000D0A46:0BEA900053756363657373210D0A006A:040000031000E00009:020000020000FC:100000000C94F1461895189518951895189518950B:1000100018951895189518950C94F8190C941704C0:100020001895189518951895189518951895189568:100030001895189518951895189518951895189558:100040000C94BC45189518950C94F4441895189583:100050001895189518951895189518951895189538:100060001895189518951895189518951895189528:1097D000504F50454E3A20302C30002B43495053C7:1097E000454E443A2030000101000000FFFF00FF19:1097F000FFFFFFFFFF0041542B4349504F50454EA0:109800003D302C22544350222C22002B4349504FF0:1098100050454E3A002B4349504F50454E3A203068:109820002C34002B4349504F50454E3A20302C30B9:1098300000FFFF0000000000000000FFFFFFFFFF2F:09984000FFFFFFFFFFFFFFFF0027:0400000300000000F9:00000001FF

将类似于以下格式的拼合固件烧写到ATmega128的片内flash中即可支持升级操作又可跑系统业务。

 

3、拼接程序的Qt实现

先看一下应用的效果图:

技术分享

使用方法为:先打开bootloader的hex,再打开应用程序的hex,点hexMerge会在与固件相同目录下生成拼接后的hex,或者点 hexMerge As

指定存放拼接后的hex存放的位置。

 

Qt源码实现:

https://github.com/aqing1987/ATmega128_HexMerger

ATmega128中应用的hex与bootloader的hex合并的实现