單片機固件中加入版本信息的方式(一)
掃描二維碼
隨時隨地手機看文章
前言
開發(fā)完MCU軟件后,通常都會生成hex文件或者bin文件,用來做固件燒錄或者升級,如果用來做產(chǎn)品開發(fā),就涉及到固件版本的問題,初學者通常采用固件文件重命名來區(qū)分版本。
如果需要每次上電開機通過串口或者OLED等顯示版本信息,那么這種方式就無法實現(xiàn)
下面介紹如何在程序中加入版本信息,以MDK為例介紹。
實現(xiàn)方式
1.定義一個結(jié)構(gòu)體,里面定義一些軟件版本相關(guān)的信息
typedef struct { char szVersion[32]; // 軟件版本 char szBuildDate[32]; // 程序編譯日期 char szBuildTime[32]; // 程序編譯時間 }AppInfo_t;
2.定義一個只讀結(jié)構(gòu)體變量(只讀的目的:防止程序改變、節(jié)約RAM),賦初值(其中__DATE_和__TIME__是C語言中的內(nèi)置宏,分別是當前的編譯日期和編譯時間)。
const AppInfo_t sg_tAppInfo = { "STM32_V0.1.5", __DATE__, __TIME__, };
3.在主函數(shù)添加打印,將版本信息輸出到終端上。
int main(void) { SystemInit(); printf("Version : %s\r\n", sg_tAppInfo.szVersion); printf("buildTime: %s\r\n", sg_tAppInfo.szBuildDate); printf("buildTime: %s\r\n", sg_tAppInfo.szBuildTime); while (1) { } }
4.在 Keil MDK 中,默認情況下,源文件不修改,只會編譯一次。
如果定于sg_tAppInfo變量的源文件沒有修改而其它文件修改時,編譯日期和編譯時間還是之前的
為了編譯版本、日期和時間正確,需要進行設(shè)置:總是編譯
5.下載程序后,通過串口工具在MCU上電就能收到版本信息的打印

擴展
從上述的實現(xiàn)方式可知,sg_tAppInfo只讀變量在程序中的位置不固定,有一定的局限性。
如果結(jié)構(gòu)體有其他的信息,無法在編譯時初始化,而是需要在程序編譯后的hex文件中添加或者修改信息,但由于只讀變量在程序中的位置不固定,不能保證每次編譯后在固定的位置添加或者修改信息。
下一篇介紹通過__attribute__機制固定sg_tAppInfo只讀變量在程序中的地址,同時采用映像文件工具對hex固件文件進行操作,自動將固件中的版本信息和固件文件名稱關(guān)聯(lián)起來。





