简介

Real Timer Transfer(RTT)是SEGGER公司开发的一种嵌入式调试手段,可以通过swd接口的调试器输入输出日志,对比常见的串口调试和SWO调试,RTT有如下优点:

  1. 只需SWD调试线就可以完成信息传输,无需另接SWO,串口线
  2. RTT为非侵入式传输,对比串口输出,RTT不会影响当前程序进程
  3. RTT传输速度快,效率高

关于RTT的详细介绍可以参考官方Wiki

RTT原理

RTT的主要交互部分为Control Block(CB)该部分由ID、上行缓冲区、下行缓冲区组成,ID为CB标识,用于调试器找到目标地址。
RTT工作时将需要传输的数据存入缓冲区,调试器会自动读取缓冲区内容将其传输到电脑

https://img.nianlee.top/2024/03/20240313-b544a2.png

RTT使用方法

  1. 安装JLink获取RTT库

RTT库在安装目录C:\Program Files (x86)\SEGGER\JLink\Samples\RTT可以找到,将RTT文件夹添加到项目中即可
2. RTT的调用
首先需要调用SEGGER_RTT_Init()进行初始化,然后可以使用SEGGER_RTT_printf()进行调试信息的输出,或对该函数重新封装让调用更简单快捷

RTT信息查看

查看RTT信息的关键是找到Control Block的地址,多数连接失败问题都是由于调试器在遍历时没有找到Control Block位置,Control Block的ID默认为SEGGER RTT,地址可以在.map文件中找到,该文件在编译文件夹中
例如这是一个项目名为lcd的文件夹,在bulid文件夹中可以找到lcd.map文件

在此文件中搜索_SEGGER_RTT可以得到地址0x24000114

https://img.nianlee.top/2024/03/20240313-a94da1.png

https://img.nianlee.top/2024/03/20240313-ffbb7a.png

推荐使用OpenOCD查看RTT信息,以STM32H7DAPLink为例:
首先打开OpenOCD安装目录,在/share/openocd/scripts目录下创建xxx.cfg,内容如图

其中3、4行要根据自己选用的平台更改
第7行意思是在起点为0x2400000范围为0x50000的内存中搜索ID为SEGGER RTTControl Block,我的Control Block地址为0x24000114可以搜索到(不建议更改为具体地址,不一定不变)
第9行意思是启动端口为8765的TCP传输RTT通道0的数据,因此数据可以通过有TCP监听功能的软件看到,例如在VOFA+中打开TCP模式,端口填8765就可以获得和串口调试一样的体验

https://img.nianlee.top/2024/03/20240313-31a10f.png