一、前言
在嵌入式开发过程中,经常会通过打印输出一些调试信息来调试参数、查找问题等,通常我的做法都是使用芯片的串口硬件设备配合串口助手软件来进行调试。但是这次项目的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 0rn');
SEGGER_RTT_TerminalOut(1,RTT_CTRL_BG_BLUE''RTT_CTRL_TEXT_BRIGHT_YELLOW'SEGGER_RTT_TerminalOut 1rn');
SEGGER_RTT_SetTerminal(2);
SEGGER_RTT_printf(0,RTT_CTRL_BG_WHITE''RTT_CTRL_TEXT_BRIGHT_BLACK'SEGGER_RTT_printf 2rn');
SEGGER_RTT_SetTerminal(3);
SEGGER_RTT_printf(0,'SEGGER_RTT_printf %drn', 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 = %crn', 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 = %frn', fa, fb);
delay(0x0fffffff);
}

上一篇:ThreadX——IPC应用之消息队列
下一篇:ThreadX——IPC应用之信号量
推荐阅读最新更新时间:2026-03-20 11:34
- 使用 ON Semiconductor 的 FAN2518S 的参考设计
- LTC1530S8、3.3V/3A 稳压器
- 使用 ON Semiconductor 的 ADP3167 的参考设计
- 使用 Analog Devices 的 LT3420EDD 的参考设计
- 基于Kinetis® M的低成本单相电表参考设计
- LTC3708、具有上升/下降轨跟踪功能的 2.5V/15A 和 1.2V/15A 稳压器
- NXQ1TXH5插件板
- 应变仪仪表放大器
- WRL-13287,基于 ESP8266 802.11 无线局域网的 SparkFun Wi-Fi Shield
- 4.1W、3-LED 通用 LED 照明驱动器

背包客_Follow me 第三季第4期
Azure RTOS ThreadX内核用户手册,含SMP多核(中文版)
现代雷达系统的信号设计
BFR340T






京公网安备 11010802033920号