打印
[技术问答]

Nu-LINk支持Segger RTT吗?

[复制链接]
993|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
刚才看到说J-LINK都支持,不知道nu-LINK能否支持啊。

使用特权

评论回复
沙发
jiekou001|  楼主 | 2020-1-30 15:07 | 只看该作者
使用RTT,可以从目标微控制器输出信息,以及以很高的速度将输入发送到应用程序,而不会影响目标的实时行为。SEGGER RTT可以与任何J-Link模型和允许后台内存访问的任何受支持的目标处理器,它们是Cortex-M和RX目标。

RTT在双向上都支持多个通道,从主机到目标都可以使用,可以用于不同的目的,并为用户提供最大的自由度。

默认实现是每个方向使用一个通道,该通道用于可打印的终端输入和输出。使用J-Link RTT Viewer,该通道可用于多个“虚拟”终端,从而仅使用一个目标缓冲区即可打印到多个窗口(例如,一个用于标准输出,一个用于错误输出,一个用于调试输出)。例如,可以使用一个附加的(主机)通道来发送配置文件或事件跟踪数据。

使用特权

评论回复
板凳
jiekou001|  楼主 | 2020-1-30 15:07 | 只看该作者
RTT通讯
可以使用不同的应用程序与目标上的RTT实施进行通信。该功能甚至可以使用J-Link SDK集成到自定义应用程序中。
在目标应用程序中使用RTT变得容易。实施代码可免费下载,并可集成到任何现有应用程序中。
要通过RTT进行通信,可以使用任何J-Link。通过终端(通道0)进行通信的简单方法是,当与J-Link的连接(例如,通过调试会话)处于活动状态时,使用Telnet客户端或类似客户端创建与localhost:19021的连接。
J-Link软件包随附了一些用于不同目的的更高级的应用程序。

使用特权

评论回复
地板
jiekou001|  楼主 | 2020-1-30 15:08 | 只看该作者
-Link RTT查看器
J-Link RTT Viewer是主要的Windows GUI应用程序,可在调试主机上使用RTT的所有功能。
RTT Viewer可以独立使用,可以打开自己的J-Link和目标连接,也可以与正在运行的调试会话并行,附加到它并使用此现有的J-Link连接。
RTT Viewer支持RTT的所有主要功能:

通道0上的端子输出
将文本输入发送到通道0
最多16个虚拟终端,只有一个目标通道
控制文本输出:彩色文本,删除控制台
在通道1上记录数据

使用特权

评论回复
5
jiekou001|  楼主 | 2020-1-30 15:08 | 只看该作者

使用特权

评论回复
6
jiekou001|  楼主 | 2020-1-30 15:13 | 只看该作者
RTT如何运作
目标执行
实时传输使用目标内存中的SEGGER RTT控制块结构来管理数据读取和写入。该控制块包含一个ID,以使其可以通过连接的J-Link在内存中找到;每个可用通道的环形缓冲区结构均描述了该通道缓冲区及其状态。
可用通道的最大数量可以在编译时配置,每个缓冲区可以在运行时由应用程序配置和添加。向上和向下缓冲区可以分别处理。
每个通道可以配置为阻塞或非阻塞。在阻塞模式下,应用程序将在缓冲区已满时等待,直到可以写入所有内存为止,从而导致应用程序处于阻塞状态,但可以防止数据丢失。在非阻塞模式下,只会写入适合缓冲区的数据,或完全不写入缓冲区的数据,其余的将被丢弃。即使没有连接调试器,也可以实时运行。开发人员不必创建特殊的调试版本,并且代码可以保留在发布应用程序中。

定位控制块
当RTT在主机上处于活动状态时,直接通过RTT Viewer之类的应用程序使用RTT或通过Telnet连接到使用J-Link的应用程序(如调试器),J-Link会自动搜索SEGGER RTT控制块在目标的已知RAM区域中。RAM区域或控制块的特定地址也可以通过主机应用程序设置,以加快检测速度,否则将无法自动找到该块。

内部结构
该图显示了目标中的简化结构。

可以有任意数量的“下缓冲区描述符”(目标->主机),也可以有任意数量的“下缓冲区描述符”(主机->目标)。每个缓冲区大小可以单独配置。缓冲区中的灰色区域是包含有效数据的区域。对于Up缓冲区,写指针由目标写入,读指针由调试探针(J-Link,主机)写入。当读写指针指向相同的元素时,缓冲区为空。这确保了永远不会出现竞争状况。

要求
尽管通过标准调试端口将J-Link连接到目标,SEGGER RTT不需要任何其他引脚或硬件。它不需要目标或调试环境中的任何配置,甚至可以在变化的目标速度下使用。
RTT可以与正在运行的调试会话并行使用,而无需进行入侵,也可以完全不使用任何IDE或调试器。

使用特权

