拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Zephyr RTOS 日志 5 分钟配好,调级免重编译

Zephyr RTOS 日志 5 分钟配好调级免重编译【免费下载链接】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 日志都取不出来。你重启了一遍又一遍换板、换晶振只能一个原因一个原因地猜。嵌入式调试的卡点往往不是代码没 bug而是出 bug 时现场没有任何记录。Zephyr RTOS 的日志与追踪机制就是为这件事设计的让系统里每个关键动作都留下痕迹事后可以把事故时间线一步步回放。梳理一条日志的完整旅程级别、过滤、后端你在代码里写一条 LOG_INF(...)它不会直接跑到串口上。第一道关是级别日志子系统定义了从 EMERG紧急到 DBG调试共 7 级高于当前门槛的消息直接丢弃。第二道关是模块过滤LOG_MODULE_REGISTER 时就要声明本模块想要的级别够不着级别的消息在编译期就被裁掉不占一个字。两道关都过了消息打包进消息池。默认走延迟模式调用点立刻返回字符串格式化这类耗时操作交给专门的日志处理线程再交给后端输出。后端可以不止一个各自独立过滤。图中绿色方框是日志前端负责把各执行域产生的消息收上来后端做最终输出出口可以是串口、USB 或主机端工具。完整选项清单见日志官方文档。配置最短日志链路开启、注册、打出第一条在配置文件中打开全局开关指定默认级别和输出通道# prj.conf CONFIG_LOGy CONFIG_LOG_DEFAULT_LEVEL5 # 5INFO输出 INFO 及以上 CONFIG_LOG_BACKEND_UARTy # 输出到控制台然后在代码里注册模块打出第一条日志#include zephyr/logging/log.h LOG_MODULE_REGISTER(sensor, LOG_LEVEL_INF); static void read_once(void) { int raw 42; LOG_INF(读取完成原始值 %d, raw); }模块注册、按实例打日志、自定义前端的完整写法在logger 示例里都有多文件工程可以直接照抄它的 LOG_MODULE_DECLARE 用法。对比三种输出通道挑一个适合设备的后端典型场景关键 Kconfig主要代价UART 控制台开发台有调试探头CONFIG_LOG_BACKEND_UART格式化与串口带宽占真实时间蓝牙量产设备无串口、需远程回传CONFIG_LOG_BACKEND_BLE依赖蓝牙协议栈内存预算变高RAM抓崩溃现场、事后回读CONFIG_LOG_BACKEND_RAM CONFIG_LOG_BACKEND_RAM_BUFFER_SIZE缓冲有限掉电即丢失选型逻辑其实很简单开发阶段首选 UART反馈回路最短量产设备没有串口就用蓝牙回传要留住崩溃前的记录就再挂一个 RAM 后端——设备即使死机环形缓冲里还留着最后几十条。调整日志级别与模块过滤不用重编译编译期级别是底线设备跑起来之后还要随时调音量。运行时过滤的入口是 log_filter_set()第二参数是模块名传 NULL 表示全部第三参数是目标级别前提是打开 CONFIG_LOG_RUNTIME_FILTERINGy。log_filter_set(NULL, sensor, LOG_LEVEL_DBG); /* 单开 sensor 到 DEBUG */ log_filter_set(NULL, NULL, LOG_LEVEL_NONE); /* 全体静音 */两个细节值得注意。一是运行时过滤按后端独立生效关掉 UART 通道不影响 RAM 通道串口侧可以静音降噪RAM 侧继续留存现场。二是想弄清过滤如何生效可以看 subsys/logging/ 源码log_mgmt.c 管理过滤状态backends/ 下是各通道的输出实现。用日志定位驱动读失败与崩溃前空白I2C 传感器读出来永远是错误现象读温度传感器总是返回 -EIO换板也一样最初像硬件问题。怀疑接线、引脚复用被排除后嫌疑落在驱动里的寄存器地址。定位动作打开驱动读取路径的 LOG_DBG让每一步都打印返回值和总线上读回的原始字节日志直接指向写出的地址字节。结论7 位与 8 位寻址弄混了地址高位多写了一位。改完再看同一条 LOG_DBG从报错变成正常值修复当场确认。死机前没有任何记录现象设备偶发死机死机前串口一片安静只有看门狗复位线索为零。怀疑要么高优先级线程卡死要么日志缓冲满被丢——消息产生了但没出去。定位动作保留延迟模式并加挂 RAM 后端同时打开 CONFIG_LOG_MODE_OVERFLOW让缓冲满时留下有消息被丢弃的标记。下次死机后从 shell 回读 RAM 环形缓冲拿到最后两条工作队列处理函数卡在等信号量上日志恰好丢在等待点。结论卡死源于另一个线程持有资源不释放。修复后 RAM 后端在产线继续发挥作用——崩溃现场不再是黑盒。如果问题更接近哪个函数太慢可以转向追踪子系统用主机端工具把执行流程调出来直接看调用时间线核对四个高频坑位再上线⚠️ 延迟模式缓冲满就丢默认消息池不大设备一忙日志悄悄消失。加大 CONFIG_LOG_BUFFER_SIZE或打开 CONFIG_LOG_MODE_OVERFLOW 留下丢弃标记。⚠️ 编译期级别只能提不能降模块注册时的级别是上限全局覆盖只会更松不会更紧。想砍掉某模块的调试输出在注册处把级别设准。⚠️ 延迟处理线程也吃内存和栈多数配置无感但紧张的项目要检查 CONFIG_LOG_PROCESS_STACK_SIZE别让日志线程自己先崩。⚠️ 后端代价不对称蓝牙回传拖入整个协议栈RAM 后端掉电即失UART 占真实带宽。先按最坏情况估算日志量再选通道。日志回答当时发生了什么追踪回答当时跑得多快两者配合多数嵌入式调试疑难都能变成可读的时间线。先把上面三个 Kconfig 选项配上让第一条日志出现在屏幕上再按需打开运行时过滤、RAM 后端和限频输出。核心源码subsys/logging/log_core.c 管消息流转log_mgmt.c 管过滤backends/ 是各输出通道示例目录samples/subsys/logging/蓝牙回传、字典压缩、多域等完整实现官方文档doc/services/logging/index.rstKconfig 到 API 细节齐全你量产设备用的是蓝牙回传还是 RAM 留存欢迎在评论区聊聊踩过的坑。【免费下载链接】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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门