Keil编译生成的bin文件自动以版本号命名

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文件夹里。

其实还有更多功能可以做,都可以通过可执行文件的方式去完成。

相关推荐
嵌入式大圣1 小时前
单片机结合OpenCV
单片机·嵌入式硬件·opencv
日晨难再3 小时前
嵌入式:STM32的启动(Startup)文件解析
stm32·单片机·嵌入式硬件
yufengxinpian3 小时前
集成了高性能ARM Cortex-M0+处理器的一款SimpleLink 2.4 GHz无线模块-RF-BM-2340B1
单片机·嵌入式硬件·音视频·智能硬件
__基本操作__4 小时前
历遍单片机下的IIC设备[ESP--0]
单片机·嵌入式硬件
网易独家音乐人Mike Zhou11 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
lantiandianzi18 小时前
基于单片机的多功能跑步机控制系统
单片机·嵌入式硬件
哔哥哔特商务网18 小时前
高集成的MCU方案已成电机应用趋势?
单片机·嵌入式硬件
跟着杰哥学嵌入式18 小时前
单片机进阶硬件部分_day2_项目实践
单片机·嵌入式硬件
东芝、铠侠总代1361006839320 小时前
浅谈TLP184小型平面光耦
单片机·嵌入式硬件·物联网·平面
lantiandianzi20 小时前
基于单片机中医药柜管理系统的设计
单片机·嵌入式硬件