一、KEIL中添加[RTT_Syscalls_KEIL.c][SEGGER_RTT.c][SEGGER_RTT_printf.c],
并将文件夹[segger_rtt]添加到引用目录中。
二、在[SEGGER_RTT_printf.c]中顶部添加 #define NRF_LOG_USES_RTT 1
三、main()中初始化如下:
SEGGER_RTT_Init();
//初始化
SEGGER_RTT_printf(0, “csh\n\r”);//打印输出
四、引用头文件:
#include “SEGGER_RTT.h”
#include “SEGGER_RTT_Conf.h”
RTT:实时传输
1、添加上、下行数据缓冲区(上行到上位机、下行到目标板)
(1)SEGGER_RTT_ConfigUpBuffer()
buffer index:通道需要配置。必须比SEGGER_RTT_MAX_UP_CHANNELS。
sName:指向一个以0结尾的字符串,该字符串将作为通道的名字被展示
pBuffer: 指向一个缓冲区被通道使用。
bufferSize:缓冲区的大小,单位字节
flags:通道的标志位:阻塞或者未阻塞
(2)SEGGER_RTT_ConfigDownBuffer()
2、输出调试信息
(1)SEGGER_RTT_WriteString() 输出显示字符
(2)SEGGER_RTT_printf()普通信息输出,但不支持浮点数
在嵌入式开发过程中,经常会通过打印输出一些调试信息来调试参数、查找问题等,通常我的做法都是使用芯片的串口硬件设备配合串口助手软件来进行调试。但是这次项目的PCB硬件设计并未预留串口调试接口,所以想使用串口调试就不方便了。经过查找资料发现Segger 提供了一种非常方便的调试方式——自家的J-Link硬件配合J-Link RTT Viewer软件进行信息输入输出调试。
性能测试
RTT传输成功后,对其性能进行测试。测试代码如下所示,测试传输20k字节,耗时28.07ms。计算可知RTT通信速率为714k/s。相对于串口11.5k/s (115200bps)的速率,优势非常明显。在一些对时间敏感的场景,串口无法胜任,可考虑使用RTT。
SEGGER’s Real Time Transfer (RTT)是一种用于嵌入式应用的交互式用户I/O技术。它结合了SWO和半托管的优点,具有很高的性能。
使用RTT,可以从目标微控制器输出信息,并以非常高的速度将输入发送到应用程序,而不会影响目标的实时行为。
SEGGER RTT可以与任何J-Link模型和任何支持的允许后台内存访问的目标处理器一起使用,它们是Cortex-M和RX targets。
RTT支持上行到主机和下行到目标的多个方向的信道,可以用于不同的目的,为用户提供了最大的自由度。
默认的实现为每个方向使用一个通道,用于可打印的终端输入和输出。在J-Link RTT Viewer中,此通道可以用于多个“虚拟”终端,允许仅使用一个目标缓冲区打印到多个窗口(例如,一个用于标准输出,一个用于错误输出,一个用于调试输出)。例如,可以使用附加的up (to host)通道发送分析或事件跟踪数据
RTT是如何工作的
实时传输使用目标内存中的SEGGER RTT控制块结构来管理数据的读写。该控制块包含一个ID,使其可以通过连接的J-Link和每个可用通道的环形缓冲区结构在内存中找到,描述了通道缓冲区及其状态。可用通道的最大数量可以在编译时配置,每个缓冲区可以在运行时由应用程序配置和添加。上下缓冲区可以分开处理。每个通道可以配置为阻塞或非阻塞(参见模式)。在阻塞模式下,当缓冲区满时,应用程序将等待,直到所有内存都可以写入,从而导致应用程序处于阻塞状态,但防止数据丢失。在非阻塞模式下,只写入缓冲区中适合的数据,或者根本不写入,其余的将被丢弃。这允许实时运行,即使没有连接调试器。开发人员不需要创建一个特殊的调试版本,代码可以保留在发布应用程序中。
定位控制块
当RTT在主机上处于活动状态时,无论是通过RTT Viewer这样的应用程序直接使用RTT,还是通过Telnet连接到使用J-Link(如调试器)的应用程序,J-Link都会自动在目标的已知RAM区域中搜索SEGGER RTT控制块。如果无法自动找到控制块,也可以通过主机应用程序设置物理内存区域或控制块的具体地址,以加快检测速度。
手动说明控制块位置
虽然自动检测RTT控制块位置对大多数目标都很好,但总是可以手动指定控制块的确切位置或指定J-Link在其中搜索控制块的具体地址范围。这是通过下面的J-Link命令字符串完成的:
SetRTTAddr
SetRTTSearchRanges
或者通过SEGGER TELNET Config String
以上翻译结果来自有道神经网络翻译(YNMT)· 计算机
图像显示了目标的简化结构。可以有任意数量的“Up缓冲区描述符”(目标->主机),以及任意数量的“Down缓冲区描述符”(主机->目标)。每个缓冲区的大小可以单独配置。
缓冲区中的灰色区域是包含有效数据的区域。
对于Up缓冲区,写入指针由目标写入,读取指针由调试探针(J-Link, Host)写入。
当读写指针指向同一个元素时,缓冲区为空。这确保了不会出现竞态条件。
需求
SEGGER RTT不需要任何额外的引脚或硬件,尽管有一个通过标准调试端口连接到目标的J-Link。它不需要对目标或调试环境进行任何配置,甚至可以在不同的目标速度下使用。
RTT可以与一个正在运行的调试会话并行使用,而不受干扰,也不需要任何IDE或调试器。
SEGGER RTT的性能明显高于任何其他用于向主机PC输出数据的技术。平均一行文本可以在1微秒或更短的时间内输出。基本上只有执行单个memcopy()的时间。
内存占用
RTT实现代码使用了大约500字节的ROM和24字节的ID + 24字节的每个通道用于RAM中的控制块。每个通道都需要一些内存作为缓冲区。向上通道的推荐大小为1kbyte,向下通道的推荐大小为16 ~ 32字节,具体大小取决于输入/输出的负载。
对实时行为的影响
在停止模式下,使用J-Link ULTRA+ @ 50mhz进行内存读取访问的典型停止时间:
JTAG @ 50 MHz 256 bytes, ~552us
JTAG @ 50 MHz 4 bytes, ~418us
JTAG @ 15 MHz 256 bytes, ~1.02ms
JTAG @ 15 MHz 4 bytes, ~718us