0%

配合OpenOCD的RTT使用Trice日志库

之前在Memfault的博客上发现了一个很有意思的日志库Trice。它专为嵌入式设备设计输出日志体积小型且可以以极高速率输出日志。作者号称在不输出时间戳的情况下可以用四条指令即可完成打日志,原因在于它并不会直接输出某个字符串,而是给每个字符串预先分配一个独一无二的ID(当然这部分在代码生成的时候完成),在打日志时候真正输出的是ID,通过上位机的程序解析输出。同样也具有printf格式化字符串的功能。

使用方式

串口

作为测试在这里也稍微提一下串口的使用方式。在代码配置中作者给出了阻塞非阻塞输出,前者直接等待输出完成,后者则是将输出内容写在缓冲区内等待空闲时输出,而硬件上目前只有串口和RTT,具体可以在triceConfig.h中修改TRICE_MODE完成

串口输出移植完成后,在代码中头部增加#include "trice.h",在需要的地方用TRICE函数以类似printf的格式调用输出日志。编译前需要在代码工作目录下运行trice u,更新字符串与ID再进行编译。将上位机与STM32用USB转连接,运行trice l -p COM5(COM5为串口端口)即可观察到输出,也可以使用-logfile指定输出到文件

其他部分的使用,如高亮等特性参见使用手册

RTT

Trice Over RTT文档

这项调试技术是Segger专用的下位机上传数据到主机的通信模式,它与重定向printf到串口或者SWO不同,后两者都需要额外的硬件支持。而RTT则是通过调试器直接轮询下位机内存中的队列来获取下位机发送的数据,因此发送数据的操作均为纯内存操作,显然比串口之流的外设通信快很多。

唯一的问题在于这个功能仅限于Jlink,对于我这种CMSIS-DAP或者STLink用户十分不友好。不过这个月初OpenOCD v0.10发布,其中正好增加了对RTT的支持,这就意味着借助OpenOCD RTT可以在一切调试器上使用。于是更新到新版后在OpenOCD的文档找到相关命令的使用

在STM32F103环境下,在OpenOCD目录下的share/openocd/scripts下增加或修改配置文件stm32f1x_stlink.cfg为如下内容(STM32F1+STLink配置)

1
2
3
4
5
6
7
8
9
set CONNECT_UNDER_RESET 0

source [find interface/stlink.cfg]
source [find target/stm32f1x.cfg]

init
rtt setup 0x20000000 0x1000 "SEGGER RTT"
rtt start
rtt server start 8765 0

其中8765为RTT服务器的端口号,rtt setup的三个参数分别为RTT缓冲区搜索的内存起始地址,内存大小以及标识字符串。在不同类型平台上除了需要修改source后面的内容外以适配不同调试器和芯片外,还需要修改rtt setup的内存大小,否则可能出现搜索不到缓冲区的情况。
保存文件后执行openocd -f stm32f1x_stlink.cfg启动OpenOCD服务器

出现rtt: Control block found at + 地址即说明RTT启动成功,最后启动trice的网络连接

1
trice log -port TCP4 -args localhost:8765

即可在只使用调试器的情况下观察输出日志

参考

OpenOCD下载

适用于RoboMaster C型开发板+DAP调试的OpenOCD配置文件cmsisdap_stm32f4x_rtt.cfg

1
2
3
4
5
6
7
8
9
set CONNECT_UNDER_RESET 0

source [find interface/cmsis-dap.cfg]
source [find target/stm32f4x.cfg]

init
rtt server start 8765 0
rtt setup 0x20000000 0x20000 "SEGGER RTT"
rtt start