
Zephyr RTOS 日志系统一次讲清【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr本文只讲 Zephyr RTOS 日志怎么用。读完后你能用 3 行 Kconfig 打开日志按场景挑选合适的嵌入式日志后端并在设备上不重烧固件就调整日志级别与模块过滤同时掌握传感器驱动错误定位和 Zephyr 崩溃日志留存的写法。日志系统在 Zephyr 中的位置日志子系统是 Zephyr 里一个独立的子系统而不是一组打印函数。它的实现集中在 subsys/logging/ 目录整体走前端 → 缓存 → 后端的流水线前端只记录消息元数据级别、模块、时间戳消息先进入环形缓存后端负责格式化与输出。这个结构带来三个实际特性模块化每个源文件通过 LOG_MODULE_REGISTER 注册成独立模块可单独设定编译期级别多后端UART、蓝牙 LE、文件系统等后端可插拔靠 Kconfig 切换运行时可控系统跑起来之后级别与过滤仍然可以在线调整。追踪数据也走同一条管线抓出来后可以用第三方工具做时间线分析最小可用配置打开日志只需要 3 行配置就能得到一条完整的输出链路CONFIG_LOGy CONFIG_LOG_DEFAULT_LEVEL3 CONFIG_LOG_BACKEND_UARTy#include zephyr/logging/log.h LOG_MODULE_REGISTER(my_module); int main(void) { LOG_INF(boot ok, temp%d, 25); LOG_DBG(detail: %s, raw data); return 0; }每条日志对应 0~6 共 7 个级别0EMERG1ALERT2CRIT3ERR4WARNING5INFO6DEBUG。注意 CONFIG_LOG_DEFAULT_LEVEL 取 0~4默认 3它是一把粗刻度3 表示编译期默认放行到 ERR 档4 才会放行到 DEBUG 档。按场景选输出后端后端只是输出阶段的可替换实现选哪个取决于设备最终摆在什么位置。输出通道关键配置项适用场景控制台UART 串口CONFIG_LOG_BACKEND_UARTy开发板带串口开发阶段直接看输出蓝牙 LECONFIG_LOG_BACKEND_BLEy依赖 BT设备没有物理串口用手机端 NUS 兼容应用接收文件系统持久存储CONFIG_BACKEND_FSy对应的CONFIG_LOG_BACKEND_FSy设备断电或现场死机事后由上位机从存储分区回读开发期留控制台最省事设备部署到远处后换成 BLE 或文件系统后端就不用每次拆机看串口。完整可编译的例子在 samples/subsys/logging/ 里BLE 后端附带手机接收的说明。不重新烧录也能调日志打开 CONFIG_LOG_RUNTIME_FILTERING 后级别和按模块的过滤都能在系统运行中修改无需重新编译。#include zephyr/logging/log_ctrl.h /* 调高某模块级别src_id 是模块的数字 IDshell 可查 */ log_filter_set(NULL, 0, 42, LOG_LEVEL_DBG); /* 全局静默级别设为 LOG_LEVEL_NONE */ log_filter_set(NULL, 0, 42, LOG_LEVEL_NONE);启用 shell 后也可以在串口控制台直接用log filter set这类命令调级连代码都不用动。两个性能参数值得记住CONFIG_LOG_PROCESS_THREAD默认开由一个专用线程负责格式化输出日志调用点只往缓存里写不在你的代码路径上阻塞CONFIG_LOG_PROCESS_TRIGGER_THRESHOLD默认 10缓存里攒够 10 条才唤醒处理线程批量输出减少上下文切换次数。 两个高频调试场景场景一传感器驱动错误定位。I2C 读失败时把返回值和寄存器地址打进日志一条消息就能区分总线问题与器件问题static int sensor_read(struct device *dev, int *val) { int ret i2c_reg_read_byte(dev, 0x20); if (ret 0) { LOG_ERR(i2c read fail: reg0x20, err%d, ret); return ret; } *val decode(ret); LOG_DBG(raw0x%02x, val%d, ret, *val); return 0; }要点LOG_ERR 只带错误码和关键上下文LOG_DBG 留给中间量发布时关 DEBUG 档即可。samples/sensor/ms5837/ 里有现成的传感器日志用法可对照。场景二崩溃前留下最后一条信息。致命错误处理函数接管后先强制把缓存里没输出的日志冲刷出去void my_fatal_handler(const struct z_arch_esf_t *esf) { log_panic(); /* 冲刷所有已缓存日志 */ LOG_ERR(crash: pc0x%llx, (unsigned long long)esf-pc); sys_reboot(SYS_REBOOT_COLD); }要点log_panic() 会立即排空缓冲区系统挂死前发生的最后几条日志重新上电后依然能看到。⚠️ 常见坑与取舍级别选错编译期默认级别放到 DEBUG发布固件也会带出全部调试信息RAM 和带宽都白烧。发布版降到 ERR/WRN 档调试时再临时调高。日志被丢默认延迟模式的消息缓存在 LOG_BUFFER_SIZE默认 1024 字节写满后旧消息被丢弃关键路径要么调大它要么改用同步模式。日志拖慢主循环同步模式CONFIG_LOG_MODE_IMMEDIATE的格式化与输出发生在调用上下文主循环甚至高优先级中断都会被卡住多核多线程系统建议保持默认延迟模式加处理线程。BLE 后端有前置条件依赖蓝牙子系统且要求处理线程栈不小于 2048 字节不满足时配置解析直接报错。刷屏淹没关键信息循环里每轮都打日志会把通道占满用 LOG_*_RATELIMIT 宏按调用点限流默认间隔 5000 ms可用 CONFIG_LOG_RATELIMIT_INTERVAL_MS 调整。延伸阅读核心实现subsys/logging/log_core.c公共 API 与宏定义include/zephyr/logging/log.h官方示例控制台、BLE、多域日志samples/subsys/logging/追踪子系统文档doc/services/tracing/【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考