那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機(jī)固件中加入版本信息的方式有哪些?-3

汽車電子技術(shù) ? 來源:大橙子瘋嵌入式 ? 作者: 大橙子瘋 ? 2023-02-15 15:38 ? 次閱讀

前言

上一篇介紹完如何在程序中的固定位置添加版本信息,而且如何通過映像工具將版本信息和固件文件名關(guān)聯(lián)同步;這篇主要介紹一下通過 Git 工具管理的程序如何在 MCU 程序版本信息中增加 Git commot 提交的 id 。

Git 是一個(gè)開源的分布式版本控制系統(tǒng),可以有效、高速地處理從很小到非常大的項(xiàng)目版本管理。簡(jiǎn)單來說就是用來管理程序版本的。

為什么增加 git 信息

通過上一篇我們了解到軟件版本信息可以通過映像工具修改 hex 或者 bin 文件,那么在軟件版本管理中,如果程序編譯后的同一個(gè)固件文件在多次進(jìn)行打包后,會(huì)存在多個(gè)已經(jīng)添加了版本信息的固件,但是可執(zhí)行程序內(nèi)容都是一樣的,在之后的管理中,如何區(qū)分不同版本的軟件功能是一樣的呢?

版本信息內(nèi)容的不同不影響可執(zhí)行文件的功能,通過文件對(duì)比雖然能確認(rèn)不同版本的固件中的可執(zhí)行程序是否一樣,但是還是比較繁瑣麻煩。

如果程序是通過 Git 工具管理的,那么此時(shí)可以通過 Git commot 提交 id 信息區(qū)分(每次提交的 id 值是不同的),通過在程序版本信息中添加 Git commot 提交 id 信息便能快速了解該版本固件對(duì)應(yīng)的源碼是哪一次提交的。

實(shí)現(xiàn)方式

1.同樣的定義一個(gè)結(jié)構(gòu)體,里面定義一些軟件版本相關(guān)的信息

typedef struct
{
    char szVersion[32];    // 軟件版本
    char szBuildDate[32];  // 程序編譯日期
    char szBuildTime[32];  // 程序編譯時(shí)間
    char szCommitId[32];  // git commit id
}AppInfo_t;

2.通過__attribute__定義一個(gè)只讀結(jié)構(gòu)體變量(具體為什么這么實(shí)現(xiàn)可以看上一篇)。

const AppInfo_t __attribute__ ((section(".ARM.__at_0x08002000"))) sg_tAppInfo =
{
    "STM32_TEST",
    __DATE__,
    __TIME__,
    ""
};

3.提交git編譯后,可以看的git commit id 值

圖片

4.采用的映像工具 srec_cat,通過 Bat 腳本實(shí)現(xiàn)以下功能:

  1. 不需要修改代碼即可修改程序版本信息
  2. 按照當(dāng)前固件打包時(shí)間作為程序的版本信息,同時(shí)按照版本信息命名文件
  3. 版本命名格式為:STM32_T2206111526
  4. 添加 Git Commit id 信息(新增)

根據(jù)目錄結(jié)構(gòu)樹編寫指定腳本(該目錄必須是git倉(cāng)庫(kù))

.git
MDK_STM32
    ---- CORE
    ---- STM32F10x_FWLib
    ---- OBJ(編譯生成的hex文件)
    ---- USER
tool
    ---- srec_cat.exe
    ---- pack.bat

實(shí)現(xiàn) pack.bat(上一篇的腳本文件有些缺陷,發(fā)現(xiàn)修改路徑和文件名后不能正常打包,可私信回復(fù)關(guān)鍵詞“固件”或“固件打包”獲取下載鏈接):

:: 版本信息前綴和長(zhǎng)度
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%)

:: 打包時(shí)間格式為年月日時(shí)分 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% .\\

