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

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

相关推荐
智商偏低5 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen6 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
望获linux6 小时前
【实时Linux实战系列】CPU 隔离与屏蔽技术
java·linux·运维·服务器·操作系统·开源软件·嵌入式软件
森焱森8 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白8 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D8 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术11 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt12 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘12 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang12 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c