一,、前言
在嵌入式開發(fā)過程中,,經(jīng)常會通過打印輸出一些調(diào)試信息來調(diào)試參數(shù)、查找問題等,,通常我的做法都是使用芯片的串口硬件設(shè)備配合串口助手軟件來進(jìn)行調(diào)試,。但是這次項(xiàng)目的PCB硬件設(shè)計(jì)并未預(yù)留串口調(diào)試接口,所以想使用串口調(diào)試就不方便了。經(jīng)過查找資料發(fā)現(xiàn)Segger 提供了一種非常方便的調(diào)試方式——自家的J-Link 硬件配合J-Link RTT Viewer 軟件進(jìn)行信息輸入輸出調(diào)試,。
二、組件添加
要使用該調(diào)試組件,,需要添加Segger提供的SEGGER_RTT組件代碼,,該代碼位于J-Link軟件安裝目錄下,而且在用戶手冊中提供了詳細(xì)的說明,。
組件源碼位置:
用戶手冊位置:
在手冊的16章節(jié)對RTT組件進(jìn)行了說明:
將組件源碼復(fù)制到工程目錄下,,工程中添加相關(guān)文件及包含路徑:
最后在需要使用打印調(diào)試信息的文件中包含#include "SEGGER_RTT.h" 頭文件就可以使用該組件了。
三,、組件應(yīng)用
關(guān)于組件提供的各API函數(shù)在手冊中都有相應(yīng)的說明。舉例應(yīng)用如下:
輸出測試:
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 軟件
RTT Viewer打印結(jié)果如下:
輸入測試:
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打印結(jié)果如下:
四,、擴(kuò)展應(yīng)用
經(jīng)過上面對SEGGER_RTT的使用,發(fā)現(xiàn)其確實(shí)非常的方便,,大多數(shù)調(diào)試都能夠替代串口調(diào)試實(shí)現(xiàn)了,,但是SEGGER_RTT_printf() 函數(shù)無法打印浮點(diǎn)數(shù)。手冊中對該函數(shù)列出了支持的轉(zhuǎn)換說明符如下:
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.) |
其中并沒有浮點(diǎn)數(shù)f 選項(xiàng),。但是可以使用SEGGER_RTT輸出函數(shù)自己修改一個(gè)printf函數(shù),,這樣就可以使用完整的printf函數(shù)了。
添加自己修改的printf函數(shù)如下:
/*********************************************************************
*
* 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]; //根據(jù)應(yīng)用需求調(diào)整大小
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;
}
接下來測試浮點(diǎn)數(shù)打?。?/p>
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);
}
|