臥槽,自定義打印函數(shù)還能這么完?
剛開始學(xué)習(xí)串口的時候,為了更好的格式化輸出數(shù)據(jù),一般會選擇重定向 printf 函數(shù),即使用 printf 打印到串口,這個是很多初學(xué)者都知曉的事情,網(wǎng)上也有一大堆資料可查。
絕大多數(shù)重定向方法都是采用串口查詢方式,所以打印效率很低,也不適合在中斷中打?。ㄒ驗樗俣忍耍绊懼袛鄨?zhí)行)。
后來,不滿足于簡單重定向,開始利用 C 庫函數(shù)自己實現(xiàn)打印函數(shù),這個時候,我們會充分利用資源,比如 DMA、內(nèi)存等加快我們的打印,這個時候,打印幾百字節(jié)只需要微秒級別的時間即可(主要是內(nèi)存搬運耗時)。
所以魚鷹實現(xiàn)了一個 DMA 方式的自定義 printf 函數(shù),使得整個項目的效率大大提高(這個以后有時間再寫,內(nèi)容比較多)。
對此魚鷹是相當滿意的。但有一個點讓魚鷹非常不舒服。
我們知道,在 MDK 中使用 printf 函數(shù)時,如果出現(xiàn)格式不對或者類型不匹配,編譯的時候會出現(xiàn)警告之類的,如下:
總之,編譯器能幫助我們避免一些低級錯誤(即使老司機也可能會犯)。
但是,自定義的打印函數(shù)卻沒有這種功能,比如魚鷹這個簡單的:
int my_printf(const char *fmt, ...) { return 0; }
使用時,即使有問題,也不會有任何警告提示:
再比如 RT-Thread 中實現(xiàn)的 rt_kprintf, 使用時同樣如此。
原以為,魚鷹實現(xiàn)的自定義打印函數(shù)只能帶著這樣的遺憾繼續(xù)使用,但最近魚鷹卻偶然了解到有一個神奇的東東可以解決這個問題。
它就是魚鷹曾經(jīng)介紹過的屬性設(shè)置 __attribute__ :
__attribute__ ((format (printf, 1, 2))) // 按 printf 函數(shù)的格式
只是魚鷹當時不知道它還能這么玩,只要自定義打印函數(shù)加上這個聲明,就可以完美解決上述無警告的問題。
比如這樣:
如此一來,我們的自定義函數(shù)也可以像 printf 函數(shù)一樣,提前將一些低級錯誤提示出來了(除了左邊感嘆號,編譯的時候也有警告)。
這才是完美的自定義打印函數(shù)呀,大家趕快試一試吧。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。