Keil编译程序生成bin文件时,如何自动以版本号命名bin文件
一、目的
二、方法
三、实现过程
一、目的
Keil编译程序时,生成的Hex/Bin文件名字是根据Keil中工程配置里定的名字命名。通常代码里会有一个字段专门用来定义软件版本号,每次生成Hex/Bin文件后,要手动重命名文件名,保证和代码中定义的软件版本号一致,这时候就会觉得很麻烦,而且手动输入容易输错啥的。本章的内容就是要达到编译后生成的Hex/Bin文件名字和代码中定义的软件版本号一致的目的!
二、方法
我所知道的方法有两类:
一:通过脚本的形式。
keil工程配置里面可以添加脚本,即.bat程序。脚本程序能够实现重命名Hex/Bin文件名、从一个路径拷贝到另一个路径下、生成新文件夹用于存储新命名的Hex/Bin文件等等。
二:通过可执行文件的形式。
keil工程配置里面可以添加可执行文件,即.exe程序。可执行程序能够实现打开源文件找到版本号、重命名Hex/Bin文件名、从一个路径拷贝到另一个路径下、生成新文件夹用于存储新命名的Hex/Bin文件、Hex/Bin文件合并(通常boot+app)等等,很多功能都能实现。
以上两种方法,能实现的功能还有很多,同样重新命名可执行文件也还有其他很多方法实现,如有其他更便捷有效的方法也可以分享。
三、实现过程
1、脚本形式
以时间为文件名尾缀,如"LED_HV_V20230815_15_42_28.bin"。
本例是将bin文件从Object文件夹copy到ExecutiveFile文件夹,并在尾缀上加上日期"年_月_日_时_分_秒"。
有的也用__DATA__和__TIME__(其中__DATE_ 和__TIME__是C语言中的内置宏,分别是当前的编译日期和编译时间),也可以。
代码如下:
javascript
@echo off
::获取日期 将格式设置为:20110820
set datevar=%date:~0,4%%date:~5,2%%date:~8,2%_
::获取时间中的小时 将格式设置为:24小时制
set timevar=%time:~0,2%
if /i %timevar% LSS 10 (
set timevar=0%time:~1,1%
)
::获取时间中的分、秒 将格式设置为:3220 ,表示 32分20秒
set timevar=%timevar%_%time:~3,2%_%time:~6,2%
@echo %datevar%%timevar%
copy Objects\LED_HV.hex ExecutiveFile\LED_HV_V%datevar%%timevar%.hex
copy Objects\LED_HV.bin ExecutiveFile\LED_HV_V%datevar%%timevar%.bin
2、可执行文件形式
原理:
打开指定的源文件(.c/.h等),找到指定的定义软件版本号的字符(通常是用宏定义定义的),将指定的.bin、.hex文件拷贝到指定的目标文件夹,并以上一步获取的软件版本号命名。
下面是实现代码:
c
get_version_string_from_file(argv[1], Version); //根据main.c获得版本号
printf("Version:%s\r\n", Version);
copyFile(HEX_FILE, argv[2], argv[4]); //将Hex从Object拷贝到ExecutiveFile文件夹并获得新路径下的文件名
copyFile(BIN_FILE, argv[3], argv[4]); //将Bin从Object拷贝到ExecutiveFile文件夹并获得新路径下的文件名
//----------------------------------------------------------------------
sTringStart = strrchr(argv[2], '\\') + 1;
sTringStop = strchr(sTringStart, '.');
memcpy(SrcHexName, sTringStart, (sTringStop - sTringStart)); //得到原Hex/Bin文件名
memcpy(SrcBinName, SrcHexName, sizeof(SrcHexName));
sprintf(NewHexName, "%s%s.hex", SrcHexName, Version); //拼接Version的Hex文件名
sprintf(NewBinName, "%s%s.bin", SrcBinName, Version); //拼接Version的Bin文件名
//printf("New name: Hex:%s Bin:%s\r\n", NewHexName, NewBinName);
get_file_dir(argv[4], HexFileDir); //得到ExecutiveFile文件夹的路径
memcpy(BinFileDir, HexFileDir, sizeof(HexFileDir));
strcat(HexFileDir, NewHexName); //拼接新的目标Hex文件路径
strcat(BinFileDir, NewBinName); //拼接新的目标Bin文件路径
printf("NewFile Dir: Hex:%s Bin:%s\r\n", HexFileDir, BinFileDir);
//----------------------------------------------------------------------
remove(HexFileDir);
rename_res = rename(NewDir_HexFileName, HexFileDir); //重新命名Hex
printf("res = %d,", rename_res);
remove(BinFileDir);
rename_res = rename(NewDir_BinFileName, BinFileDir); //重新命名Bin
printf("res = %d\r\n", rename_res);
然后在keil里面添加编译后执行.exe文件,如下图:
注:本例子是把hex和bin文件都重新命名并存储到ExecutiveFile文件夹里。
其实还有更多功能可以做,都可以通过可执行文件的方式去完成。