前一段时间没怎么写代码,以至于调试生疏了很多,很多调试软件用起来总是不尽兴,log信息使用串口打印还是稍微繁琐了一些,而且,每次换一个单片机,就得移植一遍串口。
看来,与生俱来的调试助手,还得是RTT,做一个单片机的板子,至少得流出SWD接口来。
其实RTT也不是很爽,每次打开还得选择MCU,遇上国产小品牌的MCU,选型列表里没有,只能选个M0先试试。
另外,RTT能展现的内容也不够丰富,也就是个打印,想显示曲线,还得换软件。不够轻量化和易用。
对于RTT的协议扩展,最多也就是增加了几种颜色,这个功能,我在封装的RTT模块中已经写好了,不过,当初写的时候,没在意其中的数据结构,今天正好想自己读取RTT数据来展示,就深入研究了一下。
教你如何使用SEGGER RTT优雅的实现日志系统
RTT的原理很简单,他利用printf类似的函数功能,讲我们想要发送出来的信息存储在Ram中的一个固定区域,上位机的软件,就可以通过SWD接口快速的读取这块的缓存数据,然后将它们显示在界面窗口里面。
移植RTT的时候,我们是如何增加颜色的呢?
如上面的宏定义,我们在RTT_printf外面又套了一层壳子,除了我们原本打印的数据外,我们在增加了一头一尾,让我们打印的数据被两个特殊字符包裹起来。
从定义的命名中可以看出,前面的是color,颜色。后面的是一个特殊的控制字符RESET,表示这部分颜色结束了。
在RTT的宏定义文件中是这样定义的:
我通过C#调用了JLINKARM.dll文件,读取了缓存区的数据。
我在MCU中一次性发送了两组数据,一组不带颜色,一组带颜色(LOG_ERROR)。
我在C#中调试,读取到的信息如下,是一串很长的数据,按照字符串来理解。
原始数据:"pitch: 6298 roll: -7623 yaw: 73370 nu001b[0mu001b[1;31mERR: pitch: 6298 roll: -7623 yaw: 73370 nu001b[0m"
其实,这是两串数据,我们需要把它断开,如何切断呢?
以RTTCTRLRESET来切断,也就是u001b[0m。如此以来,我们得到了两组数据。
无颜色:pitch: 6298 roll: -7623 yaw: 73370 nu001b[0m
红色:u001b[1;31mERR: pitch: 6298 roll: -7623 yaw: 73370 nu001b[0m
如此以来,我们可以在上位机来对这些颜色信息进行解释,起码可以自己做一个软件,显示出五颜六色的数据。
再者,我们只需要利用这些特殊字符,一样可以写出曲线的显示,仪表盘的显示等等。
目前的缺点是,我们还需要安装jlink驱动来实现这个功能,如果我们使用DAPLink这种不需要驱动的调试器,有没有办法可以兼容RTT的格式,同样开发一套通过SWD接口的LOG软件呢?有知道的大佬,后台指教一下,多谢。