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

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

相关推荐
善 .3 小时前
单片机的内存是指RAM还是ROM
单片机·嵌入式硬件
超级码农ProMax3 小时前
STM32——“SPI Flash”
stm32·单片机·嵌入式硬件
Asa3193 小时前
stm32点灯Hal库
stm32·单片机·嵌入式硬件
end_SJ5 小时前
初学stm32 --- 外部中断
stm32·单片机·嵌入式硬件
gantengsheng6 小时前
基于51单片机和OLED12864的小游戏《贪吃蛇》
单片机·嵌入式硬件·游戏·51单片机
嵌入式小强工作室7 小时前
stm32 查找进硬件错误方法
stm32·单片机·嵌入式硬件
委员7 小时前
基于NodeMCU的物联网窗帘控制系统设计
单片机·mcu·物联网·智能家居·iot
wenchm8 小时前
细说STM32F407单片机DMA方式读写SPI FLASH W25Q16BV
stm32·单片机·嵌入式硬件
南城花随雪。8 小时前
单片机:实现自动关机电路(附带源码)
单片机·嵌入式硬件
逝灮8 小时前
【蓝桥杯——物联网设计与开发】拓展模块4 - 脉冲模块
stm32·单片机·嵌入式硬件·mcu·物联网·蓝桥杯·脉冲测量