说明

SEGGER RTT调试全名为SEGGER’s Real Time Transfer,实时传输调试,其调试传输能力非常优秀,表现为调试的数据传输速度快、时延低。并且通过相应的API,可以将其配置为多个窗口调试。

优缺点

优点

最显而易见的一个优点就是使用SEGGER RTT进行数据调试,可以节省使用串口的资源进行显示输入输出,从而达到节省IO管脚资源的效果。

以下为SEGGER官方给出的性能数据

233

SEGGER 传输82 Bytes数据时延

由上图可知,SEGGER的其中一个优点就是数据传输的速度快、时延低。由于直接使用调试管脚进行数据传输,速度能够比串口快上不少,并且传输时延非常低,可以用来调试实时数据。

缺点

SEGGER RTT调试的唯一缺点估计就是必须要使用SEGGER退出的JLink进行调试了,不过在一些大神的带动下,一些其他的工具也能够使用SEGGER的RTT调试接口进行调试,所以问题不大。

如何使用

集成至项目中

可以直接点击这里进行下载相关文件。

下载后能够看到这些文件:

233

SEGGER RTT相关文件

然后将文件添加至工程目录中并在工程配置好文件包含路径即可。

代码中简单使用

此步骤的目的只是简单的使用RTT调试来代替串口输出,请确保使用的是JLink调试器,因为不配置buffer。

  • 初始化
1  SEGGER_RTT_Init();
2  SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
  • 打印数据

可以像使用printf一样来使用这个打印函数,如下:

1  SEGGER_RTT_printf(0, "this is rtt print0 , id = %d\r\n", i);
  • 现象

233

指定调试的输出终端窗口

因为需要指定其他的终端,所以不能像上面一样直接简单初始化就使用,因为上面的操作之所以这么简单是因为JLink调试器能够默认给SEGGER RTT提供一个默认的缓冲区到终端0,所以可以在简单配置后能够有一个能用的终端。

但是很明显,如果使用多终端的输出并且指定print的输出终端的话,就需要自己来初始化一个缓冲区buffer了。

  • 初始化缓冲区
1  uint8_t RTT_Buffer[256];
  • 初始化RTT
1  SEGGER_RTT_Init();
2  SEGGER_RTT_ConfigUpBuffer(0, NULL, RTT_Buffer, 256, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
  • 指定窗口打印
1  SEGGER_RTT_SetTerminal(1); //配置为终端1,默认为终端0,可配置为从1-F共16个终端
2  SEGGER_RTT_printf(0, "this is rtt print0 , id = %d\r\n", test_value);
  • 现象

233

指定终端输出信息

该功能不能像打印那样可以格式化字符串,仅能输出普通字符串,但是加以增加字符串操作也能达到打印的效果

初始化步骤和打印普通数据一样

  • 输出处理的字符串
1  SEGGER_RTT_TerminalOut(0, "SEGGER RTT start\r\n");
2  
3  // ...
4  
5  sprintf(term_str, "this is rtt print2\r\ndata is send in %d times\r\n", i);
6  ret = SEGGER_RTT_TerminalOut(2, term_str);

SEGGER_RTT_TerminalOut函数的第一个参数为终端号

  • 现象

233

233

总结

RTT调试是一种在研发阶段的很好的调试手段,相对于串口来说无疑是节省了很多硬件资源,但是在产品阶段并不方便接出相应的RTT调试管脚,所以RTT的使用还是应该按需来进行。


impressionyang