對比串口打印,使用RTT打印log信息的優點是只占用調試口,速度快,可隨產品發布
RTT實現的基本原理是,程序中實現一個環形緩沖區(數組+讀寫指針),MCU不斷的往緩沖區中寫數據,PC上運行的上位機周期的讀取此緩沖區中的數數據
在具體使用時需注意幾點
1.SEGGER_RTT_LOCK () SEGGER_RTT_UNLOCK()的實現方式,默認的實現方式是屏蔽中斷
在多任務運行的環境下或者中斷函數中也需要打印的環境下,需保證打印數據的完整性。
因為RTT打印的數據僅僅寫入內存,並不需要考慮傳輸的時間,因此在中斷中調用RTT的打印函數也基本沒有影響
2.選擇使用SEGGER_RTT_MODE_NO_BLOCK_SKIP/SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL
SKIP是指當緩沖區滿時,直接跳過寫入操作,BLOCK方式是死等緩沖區釋放,正式產品中使用SKIP方式,因為不可能一直連接PC
3.配置緩沖區的大小
4.RTT控制塊的位置
因為RTTViewer在內存中掃描控制塊時,其默認掃描的地址范圍可能與芯片的實際內存空間不一致,所以最好定義SEGGER_RTT_SECTION,並且修改連接腳本,
將_SEGGER_RTT變量放置到默認的掃描空間內,這樣可有效避免打開RTTViewer,卻沒有任何打印信息的問題
IAR下的配置如下截圖, gcc工具鏈下操作類似,MDK的連接腳本的語法沒研究過~~~
5.RTT的源碼中沒有實現類似printf("%f",...)打印浮點數,如實在需要打印浮點數,需修改RTT源碼,其中一個關鍵點是理解C語言不定數量參數的函數實現方式