网站建设微信营销公司,酷家乐在线家装设计,网站后台 搜索,怎么入侵网站后台目录 RTT(Real Time Transfer)简介
使用教程
常用API介绍
RTT缓冲大小修改
使用printf重定向
官方例程 RTT(Real Time Transfer)简介
平常调试代码中使用串口打印log#xff0c;往往需要接出串口引脚#xff0c;比较麻烦#xff0c;并且串口打印速度较慢#xff0c;串…目录 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可用于“虚拟”终端允许打印到多个窗口例如一个用于标准输出一个对于错误输出一个用于调试输出。 SEGGER RTT的性能显著高于用于向主机PC输出数据的任何其他技术。平均一行文本可以在一微秒或更短的时间内输出。基本上相当于执行单个memcopy的时间。在运行于168 MHz的STM32F407 Cortex-M4上进行了速度比较如下图其中不包括printf调用的时间。 将输出数据发送到主机的最大速度取决于目标缓冲区大小和目标接口速度。即使使用512字节的小目标缓冲区RTT速度也可能高达1 MB/s而常规J-Link型号的RTT速度可能高达0.5 MB/s。 RTT上行信道的缓冲器可以相对较小。所需的最小缓冲区大小可以通过一毫秒内写入的数据量和一次写入操作中写入的最大值来近似得到。如果数据发送频率较低则缓冲区应该有足够的空间用于一次写入发送的数据。如果数据发送频率更高缓冲区大小应足以满足一毫秒内写入的最大数据量。下图显示了在168 MHz的SEGGER emPower评估板NXP K66部件下使用J-Link PRO V436 MHz JTAG速度测量出的每100 us和每1ms发送均匀分布的不同数据量时所需的最小缓冲区大小。 RTT实现代码为RAM中的控制块使用约500字节的ROM和24字节ID24字节每个通道。每个通道都需要一些缓冲区内存。根据输入/输出的负载上行通道的建议大小为1 kByte下行通道的建议值为16至32 Byte。 使用教程
1.首先安装J-Link的软件驱动SEGGER - The Embedded Experts - Downloads - J-Link / J-Trace
2.安装完成后打开J-Link的安装目录开始-SEGGR-J-Link RTT Viewer-右键打开文件所在位置-然后继续右键打开文件所在位置-此时就是安装目录了 找到如下路径SEGGER\JLink\Samples\RTT,解压路径里面的压缩包SEGGER_RTT_V770c.zip(不同的版本V后面的数字可能不一样)。 3.将解压完的文件拷贝到代码工程目录中。
4. MDK工程下新建一个RTT的文件夹把解压的文件复制到RTT目录下将这些文件添加到MDK的工程中不要忘了还有头文件目录。 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的地址。 7.然后就能看到我们打印的内容了。 常用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()来设置字体颜色还背景颜色。 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的值。 使用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: supportsegger.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_REDCounter overflow!);
Cnt 0;
}
_Delay(100);
Cnt;
} while (1);
return 0;
}
/*************************** End of file ****************************/