在嵌入式開發過程當中,常常會經過打印輸出一些調試信息來調試參數、查找問題等,一般個人作法都是使用芯片的串口硬件設備配合串口助手軟件來進行調試。可是此次項目的PCB硬件設計並未預留串口調試接口,因此想使用串口調試就不方便了。通過查找資料發現Segger 提供了一種很是方便的調試方式——自家的J-Link
硬件配合J-Link RTT Viewer
軟件進行信息輸入輸出調試。git
要使用該調試組件,須要添加Segger提供的SEGGER_RTT組件代碼,該代碼位於J-Link軟件安裝目錄下,並且在用戶手冊中提供了詳細的說明。函數
組件源碼位置:測試
用戶手冊位置:設計
在手冊的16章節對RTT組件進行了說明:調試
將組件源碼複製到工程目錄下,工程中添加相關文件及包含路徑:code
最後在須要使用打印調試信息的文件中包含#include "SEGGER_RTT.h"
頭文件就可使用該組件了。orm
關於組件提供的各API函數在手冊中都有相應的說明。舉例應用以下:blog
輸出測試:接口
int a = 3; SEGGER_RTT_TerminalOut(0,RTT_CTRL_BG_BLACK""RTT_CTRL_TEXT_BRIGHT_GREEN"SEGGER_RTT_TerminalOut 0\r\n"); SEGGER_RTT_TerminalOut(1,RTT_CTRL_BG_BLUE""RTT_CTRL_TEXT_BRIGHT_YELLOW"SEGGER_RTT_TerminalOut 1\r\n"); SEGGER_RTT_SetTerminal(2); SEGGER_RTT_printf(0,RTT_CTRL_BG_WHITE""RTT_CTRL_TEXT_BRIGHT_BLACK"SEGGER_RTT_printf 2\r\n"); SEGGER_RTT_SetTerminal(3); SEGGER_RTT_printf(0,"SEGGER_RTT_printf %d\r\n", a);
打開J-Link RTT Viewer
軟件ip
RTT Viewer打印結果以下:
輸入測試:
int a; while(1) { if ((a = SEGGER_RTT_WaitKey()) > 0) { SEGGER_RTT_SetTerminal(0); SEGGER_RTT_printf(0, "SEGGER_RTT_GetKey = %c\r\n", a); } }
RTT Viewer打印結果以下:
通過上面對SEGGER_RTT的使用,發現其確實很是的方便,大多數調試都可以替代串口調試實現了,可是SEGGER_RTT_printf()
函數沒法打印浮點數。手冊中對該函數列出了支持的轉換說明符以下:
Conversion specifier | Meaning |
---|---|
c | Print the argument as one char |
d | Print the argument as a signed integer |
u | Print the argument as an unsigned integer |
x | Print the argument as an hexadecimal integer |
s | Print the string pointed to by the argument |
p | Print the argument as an 8-digit hexadecimal integer. (Argument shall be a pointer to void.) |
其中並無浮點數f
選項。可是可使用SEGGER_RTT輸出函數本身修改一個printf函數,這樣就可使用完整的printf函數了。
添加本身修改的printf函數以下:
/********************************************************************* * * rtt_printf() * * Function description * print a formatted string using RTT and standard library formatting. **********************************************************************/ int rtt_printf(const char *fmt,...) { int n; char aBuffer[256]; //根據應用需求調整大小 va_list args; va_start (args, fmt); n = vsnprintf(aBuffer, sizeof(aBuffer), fmt, args); if (n > (int)sizeof(aBuffer)) { SEGGER_RTT_Write(0, aBuffer, sizeof(aBuffer)); } else if (n > 0) { SEGGER_RTT_Write(0, aBuffer, n); } va_end(args); return n; }
接下來測試浮點數打印:
double fa = 0.1f; double fb = 2.0f; while(1) { fa += 0.0001f; fb -= 0.0002f; rtt_printf("floating test:\tfa = %f, fb = %f\r\n", fa, fb); delay(0x0fffffff); }