J-Link RTT Viewer使用教程(附代码)

2023-05-16

目录

 

RTT(Real Time Transfer)简介

使用教程

常用API介绍

RTT缓冲大小修改

使用printf重定向

官方例程


RTT(Real Time Transfer)简介

平常调试代码中使用串口打印log,往往需要接出串口引脚,比较麻烦,并且串口打印速度较慢,串口的中断可能会影响代码的执行效率。

SEGGER RTT支持使用J-link调试器输出来自目标微控制器的信息,也可以接收输入,并且在高速度交互的同时不会影响目标处理器的实时性,可以省掉平常打印日志用的串口。

SEGGER RTT可用于任何J-Link型号和任何支持后台内存访问的目标处理器,即Cortex-M和RX目标。

RTT支持两个方向、多个通道,上到主机,下到目标,它可以用于不同的目的,为用户提供尽可能多的自由。默认实现每个方向使用一个通道,用于可打印终端输入和输出。

使用J-Link RTT Viewer,可用于“虚拟”终端,允许打印到多个窗口(例如,一个用于标准输出,一个对于错误输出,一个用于调试输出)。

463331ac801040f2beebdaf76c02fc74.jpeg

SEGGER RTT的性能显著高于用于向主机PC输出数据的任何其他技术。平均一行文本可以在一微秒或更短的时间内输出。基本上相当于执行单个memcopy()的时间。在运行于168 MHz的STM32F407 Cortex-M4上进行了速度比较,如下图,其中不包括printf()调用的时间。

b7abf417c5844ed4bb6a9f16f0cde1c6.jpeg

将输出数据发送到主机的最大速度取决于目标缓冲区大小和目标接口速度。即使使用512字节的小目标缓冲区,RTT速度也可能高达1 MB/s,而常规J-Link型号的RTT速度可能高达0.5 MB/s。

5671225e95c54e03afc89bb4968e4668.jpeg

RTT上行信道的缓冲器可以相对较小。所需的最小缓冲区大小可以通过一毫秒内写入的数据量和一次写入操作中写入的最大值来近似得到。如果数据发送频率较低,则缓冲区应该有足够的空间用于一次写入发送的数据。如果数据发送频率更高,缓冲区大小应足以满足一毫秒内写入的最大数据量。下图显示了在168 MHz的SEGGER emPower评估板(NXP K66部件)下,使用J-Link PRO V4@36 MHz JTAG速度测量出的,每100 us和每1ms发送均匀分布的不同数据量时所需的最小缓冲区大小。

f320fb070fd246a5b948a46918077288.jpeg

b112e14cb301407f8d062d6b6224e9c9.jpeg

RTT实现代码为RAM中的控制块使用约500字节的ROM和24字节ID+24字节每个通道。每个通道都需要一些缓冲区内存。根据输入/输出的负载,上行通道的建议大小为1 kByte,下行通道的建议值为16至32 Byte。

a5e8b03eabfb4ae1be48e2355c454c5c.jpeg

使用教程

1.首先安装J-Link的软件驱动:SEGGER - The Embedded Experts - Downloads - J-Link / J-Trace

2.安装完成后,打开J-Link的安装目录(开始->SEGGR->J-Link RTT Viewer->右键打开文件所在位置->然后继续右键打开文件所在位置->此时就是安装目录了),

5b1a5b3080c0472e80c1f0ef1226bfd3.jpeg

找到如下路径SEGGER\JLink\Samples\RTT,解压路径里面的压缩包SEGGER_RTT_V770c.zip(不同的版本,V后面的数字可能不一样)。

6a8a3bd59e894397aeebeedf855f0c77.jpeg

3.将解压完的文件拷贝到代码工程目录中。

4. MDK工程下新建一个RTT的文件夹,把解压的文件复制到RTT目录下,将这些文件添加到MDK的工程中,不要忘了还有头文件目录。

195f8db111a54cc29c882dee745fc5e2.jpeg

