为自建代码目录补齐 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:
@@ -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`
|
||||
@@ -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`「平台约束」
|
||||
@@ -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 补一行说明。
|
||||
@@ -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`
|
||||
@@ -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`
|
||||
Reference in New Issue
Block a user