# App/log/ — 日志子系统 > 两类日志:**持久化运行日志**(`sys_log`,落 NAND)与**控制台日志**(`console_log`,走串口)。 > 两者都遵循**单写者**模型,避免多任务交错输出。 ## 文件一览 | 文件 | 作用 | |---|---| | `sys_log.h` | **日志接口(平台无关)**:定长 64B 记录写入 `/log/run.log`·`selftest.log` | | `sys_log_mcu.c` | `sys_log` 的 MCU 端后端实现(NAND + FatFs) | | `console_log.c/h` | **控制台单写者日志**:多任务日志经队列汇入唯一写者,避免串口输出交错 | ## 关键机制 ### syslog(运行/自检记录) - **唯一写者 = defaultTask**;其它任务只投递,不直接写盘 - **单记录定长 64 B**,循环写;待机页可显示记录 - **内核启动前的日志**走**无锁静态缓冲** `s_preboot[8]` 暂存(因为内核启动前不能建队列), 内核启动后由 `syslog_drain` 惰性创建真队列并排空 - ⚠️ 写盘必须校验 `f_write` 返回的**字节数**(该 FatFs 移植在簇分配失败时返回 `FR_OK` + 短写, 不报错误码);追加写必须 `FA_WRITE|FA_OPEN_APPEND`(`FA_OPEN_APPEND` 单独用**不含写位**) ### console_log(控制台单写者) - 多任务的生产者 → **单写者消费者**,消除任务间日志行交错 - 设计详见 `docs/子系统设计/控制台单写者日志设计说明.md` ## 相关文档 - `docs/子系统设计/控制台单写者日志设计说明.md` - `docs/子系统设计/运行与自检记录设计说明.md` - FatFs 陷阱:`AGENTS.md`「平台约束」