大家有沒有遇到過軟硬件工程師扯皮的事情?如果一個程序,固件信息里面沒有任何版本信息,代碼里面通過串口等接口也查詢不到固件版本等信息,一旦出現(xiàn)問題,就會你推我,我推你了。那么,怎么樣來避免這種情況發(fā)生呢?一種方法是,就像上面提到的,可以將固件版本信息定義成一個常量存放在程序中,需要的時候可以通過串口等接口查詢代碼版本信息,另一種,是今天上網(wǎng)看到的,思路也非常巧妙,這里分享給大家!
使用 MDK 編譯器,在 STM32 程序 HEX 文件中加入固件版本信息,估計很多老手都已經(jīng)在使用(你有好的方法歡迎分享,希望我的磚能引來你的玉),該方法獻給新手或初學(xué)者。
代碼如下:
?
//------------------------------------------------------------------------------
#include
//------------------------------------------------------------------------------
#define VERINFO_ADDR_BASE? ?(0x8009F00) // 版本信息在 FLASH 中的存放地址
const char Hardware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x00)))??= "Hardware: 1.0.0";
const char Firmware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x20)))??= "Firmware: 1.0.0";
const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;
const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;
//------------------------------------------------------------------------------
看到?jīng)],這里使用了 __attribute__?機制,__attribute__?可以設(shè)置函數(shù)屬性(Function Attribute )、變量屬性(Variable Attribute )和類型屬性(Type Attribute ),使用 at 參數(shù),可以把變量或函數(shù)絕對定位到 Flash 或者 RAM 中。? 具體語法,請自行百度,這里不再贅述。
?
選項配置中:Flash 地址與大小不用做任何修改!
重點在這里
?
串口打印輸出
有了這一個簡單的設(shè)置,將固件版本信息,硬件版本信息,軟件編譯時間等,就可以定義在 Flash 中的空閑位置,既可以通過 HEX 文件直接看出,亦可以通過串口打印版本信息,非常方便。怎么樣,趕快加到你的程序中試一下吧,從此,軟硬件工程師又手拉手,親密無間