RTT Viewer是什么?有什么功能?
RTT Viewer(Real-Time Transfer Viewer)是一种用于嵌入式系统调试的工具,由SEEGER公司开发。
RTT Viewer主要用于通过J-Link、ST-Link等调试器与嵌入式系统进行交互,实现实时的数据交换和调试信息输出。它允许开发者在不占用硬件UART资源的情况下,高效地从目标MCU(微控制器)向主机发送调试信息或接收控制命令。
RTT Viewer如何配置?
1、安装 J-Link_V64h
J-Link下载及安装步骤_jlink-优快云博客https://blog.youkuaiyun.com/akuanglin/article/details/140211145
2、找到RTT文件
目录:...\JLink_V644h\Samples\RTT\SEGGER_RTT_V644h.zip\RTT\
如下:
3、在工程中添加RTT
1、在工程中新建一个RTT文件夹
2、添加文件 SEGGER_RTT.c 和 SEGGER_RTT_printf.c
3、添加.h文件的路径 ,如下(Keil):
4、添加输出的接口
1、在需要使用的文件中添加依赖: #include "./RTT/SEGGER_RTT.h"
2、调用接口:
int SEGGER_RTT_printf(unsigned BufferIndex, const char *sFormat, ...)
举例:
SEGGER_RTT_printf(0, "LCD ID : %d\r\n",id)
与printf的用法相似,前面多一个入参unsigned BufferIndex,表述要使用的缓冲区,例如,0代表“终端”
5、添加浮点数输出(如需,按照下面步骤添加)
默认的SEGGER_RTT_printf是无法输出浮点数,需要在SEGGER_RTT_vprintf的switch case函数中添加如下代码:
//----------输出浮点-----------------------------
case 'f':
case 'F':
{
float fv;
fv = (float)va_arg(*pParamList, double); // 取出输入的浮点数值
v = (int)fv; // 取整数部分
_PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); // 显示整数,支持负数
_StoreChar(&BufferDesc, '.'); // 显示小数点
v = abs((int)(fv * 1000000));
v = v % 1000000;
_PrintInt(&BufferDesc, v, 10u, 2, FieldWidth, FormatFlags); // 显示小数点后两位
// v = abs((int)(fv * 1000));
// v = v % 1000;
// _PrintInt(&BufferDesc, v, 10u, 2, FieldWidth, FormatFlags); //显示小数点后三位
// v = abs((int)(fv * 10000));
// v = v % 10000;
// _PrintInt(&BufferDesc, v, 10u, 2, FieldWidth, FormatFlags); //显示小数点后四位
//
// v = abs((int)(fv * 100000));
// v = v % 100000;
// _PrintInt(&BufferDesc, v, 10u, 2, FieldWidth, FormatFlags); //显示小数点后五位
//
// v = abs((int)(fv * 1000000));
// v = v % 1000000;
// _PrintInt(&BufferDesc, v, 10u, 2, FieldWidth, FormatFlags); //显示小数点后六位
}
break;
SEGGER_RTT_vprintf在SEGGER_RTT_printf.c的378行,case添加在SEGGER_RTT_printf.c的533行
打开RTT Viewer窗口
双击JLinkRTTViewer.exe,打开RTT Viewer窗口,如下:
选择芯片的型号,其它默认的一般不需要修改,也可以按需修改
注意Target Interface的选择需要与Keil中的配置一样
编写测试代码,烧录进去
/**
* @brief task4
* @param pvParameters : 传入参数(未用到)
* @retval 无
*/
void task4(void *pvParameters)
{
UBaseType_t priority_num = 0;
while (1)
{
priority_num += 1;
SEGGER_RTT_printf(0, "priority is : %d\r\n", priority_num);
vTaskDelay(1000);
}
}
效果如下: