为自建代码目录补齐 README,建立目录级导航体系

- 新增 26 份目录 README:App/(+log,task,util,protocol)、Drivers/BSP/(+8子系统)、
  Src/、Inc/、scripts/、tools/(+6子工具)、test/、MDK-ARM/、simulator/(+sim,tests)
- 每份含:定位、文件清单表、关键约束/陷阱、指向 docs 权威文档
- 第三方库与生成代码目录排除(CMSIS/HAL/Middlewares/Lib/SDL2)
- docs/文档规范.md 新增 §1.1b 代码目录 README 约定;根 README 目录结构加入说明
This commit is contained in:
2026-09-26 12:25:36 +08:00
parent 8d86fb1149
commit 39bd06adea
31 changed files with 1149 additions and 0 deletions
+49
View File
@@ -0,0 +1,49 @@
# App/ — 应用层
> **自研代码**(非 CubeMX 生成、非第三方库)。本目录是项目的**应用层**:任务编排、业务逻辑、
> 日志与配置引擎、工具函数。所有文件遵循 `docs/代码规范/嵌入式C语言代码规范_V1.0.md`。
## 职责
`Src/main.c`(CubeMX 初始化)→ `app_main_init`(本目录 `app_main.c`)→ `osKernelStart` →
6 个 FreeRTOS 任务(见 `task/`)。**`osKernelStart` 之前全是内核启动前代码,禁止调用任何
FreeRTOS/CMSIS-RTOS API**(见 `AGENTS.md`「平台约束」)。
## 文件一览
| 文件 | 作用 |
|---|---|
| `app_main.c/h` | 应用初始化入口 `app_main_init`:时间子系统优先 → RS485 → NAND → ADC → 诊断 |
| `app_cfg.h` | **功能模块编译开关**(裁剪测试套件/模块用) |
| `sys_events.h` | 系统就绪事件定义(Event Flags:`SYS_EVT_NET_READY` 等就绪屏障) |
| `time_sync.c/h` | 时间同步任务(等待网络就绪后与时间源同步) |
| `cfg_file.c/h` | **配置引擎**(`/config.ini` 解析 + 持久化 + 旧档迁移),属主为 defaultTask |
| `cfg_file_store.h` | 配置存储后端抽象接口(MCU=FreeRTOS 堆 / 模拟器=宿主堆,共享核心零分配) |
| `cfg_file_store_mcu.c` | 配置存储的 MCU 端后端实现(`cfg_store_alloc/free` → FreeRTOS 堆) |
| `log/` | 日志子系统(见下) |
| `task/` | FreeRTOS 任务实现(见下) |
| `util/` | 工具函数(见下) |
| `protocol/` | 通信协议(预留,当前为空) |
## 子目录
| 目录 | 内容 | README |
|---|---|---|
| `log/` | syslog(`/log/run.log`·`selftest.log` 定长记录)+ 控制台单写者日志 | [`log/README.md`](log/README.md) |
| `task/` | 6 个 FreeRTOS 任务实现 | [`task/README.md`](task/README.md) |
| `util/` | CRC / 环形缓冲 / 墙钟时间 | [`util/README.md`](util/README.md) |
| `protocol/` | 通信协议(预留) | — |
## 关键约束
- **配置引擎单任务收敛**:`cfg_file` 为静态态、属主是 defaultTask;UI 保存请求经
`SYS_EVT_CFG_SAVE` 事件唤醒,netTask/uiTask **不得直接触碰**配置引擎
- **syslog 唯一写者**:`/log/*` 只由 defaultTask 写入
- 新增任务/缓冲/栈前**必须先核算 RAM 余量**(`docs/内存管理/`)
## 相关文档
- 架构全景:`docs/架构设计/项目架构总览.md`
- 启动顺序:`docs/架构设计/项目启动顺序管理.md`
- 配置引擎:`docs/子系统设计/配置文件设计说明.md`
- 日志:`docs/子系统设计/控制台单写者日志设计说明.md`、`docs/子系统设计/运行与自检记录设计说明.md`
+34
View File
@@ -0,0 +1,34 @@
# 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`「平台约束」
+12
View File
@@ -0,0 +1,12 @@
# App/protocol/ — 通信协议(预留)
> **占位目录**:规划用于存放自定义通信协议实现(解析 / 组帧 / 状态机)。
> 当前为空(仅 `.gitkeep`),协议相关实现暂分散在:
> - RS-485 侧:`App/task/rs485_task.c` + `App/util/crc.c` + `App/util/ringbuf.c`
> - 网络侧:`Drivers/BSP/NET/`
> - 远端显示:`docs/UI设计/RemoDispBus协议与接收设计说明.md`
## 何时使用本目录
当出现**跨接口复用的协议逻辑**(如统一的帧编解码器、协议状态机)时,落到此处,
避免散落到各 task 里。新增后请在本 README 补一行说明。
+39
View File
@@ -0,0 +1,39 @@
# App/task/ — FreeRTOS 任务实现
> 6 个任务的入口函数与任务体。任务创建在 `Src/freertos.c`(`MX_FREERTOS_Init`),
> **栈大小/优先级的唯一事实源也是 `Src/freertos.c`**;本目录只放任务**实现**。
## 任务清单
| 文件 | 任务 | 优先级 | 职责 |
|---|---|---|---|
| `default_task.c/h` | defaultTask | Normal | FTL + FatFS 挂载、配置引擎属主、syslog 唯一写者、LED 指示 |
| `net_task.c/h` | netTask | Normal | `net_stack_bring_up` → 置 NET_READY → 循环 `net_poll` + `net_process_messages` |
| `ui_task.c/h` | uiTask | BelowNormal | LVGL 界面(菜单 / 内容页 / 待机)+ 推流 |
| `adc_task.c/h` | (ADC 任务) | — | 高精度 ADC(TPAFE5160)数据采集 |
| `rs485_task.c/h` | (RS-485 任务) | — | 半双工 RS-485 协议通信 |
| `time_sync.c`(在 `App/` 根) | timeSyncTask | Normal | 墙钟时间同步(实现不在本目录) |
> 上表栈大小/优先级以 `Src/freertos.c` 为准(`README.md`/`AGENTS.md` 的任务表由
> `scripts/gen_task_table.py` 生成,勿手抄)。
## 就绪屏障(重要)
任务间**不用魔法延时**,改用 `App/sys_events.h` 的 Event Flags:
- `SYS_EVT_NET_READY` / `SYS_EVT_STORAGE_READY` 等是**状态位**——等待时必须
`osFlagsWaitAny|osFlagsNoClear`,**不能用默认消费型等待**(否则先到的消费者会清掉位,
导致 `ftpTask` 的 `WaitAll(两位)` 永不成立 → FTP 静默不监听)
- `SYS_EVT_CFG_SAVE` / `SYS_EVT_NET_RECONFIG` 等**命令位**保持消费型等待
## 平台约束(改本目录前必读)
- **内核启动前禁止任何 FreeRTOS/CMSIS-RTOS API 调用**(`osMessageQueueNew` 等会杀死启动)
- 就绪屏障位一律用 `osFlagsNoClear`
- 内存预算紧张,改栈/缓冲前先核算(`docs/内存管理/`)
## 相关文档
- 启动顺序与屏障:`docs/架构设计/项目启动顺序管理.md`
- 内存与定栈规则:`docs/内存管理/RAM使用分析与优化方案.md`
- 栈水位实测:`scripts/stack_report.py`
+29
View File
@@ -0,0 +1,29 @@
# App/util/ — 通用工具函数
> 平台无关的纯工具模块(无 FreeRTOS 依赖、无硬件依赖),可在 MCU 与 PC 模拟器中共用。
## 文件一览
| 文件 | 作用 |
|---|---|
| `crc.c/h` | 校验算法(CRC16/CRC32 等,供 RS-485 协议与数据校验使用) |
| `ringbuf.c/h` | 环形缓冲(SPSC 无锁环形队列,用于串口/数据流收发) |
| `sys_clock.c/h` | **墙钟时间管理**:RTC 基准、tick 回绕防护、每 30 天惰性再基准化 |
## 设计要点
### sys_clock
- 以 SD2506 RTC 为基准,HAL tick 计数补齐亚秒精度
- **49.7 天 tick 回绕防护**:每 30 天惰性再基准化(`sys_clock_get` 内部触发)
- RTC 故障时降级到默认时间基准并返回 -1,触发"时钟芯片异常"自检上报
- 设计详见 `docs/子系统设计/系统墙钟时间维护说明.md`
### ringbuf
- 单生产者单消费者(SPSC)无锁设计,配合 DMA/中断收发
- 容量为 2 的幂,用掩码取模(避免除法开销)
## 相关文档
- `docs/子系统设计/系统墙钟时间维护说明.md`