嵌入式 十二月 24, 2021

基于STM32CubeIDE实现编译版本号自动升级功能

文章字数 2.8k 阅读约需 3 mins. 阅读次数 1000000

简介

  软件的版本号通常包含主版本号、子版本号、修正版本号和编译版本号,本文介绍基于STM32CubeIDE实现编译版本号自动升级的方法,即每次编译程序都自动将编译版本号加1。

实现原理

  在C语言代码中,版本号可以通过宏定义实现,可以直接定义完整的版本号,也可以将版本号的几个部分分开定义,通过更改宏定义的方式即可更改程序版本号。实现自动升级编译版本号的原理,就是将版本号的几个部分分开定义并单独放置到一个头文件中,每次编译程序之前,先调用一个文本处理工具,该文本处理工具读取版本号所在的头文件,识别编译版本号并进行修改,然后将修改后的内容回写到头文件中,最后对源代码进行编译链接。

具体实现方法

文本处理工具

  要实现自动升级编译版本号的功能,首先需要一个文本处理工具,该工具需要高度定制化的功能,即读取头文件、识别并修改编译版本号。作为程序猿,大家不妨自己动手code一个文本处理工具,当然也可以直接点击链接下载现成的专用文本处理工具

编译版本号的宏定义

  如果大家使用自己制作的文本处理工具,宏定义能满足各自的文本处理工具的识别、修改要求即可。

  如果大家下载了现成的文本处理工具,则必须按照#define BUILD_NUMBER 0x02212320的格式进行宏定义,注意作者的编译版本号“02212320“是以编译时的时间(月、日、时、分)进行定义的,是文本处理工具要修改的部分,其他部分是文本处理工具识别编译版本号的格式依据,必须与样例保持一致。之所以以16进制的方式定义编译版本号,是因为作者设置的编译版本号前两位表示月份,因此大概率出现第一位是“0”的情况,在C语言中,0开头的数字是8进制,不便于打印。使用16进制定义编译版本号后,推荐打印时采用"%08x"的格式,从而实现打印和定义完全一样的效果,方便识别。此外,文本处理工具逻辑较为简单,因此强烈建议版本号单独放置在一个头文件中

自动调用文本处理工具

  最后一步就是设置好每次编译代码之前自动调用该文本处理工具。

  首先将下载好的文本处理工具放到工程文件夹下的“Debug”目录下,注意改目录下是否有makefile,如果没有,应找到makefile并将文本处理工具与makefile放置在同已文件夹下。然后依次点击Project -> Properties -> C/C++ Build -> Settings -> Build Steps,在 Pre-build steps中的Command 中输入“autoVersion.exe ../Inc/version.h”,如下图所示。其中“autoVersion.exe”是文本处理工具的文件名,“../Inc/version.h”是编译版本号所在的头文件相对于文本处理工具的相对路径,也可以用该头文件的绝对路径。然后保存配置即可。

验证功能

  编译程序,观察控制台输出,如下图所示是正常的运行结果。

  编译完成后,观察宏定义是否改变。

提醒

  建议关闭下载程序前自动编译的功能。

小结

  本文介绍了基于STM32CubeIDE实现自动升级编译版本号的方法,其他集成编译环境如RT-Thread Studio、keil MDK等,也可以实现该功能,方法类似,本文不再赘述,大家可自行探索。最后,前文所述文本处理工具基于python开发,源码已上传gitee,供大家参考和指导。

0%