查看: 1122|回复: 0
打印 上一主题 下一主题

SEGGER的实时传输RTT,嵌入式应用中用户IO交互的一种新技术

[复制链接]

45

主题

47

帖子

616

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
616
跳转到指定楼层
楼主
发表于 2019-1-12 21:50:52 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
SEGGER的实时传输(Real Time Transfer, RTT)是嵌入式应用中用户I/O交互的一种新技术。它结合了SWO和半主机semihosting的优点,具有很高的性能,特性如下:
  • 与目标应用程序进行双向通信
  • 非常高的传输速度,不影响实时行为
  • 使用调试通道进行通信
  • 目标上不需要额外的硬件或引脚
  • 支持任何J-Link模型
  • 支持ARM Cortex-M0/M0+/M1/M3/M4/M7/M23/M33和Renesas RX100/200/600
  • 提供功能和自由的完整实现代码


什么是RTT

使用RTT可以从目标单片机输出信息,并以非常快的速度向应用程序发送输入,而不会影响目标的实时行为。SEGGER RTT可以与任何J-Link模型和任何支持的目标处理器一起使用,这些处理器允许后台内存访问,即Cortex-M和RX目标。

RTT支持两个方向上的多个通道,向上到主机,向下到目标板,可以用于不同的目的,并为用户提供尽可能多的自由。

默认实现每个方向使用一个通道,这意味着可打印的终端输入和输出。有了J-Link RTT查看器,这个通道可以用于多个“虚拟”终端,只需要一个目标缓冲区就可以打印到多个窗口(例如,一个用于标准输出,一个用于错误输出,一个用于调试输出)。例如,可以使用另一个up (to host)通道发送分析或事件跟踪数据。


RTT实现

SEGGER RTT是用ANSI C编写的,可以将代码集成到任何嵌入式应用程序中。

RTT可以通过一个简单易用的API来使用。甚至可以重写标准printf()函数来使用RTT。使用RTT可以将printf()所花费的时间降到最低,并允许将调试信息打印到主机PC上,即使应用程序正在执行时间关键的实时任务。

SEGGER RTT实现包括printf()的一个简单实现,可用于通过RTT编写格式化字符串。SEGGER_RTT_Printf()比大多数标准库printf实现都小,不需要堆,只需要可配置的堆栈数量。

SEGGER RTT实现可以通过预处理器定义完全配置。使用Lock()和Unlock()例程可以实现任务安全读写,可以方便地设置缓冲区的数量以及终端缓冲区的大小。

J-Link RTT Viewer

J-Link RTT Viewer是在调试主机上使用RTT所有特性的主要Windows GUI应用程序。

RTT Viewer可以单独使用,打开到J-Link和target的连接,或者与正在运行的调试会话并行使用,附加到它并使用这个现有的J-Link连接。

RTT查看器支持RTT的所有主要功能:

  • 在通道0上的终端输出
  • 将文本输入发送到通道0
  • 在一个目标通道上面多达16个虚拟终端
  • 控制文本输出: 彩色文本,擦除控制台
  • 在通道1上记录日志数据


有关J-Link RTT查看器的完整文档,请参阅J-Link用户手册(UM08001)RTT章节。J-Link RTT Viewer是J-Link软件和文档包的一部分,它是免费的。


J-Link RTT Client

J-Link RTT客户机充当Telnet客户机,但是在关闭调试会话时,它会自动尝试重新连接到J-Link连接。J-Link RTT客户机是用于Windows、Linux和macOS的J-Link软件和文档包的一部分,可以用于简单的RTT用例。


J-Link RTT Logger

使用J-Link RTT记录器,可以从通道1上读取数据并记录到文件中。

例如,这个通道可用于向主机发送性能分析数据。J-Link RTT记录器打开到J-Link的专用连接,可以独立使用,无需运行调试器。

该应用程序是J-Link软件和文档包的一部分,适用于Windows、Linux和OS X。

J-Link RTT Logger的源代码可以作为一个起点,将RTT集成到调试器等其他PC应用程序中,是J-Link SDK的一部分。


RTT性能表现

SEGGER RTT的性能明显高于其他任何用于向主机输出数据的技术。平均每行文本可以在一微秒或更短的时间内输出,基本上只需要执行一次memcopy()。



在168mhz运行的STM32F407 Cortex-M4上进行了速度比较。printf()调用的开销基本上可以被忽略。


