打印
[资源分享]

一个高效的BootLoader与APP固件合并方法

[复制链接]
4022|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1、前言

嵌入式固件一般分为BootLoaderApp,BootLoader用于启动校验、App升级、App版本回滚等功能,BootLoader在cpu上电第一阶段中运行,之后跳转至App地址执行应用程序。

因此,在发布固件的时候,会存在BootLoader固件和App固件;此时我们期望是将BootLoader固件和App固件合并成为一个固件,这样在量产时只需烧录一次即可。


使用特权

评论回复

相关帖子

沙发
药无尘|  楼主 | 2022-8-26 11:18 | 只看该作者
2、传统方式
一些传统的方法都是“土办法”,没什么毛病,但比较繁琐。项目种类增加,或者版本发布频繁时更加体现出繁琐性,且易出错,操作稍微失误可能导致固件不完整;烧录不完整的固件,机子变“砖头”。

烧录两次,分别烧录BootLoader和App固件
烧录固件到芯片后,再从芯片读取固件,另存为hex文件
手动复制、合并固件
BootLoader支持App固件传输功能的,只烧录BootLoader,后期再升级App

使用特权

评论回复
板凳
药无尘|  楼主 | 2022-8-26 11:18 | 只看该作者
3、高效方式
我们目标是通过自动化脚本合并生成一个发布固件,提高效率和确保固件的完整性。

3.1 合并文件
Linux下的脚本我们用得很多,其实Windows的脚本也非常优秀,利用Windows的脚本可以快速实现增、删、查、改文件。常用Windows脚本命令如下。

合并两个文件:copy /b
重命名文件:ren <source_file> <dect_file>
删除文件:del
很显然,我们利用其合并命令,只需一条指令即可将BootLoader和App文件合并。

「例子:」

假设当前目录存在Boot.bin和App.bin文件,合并后文件命名为Firmware.bin。
copy /b .\Boot.bin + .\App.bin Firmware.bin

使用特权

评论回复
地板
药无尘|  楼主 | 2022-8-26 11:26 | 只看该作者
3.2 bin转hex
我们知道,二进制(bin)文件是不存在地址信息的,cpu上电执行并不一定是从地址0开始执行代码,如STM32芯片起始执行地址为0x8000000。

因此不能通过串口工具烧录bin文件,只能通过J-link或者ST-link烧录,并且在烧录前指定存储起始地址。因此,将bin文件转换为hex文件是有必要的。

「bin转hex方式:」

使用jflash工具,把合并后的bin文件,使用jflash打开,另存为hex格式文件

将bin文件烧录置芯片,读取出来,另存为hex文件

自己动手写一个bin转hex工具

借助第三方bin转hex工具

前两者太繁琐,效率低下;第三个比较灵活,但需要花点时间;如果使用优秀的现成工具是最快捷的办法。推荐使用“srec_cat.exe”工具,可以结合Windows脚本一起使用。

使用特权

评论回复
5
药无尘|  楼主 | 2022-8-26 11:27 | 只看该作者
3.2.1 srec_cat工具
srec_cat一个功能非常强大的文件合并、转换工具,支持功能众多,包括:

文件合并
文件分割
bin转hex
hex转bin
数据填充
CRC校验
此外,还存在srec的系列工具,文件比较工具 srec_cmp.exe和文件信息查看工具 srec_info.exe,可以从文章后面官方网站下载使用。

「文件合并」

命令格式:
srec_cat.exe <源文件0> <文件类型> <源文件1> <文件类型> <目标文件> <文件类型>

例子:
srec_cat.exe source0.bin -Binary source1.bin -Binary -o merge.bin -Binary
srec_cat.exe source0.hex -Intel source1.hex -Intel -o merge.hex -Intel

如果BootLoader和App生产的文件为hex格式,可以直接使用该命令合并为一个hex文件,注意地址的连续性。

「bin转hex」

命令格式:srec_cat.exe <bin源文件> <-Binary> <-offset> <偏移地址> <-Output> <hex目标文件> <-Intel>

例子:

将Boot.bin和App.bin合并的Firmware.bin转换为hex格式文件。
srec_cat.exe Firmware.bin -Binary -offset 0x8000000 -o Firmware.hex -Intel

使用特权

评论回复
6
药无尘|  楼主 | 2022-8-26 11:27 | 只看该作者
3.3 完整示例
第一步,在需要生成固件目录新建一个txt文件。

第二步,键入如下内容(Boot固件和App固件可以指定目录)。
copy /b .\Boot.bin + .\App.bin Firmware.bin
srec_cat.exe Firmware.bin -Binary -offset 0x8000000 -o Firmware.hex -Intel
第三步,重命名txt文件为".bat"后缀文件,即是Windows可执行脚本的文件类型。

第四步,双击运行脚本,即可生成目标文件。

出现任何目标文件生成失败的情况,检查相关源文件是否存在,路径是否正确。
del Firmware.bin

使用特权

评论回复
7
药无尘|  楼主 | 2022-8-26 11:28 | 只看该作者
3.4 举一反三
以此类比,存在多个App文件的情况,可以通过该方式分别进行合并出一个固件。另外,实际项目中,经常会使用内部flash空闲扇区保存一些设备参数信息,如校准系数、设备地址、序列号等信息。

我们可以将参数信息保存为一个bin文件,通过该方式和固件合并,这样量产时将参数和固件一并写入,提高生产效率!

使用特权

评论回复
8
tpgf| | 2022-9-4 16:41 | 只看该作者
现行的并没有合并成为一个固件是吗

使用特权

评论回复
9
qcliu| | 2022-9-4 19:44 | 只看该作者
高效的标志是什么呢

使用特权

评论回复
10
drer| | 2022-9-4 20:13 | 只看该作者
这部分是最底层了是吧

使用特权

评论回复
11
coshi| | 2022-9-4 20:35 | 只看该作者
多个app文件应该如何处理呢

使用特权

评论回复
12
kxsi| | 2022-9-4 20:41 | 只看该作者
我们常用的结合方式是什么呢

使用特权

评论回复
13
wiba| | 2022-9-4 20:53 | 只看该作者
什么时候需要我们关心BootLoader呢

使用特权

评论回复
14
Henryko| | 2022-9-9 19:33 | 只看该作者

这部分是最底层了吧

使用特权

评论回复
15
pixhw| | 2022-11-10 14:20 | 只看该作者
怎么写IAP的bootloader和APP

使用特权

评论回复
16
maudlu| | 2022-11-10 14:34 | 只看该作者
bootloader用什么工具打开和修改  

使用特权

评论回复
17
wangdezhi| | 2022-11-10 14:54 | 只看该作者
如果合并了,怎么更新app呢?              

使用特权

评论回复
18
albertaabbot| | 2022-11-10 15:20 | 只看该作者
如何选择运行BootLoader程序  

使用特权

评论回复
19
lzbf| | 2022-11-10 16:01 | 只看该作者
如何替换固件里的 bootloader

使用特权

评论回复
20
mikewalpole| | 2022-11-10 16:47 | 只看该作者
如何实现从bootloader到APP的跳转?   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

613

帖子

2

粉丝