0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机固件中加入版本信息的方式有哪些?-3

汽车电子技术 来源:大橙子疯嵌入式 作者: 大橙子疯 2023-02-15 15:38 次阅读

前言

上一篇介绍完如何在程序中的固定位置添加版本信息,而且如何通过映像工具将版本信息和固件文件名关联同步;这篇主要介绍一下通过 Git 工具管理的程序如何在 MCU 程序版本信息中增加 Git commot 提交的 id 。

Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。简单来说就是用来管理程序版本的。

为什么增加 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 脚本实现以下功能:

  1. 不需要修改代码即可修改程序版本信息
  2. 按照当前固件打包时间作为程序的版本信息,同时按照版本信息命名文件
  3. 版本命名格式为:STM32_T2206111526
  4. 添加 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 工具)。

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16024

    浏览量

    343742
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79573
  • Git
    Git
    +关注

    关注

    0

    文章

    193

    浏览量

    15422
收藏 人收藏

    评论

    相关推荐

    华大单片机是如何向MDK中加入头文件和库文件的

    华大单片机如何向MDK中加入头文件和库文件关键文件介绍加入头文件大多数习惯于8位单片机开发的工程师,都会使用操作寄存器的方式来使用
    发表于 07-13 08:43

    请问单片机如何向MDK中加入头文件和库文件?

    请问单片机如何向MDK中加入头文件和库文件?
    发表于 09-27 08:32

    单片机的烧录方式

    单片机的烧录方式单片机三种烧录方式ISP、IAP和ICP什么不同?单片机三种烧录
    发表于 01-27 08:01

    如何在XHTML网页中加入CSS详细的五种方式说明

    本文档的主要内容详细介绍的是如何在XHTML网页中加入CSS详细的五种方式说明资料免费下载。
    发表于 06-13 16:58 5次下载

    如何使用MDK编译器让STM32程序HEX文件中加入固件版本信息

    本文介绍一个小技巧: 使用MDK编译器,让STM32程序HEX文件中加入固件版本信息。 代码 代码如下
    的头像 发表于 06-23 15:14 3601次阅读
    如何使用MDK编译器让STM32程序HEX文件<b class='flag-5'>中加入</b><b class='flag-5'>固件</b><b class='flag-5'>版本</b><b class='flag-5'>信息</b>

    华大单片机如何向MDK中加入头文件和库文件

    华大单片机如何向MDK中加入头文件和库文件关键文件介绍加入头文件大多数习惯于8位单片机开发的工程师,都会使用操作寄存器的方式来使用
    发表于 11-23 18:07 15次下载
    华大<b class='flag-5'>单片机</b>如何向MDK<b class='flag-5'>中加入</b>头文件和库文件

    SMT32的HEX文件里加入固件版本的方法

    本文介绍一个小技巧:使用MDK编译器,让STM32程序HEX文件中加入固件版本信息
    发表于 02-08 15:28 0次下载
    SMT32的HEX文件里<b class='flag-5'>加入</b><b class='flag-5'>固件</b><b class='flag-5'>版本</b>的方法

    单片机固件中加入版本信息的方法

    平时我们写程序,通常都会备注软件版本,那么,怎么在单片机中保存版本信息呢?方法其实有很多,但基本原理都是在指定存储区域(Flash)中写入软件版本
    的头像 发表于 04-18 14:50 923次阅读

    STM32程序HEX文件中加入固件版本信息

    使用MDK编译器,让STM32程序HEX文件中加入固件版本信息
    的头像 发表于 08-14 16:13 3947次阅读

    SMT32的HEX文件里加入固件版本的方法

    使用MDK编译器,让STM32程序HEX文件中加入固件版本信息
    的头像 发表于 02-01 09:37 3532次阅读

    单片机固件中加入版本信息方式有哪些?-1

    开发完MCU软件后,通常都会生成hex文件或者bin文件,用来做固件烧录或者升级,如果用来做产品开发,就涉及到固件版本的问题,初学者通常采用固件文件重命名来区分
    的头像 发表于 02-15 15:13 995次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>固件</b><b class='flag-5'>中加入</b><b class='flag-5'>版本</b><b class='flag-5'>信息</b>的<b class='flag-5'>方式</b>有哪些?-1

    单片机固件中加入版本信息方式有哪些?-2

    这篇介绍一下如何在 MCU 程序中固定位置添加程序的版本信息等。
    的头像 发表于 02-15 15:36 735次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>固件</b><b class='flag-5'>中加入</b><b class='flag-5'>版本</b><b class='flag-5'>信息</b>的<b class='flag-5'>方式</b>有哪些?-2

    怎么在单片机中保存版本信息呢?

    平时我们写程序,通常都会备注软件版本,那么,怎么在单片机中保存版本信息呢?
    的头像 发表于 04-18 15:12 619次阅读

    单片机固件如何加入版本信息

    时我们写程序,通常都会备注软件版本,那么,怎么在单片机中保存版本信息呢? 方法其实有很多,但基本原理都是在指定存储区域(Flash)中写入软件版本
    发表于 08-22 09:16 197次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>固件</b>如何<b class='flag-5'>加入</b><b class='flag-5'>版本</b><b class='flag-5'>信息</b>

    SMT32的HEX文件里加入固件版本的方法

    SMT32的HEX文件里加入固件版本的方法
    的头像 发表于 09-18 15:34 407次阅读
    SMT32的HEX文件里<b class='flag-5'>加入</b><b class='flag-5'>固件</b><b class='flag-5'>版本</b>的方法