5.工程加入文件后,在想要用到RTT的文件中包含#include "SEGGER_RTT.h",然后直接调用SEGGER_RTT_printf()就好了,例如SEGGER_RTT_printf(0,"Hello RTT~");这个和C语言的printf的格式差不多,就是前面加了一个端口0的参数,代码编辑后编译无错误后下载。

6.然后点击开始->SEGGR->J-Link RTT Viewer,打开J-Link RTT Viewer 选择好你的芯片型号后,点击确认。在很多设备上RTT地址是可以自动是被识别到的,对于不能自动识别的设备,需要自行输入RTT地址,RTT地址即为代码中结构体_SEGGER_RTT的地址。

2db0e3ba48da4b959a55a0d7f953e0d7.jpeg

7.然后就能看到我们打印的内容了。

ca3dc55153a0401da71953cbc3959e50.jpeg

常用API介绍

1.void SEGGER_RTT_Init (void); RTT初始化函数,应放于程序开始阶段。

2. int SEGGER_RTT_GetKey (void);从RTT终端获取一个按键字符。

    int c;
    c = SEGGER_RTT_GetKey();
    if (c == 'q') {
        exit();
    }

3.int SEGGER_RTT_HasKey (void);检测缓存区中是否还有字符

   if (SEGGER_RTT_HasKey()) {
      int c = SEGGER_RTT_GetKey();
   }

4. int SEGGER_RTT_printf (unsigned BufferIndex, const char * sFormat, …);格式化输出字符串,同时可以使用SEGGER_RTT_printf()来设置字体颜色还背景颜色。

48021837c886490a8945ceb6c313b694.jpeg

SEGGER_RTT_printf(0,RTT_CTRL_BG_WHITE”RTT TEST\r\n”);
SEGGER_RTT_printf(0,RTT_CTRL_TEXT_BLUE”RTT TEST\r\n”);

5.void SEGGER_RTT_SetTerminal(char TerminalId);设置虚拟终端ID, 下面示例中,SEGGER_RTT_WriteString中的0参数,是通道号,不是终端号。

//
// Send a string to terminal 1 which is used as error out.
//
SEGGER_RTT_SetTerminal(1); // Select terminal 1
SEGGER_RTT_WriteString(0, "ERROR: Buffer overflow");
SEGGER_RTT_SetTerminal(0); // Reset to standard terminal

6. int SEGGER_RTT_WaitKey (void);检测缓存区中是否还有字符。

   int c = 0;
    do {
        c = SEGGER_RTT_WaitKey();
    } while (c != 'c');

RTT缓冲大小修改

有时候我们的信息不能完全的打印出来,可能是因为缓冲不够,默认缓冲区大小事1K字节,如果不够可以改大一点。修改SEGGER_RTT_Conf.h文件中的#define BUFFER_SIZE_UP的值。

cb974a5c3d8a471fa6875e93d4f4d52a.jpeg

使用printf重定向

项目中使用printf的地方非常多,如果可以直接修改printf重定向到RTT组件,则会非常方便。使用的方法是直接使用RTT提供的API实现fputc。

#include <stdio.h>
int fputc(int ch, FILE *f)
{
    SEGGER_RTT_PutChar(0,ch);
    return ch;
}

官方例程

/*********************************************************************
* SEGGER Microcontroller GmbH *
* Solutions for real time microcontroller applications *
**********************************************************************
* *
* (c) 1995 - 2018 SEGGER Microcontroller GmbH *
* *
* 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) {
int Cnt = 0;
SEGGER_RTT_WriteString(0, "Hello World from SEGGER!\n");
do {
SEGGER_RTT_printf(0, "%sCounter: %s%d\n",
RTT_CTRL_TEXT_BRIGHT_WHITE,
RTT_CTRL_TEXT_BRIGHT_GREEN,
Cnt);
if (Cnt > 100) {
SEGGER_RTT_TerminalOut(1, RTT_CTRL_TEXT_BRIGHT_RED"Counter overflow!");
Cnt = 0;
}
_Delay(100);
Cnt++;
} while (1);
return 0;
}
/*************************** End of file ****************************/

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

