上一篇介绍完如何在程序中的固定位置添加版本信息,而且如何通过映像工具将版本信息和固件文件名关联同步;这篇主要介绍一下通过 Git 工具管理的程序如何在 MCU 程序版本信息中增加 Git commot 提交的 id 。
Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。简单来说就是用来管理程序版本的。
通过上一篇我们了解到软件版本信息可以通过映像工具修改 hex 或者 bin 文件,那么在软件版本管理中,如果程序编译后的同一个固件文件在多次进行打包后,会存在多个已经添加了版本信息的固件,但是可执行程序内容都是一样的,在之后的管理中,如何区分不同版本的软件功能是一样的呢?
版本信息内容的不同不影响可执行文件的功能,通过文件对比虽然能确认不同版本的固件中的可执行程序是否一样,但是还是比较繁琐麻烦。
如果程序是通过 Git 工具管理的,那么此时可以通过 Git commot 提交 id 信息区分(每次提交的 id 值是不同的),通过在程序版本信息中添加 Git commot 提交 id 信息便能快速了解该版本固件对应的源码是哪一次提交的。
1.同样的定义一个结构体,里面定义一些软件版本相关的信息
typedef struct
{
char szVersion[32]; // 软件版本
char szBuildDate[32]; // 程序编译日期
char szBuildTime[32]; // 程序编译时间
char szCommitId[32]; // git commit id
}AppInfo_t;
2.通过__attribute__
定义一个只读结构体变量(具体为什么这么实现可以看上一篇)。
const AppInfo_t __attribute__ ((section(".ARM.__at_0x08002000"))) sg_tAppInfo =
{
"STM32_TEST",
__DATE__,
__TIME__,
""
};
3.提交git编译后,可以看的git commit id 值
4.采用的映像工具 srec_cat,通过 Bat 脚本实现以下功能:
- 不需要修改代码即可修改程序版本信息
- 按照当前固件打包时间作为程序的版本信息,同时按照版本信息命名文件
- 版本命名格式为:STM32_T2206111526
- 添加 Git Commit id 信息(新增)
根据目录结构树编写指定脚本(该目录必须是git仓库)
.git
MDK_STM32
---- CORE
---- STM32F10x_FWLib
---- OBJ(编译生成的hex文件)
---- USER
tool
---- srec_cat.exe
---- pack.bat
实现 pack.bat(上一篇的脚本文件有些缺陷,发现修改路径和文件名后不能正常打包,可私信回复关键词“固件”或“固件打包”获取下载链接):
:: 版本信息前缀和长度
set strPrefix=STM32_
set strPrefixlen=6
:: hex 文件路径和文件名
set hexFilePath=..\\MDK_STM32\\OBJ
set hexFileName=main
:: 版本信息起始地址
set verStringAddr=0x08002000
:: git commit id信息起始地址
set commitIdStringAddr=0x08002060
if %time:~0,2% leq 9 (set hour=0%time:~1,1%) else (set hour=%time:~0,2%)
if %time:~0,2% leq 9 (set minute=%time:~2,2%) else (set minute=%time:~3,2%)
:: 打包时间格式为年月日时分 T2206111526
set strTime=T%date:~2,2%%date:~5,2%%date:~8,2%%hour%%minute%
set strVersion=%strPrefix%%strTime%
:: 获取commit id
@for /F %%i in ('git rev-parse --short HEAD') do @set commitid=%%i
@echo commitid=%commitid%
copy %hexFilePath%\\%hexFileName% .\\
:: 版本信息的结束地址
set /a InfoEnd=%verStringAddr%+%strPrefixlen%+11
.\\srec_cat.exe -generate %verStringAddr% %InfoEnd% -repeat-string %strVersion% %hexFilePath%\\%hexFileName%.hex -intel -exclude %verStringAddr% %InfoEnd% -o .\\tmp_%strVersion%.hex -intel
:: git commit id 信息的结束地址
set /a InfoEnd=%commitIdStringAddr%+7
.\\srec_cat.exe -generate %commitIdStringAddr% %InfoEnd% -repeat-string %commitid% .\\tmp_%strVersion%.hex -intel -exclude %commitIdStringAddr% %InfoEnd% -o .\\%strVersion%.hex -intel
del %hexFileName%.hex
del .\\tmp_%strVersion%.hex
5.编译完成后,双击 pack.bat 生成添加版本信息后的固件。
6.之后需要通过 J-LINK 工具包或者 ST-Link 工具打开生成的固件进行烧录(通过Keil编译直接下载的没有用,我这里用的是 ST-Link 工具)。
全部0条评论
快来发表一下你的评论吧 !