关于SEGGER RTT调试
说明
SEGGER RTT调试全名为SEGGER’s Real Time Transfer,实时传输调试,其调试传输能力非常优秀,表现为调试的数据传输速度快、时延低。并且通过相应的API,可以将其配置为多个窗口调试。
优缺点
优点
最显而易见的一个优点就是使用SEGGER RTT进行数据调试,可以节省使用串口的资源进行显示输入输出,从而达到节省IO管脚资源的效果。
以下为SEGGER官方给出的性能数据
由上图可知,SEGGER的其中一个优点就是数据传输的速度快、时延低。由于直接使用调试管脚进行数据传输,速度能够比串口快上不少,并且传输时延非常低,可以用来调试实时数据。
缺点
SEGGER RTT调试的唯一缺点估计就是必须要使用SEGGER退出的JLink进行调试了,不过在一些大神的带动下,一些其他的工具也能够使用SEGGER的RTT调试接口进行调试,所以问题不大。
如何使用
集成至项目中
可以直接点击这里进行下载相关文件。
下载后能够看到这些文件:
然后将文件添加至工程目录中并在工程配置好文件包含路径即可。
代码中简单使用
此步骤的目的只是简单的使用RTT调试来代替串口输出,请确保使用的是JLink调试器,因为不配置buffer。
- 初始化
SEGGER_RTT_Init();
SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
- 打印数据
可以像使用printf一样来使用这个打印函数,如下:
SEGGER_RTT_printf(0, "this is rtt print0 , id = %d\r\n", i);
- 现象
指定调试的输出终端窗口
因为需要指定其他的终端,所以不能像上面一样直接简单初始化就使用,因为上面的操作之所以这么简单是因为JLink调试器能够默认给SEGGER RTT提供一个默认的缓冲区到终端0,所以可以在简单配置后能够有一个能用的终端。
但是很明显,如果使用多终端的输出并且指定print的输出终端的话,就需要自己来初始化一个缓冲区buffer了。
- 初始化缓冲区
uint8_t RTT_Buffer[256];
- 初始化RTT
SEGGER_RTT_Init();
SEGGER_RTT_ConfigUpBuffer(0, NULL, RTT_Buffer, 256, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
- 指定窗口打印
SEGGER_RTT_SetTerminal(1); //配置为终端1,默认为终端0,可配置为从1-F共16个终端
SEGGER_RTT_printf(0, "this is rtt print0 , id = %d\r\n", test_value);
- 现象
指定终端输出信息
该功能不能像打印那样可以格式化字符串,仅能输出普通字符串,但是加以增加字符串操作也能达到打印的效果
初始化步骤和打印普通数据一样
- 输出处理的字符串
SEGGER_RTT_TerminalOut(0, "SEGGER RTT start\r\n");
// ...
sprintf(term_str, "this is rtt print2\r\ndata is send in %d times\r\n", i);
ret = SEGGER_RTT_TerminalOut(2, term_str);
SEGGER_RTT_TerminalOut函数的第一个参数为终端号
- 现象
总结
RTT调试是一种在研发阶段的很好的调试手段,相对于串口来说无疑是节省了很多硬件资源,但是在产品阶段并不方便接出相应的RTT调试管脚,所以RTT的使用还是应该按需来进行。