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源码实现: