在KEIL系統下做版本管理

固件內獲取當前時間
編譯器內置宏定義
一邊情況下,C/C++編譯器會內置幾個宏,這些宏定義不僅可以幫助我們完成跨平臺的源碼編寫,靈活使用也可以巧妙地幫我們輸出非常有用的調試信息。

ANSI C標準中有幾個標準預定義宏(也是常用的):
__LINE__:在源代碼中插入當前源代碼行號;
__FILE__:在源文件中插入當前源文件名;
__DATE__:在源文件中插入當前的編譯日期
__TIME__:在源文件中插入當前編譯時間;
__STDC__:當要求程序嚴格遵循ANSI C標準時該標識被賦值爲1;
__cplusplus:當編寫C++程序時該標識符被定義。

編譯器在進行源碼編譯的時候,會自動將這些宏替換爲相應內容。
KEIL的__DATE__與__TIME__
樓主使用的keil開發環境,ANSI C標準。以此爲例說明如何獲取編譯時間並轉化爲標準數字格式日期。
確認平臺宏定義輸出類型
參考範例:
//查看宏定義的內容
unsigned char code DataStr[]=__DATE__;
unsigned char code TimeStr[]=__TIME__;
printf("%s_%s_%d_%d\n", __DATE__, __TIME__, sizeof(__DATE__),sizeof(__TIME__));
輸出結果:
Jan 13 2017_17:24:11_12_9

說明:
日期輸出爲月份(英文縮寫前三個字母,首字母大寫) 日份 年份。佔用字節12字節(包括字符串結束符)。
時間輸出爲時:分:秒。佔用字節9字節(包括字符串結束符)。
__DATE__轉標準數字日期
參考範例:
/** 
__LINE__ 當前語句所在的行號, 以10進制整數標註. 
__FILE__ 當前源文件的文件名, 以字符串常量標註. 
__DATE__ 程序被編譯的日期, 以"Mmm dd yyyy"格式的字符串標註. 
__TIME__ 程序被編譯的時間, 以"hh:mm:ss"格式的字符串標註, 該時間由asctime返回. 
 */ 
 
#define YEAR ((((__DATE__ [7] - '0') * 10 + (__DATE__ [8] - '0')) * 10 \
    + (__DATE__ [9] - '0')) * 10 + (__DATE__ [10] - '0'))
 
/**月份簡寫
January (Jan)---Febuary (Feb)---March (Mar)---April (Apr)---May (May)---June (Jun)--
July (Jul)---August (Aug)---September (Sep)---October (Oct)---November (Nov)---SDecember (Dec)--
*/
 
#define MONTH (__DATE__ [2] == 'n' ? 1 \
    : __DATE__ [2] == 'b' ? 2 \
    : __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? 3 : 4) \
    : __DATE__ [2] == 'y' ? 5 \
    : __DATE__ [2] == 'n' ? 6 \
    : __DATE__ [2] == 'l' ? 7 \
    : __DATE__ [2] == 'g' ? 8 \
    : __DATE__ [2] == 'p' ? 9 \
    : __DATE__ [2] == 't' ? 10 \
    : __DATE__ [2] == 'v' ? 11 : 12)
 
#define DAY ((__DATE__ [4] == ' ' ? 0 : __DATE__ [4] - '0') * 10 \
    + (__DATE__ [5] - '0'))
 
//__DATE__轉換爲int型,eg:170502(20省去)
#define DATE_AS_INT ((YEAR-2000) * 10000 + (MONTH) * 100 + (DAY))
 
//固件版本號
#define FW_VER     DATE_AS_INT
 
此時固件好FW_VER是int型的宏定義,例如170113.

KEIL生產與系統時間一致的同名BIN文件
KEIL生產bin文件
KEIL安裝之後自帶BIN文件生成工具,路徑在 \Keil_v5\ARM\ARMCC\bin\fromelf.exe。生成方式爲,在KEIL設置的USER選項中after build中填寫如下代碼,即可生成跟.Axf同名的Bin文件
fromelf.exe --bin -o [email protected] #L


BIN文件更名爲系統時間
BIN固件文件生成後需要自動複製到相應的文件夾內並更名爲系統時間。這就需要用到WINDOWS的批處理來完成。並且需要在After Build的Run #2中調用此批處理文件。批處理文件命令爲CopyBin.bat,文件內容如下。
@rem ::關閉回顯
@echo off
@rem ::直接運行fromelf.exe生成bin文件,未測試成功
@rem ::start  "../fromelf.exe --bin -o ../output/CONTROL_APP_Q_X.bin ../CONTROL_APP_Q_X.axf"
@rem ::start  ../fromelf.exe --bin -o [email protected] #L
 
@rem ::%cd%可獲取當前完整路徑名
@rem echo %cd%
 
@rem ::清空以前的bin文件
@del /s /q ..\BIN\*.*
 
@rem ::輸出結果格式爲20170527145218.bin跟當前日期一直。
@rem ::如果不一致則是當前系統的日期格式不一致導致
@rem ::解決辦法:修改系統的日期格式或者運行tools/timeformat.reg文件把日期格式導入註冊表.
@rem ::獲取當前時間字符串並賦值給變量T
 
@set T=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
 
@echo on
 
@rem ::更改BIN文件下的文件名爲當前日期
copy ..\OutPut\CONTROL_APP_Q_X.bin ..\BIN\%T%.bin

對應好路徑,就能實現把並文件複製到相應到固定文件夾下並更名爲系統時間。如:20170528110232.bin

此過程中如果文件名跟實際時間不一致,則是系統時間格式不一致導致的。提供如下REG文件,可修改註冊表中的時間格式,不想修改註冊表的可以在系統設置的時間格式裏修改也可。保存如下代碼爲timeformat.reg然後雙擊執行即可更改系統時間格式,達到標準時間顯示的目的。
Windows Registry Editor Version 5.00
 
[HKEY_CURRENT_USER\Control Panel\International]
 
"s1159"="上午"
"s2359"="下午"
"sDate"="."
"sLongDate"="yyyy'年'M'月'd'日'"
"sShortDate"="yyyy.MM.dd"
"sTime"=":"
"sTimeFormat"="HH:mm:ss"
"sShortTime"="HH:mm"
"sYearMonth"="yyyy'年'M'月'"

至此,可以編譯之後固件內版本時間跟固件名稱一致
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章