J-link RTT的使用

RTT介绍

J-Link RTT(Real Time Transfer,实时传输)是 SEGGER 公司为 J-Link 仿真器开发的一项高效调试数据通信技术,用于在嵌入式设备和主机PC之间进行高速、无阻塞的日志输出和数据交互。

在嵌入式开发中,调试信息的打印通常依赖于串口,但若未预留串口,JLINK调试器的RTT(Real-Time Transfer)功能可以成为替代方案。

RTT技术特点

  • 与目标嵌入式应用的双向通信能力
  • 不影响嵌入式应用的实时行为的高速传输速率
  • 使用调试通道(SWD: SWDIO、SWCLK)用作通信(相当于不用再额外占用GPIO等外设接口)
  • 不需要在目标嵌入式系统增加额外的硬件或引脚
  • 任何的J-Link型号都支持(J-Link型号列表和比较可参考https://www.segger.com/products/debug-probes/j-link/models/model-overview/
  • 能被ARM Cortex-A/R/M系列芯片支持,以及被RISC-VRenesas RX支持
  • 提供完整的RTT的实现代码

RTT与串口对比:

对比项 RTT UART串口
速率 高速(KB/s级) 较低(一般115200)
阻塞性 无阻塞 可能阻塞
线缆需求 只需J-Link USB(SWD接口) 需额外串口线(走TX和RX)
PC端工具 RTT Viewer/IDE 串口助手
多通道 支持 通常单通道
方向 双向 通常单向

下载Jlink相关软件驱动

官网下载:

SEGGER - The Embedded Experts - Downloads - J-Link / J-Trace

image-20250824173731374

内部包含一些源码和工具

image-20250824173850217

移植RTT到我们的工程中

打开Samples目录下的RTT文件夹,解压该处文件夹

image-20250824174059991

将这4个文件复制到我们工程的Debug目录下(没有就新建一个Debug目录)

image-20250824174503833

image-20250827140738744

image-20250827140755105

keil工程中创建Debug/RTT组,添加这四个文件进去

image-20250827140835370

添加对应的头文件搜索路径,然后编译即可

image-20250827140916713

使用RTT输出日志

我们在使用RTT的时候,一般不需要调用SEGGER_RTT_Init(),因为几乎所有RTT API在调用时,都会先判断和确保 RTT 控制块已初始化。如果没初始化会自动调用初始化,我们只需要直接使用SEGGER_RTT_printf即可

包含头文件

image-20250824180444967

输出日志可以控制颜色,终端号,然后前往RTT Viewr中查看日志

image-20250824184303911

打印函数原型

1
int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...);

参数

  • BufferIndex:指定你要输出到的 RTT通道号

    • 通常是默认的上行通道(Host端接收),一般都用0。使用Terminal 0一个作为日志输出足够了

    • 多通道输出时可以指定输出的通道(多Terminal同时输出)

  • sFormat:输出格式字符串,和标准C库的printf一致

    • 支持常用的格式控制符:%d%u%x%s%f(部分库版本)等。
  • ...:可变参数

使用RTT Viewr查看日志

RTT Viewr是基于J-Link的高速串口调试助手 + 多通道通信 + 图形化日志终端。

在下载的Jlink驱动相关的文件夹中

image-20250824181430819

打开后需要我们进行一些配置,按照自己的情况进行配置,我这里使用的是USB连接、STMF411CEU6芯片、SWD调试、RTT Control Block选择自动检测,然后点击OK即可

image-20250824184956606

对于RTT Control Block的地址,实际上就是存放在RAM中的一个结构体_SEGGER_RTT(内存区域),我们的日志数据存放在里面的缓冲区中。

我们需要准确填写该地址,否则日志无法正确显示。很多设备的RTT地址可以使用Auto Detection,如果不能识别请自己选择Address填写:

image-20250824185100683

这里的0x20000490地址在我的keil中的.map文件可以找到分配的地址,对应填写即可

image-20250824182327509

打开后可以看到我们之前写的代码在这里输出了日志

image-20250824184504521

增加浮点数打印功能

RTT默认下不支持输出浮点数,如果需要具有输出浮点数的功能,需要我们修改其源码

我们现在SEGGER_RTT_Conf.h中新增一个宏,用于控制打印浮点数功能是否开启

image-20250902153301980

然后找到SEGGER_RTT_printf.c中的SEGGER_RTT_vprintf函数中添加,默认打印3位,需要显示更多位数的话,修改源码即可

image-20250902153718412

编写测试代码,后烧录使用J-Link RTT进行观察

image-20250902155322793

image-20250902155341867