J-Link RTT Viewer使用教程(附代码) 的相关文章

  • CMake中target_link_libraries的使用

    CMake中的target link libraries命令用于指定链接给定目标和 或其依赖项时要使用的库或标志 来自链接库目标的使用要求将被传播 propagated 目标依赖项的使用要求会影响其自身源代码的编译 其格式如下 xff1a
  • ST LINK V2.1接线图

    方便查询 xff0c 图片来源已经忘记了 xff0c 如有冒犯请通知我 特此记录以防忘记 anlog 2020年8月29日
  • Dockerfile使用教程

    第一 创建一个spring boot项目 第二 创建 xff1a Dockerfile文件 xff08 在项目根目录下 xff09 第三 复制粘贴 FROM java 8 设置基础镜像 FROM openjdk 8 jdk alpine 指
  • ST-Link的internal command error问题的解决方法

    问题 xff1a 显示 xff1a internal command error 这是由于stlink无法识别到芯片的情况 xff0c 通过解决这个问题我找到几个原因和解决方法 xff1a 1 xff0c 芯片睡眠 xff0c 停机 xff
  • CMake的add_library与target_link_libraries

    一 add library介绍 使用该命令可以在Linux下生成 xff08 静态 动态 xff09 库so或者 a文件 xff0c Windows下就是dll与lib文件 xff0c 它有两种命令格式 1 1 第一种格式 xff1a No
  • TP-LINK路由器如何设置上网

    1 登陆 xff0c 网址192 168 1 1 xff0c 登陆 xff0c 一般在路由器背后 xff0c 没有或者忘记就重置 2 设置导向 3 输入拨号 xff08 以太网 xff09 的账号密码 4 设置wifi账号密码 xff0c
  • CMake:通过target_link_libraries链接第三方库

    sdbusplus 通过new method call同步调用service的method 风静如云的博客 CSDN博客 例子中需要在编译时链接 lsdbusplus lsystemd 这两个第三方库 那么通过cmake怎么指定呢 其实很简
  • postman使用教程

    Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 市场上有很多优秀的 xff0c 完善的接口测试工具 xff0c 比如SoapUI xff0c Postman xff0c JMeter yapi等 xff0c
  • add_library,target_link_libraries,set_target_properties,target_link_libraries使用联系

    折腾了半下午 xff0c 终于知道这个货是怎么个关系了 在此写下记录 xff0c 希望遇到同样问题的同学 xff0c 不要再次浪费时间了 首先我是在Linux环境下 先列出我的CmakeLists txt 注意 xff0c 在CmakeLi
  • 【教程】Edraw Max使用教程:Edraw Max快速入门指南

    Edraw Max是一款简单易用的快速制图软件 帮助你轻松创建流程图 网络拓扑图 组织结构图 商业图表 工程图 思维导图 软件设计图和平面布局图等 大多数用户一般不会花太多时间详细阅读用户手册 因此我们编辑了这个快速入门指南 为帮助你尽快开
  • 使用WIFI连接新大陆云平台(基于RT_Thread操作系统)

    前言 使用RT Thread Studio 连接WIFI 首先我们需要配置WIFI 具体的配置参考上面这篇文章 下面将会讲述使用WIFI连接到新大陆云平台 相关的AT指令 1 设置WIFI为Station模式 AT CWMODE 1 2 重
  • 内核7-线程间同步

    目录 1 信号量 1 1 信号量机制 1 2 信号量的使用场合 1 2 1 线程同步 1 2 2 锁 1 2 3 中断与线程的同步 1 2 4 资源计数 1 3 信号量控制块 1 4 函数 1 4 1 rt sem init 函数 1 4
  • 【教程】Matrikon OPC使用教程连载(二)

    MatrikonOPC介绍 Matrikon 是基于OPC UA和基于OPC的控制自动化数据互操作性产品的供应商 提供自动化厂商的高级OPC UA开发工具包 适用于从嵌入式设备到云应用的所有产品线 对于终端用户客户 Matrikon提供了关
  • 【汇编语言05】第4章 第一个程序

    目录 0 前言 1 源程序从编写到执行 1 1 第1步 编写汇编源程序 1 2 第2步 对源程序进行编译连接 1 3 第3步 执行可执行文件中的程序 2 简单源程序示例及其组成 2 1 简单源程序示例 2 2 伪指令 2 3 源程序与程序
  • visual studio使用教程

    linux疑难问题排查实战 分享了作为公司专家 在项目开发过程中内存优化 堆 栈 代码段 数据段 性能优化 死机 栈越界 堆越界 死锁等疑难问题排查的案例 使用的工具 perf asan strace memleak等 工作经验 大家可以点
  • 【RTT驱动框架分析06】-pwn驱动框架分析+pwm驱动实现

    pwm pwm应用程序开发 访问 PWM 设备API 应用程序通过 RT Thread 提供的 PWM 设备管理接口来访问 PWM 设备硬件 相关接口如下所示 函数 描述 rt device find 根据 PWM 设备名称查找设备获取设备
  • Tkinter 帮助查看器

    我有一个简单的 Python Tkinter 应用程序 我想向其中添加帮助文档 将帮助查看器集成到应用程序的最简单方法是什么 最好是跨平台的 尽管我主要使用 Windows 我可以想象用纯 HTML 编写帮助 或者只是启动外部网络浏览器 使
  • RT-Thread 内核基础(四)

    自动初始化机制 自动初始化机制是指初始化函数不需要被显示调用 只需要在函数定义处通过宏定义的方式进行申明 就会在系统启动过程中被执行 例如在串口驱动中调用一个宏定义告知系统初始化需要调用的函数 代码如下 int rt hw usart in
  • 获取当前控制台字体信息

    我正在用 C NET 为控制台编写一个图像查看器 我的问题是控制台字体字符不是正方形 我将它们视为像素 这会在屏幕上绘制时拉伸图像 我想以某种方式读取有关当前使用的字体的字体信息 width height等属性 I found 这个答案 h
  • NLog 最好的查看器是哪个? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • MySQL基础学习笔记

    MySQL学习文档 一 MySQL基础知识 1 1 mysql各个版本的重要性介绍 MySQL Community Server 社区版本 xff0c 开源免费 xff0c 但不提供官方技术支持 MySQL Enterprise Editi
  • Java常见面试问题总结

    Java常见面试问题总结 说明 xff1a 本人是二线城市工作4 5年的菜鸟程序员 xff0c 以下面试问题更侧重于当地的初中级 高开 要是以北上广深的面试标准问则还远远不够 xff0c 就比如在一线城市JDK List Map Set x
  • RabbitMQ学习教程

    RabbitMQ学习教程 MQ考察重点 xff1a span class token number 1 span 了解过哪些MQ xff1f 不同MQ之间有什么区别 xff1f span class token number 2 span
  • ArchLinux安装配置及美化

    官方wiki xff1a https wiki archlinux org 基础安装 一 xff1a 制作安装介质 下载ISO镜像文件 xff1a https archlinux org download 官方下载网址 在linux系统中可
  • K8s kubectl 报错 c-bash: _get_comp_words_by_ref: command not found解决过程

    K8s kubectl error xff1a c bash get comp words by ref command not found 故障现象 xff1a 新搭了个测试环境 xff0c 准备cka的考试 source lt kube
  • OpenSSH权限提升漏洞(CVE-2021-41617)修复 Centos 7升级Openssh 8.8

    OpenSSH权限提升漏洞 xff08 CVE 2021 41617 xff09 修复 1 准备工作2 安装必须的包3 下载OpenSsh 8 8p14 OpenSsh 解压安装5 配置文件修改6 重启服务7 意外 Centos 7升级Op
  • Jenkins 构建报错:Couldn‘t find any revision to build. Verify the repository and branch configuration for

    Jenkins 构建报错 Couldn 39 t find any revision to build Verify the repository and branch configuration for 1 错误信息 2 错误原因3 解决
  • 利用阿里云下载国外镜像,国内顺畅下载k8s.gcr.io的镜像

    国内顺畅下载k8s gcr io的镜像 1 起因 配置kube dns是3个k8s gcr io的镜像无法下载 报错如下 Error response from daemon Get https k8s gcr io v2 net http
  • pip 使用阿里源

    pip 使用阿里源 使用pip install 的时候默认会去国外服务器下载 所以经常断开或者速度很慢 只需要在原来的命令后加上 i https mirrors aliyun com pypi simple即可直接从阿里源上安装 pip s
  • sun.misc包找不到

    转 http blog csdn net jbxiaozi article details 7351768 1 右键项目 属性 java bulid path jre System Library access rules resoluti
  • npm安装vue报错:npm ERR! code ETIMEDOUT

    npm安装vue报错 信息如下 C span class token punctuation span Users span class token punctuation span Q span class token operator
  • 将element-plus分页组件由默认英文,改为中文

    1 现象 分页组件默认显示为英文 但实际页面中大多都是中文 弄个英文显得比较突兀 2 配置 在main js中添加以下两句语句 span class token function import span locale from span c
  • [Gitops--2]Argocd和Gitlab-runner安装配置

    ArgoCd Argo是一组k8s原生工具集 用于运行和管理k8s上的作业和应用程序 Argo提供了一种在k8s上创建工作和应用的三种计算模式 服务模式 工作流模式和基于事件模式 所有的Argo工具都实现为了创建控制器和自定义资源 为什么选
  • Windows update 0x8024401c 0x80244019

    Windows 更新失败 报错 0x8024401c 0x80244019 以系统管理员身份运行 net stop wuauserv reg delete f HKEY LOCAL MACHINE span class token punc
  • K8s常见面试题20问

    K8s常见面试题19问 收集了一些K8s常见问题和同学们面试常被问到的问题 如果有新的面试题私聊或者留言给我 1 Docker和虚拟机有那些不同 虚拟化环境下每个 VM 是一台完整的计算机 xff0c 在虚拟化硬件之上运行所有组件 xff0
  • Dockerfile常用命令

    Dockerfile常用命令 1 Dockerfile Dockerfile是一个文本文件 用一组指令来完成镜像的构建 每一条指令构建一层镜像 所有尽量将相同的命令合并成一行以减少中间镜像的层数 2 From 必须 指定基础镜像即我从哪里可
  • Kubesphere流水线实现蓝绿发布

    Kubesphere流水线实现蓝绿发布 1 Gitlab仓库准备 1 1 创建仓库 新建空白项目 名字随便取 greenweb 复制克隆地址 http 192 168 31 199 deploy greenweb git 1 2 初始化并上
  • 【NetWorkX实例(3)】图、边、节点等相关方法

    更全面的NetworkX中文使用手册 xff0c 请收藏 xff1a NetworkX中文使用手册 在 NetWorkX实例 1 基础操作一文中 xff0c 介绍了networkx中图的生成 xff0c 下面就介绍一下图 边 节点等相关方法
  • Python调用外部EXE程序遍历窗体及控件并获取控件信息。

    背景 我的工作中经常手工运行一个windows程序 xff08 密码生成工具 xff09 xff0c 获取该程序的计算结果 xff0c 手工填到登录表单的中 该程序非常久远 xff0c 已无人维护 根据凡是重复2次以上的工作都应该自动化原则
  • J-Link RTT Viewer使用教程(附代码)

    目录 RTT Real Time Transfer 简介 使用教程 常用API介绍 RTT缓冲大小修改 使用printf重定向 官方例程 RTT Real Time Transfer 简介 平常调试代码中使用串口打印log xff0c 往往