Zephyr OS 入门与实战

第11课:日志与调试系统

1. 分级日志系统

Zephyr RTOS 提供了完善的日志系统,支持不同级别的日志输出,便于开发者进行调试和问题追踪。

日志级别

Zephyr 定义了以下几种日志级别:

日志级别 宏定义 描述 典型用途
ERROR LOG_ERR() 错误信息 系统关键错误,需要立即处理
WARNING LOG_WRN() 警告信息 潜在问题,不影响系统运行但需要注意
INFO LOG_INF() 普通信息 系统运行状态信息
DEBUG LOG_DBG() 调试信息 开发调试阶段的详细信息

基本用法

#include <logging/log.h>
LOG_MODULE_REGISTER(my_module, LOG_LEVEL_DBG);

void my_function(void) {
    LOG_ERR("This is an error message");
    LOG_WRN("This is a warning message");
    LOG_INF("This is an info message");
    LOG_DBG("This is a debug message");
}
注意: 使用日志系统前需要先调用 LOG_MODULE_REGISTER 注册模块,并指定默认日志级别。

日志级别控制

可以通过以下方式控制日志级别:

  1. 在代码中设置默认级别:LOG_MODULE_REGISTER(module_name, LOG_LEVEL_INF)
  2. 通过 Kconfig 配置:CONFIG_LOG_DEFAULT_LEVEL=3 (0:OFF, 1:ERR, 2:WRN, 3:INF, 4:DBG)
  3. 运行时动态调整:log_filter_set(NULL, LOG_LEVEL_DBG)

2. 使用 Segger RTT 实时输出

Segger RTT (Real Time Transfer) 是一种高效的调试输出技术,相比传统串口输出具有以下优势:

配置步骤

# 在 prj.conf 中添加以下配置
CONFIG_USE_SEGGER_RTT=y
CONFIG_RTT_CONSOLE=y
CONFIG_LOG_BACKEND_RTT=y
CONFIG_LOG_PRINTK=y

使用示例

#include <logging/log.h>
#include <sys/printk.h>

LOG_MODULE_REGISTER(rtt_demo, LOG_LEVEL_DBG);

void main(void) {
    LOG_INF("Starting RTT demo...");
    printk("This message goes to RTT as well\n");
    LOG_DBG("Debug information can be captured");
}

最佳实践

  • 开发阶段使用 LOG_LEVEL_DBG 获取详细调试信息
  • 生产环境建议设置为 LOG_LEVEL_INF 或更高
  • 结合 J-Link 和 J-Link RTT Viewer 工具查看输出
  • 可以使用 RTT 进行双向通信,实现调试命令输入
注意: 使用 RTT 需要目标设备支持 SWD/JTAG 调试接口,并且连接了 J-Link 或其他兼容的调试器。
客服小姐姐(优先添加)
客服小姐姐(优先添加)
客服微信
讲师微信(备用)