RTT
Segger RTT的使用
一般arm系统中,如何通过电脑键盘和显示器同mcu进行交互最有效的有两种形式:arm7的semihost,cm时代的traceswo。现在jlink推出了颇具特色的rtt(无需SWO引脚,且速度更快)三者的比较如下图:
RTT( Real Time Terminal)是SEGGER公司在jlink V4.90之后,针对Cortex-M和RX系列推出的嵌入式应用与用户进行交互的实时终端。MCU通过J-link与电脑连接并将打印信息输出到电脑上,电脑同时可以通过键盘等向MCU发送数据。无需复杂的工程配置,没有MCU内核的限制,并且打印字符还非常的流畅。其实现原理就是J-link与MCU共享内存。
速度取决于the target buffer size。
使用方法参考:
SEGGER-RTT调试(代替串口printf输出)的使用方法
http://blog.csdn.net/yanyuzuixin/article/details/68953131
http://blog.csdn.net/Maple_Leaf_15/article/details/51020003
使用条件:
- 安装jlink驱动(jlink V4.90以后的最新版本),可以看到考安装目录下有3个应用软件,都可以作为查看的方法。
- 官网下载或者安装目录下接下RTT包:安装目录:C:\Program Files (x86)\SEGGER\JLink_V612\Samples\RTT\SEGGER_RTT_V612.zip
官网:https://www.segger.com/downloads/jlink/JLink_Windows.exe
RTT介绍:
。
- 将解压后得到四个文件
SEGGER_RTT.c、SEGGER_RTT.h、SEGGER_RTT_Conf.h”
SEGGER_RTT_printf.c:无需添加标准库<stdio.h>,当然也提供了重定向(RTT_Syscalls_KEIL.c/RTT_Syscalls_IAR.c/RTT_Syscalls_GCC.c)
- 用法:
2.1配置:新工程的使用:添加SEGGER_RTT.c和SEGGER_RTT_printf.c到工程文件夹下,并设定SEGGER_RTT.h、SEGGER_RTT_Conf.h的头文件路径;而若要取代SWO则是去掉Retarget.c这个重定向文件,只包含EGGER_RTT.c和RTT_Syscalls_KEIL.c/RTT_Syscalls_IAR.c。
2.2 在源代码中包含RTT头文件并初始化:
2.3在需要输出log的地方调用SEGGER_RTT_printf();函数输出打印。该函数用法和printf函数类似,只是多了一个参数用来指定RTT通道。其中通道0,就是我们在调试时使用的通道。在主函数中添加如下代码。
- 最简单易用的两个函数是
- SEGGER_RTT_ConfigUpBuffer(0,NULL,NULL,0,SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL):非必要的初始化(不知有什么用?)。它是官方例程RTT_Implementation_141217-Examples-Main_RTT_PrintfTest.c的第一句
- SEGGER_RTT_WriteString(0,"字符串"):直接输出字符串
- SEGGER_RTT_printf(0,"字符串",输出格式):相当于printf,可以输出各种数据类型
- 查看RTT输出的工具有三个:
- RTTViewer:不支持中文。至少要进入一次Debugger才能正常显示输出。建议进入Debugger之后再打开,否则经常不能正常显示输出
- RTTLogger:支持中文,并且可以保存为log文件。使用具体的正确使用方法不清楚。根据手册说明,log只接收RTT通道1的输出,即SEGGER_RTT_printf(1,"字符串",输出格式)。但是实测,只能输出RTT通道0的信息,并且要求代码中要有使用到通道1的语句。否则收不到数据,只要连接jlink不要进入debug也有信息输出
- RTTClient:必须配合RTTLogger或者keil的Debugger来使用,而RTTLogger也必须配合Debugger使用。Client、Logger和Debugger三个窗口都打开的时候,Client和Logger只有其中一个能正常显示,另外一个会严重丢失数据。
- 无论哪个查看RTT的工具,都会丢失数据。可能与输出函数的使用频率过高有关(?)。加大SEGGER_RTT_Conf.h中的#define BUFFER_SIZE_UP的值可以有效降低丢失率。
- 从开始菜单栏找到J-Link User Manual (UM08001)文档,里面有JLink各个工具的说明
2.3查看终端:有三种方法都可以,在jlink的驱动安装目录下有三个应用软件
RTT Viewer this channel(0) can be used for multiple "virtual" terminals output and keyboard input, allowing to print to multiple windows (e.g. one for standard output , one for error output, one for debugging output) with just one target buffer. An additional up (to host) channel can for example be used to send profiling or event tracing data.
可以向单片机传送按键值和字符串,如下图再输入框中输入,再单片机中用以下来接收
len=SEGGER_RTT_Read(0, mybuf, 10);
if(len)
{
Vol=atof(mybuf);
value =(Vol/3.30 + EPS)*65536;
J-Link RTT Client:功能简单。
J-Link RTT Logger(Channel 1):opens a dedicated connection to J-Link and can be used stand-alone, without running a debugger.
RTT输入检测
首先在程序中添加SEGGER_RTT_Read(0,rtt_buf,sizeof(rtt_buf));
其次在J-Link RTT Viewer控制台的Input里面选择Sending/Send on Enter,然后End of Line选择None
这样就可以通过下方输入框输入信息,按Enter发送
这样,程序里面接收数组rtt_buf就是输入框所输入的信息
扩展阅读:Jlink RTT弱爆了,Jlink Scope来啦
http://blog.csdn.net/Airbnb/article/details/41494335
jlink示波器来啦!!
普通jlink只能同时显示10个变量,采样率为50hz
jlink pro和jlink ultra可以同时显示100个变量,采样率无限制(受限于USB带宽)
使用方法:
下载4.90e安装,
目录下找到JScope.exe启动,
配置参数,如下图,选择芯片,接口类型
添加要观察的变量
启动示波器
OK
无需仿真环境,程序下载到芯片,连接jlink就可以了,也就是不需要IAR或MDK运行。
JScope不像RTT那样需要在工程中添加C文件和H文件,JLINK在后台自动读取变量并显示
Event Recoder :SWV 是由仪器化跟踪宏单元 ITM(Instrumentation Trace Macrocell)和 SWO(当前 M3/M4 可以通过 SWO 引脚输出以下三种 信息:printf 函数的 debug 调用 通道 0 用于输出调试字符或者实现 printf 函数, 通道 31 用于 Event Viewer,这就是为什么实现 Event Viewer 需要配置 SWV 的原因
;数据观察点和跟踪 DWT ;时间戳的功能 ) 构成。其特点:
不带 ITM 功能的 Cortex-M0/M0+/M23, 是需要开关中断的 ;而带 ITM 功能的 Cortex-M3/M4/M7/M33 内核芯片 不需要关中断- 可以在任务中、 RTOS 内核中和中断服务程序中任意调用 ;
- 各种 link 通吃,支持 SWD 接口或者 JTAG 接口方式的 JLINK、 STLINK、 ULINK 和 CMSIS-DAP
- 速度快
主要功能:重定向输出(2*u32,4*u32,printf);时间测量(通过调用测量起始函数: EventStartG (slot) 或者 EventStartGv (slot, val1, val2) ;测量停止函数: EventStopG (slot) 或者 EventStopGv (slot, val1, val2) 实现);功耗测量(只有ULINK可以)
使用方法:
- 配置步骤:使能Event Recoder,STDOUT到EVR
-
使能微库 MicroLib ,不要对fpuc, fgetc 再做重定向了。
- 保证CMSIS再V5.4.0以上。
- 调用
- 将组件调出来展示:VIEW->Anlysis windows->Event Recoder
Event Recorder 实现 printf 重定向(这种方式不需要SWO引脚,而SWD的SWO则需要该引脚,但都是通过debug(printf) viewer展示) :VIEW->serial windows->debug(printf) viewer
关于SWO:
SWO在COTEX_M3/4/7上有,而在M0内核的L0,G0,M0上没有。使用时需要硬件上除SWDIO,SWCLK外将SWO也引出将SWO引脚功能使能,并对fputc函数重定向,端口默认是0,若要修改可在对应的core_cm3.h(或cm4 cm7)中的ITM_SendChar()函数中修改;同时需要SWV才能SWD.
STM32CubeProg的SWO参考:打印输出教程 | SWO打印输出配置,基于STM32CubeProg『Serial Wire Viewer』
1 int fputc(int ch, FILE *f) 2 { 3 ITM_SendChar(ch); 4 return ch; 5 }