我是老温,一名热爱学习的嵌入式工程师。关注我,一起变得更加优秀!
在调试嵌入式软件bug的时候,很多工程师老铁都喜欢用printf打印或者在线仿真的方式来进行问题定位,在线仿真需要烧录调试器和IDE的参与,而printf只需要串口即可。
printf在监控系统运行的时候非常有用,在代码片段里面加入固定的字符串,只要代码运行到那一部分,CPU就会把信息打印到串口上,然后工程师就可以知道代码的运行情况了。
然而最近,我无意中发现了一款适用于嵌入式日志追踪的轻量级工具,Trice
什么是 Trice?
Trice的项目地址在这里:https://github.com/rokath/trice(复制到浏览器打开,或点击【阅读原文】)
它是一个专门为嵌入式 C/C++ 开发的轻量级日志框架,它提供了类似于printf的简单易用性,并且每次的日志调用仅需要6~100个CPU周期。
Trice的核心设计理念是,将日志的“生成”与“显示”彻底分离,它通过在编译期间的ID映射,然后在主机端对ID进行解析可视化,最大限度地降低资源占用,同时保留了printf开发的便捷性。
Trice 与 Printf 对比
printf虽然简单方便,但有时候把调试信息加到代码里面也有弊端,会造成代码编译过大占用Flash空间,而且打印的时候需要在串口通道传输具体的信息内容,效率难免会有点低。
我做了一个表格,来对比一下Trice和printf的区别。
| 对比维度 | Trice工具 | printf函数 |
| 核心定位 | 嵌入式专用,轻量化,高效率,适配实时性场景 | 通用打印函数,简单的日志输出 |
| Flash占用 | 极低,单条日志4byte,运行代码<1KB | 代码包含字符串日志信息,Flash占用较高 |
| CPU开销 | 极小,6~100 CPU周期,低延迟 | 较高,可能影响系统实时性 |
| 日志传输 | 二进制传输(ID+参数方式),支持UART、RTT | 传输时需格式化字符串,日志量大,通常仅支持UART |
| 使用场景 | 资源受限的嵌入式设备,如单片机,实时系统,中断日志,现场调试 | 简单调试,资源充足的设备 |
如何安装和移植Trice?
Trice的移植安装使用,主要涉及两个方面:嵌入式目标设备端,PC主机端。
先来说说PC主机端,主要是基于GO语言开发的,它的核心功能就是加载编译期间生成的ID映射表,然后接收设备端发送过来的ID并进行解析,把日志还原成可视化输出。
主机端安装,需要先安装 GO 环境(建议1.18版本以上),然后执行以下命令,完成 Trice 工具的安装,安装完成后可以查看Trice版本。
go install github.com/rokath/trice/cmd/trice@latesttrice version
在嵌入式端,主要是将源码里面的trice.c、trice.h、triceConfig.h这三个文件复制到工程项目里面进行编译,确保源码文件能被正确编译即可。
在triceConfig.h文件里面配置日志传输接口,并且需要指定UART的句柄(比如STM32的&huart1),代码如下所示。
#include "trice.h"#include "stm32f1xx_hal.h"// 配置UART接口#define TRICE_USE_UART 1#define TRICE_UART_HANDLE &huart1// Trice发送回调函数(将日志数据通过UART发送)void TriceSend( const uint8_t* data, uint16_t len ){HAL_UART_Transmit(TRICE_UART_HANDLE, data, len, HAL_MAX_DELAY);}
使用的时候,在需要追踪的代码位置插入Trice日志宏,支持INFO、WARN、ERROR多种日志级别,调用方式跟printf差不多,代码如下所示。
#include "trice.h"void System_Init(){TriceInit(); //初始化Trice// 打印INFO信息TRICE_INFO("System Init Completed, MCU Clock: %d MHz", SystemCoreClock/1000000);// 在终端里面打印Trice日志HAL_UART_Receive_IT(&huart1, &rx_data, 1);}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){TRICE_DEBUG("UART Receive Data: 0x%02X", rx_data);HAL_UART_Receive_IT(&huart1, &rx_data, 1);}
在项目的根目录创建空的 til.json 和 li.json ,编译前需要执行 trice insert,然后Trice工具会扫描项目里面的日志宏,并且为每条日志分配ID,并且将ID与字符串的映射关系写入til.json文件。
如何使用Trice?
1、把嵌入式设备通过UART串口与PC端连接,并且确保通信波特率、数据位、停止位与triceConfig.h配置一致。
2、在命令行终端里面,执行以下命令,启动Trice 日志解析
trice log -port COM3 -baud 115200
3、启动后,主机端会实时接收并解析嵌入式设备发送的二进制日志,并且支持日志过滤、日志着色、日志保存等操作。
使用Trice的注意事项
(1)编译之前必须要用trice insert生成ID映射表,不然日志是无法正常在PC主机端进行解析的,如果要修改日志内容,就需要重新执行该命令。
(2)triceConfig.h里面的接口配置需要与硬件保持一致,避免日志传输或者解析失败的情况发生。
(3)对于资源紧张的单片机芯片,建议关闭不必要的日志功能(比如时间戳或者传输加密),降低资源占用。
(4)编译完成后,可以执行trice clean恢复代码,避免日志宏影响代码的可读性。
182