1. 如果你的程序中使用了C++全局變量,那么*不要*使用MicroLIB,否則Keil會說某某Symbol找不到
2. 不使用MicroLIB帶來的一個問題是KEIL會使用semihosting SWI完成sys_io(例如printf的時候),我們需要一個retarget.c來禁止semihosting。KEIL提供該文件的模版(包括最小版和完全版,見下文),改改就是了
3. retarget.c也有最小版和完全版;最小版除實現fputc及輔助函數用於printf外,只實現了sys_io中的_sys_close;完全版還實現了_sys_open,_sys_read,_sys_write,等等。如果實現了sys_io中除_sys_close以外的任意一個,那么就必須同時實現其他函數。即,要么最小版,要么完全版,不存在中間版。當使用C++標准庫時可能需要完全版:例如使用complex template時就必須使用完全版的retarget.c,因為complex class實現了“<<”和“>>”運算符重載,需要_sys_open等函數。當然我們一般不需要完整的函數內容,只要讓編譯器看到函數定義就行了。
4. 使用new和delete:參考幫助文件的Libraries and floating point support guide -> The ARM C and C++ libraries -> Stack pointer initialization and heap bounds
一般來說KEIL或廠家(如ST)提供的啟動文件已包含該項支持;將匯編啟動文件中的heap size項改改就好了。
5. 順便說下如何動態控制printf的精度(同樣用於snprintf,etc):使用%*控制。例如printf("%.*f ", 2, 1.234)
6. 科學記數法打印:%e