嵌入式開發筆記——調試組件SEGGER_RTT


  • 作者:zzssdd2
  • E-mail:zzssdd2@foxmail.com

一、前言

在嵌入式開發過程中,經常會通過打印輸出一些調試信息來調試參數、查找問題等,通常我的做法都是使用芯片的串口硬件設備配合串口助手軟件來進行調試。但是這次項目的PCB硬件設計並未預留串口調試接口,所以想使用串口調試就不方便了。經過查找資料發現Segger 提供了一種非常方便的調試方式——自家的J-Link硬件配合J-Link RTT Viewer軟件進行信息輸入輸出調試。

二、組件添加

要使用該調試組件,需要添加Segger提供的SEGGER_RTT組件代碼,該代碼位於J-Link軟件安裝目錄下,而且在用戶手冊中提供了詳細的說明。

組件源碼位置:

用戶手冊位置:

在手冊的16章節對RTT組件進行了說明:

將組件源碼復制到工程目錄下,工程中添加相關文件及包含路徑:

最后在需要使用打印調試信息的文件中包含#include "SEGGER_RTT.h"頭文件就可以使用該組件了。

三、組件應用

關於組件提供的各API函數在手冊中都有相應的說明。舉例應用如下:

輸出測試:

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打印結果如下:

輸入測試:

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);
} 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM