RTT使用方法
简介
Real Timer Transfer(RTT)是SEGGER公司开发的一种嵌入式调试手段,可以通过swd接口的调试器输入输出日志,对比常见的串口调试和SWO调试,RTT有如下优点:
- 只需SWD调试线就可以完成信息传输,无需另接SWO,串口线
- RTT为非侵入式传输,对比串口输出,RTT不会影响当前程序进程
- RTT传输速度快,效率高
关于RTT的详细介绍可以参考官方Wiki
RTT原理
RTT的主要交互部分为Control Block(CB)
该部分由ID、上行缓冲区、下行缓冲区组成,ID为CB标识,用于调试器找到目标地址。
RTT工作时将需要传输的数据存入缓冲区,调试器会自动读取缓冲区内容将其传输到电脑
RTT使用方法
- 安装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
推荐使用OpenOCD查看RTT信息,以STM32H7
和DAPLink
为例:
首先打开OpenOCD安装目录,在/share/openocd/scripts
目录下创建xxx.cfg
,内容如图
其中3、4行要根据自己选用的平台更改
第7行意思是在起点为0x2400000
范围为0x50000
的内存中搜索ID为SEGGER RTT
的Control Block
,我的Control Block
地址为0x24000114
可以搜索到(不建议更改为具体地址,不一定不变)
第9行意思是启动端口为8765的TCP传输RTT通道0的数据,因此数据可以通过有TCP监听功能的软件看到,例如在VOFA+中打开TCP模式,端口填8765就可以获得和串口调试一样的体验