下载RTT目标代码包

RTT目标代码作为J-Link软件和文档包的一部分提供,可以在下面下载。RTT源码在J-Link软件包中:Samples/RTT。




API函数

Function Name
Description
SEGGER_RTT_Read()
Read data from an input buffer.
SEGGER_RTT_Write()
Write data to an output buffer.
SEGGER_RTT_WriteString()
Write a zero-terminated string to an output buffer.
SEGGER_RTT_printf()
Write a formatted string to an output buffer.
SEGGER_RTT_GetKey()
Get one character from input buffer 0.
SEGGER_RTT_HasKey()
Check if a character is available in input buffer 0.
SEGGER_RTT_WaitKey()
Wait for a character to be available in input buffer 0 and get it.
SEGGER_RTT_ConfigUpBuffer()
Configure an up (output) buffer.
SEGGER_RTT_ConfigDownBuffer()
Configure a down (input) buffer.
SEGGER_RTT_Init()
Initialize RTT Control Block structure when using RAM only targets.
SEGGER_RTT_SetTerminal()
Set the "virtual" Terminal to use for output on channel 0 via Write and WriteString.
SEGGER_RTT_TerminalOut()
Send a zero-terminated string via a "virtual" terminal.


RTT的printf ()重定向

乐动在线入口printf()库中使用的低级函数通常很容易被覆盖,从而提供自己的输出函数。SEGGER RTT实现包中包含GCC/Newlib、IAR和KEIL MDK所需的代码,这些代码可以简单地包含在项目中,通过RTT重新定位printf()以输出数据。此外,SEGGER RTT实现包还包含printf()的简化版本SEGGER_RTT_printf(),它可以直接通过RTT打印格式化的字符串,而不需要标准库。


程序中的使用方法

如果你想使用它,操作非常简单,找到自己J-Link的安装目录下的Samples/RTT文件夹,解压含有SEGGER_RTT_Vxxx.zip的压缩包,将解压后的RTT文件夹下四个文件:SEGGER_RTT.c,SEGGER_RTT.h,SEGGER_RTT_Conf.h 和 SEGGER_RTT_printf.c 添加到项目中,并在文件的起始处#include "SEGGER_RTT.h"文件。



1. 打印调试信息

在程序中调用SEGGER_RTT_printf函数来打印调试信息了,该函数用法和printf函数类似,只是多了一个参数用来指定RTT通道。其中通道0,就是我们在调试时使用的通道。


2. 输入信息

在程序中添加SEGGER_RTT_Read(0,rtt_buf,sizeof(rtt_buf)),然后打开J-Link RTT Viewer,在控制台下方的输入框输入信息,程序里接收数组rtt_buf的内容就是通过输入框所输入的信息。


默认输入模式为 Send on Input,每输入一个数据马上发送到目标程序,可以更改输入方式:在菜单上依次选择 Input / Sending... / Send on Enter, Input / End of Line... 根据需要选择行结束符,不需要就选择None。


示例代码

RTT保持了尽可能的简单,并且可以在没有任何配置的情况下使用。

  1. /*********************************************************************
  2. *? ?? ?? ? SEGGER MICROCONTROLLER SYSTEME GmbH
  3. *? ?Solutions for real time microcontroller applications
  4. **********************************************************************
  5. File? ? : Main_RTT_MenuApp.c
  6. Purpose : Sample application to demonstrate RTT bi-directional functionality
  7. ? ?? ?? ? Target Hardware: Debug J-Link ULTRA/PRO V4
  8. --------- END-OF-HEADER --------------------------------------------*/

  9. #define MAIN_C

  10. #include

  11. #include "SEGGER_RTT.h"

  12. volatile int _Cnt;
  13. volatile int _Delay;

  14. static char r;

  15. /*********************************************************************
  16. *
  17. *? ?? ? main
  18. */
  19. void main(void) {

  20. ??SEGGER_RTT_WriteString(0, "SEGGER Real-Time-Terminal Sample\r\n");
  21. ??SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
  22. ??do {
  23. ? ? r = SEGGER_RTT_WaitKey();
  24. ? ? SEGGER_RTT_Write(0, &r, 1);
  25. ? ? r++;
  26. ??} while (1);
  27. }

  28. /*************************** End of file ****************************/
复制代码



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表