在嵌入式开发过程当中,常常会经过打印输出一些调试信息来调试参数、查找问题等,一般个人作法都是使用芯片的串口硬件设备配合串口助手软件来进行调试。可是此次项目的PCB硬件设计并未预留串口调试接口,因此想使用串口调试就不方便了。通过查找资料发现Segger 提供了一种很是方便的调试方式——自家的J-Link
硬件配合J-Link RTT Viewer
软件进行信息输入输出调试。git
要使用该调试组件,须要添加Segger提供的SEGGER_RTT组件代码,该代码位于J-Link软件安装目录下,并且在用户手册中提供了详细的说明。函数
组件源码位置:测试
用户手册位置:设计
在手册的16章节对RTT组件进行了说明:调试
将组件源码复制到工程目录下,工程中添加相关文件及包含路径:code
最后在须要使用打印调试信息的文件中包含#include "SEGGER_RTT.h"
头文件就可使用该组件了。orm
关于组件提供的各API函数在手册中都有相应的说明。举例应用以下:blog
输出测试:接口
int a = 3; SEGGER_RTT_TerminalOut(0,RTT_CTRL_BG_BLACK""RTT_CTRL_TEXT_BRIGHT_GREEN"SEGGER_RTT_TerminalOut 0\r\n"); SEGGER_RTT_TerminalOut(1,RTT_CTRL_BG_BLUE""RTT_CTRL_TEXT_BRIGHT_YELLOW"SEGGER_RTT_TerminalOut 1\r\n"); SEGGER_RTT_SetTerminal(2); SEGGER_RTT_printf(0,RTT_CTRL_BG_WHITE""RTT_CTRL_TEXT_BRIGHT_BLACK"SEGGER_RTT_printf 2\r\n"); SEGGER_RTT_SetTerminal(3); SEGGER_RTT_printf(0,"SEGGER_RTT_printf %d\r\n", a);
打开J-Link RTT Viewer
软件ip
RTT Viewer打印结果以下:
输入测试:
int a; while(1) { if ((a = SEGGER_RTT_WaitKey()) > 0) { SEGGER_RTT_SetTerminal(0); SEGGER_RTT_printf(0, "SEGGER_RTT_GetKey = %c\r\n", a); } }
RTT Viewer打印结果以下:
通过上面对SEGGER_RTT的使用,发现其确实很是的方便,大多数调试都可以替代串口调试实现了,可是SEGGER_RTT_printf()
函数没法打印浮点数。手册中对该函数列出了支持的转换说明符以下:
Conversion specifier | Meaning |
---|---|
c | Print the argument as one char |
d | Print the argument as a signed integer |
u | Print the argument as an unsigned integer |
x | Print the argument as an hexadecimal integer |
s | Print the string pointed to by the argument |
p | Print the argument as an 8-digit hexadecimal integer. (Argument shall be a pointer to void.) |
其中并无浮点数f
选项。可是可使用SEGGER_RTT输出函数本身修改一个printf函数,这样就可使用完整的printf函数了。
添加本身修改的printf函数以下:
/********************************************************************* * * rtt_printf() * * Function description * print a formatted string using RTT and standard library formatting. **********************************************************************/ int rtt_printf(const char *fmt,...) { int n; char aBuffer[256]; //根据应用需求调整大小 va_list args; va_start (args, fmt); n = vsnprintf(aBuffer, sizeof(aBuffer), fmt, args); if (n > (int)sizeof(aBuffer)) { SEGGER_RTT_Write(0, aBuffer, sizeof(aBuffer)); } else if (n > 0) { SEGGER_RTT_Write(0, aBuffer, n); } va_end(args); return n; }
接下来测试浮点数打印:
double fa = 0.1f; double fb = 2.0f; while(1) { fa += 0.0001f; fb -= 0.0002f; rtt_printf("floating test:\tfa = %f, fb = %f\r\n", fa, fb); delay(0x0fffffff); }