前言
什么是RTT?
RTT(Real Time Transfer)是一种用于嵌入式中与用户进行交互的技术,它结合了SWO和半主机的优点,具有极高的性能。使用RTT可以从MCU非常快速输出调试信息和数据,且不影响MCU实时性。这个功能可以用于很多支持J-Link的设备和MCU,兼容性强。RTT支持两个方向的多个通道,上到主机,下到目标,它可以用于不同的目的,为用户提供尽可能多的自由。默认实现每个方向使用一个通道,用于可打印终端输入和输出。
使用RTT,可以快速地从目标MCU输出信息,或者向应用输入信息,而不会影响目标系统的实时性。RTT支持所有型号J-Link,及Cortex-M和RX、RISC-V支持后台内存访问的目标处理器。当然支持N32所有型号的单片机。
RTT支持双向多通道,默认每个方向实现一个通道,用于输入和输出。使用J-Link Viewer软件,通道可以用于多个虚拟终端,允许打印到多个窗口,只使用一个缓冲区。例如,一个用于标准输出,一个用于错误输出,一个用于调试输出。
SEGGER RTT的性能显著高于用于向主机PC输出数据的任何其他技术,平均一行文本可以在1微秒或更少的时间内输出。基本上只需要一个memcopy()执行的时间。
应用场景
Jlink RTT全称为SEGGER’s Real Time Transfer(RTT),一种基于SEGGER公司的基于JLink调试器的交互式用户I/O的技术。故名思义,就是一种基于jlink的和用户进行交互的技术,可以直观的显示调试芯片的信息,以及可以让用户和调试芯片进行互动的技术。使用J-Link RTT Viewer,可用于“虚拟”终端,允许打印到多个窗口(例如,一个用于标准输出,一个对于错误输出,一个用于调试输出)。
使用Jlink RTT优点:
3.RTT的通信可以通过不同的应用程序完成,可以使用SDK集成到自定义的应用程序中,可本地连接,可远程连接。
基于以上3个优点,如果你还在调试N32芯片的时比使用USART进行用户交互要高效的多。
Jlink RTT说明
调试示意图
JlinkRTT原理
RTT在MCU的存储器中使用SEGGER RTT控制块结构管理数据读写。控制块对于每个可用的信道都在内存中包含了一个ID,通过J-Link或者环形缓冲结构区(链表)都可以通过ID找到对应的控制块。
可用信道的最大数目可以在编译时配置,并且每个缓冲区都可以在MCU运行时配置和使用。上下缓冲区可以分开处理。每个通道都可以配置为阻塞或非阻塞。
在阻塞模式下,应用程序将等待缓冲区写满,直到可以写入所有内存为止,这将导致应用程序处于阻塞状态,但可以防止数据丢失。
在非阻塞模式下,只会写入适合缓冲区的数据,或完全不写入缓冲区,其余的数据将被丢弃。这样即使没有连接调试器,也可以实时运行。开发人员不必创建特殊的调试版本,并且代码可以保留在发布应用程序中。
RTT的性能
RTT的性能明显高于其他任何用于将数据输出到主机PC的方式。平均一行文本可以在1微秒或更短的时间内输出。基本上相当于做一个memcopy()的时间。
RTT实现代码使用大约500字节的ROM和(n(通道数) * (24字节ID+24字节))的RAM。推荐的大小是1 kByte(上行信道)和16到32字节(下行信道),这取决于输入/输出的负载。
Segger提供了RTT Viewer、RTT Client和RTT Logger3个工具用于RTT的访问,下面列出这几个工具的优缺点。
SEGGER RTT的实现代码是用ANSI C编写的,可以通过简单地添加源代码集成到任何嵌入式应用程序中。RTT通过一个简单易用的API来使用,使用RTT可以将输出时间减少到最少,并允许在应用程序执行实时任务时将调试信息打印到主机。实现代码还包括一个简化版本的printf(),它可用于通过RTT编写格式化的字符串。它比大多数标准库printf()实现都要小,并且不需要使用Heap。
SEGGER RTT在编译时是完全可配置的,可以设置通道的数量和默认通道的大小。通过可定义的Lock()和Unlock()例程,使读写操作是线程安全的。
|
优点
|
缺点
|
RTT Viewer
|
1、图形化界面,操作简单;2、支持读、写、文件存档;3、支持多通道;
|
1、性能不够好,速度达不到官方宣传的数据,数据量大的时候会丢;2、功能上不像xShell这种工具那么强;
|
RTT Client
|
1、性能可以,比Viewer好很多;2、当debug停止的时候会自动重连;
|
1、不像viewer操作那么简单;2、需要进入debug模式才能使用;3、不支持多通道;
|
RTT Logger
|
1、不需要进入debug模式;2、支持文件存档;
|
1、只支持通道1;
|
软件配置
移植RTT的SDK包到工程文件
解压后可以看到如下图所示文件,Example目录是参考的demo,RTT和Syscalls文件夹下就是移植所需要的文件
Example目录内容:
RTT目录内容:
Syscalls目录内容:
注意:发现keil引用RTT文件时不需要引用SEGGER_RTT_Syscall_KEIL.c,添加反而报错。
将代码添加到工程中
添加头文件路径
编译选项注意
一定要 取消 这个勾选!!!
工程测试
功能描述
测试添加#include "SEGGER_RTT.h"
测试代码:
代码分析
测试代码为SEGGER_RTT_printf不同数据类型格式,浮点转字符串,指针地址打印,程序循环等,对程序开发调试具有普遍意义。
因为官方的RTT View不能打印出float类型的数据,因此简单写了个float转字符串的函数。
float value = 3.1415; unsigned char length;
SEGGER_RTT_printf(0,"value = %s \n",out_float(value,4,&length));
测试结果
编译下载,重新上电,然后打开J-Link RTT Viewer,点击OK就可以看到输出结果,如果想仿真调试,需要先进入仿真状态,然后在点击OK。
logger打印:
打开RTT Client后显示如下:
注意事项
RTT Viewer非常强大,可以设置显示的颜色,格式化输出等,具体的函数说明可以查看