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

Keil编译程序生成bin文件时,如何自动以版本号命名bin文件

  • 一、目的
  • 二、方法
  • 三、实现过程
  • 一、目的
  • 二、方法
  • 三、实现过程
    • 1、脚本形式
    • 2、可执行文件形式

一、目的

二、方法

三、实现过程

一、目的

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语言中的内置宏,分别是当前的编译日期和编译时间),也可以。

代码如下:

@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 ,表示 3220set 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文件拷贝到指定的目标文件夹,并以上一步获取的软件版本号命名。
下面是实现代码:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/309048.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RK3568平台开发系列讲解(Linux系统篇)Linux 内核打印

🚀返回总目录 文章目录 一、方法一:dmseg 命令二、方法二:查看 kmsg 文件三、方法三:调整内核打印等级一、方法一:dmseg 命令 在终端使用 dmseg 命令可以获取内核打印信息,该命令的具体使用方法如下所示: 首先在串口终端使用 “dmseg”命令,可以看见相应的内核打印信息…

星耀新春,集星探宝,卡奥斯开源社区双节活动上线啦!

卡奥斯开源社区龙年新春专题活动上线啦! “星耀新春,集星探宝”,卡奥斯开源社区龙年新春专题活动重磅发布! 写文章、发项目、建应用、做测评,玩转盘、开宝箱 6大活动板块陪你玩儿转双节! 扫地机器人、家…

rax3000m 刷机 uboot + immortalwrt

0. 环境 - win10 ubuntu22 - rax3000m 生产日期20231027 一台(nand版本的) 1. 上电,登录web 电脑连接路由器LAN1 http://192.168.10.1/ 账号:user 密码:KK6kYC!3 上网设置:自动获取IP 2. 开启 ssh 2…

C++学习笔记——返回对象

一、返回对象 当我们说一个函数返回对象时,意味着该函数的返回值是一个对象。这种情况下,函数可以通过创建对象的副本、返回对象的引用或者返回对象的指针来实现。 返回对象的副本: 当一个函数返回对象的副本时,函数内部会创建一…

微服务下多模块拆分,公用类调用与模块隔离性怎么兼得呢

前言 在一个微服务项目中,为了追求低耦合,会根据业务板块对主系统进行切分为一个个子模块,模块间相互隔离,但是这样子就会导致一个问题:对于一些在多个子模块中都适用的配置类、工具类、封装类等都需要拷贝冗余到各个模…

1月10号代码随想录左叶子之和

404.左叶子之和 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24示例 2: 输入: root [1]…

03.用于LLMs不同的任务-transformer 架构

大多数现代LLMs都依赖于 transformer 架构,这是 2017 年论文 Attention Is All You Need 中介绍的深度神经网络架构。要理解LLMs,我们必须简要回顾一下最初的转换器,它最初是为机器翻译而开发的,将英语文本翻译成德语和法语。变压器架构的简化版本如图 1.4 所示。 图 1.4 …

基于JAVA+SpringBoot的高校学术报告系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 智慧高校学术报告系统…

使用numpy处理图片——滤镜

大纲 3维数组切分打平重组法深度切分法 3维数组堆叠 我们在用手机拍照片时,往往会对照片进行滤镜处理,从而让照片更加美观。本文我们将实现几种滤镜效果——去除所有像素中的某一种原色,形成只有红绿、红蓝和绿蓝原色的照片。 为了突出色彩丰…

鸿鹄电子招投标系统:企业战略布局下的采购寻源解决方案

在数字化采购领域,企业需要一个高效、透明和规范的管理系统。通过采用Spring Cloud、Spring Boot2、Mybatis等先进技术,我们打造了全过程数字化采购管理平台。该平台具备内外协同的能力,通过待办消息、招标公告、中标公告和信息发布等功能模块…

计算机组成原理20——控制单元的功能和实现2

本系列文章是学习了网课《哈尔滨工业大学–计算机组成原理》之后,用以梳理思路而整理的听课笔记及相关思维拓展。本文涉及到的观点均为个人观点,如有不同意见,欢迎在评论区讨论。 目录 控制单元的外特性控制信号举例-多级时序系统控制方式 控…

关于jupyter突然打不开的问题

好久没有用python了,我的电脑环境是安装过anaconda和pycharm,但是有些简单的东西就希望在jupyter中测试一下,但是最近发现jupyter打不开了。 具体是: 在这里打开jupyter是可以的,但是在命令行就不行,表现为…

2023-12-29 贪心算法 分发饼干和摆动序列以及最大子数组和

贪心算法 什么是贪心算法? 就是每一阶段的最优解,从局部的最优解达到全局的最优解! 最好用的策略就是举反例,如果想不到反例,那么就试一试贪心吧。 贪心算法一般分为如下四步: 将问题分解为若干个子问…

神州战神z7ra7重装教程

UEFI模式下装的系统,开机速度明显比Legacy模式下装的系统开机速度更快 关键点: ①.U盘格式必须为FAT32 ②.不可以使用ISO镜像制作UEFI安装U盘,而是使用微软官方的工具。 ③.开机BIOS设置,最好将Secure boot设置为Disabled&#xf…

软件测试工程师经典面试题总结

一、接口测试如何设计测试用例? 首先,接口测试用例与其他测试用例是一样的,都是为了证明程序存在错误,其出发点相同;接口测试用例的对象是接口,需要验证各个系统及组件间的接口;其三是接口测试的…

SpringMVC概述、SpringMVC 的入门

1.MVC介绍 MVC是一种设计模式,将软件按照模型、视图、控制器来划分: M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为数据承载Bean:专门存储业务数据…

“第四个中国人民警察节”细语

今(2024年1月10日)天,是第四个中国人民警察节,本“人民体验官”推广人民日报官方微博文化产品《一起致敬人民警察!》。 图:来源“人民体验官”推广平台 笔者认同“平安的密码叫110”这个洽当比喻。因为人民…

threejs 光带扩散动画

目录 一、创建光带 (1) 设置光带顶点 (2) 设置光带顶点透明度属性 二、光带动画 完整代码 html文件代码 js文件代码 最后展示一下项目里的效果: 最近项目中要求做一段光带效果动画,尝试着写了一下,下面是本次分享光带扩散动画的效果预…

Kubernetes实战(十五)-Pod垂直自动伸缩VPA实战

1 介绍 VPA 全称 Vertical Pod Autoscaler,即垂直 Pod 自动扩缩容,它根据容器资源使用率自动设置 CPU 和 内存 的requests,从而允许在节点上进行适当的调度,以便为每个 Pod 提供适当的资源。 它既可以缩小过度请求资源的容器&…

STM32 使用 DS18B20 温度传感器实现环境温度监测

为了实现环境温度监测系统,我们可以利用STM32微控制器和DS18B20数字温度传感器。在本文中,我们将介绍如何通过STM32微控制器读取DS18B20传感器的温度数据,并展示一个简单的示例代码。 1. 系统概述 环境温度监测系统旨在使用DS18B20数字温度…