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

當(dāng)前位置:首頁(yè) > > 大橙子瘋嵌入式


前言

開(kāi)發(fā)完MCU軟件后,通常都會(huì)生成hex文件或者bin文件,用來(lái)做固件燒錄或者升級(jí),如果用來(lái)做產(chǎn)品開(kāi)發(fā),就涉及到固件版本的問(wèn)題,初學(xué)者通常采用固件文件重命名來(lái)區(qū)分版本。

如果需要每次上電開(kāi)機(jī)通過(guò)串口或者OLED等顯示版本信息,那么這種方式就無(wú)法實(shí)現(xiàn)

下面介紹如何在程序中加入版本信息,以MDK為例介紹。

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

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

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

2.定義一個(gè)只讀結(jié)構(gòu)體變量(只讀的目的:防止程序改變、節(jié)約RAM),賦初值(其中__DATE_和__TIME__是C語(yǔ)言中的內(nèi)置宏,分別是當(dāng)前的編譯日期和編譯時(shí)間)。

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 中,默認(rèn)情況下,源文件不修改,只會(huì)編譯一次。

如果定于sg_tAppInfo變量的源文件沒(méi)有修改而其它文件修改時(shí),編譯日期和編譯時(shí)間還是之前的

為了編譯版本、日期和時(shí)間正確,需要進(jìn)行設(shè)置:總是編譯

5.下載程序后,通過(guò)串口工具在MCU上電就能收到版本信息的打印


擴(kuò)展

從上述的實(shí)現(xiàn)方式可知,sg_tAppInfo只讀變量在程序中的位置不固定,有一定的局限性。

如果結(jié)構(gòu)體有其他的信息,無(wú)法在編譯時(shí)初始化,而是需要在程序編譯后的hex文件中添加或者修改信息,但由于只讀變量在程序中的位置不固定,不能保證每次編譯后在固定的位置添加或者修改信息。

下一篇介紹通過(guò)__attribute__機(jī)制固定sg_tAppInfo只讀變量在程序中的地址,同時(shí)采用映像文件工具對(duì)hex固件文件進(jìn)行操作,自動(dòng)將固件中的版本信息和固件文件名稱(chēng)關(guān)聯(lián)起來(lái)。


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