J-link RTT的使用

J-link RTT的使用
THEDIRTT介绍
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-V和Renesas 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
内部包含一些源码和工具
移植RTT到我们的工程中
打开Samples目录下的RTT文件夹,解压该处文件夹
将这4个文件复制到我们工程的Debug
目录下(没有就新建一个Debug目录)
keil工程中创建Debug/RTT组,添加这四个文件进去
添加对应的头文件搜索路径,然后编译即可
使用RTT输出日志
我们在使用RTT的时候,一般不需要调用SEGGER_RTT_Init()
,因为几乎所有RTT API在调用时,都会先判断和确保 RTT 控制块已初始化。如果没初始化会自动调用初始化,我们只需要直接使用SEGGER_RTT_printf
即可
包含头文件
输出日志可以控制颜色,终端号,然后前往RTT Viewr中查看日志
打印函数原型:
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驱动相关的文件夹中
打开后需要我们进行一些配置,按照自己的情况进行配置,我这里使用的是USB连接、STMF411CEU6芯片、SWD调试、RTT Control Block选择自动检测,然后点击OK
即可
对于
RTT Control Block
的地址,实际上就是存放在RAM中的一个结构体_SEGGER_RTT
(内存区域),我们的日志数据存放在里面的缓冲区中。
我们需要准确填写该地址,否则日志无法正确显示。很多设备的RTT地址可以使用Auto Detection
,如果不能识别请自己选择Address填写:
这里的0x20000490
地址在我的keil中的.map文件可以找到分配的地址,对应填写即可
打开后可以看到我们之前写的代码在这里输出了日志
增加浮点数打印功能
RTT默认下不支持输出浮点数,如果需要具有输出浮点数的功能,需要我们修改其源码
我们现在SEGGER_RTT_Conf.h
中新增一个宏,用于控制打印浮点数功能是否开启
然后找到SEGGER_RTT_printf.c
中的SEGGER_RTT_vprintf
函数中添加,默认打印3位,需要显示更多位数的话,修改源码即可
编写测试代码,后烧录使用J-Link RTT进行观察