评论回复
7
jiekou001|  楼主 | 2020-1-30 15:13 | 只看该作者
RTT效果
SEGGER RTT的性能明显高于用于将数据输出到主机PC的任何其他技术。平均文本行可以在1微秒或更短的时间内输出。基本上只有一次执行一次memcopy()的时间。





速度比较是在168 MHz的STM32F407 Cortex-M4上完成的。printf()调用的开销已删除。



传输速度
可以将输出数据发送到主机的最大速度取决于目标缓冲区大小和目标接口速度。即使使用较小的512字节目标缓冲区,在高接口速度的情况下,RTT速度也可能高达1 MByte /秒,而在常规J-Link模型中,RTT速度可能达到0.5 MByte /秒。


















使用特权

评论回复
8
jiekou001|  楼主 | 2020-1-30 17:10 | 只看该作者
目标缓冲区大小
RTT上行通道的缓冲区可能相对较小。所需的最小缓冲区大小可以通过一毫秒内写入的数据量和一次写入操作中写入的最大值来近似。如果发送数据的频率降低,则缓冲区应有足够的空间容纳一次写入发送的数据。如果更频繁地发送数据,则缓冲区大小应足以在一毫秒内写入最大数据量。该图显示了每100 us和每1 ms发送一次均匀分布的不同数量的数据时所需的最小缓冲区大小。



使用特权

评论回复
9
jiekou001|  楼主 | 2020-1-30 17:18 | 只看该作者
内存占用
RTT实施代码在RAM中的控制块上每通道使用约500字节的ROM和24字节的ID + 24字节。每个通道需要一些内存用于缓冲区。根据输入/输出的负载,建议的大小对于上行通道为1 kByte,对于下行通道为16至32 Byte。

RTT实施
SEGGER RTT实现是用ANSI C编写的,并且可以使用该代码集成到任何嵌入式应用程序中,这些代码可从下面下载。

可以通过简单易用的API使用RTT。甚至可以重写标准的printf()函数以使用RTT。使用RTT可以将printf()花费的时间减至最少,并允许在应用程序执行时间紧迫的实时任务时将调试信息打印到主机PC。

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

SEGGER RTT实施完全可以使用预处理程序定义进行配置。使用Lock()和Unlock()例程可以使读取和写入任务安全,可以轻松设置缓冲区的数量以及终端缓冲区的大小。


使用特权

评论回复
10
jiekou001|  楼主 | 2020-1-30 17:18 | 只看该作者

使用特权

评论回复
11
jiekou001|  楼主 | 2020-1-30 17:20 | 只看该作者
/*********************************************************************
*               SEGGER MICROCONTROLLER GmbH & Co KG                  *
*       Solutions for real time microcontroller applications         *
**********************************************************************
*                                                                    *
*       (c) 2014  SEGGER Microcontroller GmbH & Co KG                *
*                                                                    *
*       www.segger.com     Support: support@segger.com               *
*                                                                    *
**********************************************************************

----------------------------------------------------------------------
File    : RTT.c
Purpose : Simple implementation for output via RTT.
          It can be used with any IDE.
--------  END-OF-HEADER  ---------------------------------------------
*/

#include "SEGGER_RTT.h"

static void _Delay(int period) {
  int i = 100000*period;
  do { ; } while (i--);
}

int main(void) {
  do {
    SEGGER_RTT_WriteString(0, "Hello World from SEGGER!\r\n");
    _Delay(100);
  } while (1);
  return 0;
}

/*************************** End of file ****************************/

使用特权

评论回复
12
jiekou001|  楼主 | 2020-1-30 17:21 | 只看该作者
使用RTT的printf()
库中用于printf()的低级函数通常很容易被覆盖,以提供自己的输出函数。SEGGER RTT实现包包括GCC / Newlib,IAR和KEIL MDK所需的代码,这些代码可以简单地包含在项目中,以将printf()重定向为目标,以通过RTT输出数据。另外,SEGGER RTT实现包包括printf()的简化版本SEGGER_RTT_printf(),可用于直接通过RTT打印格式化的字符串,而无需使用标准库。

支持目标
RTT可以与J-Link支持的任何目标一起使用,并允许在目标运行时访问后台内存。

支持这么多内核。

使用特权

评论回复
13
yiy| | 2020-1-30 18:14 | 只看该作者
可以试试,看怎么移植过去。

使用特权

评论回复
14
wahahaheihei| | 2020-1-30 21:42 | 只看该作者
这个应该需要硬件支持 才行吧

使用特权

评论回复
15
zhuotuzi| | 2020-1-30 21:48 | 只看该作者
看起来不错,是个思路。

使用特权

评论回复
16
yiyigirl2014| | 2020-1-31 11:53 | 只看该作者
如果协议公开,应该可以移植

使用特权

评论回复
17
yiyigirl2014| | 2020-1-31 11:54 | 只看该作者
部分nu-LINK没有串口功能,只能烧录,如果公开协议,或者提供一个接口应该就可以实现类似串口的功能

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

135

主题

1370

帖子

2

粉丝