通過串口打印調試信息或者實現上下位機交互是我們最常使用的調試手段之一,畢竟實現起來無論是硬件成本(接出兩根線Txd和Rxd,外加一個電平轉換芯片)還是軟件成本(下位機寫好UART驅動,上位機直接超級終端或者一些第三方串口調試助手)都是相對較低的,所以這種方式還是灰常受廣大“攻城師”們歡迎的。不過如果由于I/O資源緊缺串口被用做其他用處或者板子直接沒有引出串口的話(是不是產生共鳴了,呵呵),那該怎么辦呢?
當然,所謂時代不同了(liao)(我咋順口想說“男女都一樣呢”,呵呵,哎,都是生在舊社會長在紅旗下的孩子。,隨著嵌入式開發生態系統越來越完善,目前也是有越來越多的Poweful開發工具支持豐富的調試功能(支持打印調試信息和交互等),但是涉及到一些版權的問題價格上還是有點小貴的(對一些小企業來說還是難以接受的),所以這個時候就需要我們動動腦筋去摸索摸索其他的方法(所謂路是探索出來的),事實證明破釜沉舟下人的潛力是無限的,呵呵,這里就分享一個折衷的辦法去解決大家一直苦惱的問題,即使用IAR虛擬的串口終端來實現信息的交互和打印,下面進入正題:
測試平臺:IAR6.6 + FRDM KE02開發板(我目前手里有就拿這個了,其他板子都可以放心用的,呵呵)
測試代碼:KE驅動庫(KEXX_DRIVERS_V1.0.1_DEVD\kexx_drv_lib_release_r1.0.1\build\iar\ke02\platinum)
這里稍微提一句,我測試的是KE驅動庫的代碼,但是實際上只要你看懂了我下面的解決方法(授之以漁而不是魚),其他代碼都是類似的。
1)打開KE02 platinum的IAR工程,進入到platinum.c文件,找到main函數如下圖1,可以看到其調用了printf打印函數,而該工程是默認調用底層串口的,我們跳轉到該函數的定義如圖2,再繼續跳轉到out_char的函數定義如圖3,這下就屢清楚了,我們可以很直觀的看到工程默認是調用UART底層的,呵呵,下面我們就要動手改造它對printf進行重定向;
2)首先我們需要注釋掉printf的實現函數,將其屏蔽掉,然后需要給printf一個重新指向的地址,下面就該我們常見的這位老兄出場了(貌似當初自打我開始接觸Turbo C的時候就已經用到它了,老生常談的“Hello world”就是調用它內部的printf來實現的)。我們找到Common.h文件,將添加到其中,如下圖,這樣凡是需要printf的文件只需要添加common.h頭文件即可:
3)這里先說說stdio.h文件的作用,我們打開stdio.h文件可以看到其內部定義了標準輸入輸出函數,包括我們常見的scanf和printf等函數,而這些函數所調用的底層即為IAR提供的鏈接到其Terminal的驅動,所以……懂的,呵呵。除此之外,我們肯定不滿足只輸出打。ńo人略顯低端的趕腳有木有),所以為了體現我們不是“土豪”,我覺著有必要讓它交互起來,實現真正的串口功能(因為一些類似bootloader之類的還是需要輸入參數的),我在main函數添加了scanf語句用來測試輸入功能,如下:
4)準備工作就緒,編譯鏈接整個工程,然后下載到KE02的板子中并進入到Debug調試環境中,點擊View->Terminal I/O調出虛擬終端,然后全步運行,就可以看到Terminal下開始打印調試信息,如下。當然顯示輸出有點小case了,我們再試試輸入功能,在input框中輸入‘a’,然后回車,如下圖,perfect:
5)還沒完,我們要玩就玩高端大氣上點檔次的,我們再探索探索呢,結果又發現個小驚喜,我們點擊上圖右下角的“Input Mode”,彈出設置框如下,很高端啊有木有:
呼,終于寫完了,呵呵,看完之后是不是有種躍躍欲試的興奮呢,哈哈,enjoy it~
未完待續~
附件為我修改好的工程,僅供參考:
|