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

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

相关推荐
iCxhust2 小时前
51单片机电力载波应用开发(4)单片机发PC端接收
单片机·嵌入式硬件·51单片机
国科安芯5 小时前
断电也隔离、听得真:ASL3159S 单通道 SPDT 模拟开关的“断电保护 + 音频保真“账
单片机·嵌入式硬件·安全·商业航天·抗辐射
jianqiang.xue5 小时前
【CStackGUI 实战】深色主题终端:app.dark 默认深色 + 顶层命名样式表 + 运行时切换
单片机·嵌入式·cstackgui·c语言gui·可视化拖拽
新晨单片机设计5 小时前
S008C-基于STM32单片机无线抢答器【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus·无线抢答器
小诗懂技术6 小时前
【裸机lcd】framebuffer的配置与小型图像库的移植
arm开发·单片机·嵌入式硬件·裸机
comyccccc7 小时前
3.3V稳压电源设计与PCB实现学习笔记
单片机·嵌入式硬件
小程序设计8 小时前
基于STM32森林火灾远程监测模块设计
stm32·单片机·嵌入式硬件
魔猴疯猿8 小时前
香橙派(Orange Pi)入门使用教程:从开箱到跑通第一个项目
单片机·嵌入式硬件·物联网
丸子君君9 小时前
【以麒麟服务器时间为准,定时请求时间同步】
运维·服务器·单片机
沐欣工作室_lvyiyi10 小时前
基于STM32单片机汽车充电桩控制模块设计(论文+源码)
stm32·单片机·汽车·毕业设计