Keil是嵌入式开发中用的非常多的一个工具,有很多技巧是在使用中慢慢发现的,其中有不少技巧我都觉得非常有价值,今天要分享的是一个如何使用自动化脚本,编译即生成自己想要文件的技巧!
主要解决如下两个问题:
1、嵌入式软件开发完成后,需要发布版本,如果软件支持远程升级,那么发布的版本需要打包bootloader.hex与app.hex,是如何实现的?
2、远程升级文件(bin)结尾需要增加整个文件的校验码,可以用来验证整个文件的正确性,又是如何实现的?
你是否也这样操作过?
-
打开合并工具,手动选择两个Hex文件,点击合并…
-
手动将bootloader与app烧写进芯片,然后用烧录工具读取芯片flash内容,再保存为一个文件…
-
打开二进制工具计算CRC校验值,然后再添加到Bin文件末尾
这些方法都是可行的,因为我都干过^V^,只是操作麻烦了点,尤其这种重复性工作做多了,你会不会觉得烦?在当今这个越来越智能化的社会,作为嵌入式工程师持续干这种重复性的机械活,我觉得实在不应该,使其自动化,节省出大把时间它不香吗!
今天,就给大家分享一个我后面一直在用的Keil自动化脚本技巧,解决以上痛点:编译完成后自动合并文件+自动添加CRC校验,真正实现“编译即发布”。
一、如何实现
只需简单两步配置,即可一劳永逸:
1、打开Keil,点击魔术棒 → Options for Target → User → After Build/Rebuild

2、勾选Run #1 和 Run #2,后面方框中分别填入以下命令:
-
Run#1(用于生成原始bin文件):
C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o .\SREC\original_app .\output\app.axf
说明:fromelf.exe文件在你的Keil安装目录下,安装目录不同位置会有差异;
-
Run#2(执行打包和添加CRC的脚本):
.\SREC\crc_add.bat
二、crc_add.bat 做了什么?
这个批处理脚本核心做了两件事:
①将bootloader与app合并打包
使用mergeHEX工具将bootloader.hex和app.hex合并为一个完整的boot-app.hex文件

②在生成的bin文件中增加crc校验码
使用crc_gen工具对合并后的文件计算CRC32,并自动附加在文件末尾。

crc_add.bat中内容具体指令如下:
@echo off
ECHO Add CRC32 At the end of the document
ECHO -------------------------------------
cd .\SREC
SET SREC_PATH=.
for /f %%i in ('dir /b .\original_app') do (
set indexdx=%%~zi
)
ECHO %indexdx%
ECHO %SREC_PATH%\srec_cat.exe original_app -Binary -crop 0 %indexdx% -crc32-b-e %indexdx% -o app.bin -Binary
ECHO %SREC_PATH%\mergeHEX.exe .\Bootloader.hex ..\output\app.hex .\boot-app.hex
%SREC_PATH%\srec_cat.exe original_app -Binary -crop 0 %indexdx% -crc32-l-e %indexdx% -o .\app.bin -Binary
%SREC_PATH%\mergeHEX.exe .\Bootloader.hex ..\output\app.hex .\boot-app.hex
三、SREC文件结构示意:
crc_add.bat中所需要的工具均放在SREC文件夹,并且生成的文件也在该文件夹下:

值得注意的是:需要将自己的bootloader.hex文件拷贝到该SREC文件夹
四、最终效果
每次点击编译后,Keil会自动执行后续动作,最终在SREC目录下生成:
app.bin:用于远程升级的纯app二进制文件
boot-app.hex:已合并bootloader且带crc校验码的刷机文件

真正实现“编译完成即发布”,省去一切手动操作。这样就解放了双手,才能把时间用在真正有价值的地方——比如摸鱼,哈哈!
文中用到的脚本工具(crc_add.bat、mergeHEX.exe等)已打包,如果需要,请在公众号【开源之外小记】后台回复【Keil自动化】获取!
如果您觉得有用,欢迎点赞、收藏、转发,这将是我不断分享的动力!
1万+

被折叠的 条评论
为什么被折叠?



