嵌入式芯片调试神器-J-Link RTT详解
发布网友
发布时间:2024-10-09 07:20
我来回答
共1个回答
热心网友
时间:2024-10-09 17:13
更多嵌入式、无线通信硬核技术分享,职业发展、实战项目、咨询联系,欢迎关注 vx gzh “技塑未来”
Real Time Transfer(简称RTT)是Segger公司推出的用于嵌入式系统监控和交互的工具,其融合了SWO(SWD调试技术中的调试日志输出)等能力,且具备极高的性能。RTT的技术特点如下:
RTT能够在不影响嵌入式应用的实时行为下,能够高速双向通信,既可以输出调试信息,也能够从外部输入相关的控制命令。RTT可以在两个传输方向(输出和输入)上支持多个通道,不同的通道可用于不同的目的。
常见的实现是每个传输方向使用一个通道,用于调试的输入输出:
通过在PC上使用J-Link RTT Viewer工具,在工具中可以有多个虚拟终端,可以用来打印不同的信息(如一个窗口做标准输出,一个窗口做错误信息的输出,一个窗口做调试信息输出)。
在目标应用程序中使用RTT非常容易。实现代码可以免费下载,并且可以集成到任何现有的应用程序中。
通过RTT通信,可以使用任何J-Link。通过终端(通道0)进行通信的简单方法是,当到J-Link的连接(例如,通过调试会话)处于活动状态时,使用Telnet客户机或类似的设备创建到localhost:19021的连接。
RTT工具包含在J-Link软件包中,可根据系统需要下载对应安装包(地址: segger.com/downloads/jl...),Windows和MAC的都是图形化界面安装,都很简单,这里对Linux系统下的安装细节进行补充说明,以树莓派系统为例:
J-Link RTT Viewer
J-Link RTT Viewer是主要的Windows的GUI应用,用来使用RTT调试的所有功能。RTT Viewer可以单独使用,开启一个连接到J-Link,或者在运行调试会话时并行使用,RTT Viewer支持所有RTT的主要功能:
关于J-Link RTT Viewer的详细说明可参考J-Link用户指南文档( wiki.segger.com/UM08001...)。
关于J-Link RTT Viewer的多个虚拟终端,还是相对描述的模糊的,这里以相应实例来说明。
J-Link RTT Client
J-Link RTT Client作为一个Telnet Client,当调试会话关闭时其会自动尝试重连到J-Link连接,J-Link RTT Client是J-Link软件包的一部分。
J-Link RTT Logger
有了J-Link RTT Logger,来自Up-Channel 1的数据可被读取,并且可记录到log文件,这个Channel可以用于发送性能分析数据到主机端,J-Link RTT Logger打开了一个到J-Link的专用连接,可以在无调试会话时单独使用。该应用也是J-Link软件包的一部分。J-Link RTT Logger支持的命令列表如下:
如下为一个在树莓派上,用J-Link RTT Logger来抓取nordic开发板日志的示例:
RTT工作原理
RTT的实现使用了Control Block的架构,在目标嵌入式系统上通过内存来管理数据的读写。
注:Up Buffer Descriptors: Target -> Host
Down Buffer Descriptors: Host -> Target
上图灰色部分表示有数据存在
Control Block包含了ID,便于J-Link在内存内进行查找,每个可用通道(上面提到的虚拟终端)采用Ring Buffer架构,描述通道的缓存和状态。可用通道的最大个数可被配置,每个Buffer也可以被配置,上行和下行的Buffer是单独分开处理的。每个通道可以配置为阻塞模式或非阻塞模式。
在阻塞模式下,当Buffer满了后应用会等待,这会造成应用阻塞,但是保证了数据不丢失。
在非阻塞模式下,只写入符合缓冲区大小的数据,或者根本不写入数据,其余的将被丢弃,这种方式适用于应用的实时运行。
当RTT被激活,如通过RTT Viewer连接到使用J-Link的应用程序,J-Link会自动在嵌入式目标系统的已知内存区域搜索SEGGER RTT Control Block。RAM区域或Control Block的特定地址也可以通过主机应用程序来设置,以加快检测速度。
RTT的性能
如下是RTT, SWO, Semihosting三者速率的一个比较,该数据基于STM32F407上实测:
如下是RTT配合不同的J-Link型号(JTAG速率有差异),以及嵌入式系统上分配给RTT的Control Block缓存大小的一个速率对比:
RTT上行通道的缓冲区可以相对较小,所需的最小缓冲区大小可以用一毫秒内写入的数据量和一次写入操作中写入的最大数据量来近似表示。如果数据发送的频率较低,那么缓冲区应该有足够的空间来容纳一次写入发送的数据。如果更频繁地发送数据,缓冲区大小应该足以满足1毫秒内写入的最大数据量。下图显示了发送不同数量的数据时所需的最小缓冲区大小,平均分布,每100 us和每1 ms:
RTT实现代码大约需要500字节的ROM空间,RAM的占用则和Control Block的Buffer个数相关,24字节的ID + 24字节的单个通道控制块。每个通道都需要一些缓冲区的内存。根据输入/输出负载的不同,上行通道推荐的大小为1 kByte,下行通道推荐的大小为16到32字节。
RTT代码实现
SEGGER RTT代码用ANSI C编写,能方便集成到任何嵌入式应用程序中。RTT可以通过简单易用的API来使用。甚至可以重写标准的printf()函数来使用RTT。使用RTT将printf()所花费的时间减少到最低限度,并允许在应用程序执行时间关键的实时任务时向主机PC打印调试信息。
SEGGER RTT实现包括printf()的一个简单实现,可用于通过RTT编写格式化字符串。SEGGER_RTT_Printf()比大多数标准库printf实现要小,并且不需要堆,只需要可配置的堆栈数量。通过使用Lock()和Unlock(),使读取和写入线程安全,缓冲区的数量以及终端缓冲区的大小都可以设置。如下是RTT提供给嵌入式集成的接口函数:
更多精彩文章,也欢迎关注“技塑未来”公号,持续收取。
参考资料
segger.com/products/deb...
wiki.segger.com/UM08001...
wiki.segger.com/RTT