:: 版本信息的結(jié)束地址
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 信息的結(jié)束地址
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 工具打開生成的固件進(jìn)行燒錄(通過Keil編譯直接下載的沒有用,我這里用的是 ST-Link 工具)。

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17318

    瀏覽量

    352649
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3795

    瀏覽量

    81411
  • Git
    Git
    +關(guān)注

    關(guān)注

    0

    文章

    201

    瀏覽量

    15819
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    華大單片機(jī)是如何向MDK中加入頭文件和庫(kù)文件的

    華大單片機(jī)如何向MDK中加入頭文件和庫(kù)文件關(guān)鍵文件介紹加入頭文件大多數(shù)習(xí)慣于8位單片機(jī)開發(fā)的工程師,都會(huì)使用操作寄存器的方式來使用
    發(fā)表于 07-13 08:43

    請(qǐng)問單片機(jī)如何向MDK中加入頭文件和庫(kù)文件?

    請(qǐng)問單片機(jī)如何向MDK中加入頭文件和庫(kù)文件?
    發(fā)表于 09-27 08:32

    如何更簡(jiǎn)單的給單片機(jī)更新固件

    當(dāng)單片機(jī)已經(jīng)焊接到電路板上時(shí),如何更簡(jiǎn)單更便捷的為單片機(jī)升級(jí)固件便成了一件值得深思的問題。本文介紹了一種更簡(jiǎn)單更便捷的固件升級(jí)方式,不需要任
    的頭像 發(fā)表于 10-23 18:19 ?1.8w次閱讀
    如何更簡(jiǎn)單的給<b class='flag-5'>單片機(jī)</b>更新<b class='flag-5'>固件</b>?

    如何使用MDK編譯器讓STM32程序HEX文件中加入固件版本信息

    本文介紹一個(gè)小技巧: 使用MDK編譯器,讓STM32程序HEX文件中加入固件版本信息。 代碼 代碼如下
    的頭像 發(fā)表于 06-23 15:14 ?4111次閱讀
    如何使用MDK編譯器讓STM32程序HEX文件<b class='flag-5'>中加入</b><b class='flag-5'>固件</b><b class='flag-5'>版本</b><b class='flag-5'>信息</b>

    華大單片機(jī)如何向MDK中加入頭文件和庫(kù)文件

    華大單片機(jī)如何向MDK中加入頭文件和庫(kù)文件關(guān)鍵文件介紹加入頭文件大多數(shù)習(xí)慣于8位單片機(jī)開發(fā)的工程師,都會(huì)使用操作寄存器的方式來使用
    發(fā)表于 11-23 18:07 ?15次下載
    華大<b class='flag-5'>單片機(jī)</b>如何向MDK<b class='flag-5'>中加入</b>頭文件和庫(kù)文件

    單片機(jī)的燒錄方式:ISP、ICP、IAP的區(qū)別

    單片機(jī)的燒錄方式單片機(jī)三種燒錄方式ISP、IAP和ICP什么不同?單片機(jī)三種燒錄
    發(fā)表于 12-03 18:21 ?27次下載
    <b class='flag-5'>單片機(jī)</b>的燒錄<b class='flag-5'>方式</b>:ISP、ICP、IAP的區(qū)別

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

    本文介紹一個(gè)小技巧:使用MDK編譯器,讓STM32程序HEX文件中加入固件版本信息
    發(fā)表于 02-08 15:28 ?0次下載
    SMT32的HEX文件里<b class='flag-5'>加入</b><b class='flag-5'>固件</b><b class='flag-5'>版本</b>的方法

    單片機(jī)固件中加入版本信息的方法

    平時(shí)我們寫程序,通常都會(huì)備注軟件版本,那么,怎么在單片機(jī)中保存版本信息呢?方法其實(shí)有很多,但基本原理都是在指定存儲(chǔ)區(qū)域(Flash)中寫入軟件版本
    的頭像 發(fā)表于 04-18 14:50 ?1162次閱讀

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

    使用MDK編譯器,讓STM32程序HEX文件中加入固件版本信息
    的頭像 發(fā)表于 08-14 16:13 ?4426次閱讀

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

    使用MDK編譯器,讓STM32程序HEX文件中加入固件版本信息
    的頭像 發(fā)表于 02-01 09:37 ?3913次閱讀

    單片機(jī)固件中加入版本信息方式哪些?-1

    開發(fā)完MCU軟件后,通常都會(huì)生成hex文件或者bin文件,用來做固件燒錄或者升級(jí),如果用來做產(chǎn)品開發(fā),就涉及到固件版本的問題,初學(xué)者通常采用固件文件重命名來區(qū)分
    的頭像 發(fā)表于 02-15 15:13 ?1472次閱讀
    <b class='flag-5'>單片機(jī)</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><b class='flag-5'>有</b>哪些?-1

    單片機(jī)固件中加入版本信息方式哪些?-2

    這篇介紹一下如何在 MCU 程序中固定位置添加程序的版本信息等。
    的頭像 發(fā)表于 02-15 15:36 ?1293次閱讀
    <b class='flag-5'>單片機(jī)</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><b class='flag-5'>有</b>哪些?-2

    怎么在單片機(jī)中保存版本信息呢?

    平時(shí)我們寫程序,通常都會(huì)備注軟件版本,那么,怎么在單片機(jī)中保存版本信息呢?
    的頭像 發(fā)表于 04-18 15:12 ?898次閱讀

    單片機(jī)固件如何加入版本信息

    時(shí)我們寫程序,通常都會(huì)備注軟件版本,那么,怎么在單片機(jī)中保存版本信息呢? 方法其實(shí)有很多,但基本原理都是在指定存儲(chǔ)區(qū)域(Flash)中寫入軟件版本
    發(fā)表于 08-22 09:16 ?463次閱讀
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>固件</b>如何<b class='flag-5'>加入</b><b class='flag-5'>版本</b><b class='flag-5'>信息</b>

    STM32單片機(jī)實(shí)現(xiàn)固件在線升級(jí)(IAP)

    1,固件升級(jí)方案綜述單片機(jī)固件升級(jí)方式很多種。1、ICP:簡(jiǎn)單說就是在單片機(jī)開發(fā)時(shí)使用燒錄器
    的頭像 發(fā)表于 12-16 08:00 ?5622次閱讀
    STM32<b class='flag-5'>單片機(jī)</b>實(shí)現(xiàn)<b class='flag-5'>固件</b>在線升級(jí)(IAP)
    百家乐官网博百家乐官网的玩法技巧和规则| 为什么百家乐玩家越来越多选择网上百家乐 | 百家乐开过的路纸| 百家乐官网有破解的吗| 百家乐推筒子| 百家乐官网有多少局| 百家乐必胜法技巧| 香港百家乐官网赌场| 太阳城娱乐官方网站| 劳力士百家乐官网的玩法技巧和规则 | 大富豪棋牌游戏| 2404这个房号 风水| 基隆市| 什么百家乐平注法| 独赢百家乐官网全讯网| 大丰收百家乐的玩法技巧和规则| 百家乐官网单跳| 棋牌室转让| 百家乐翻天粤| 百家乐官网投注方法网| 大发888娱乐总代理qq| 墓地附近做生意风水| 昭平县| 金矿百家乐的玩法技巧和规则| 百家乐官网游戏模拟| 娱乐城注册送38彩金| 百家乐开户送彩金28| 百家乐官网赌博规律| 波克棋牌官方下载| JJ百家乐官网的玩法技巧和规则 | 大发888官方6222| 百家乐论坛博彩拉| 百家乐官网国际娱乐平台| 威尼斯人娱乐平台开户| 百家乐优惠现金| 百家乐官网赌缆注码运用| 顶级赌场下载| 百家乐看| 24山向水法吉凶断| 全讯网开奖现场| 百家乐赌法|