日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 大橙子瘋嵌入式


前言

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

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

為什么增加 git 信息

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

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

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

實現(xiàn)方式

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

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

2.通過__attribute__定義一個只讀結(jié)構(gòu)體變量(具體為什么這么實現(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 腳本實現(xiàn)以下功能:

  1. 不需要修改代碼即可修改程序版本信息

  2. 按照當前固件打包時間作為程序的版本信息,同時按照版本信息命名文件

  3. 版本命名格式為:STM32_T2206111526

  4. 添加 Git Commit id 信息(新增)

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

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

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

:: 版本信息前綴和長度
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% .\

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



本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