文档体系重组与 D-7 一致性门禁落地,清理芯片手册孤儿图片
- D-6 目录规范化:docs 根目录散落文档归入 UI设计/子系统设计/架构设计/审查记录/ 环境与部署/网络 等子目录,去掉目录名空格,重命名 嵌入式C语言代码规范_V1.0.md - D-7 三档一致性门禁:新增 scripts/check_doc_links.py(链接存在性)、 scripts/gen_task_table.py(FreeRTOS 任务表数值)、scripts/check_mem_numbers.py (内存/Flash 体积),均支持 --check/--write/--diff,pre-commit 钩子同步注册 - D-5 文档索引:新建 docs/README.md,新建 docs/文档规范.md 约束目录命名与链接写法 - D-1 芯片手册瘦身:删除 1069 张无引用孤儿图片(77.06 MB), docs/芯片手册 120 MB → 41 MB,已引用图片零断链 - 同步 C 源码注释中的文档路径引用(D-6 重组后),构建 0 错误 0 警告
@@ -5,7 +5,7 @@ description: docs/ 文档技术配图绘制流程(精确布局图用 SVG 生
|
||||
|
||||
# 文档配图绘制(SVG / Mermaid)
|
||||
|
||||
`docs/` 文档技术配图的统一流程;完整选型依据 / 约定 / 检查清单见 `docs/图形绘制流程.md`。**产物统一放 `docs/images/`**(专门配图目录,`.svg` 入库;PNG 预览属本地派生物、不入库)。
|
||||
`docs/` 文档技术配图的统一流程;完整选型依据 / 约定 / 检查清单见 `docs/架构设计/图形绘制流程.md`。**产物统一放 `docs/images/`**(专门配图目录,`.svg` 入库;PNG 预览属本地派生物、不入库)。
|
||||
|
||||
## 工具选型
|
||||
|
||||
@@ -42,7 +42,7 @@ description: docs/ 文档技术配图绘制流程(精确布局图用 SVG 生
|
||||
```
|
||||
|
||||
4. **目检**:浏览器打开 `docs/images/*.svg`——文字不溢出盒外、框 / 线 / 标签对齐、配色符合调色板。
|
||||
5. **md 引用**(相对路径):`docs/` 根的 md 写 ``;`docs/UI 设计/` 等子目录 md 写 ``。
|
||||
5. **md 引用**(相对路径):`docs/` 根的 md 写 ``;`docs/UI设计/` 等子目录 md 写 ``。
|
||||
6. **提交**:生成器脚本(源)+ 生成的 `.svg`(产物)**一并**提交。
|
||||
|
||||
## SVG 约定(手写 / 新增生成器必须遵循)
|
||||
|
||||
@@ -5,7 +5,7 @@ description: 重生成中文子集字体 ui_font_cn_12(extract_cn 提取 → m
|
||||
|
||||
# 中文字体重生成
|
||||
|
||||
本工程**唯一字体** `ui_font_cn_12`(宋体 12px 1bpp 子集,MCU/模拟器双端共用)。**缺字渲染为空白**——新增汉字必须走以下固定顺序,不得跳过或调换。详细原理见 `docs/UI 设计/UI_中文字体生成与配置.md`。
|
||||
本工程**唯一字体** `ui_font_cn_12`(宋体 12px 1bpp 子集,MCU/模拟器双端共用)。**缺字渲染为空白**——新增汉字必须走以下固定顺序,不得跳过或调换。详细原理见 `docs/UI设计/UI_中文字体生成与配置.md`。
|
||||
|
||||
## 固定顺序(仓库根目录执行)
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ description: UI 改动后的回归验证:5 步门禁(模拟器构建、菜
|
||||
|
||||
# UI 回归验证
|
||||
|
||||
UI 相关改动完成后必须跑完 5 个门禁再提交。完整说明见 `docs/UI 设计/UI_自动化测试流程.md`。
|
||||
UI 相关改动完成后必须跑完 5 个门禁再提交。完整说明见 `docs/UI设计/UI_自动化测试流程.md`。
|
||||
|
||||
## 步骤(仓库根目录执行,python 一律用 .venv)
|
||||
|
||||
@@ -42,4 +42,4 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警
|
||||
- `.venv` 缺失/换机:`& 'C:\ProgramData\anaconda3\python.exe' -m venv .venv; & '.venv\Scripts\python.exe' -m pip install -r requirements.txt`
|
||||
- 新增 UI `.c` 文件先走 `new-source-file` skill 双端注册,否则一端静默缺文件
|
||||
- 字体重生成后全页大面积像素差异属预期:确认字形正确后 `--update` 刷参考
|
||||
- 涉及新界面/大改时本 skill 是 P3 门禁,完整管线(P0~P5)见 `docs/UI 设计/UI_界面制作流程.md`
|
||||
- 涉及新界面/大改时本 skill 是 P3 门禁,完整管线(P0~P5)见 `docs/UI设计/UI_界面制作流程.md`
|
||||
|
||||
@@ -104,3 +104,35 @@ repos:
|
||||
Src/|
|
||||
Inc/
|
||||
)
|
||||
|
||||
# 5) 文档一致性门禁(D-7)
|
||||
# 存在性:md 互链 / 反引号路径是否指向真实文件(防迁移/删除后残留死链)
|
||||
- id: doc-links
|
||||
name: 文档链接存在性 (D-3/D-7)
|
||||
entry: python scripts/check_doc_links.py
|
||||
language: system
|
||||
files: \.md$
|
||||
# 外部资料(芯片手册转录)链接形态不受控;第三方目录整体排除
|
||||
exclude: |
|
||||
(?x)^(
|
||||
\.opencode/node_modules/|
|
||||
Lib/lvgl/|
|
||||
simulator/|
|
||||
MDK-ARM/RTE/|
|
||||
docs/芯片手册/
|
||||
)
|
||||
# 数值:README/AGENTS 任务表须与 Src/freertos.c 一致(D-2/D-7)
|
||||
- id: task-table
|
||||
name: FreeRTOS 任务表一致性 (D-2/D-7)
|
||||
entry: python scripts/gen_task_table.py --check
|
||||
language: system
|
||||
files: ^(README\.md|AGENTS\.md|Src/freertos\.c)$
|
||||
pass_filenames: false
|
||||
# 体积:内存/Flash 数字须与最新 .map 一致(D-7 第三档)
|
||||
# 只在内存文档或代码变动时触发;.map 未生成时脚本自身给出明确提示
|
||||
- id: mem-numbers
|
||||
name: 内存/Flash 数字一致性 (D-7 体积档)
|
||||
entry: python scripts/check_mem_numbers.py --scan
|
||||
language: system
|
||||
files: ^(docs/内存管理/.*\.md|scripts/check_mem_numbers\.py|App/.*\.c|App/.*\.h|Src/.*\.c|Inc/.*\.h)$
|
||||
pass_filenames: false
|
||||
|
||||
@@ -47,6 +47,7 @@ STM32F407ZGTx @168MHz(HSE 8MHz → PLL M=4/N=168/P=2);**仅 Keil MDK-ARM v
|
||||
- **FatFs 打开模式陷阱(2026-09-20 台架实测,`Lib/FatFs` 移植版)**:`FA_OPEN_APPEND`(0x30) = `FA_OPEN_ALWAYS|FA_SEEKEND`,**不含 `FA_WRITE`(0x02)**——不带写位打开的文件 `f_write` 恒返回 `FR_DENIED`(7)(/log 写失败真根因);追加写必须用 `FA_WRITE|FA_OPEN_APPEND`。该移植的 `f_write` 簇分配失败时返回 `FR_OK`+短写(无错误码),判失败必须校验写回字节数。标志位为旧式编号(`FA_READ`=0x01 / `FA_WRITE`=0x02 / `FA_CREATE_NEW`=0x04 / `FA_CREATE_ALWAYS`=0x08 / `FA_OPEN_ALWAYS`=0x10 / `FA_OPEN_APPEND`=0x30 / `FA_SEEKEND`=0x20(ff.c 内部定义)),与上游 FatFs R0.14 不同,勿照抄上游代码示例
|
||||
- **FatFs 文件名约束(2026-09-20 台架实证,`.fschk` 无限重格式化事故根因)**:本移植 `Lib/FatFs/ffconf.h` 为 `FF_USE_LFN=0`,**只支持严格 8.3 短名**——主名≤8 字符、扩展≤3 字符、**不得以点开头**(`.fschk` 会被 `ff.c create_short` 把点后当扩展域解析超限 → `f_open` 恒返 `FR_INVALID_NAME`(6),纯 RAM 名字判定、不碰盘)。ff.c `create_short` 全部拒绝点已加 DEBUG 打印:`[ERR][FATFS] SFN reject (原因) seg='名字片段' bad_ch=坏字符`,非法名字调用看开机日志即可定位。自愈类逻辑**严禁**把名字/参数类错误码(`FR_INVALID_NAME` 等)归入卷损坏触发集(整卷重格式化不可逆)
|
||||
|
||||
<!-- TASK_TABLE:BEGIN generated by scripts/gen_task_table.py -->
|
||||
| Task | 栈 (words) | 优先级 |
|
||||
|---|---|---|
|
||||
| defaultTask | 1024 | Normal |
|
||||
@@ -55,6 +56,7 @@ STM32F407ZGTx @168MHz(HSE 8MHz → PLL M=4/N=168/P=2);**仅 Keil MDK-ARM v
|
||||
| testTask | 2048 | BelowNormal |
|
||||
| uiTask | 4096 | BelowNormal |
|
||||
| timeSyncTask | 512 | Normal |
|
||||
<!-- TASK_TABLE:END -->
|
||||
|
||||
(实际值以 `Src/freertos.c` 为准;testTask 仅在启用测试套件时创建。改动栈/缓冲前先核对此表与实测。2026-09-21 上调:defaultTask 512→1024(扛 mount/mkfs/FAT探针/cfg/syslog 深层 FatFS I/O,旧值经 `configCHECK_FOR_STACK_OVERFLOW=2` 钩子实测溢出)、testTask 1024→2048(存储套件 deep call chain + 局部缓冲溢出)。FreeRTOS 堆已迁 CCM,任务栈合计已不占 SRAM;2026-09-21 可观测性落地后实测:ftpTask 峰值曾达 3480B/4096B(余量 15%,低于 1024B 底线)→ 已按 `docs/内存管理/RAM使用分析与优化方案.md` §1.4 把 lftpd 9 处大局部缓冲静态化(BSS +4.6KB),复测峰值 **1184B/4096B(余量 71%)**,6 任务全 PASS)
|
||||
|
||||
@@ -66,7 +68,7 @@ STM32F407ZGTx @168MHz(HSE 8MHz → PLL M=4/N=168/P=2);**仅 Keil MDK-ARM v
|
||||
- **就绪屏障**(`App/sys_events.h` Event Flags,取代魔法延时):`SYS_EVT_NET_READY`(netTask 置位)/ `STORAGE_READY`(defaultTask:卷挂载 + 网络配置加载完成)/ `FTP_READY` / `TIMESYNC_READY`;消费者用 `osEventFlagsWait` 阻塞等待
|
||||
- netTask:`net_stack_bring_up`(配置已由 defaultTask 在屏障前加载,本任务只读 RAM 副本 → `net_init` + PHY 强制 100M 全双工 → 递增网络代次号)→ 置 NET_READY → 循环 `net_poll` + `net_process_messages`;消费 `SYS_EVT_NET_RECONFIG` → 立即重建网络(新 IP 免重启生效,各 TCP 服务据代次号重建监听)
|
||||
- defaultTask:`f_mount` forced(无卷自动 `f_mkfs` FAT32;挂载后卷健康探针:小写两击确认,FAT 区陈旧/擦除时自动重格式化自愈,`/config.ini` 回落工厂默认——2026-09-20 /log 写失败修复)→ 网络配置加载(`net_cfg_load`,首启含旧档迁移)→ STORAGE_READY → LED 闪烁;同时是 syslog(`/log/run.log`·`selftest.log`,定长 64B 记录)的**唯一写者**与**配置引擎属主**(`cfg_file` 静态态单任务收敛于此:UI 保存请求执行 `net_cfg_save_run` + 2s `cfg_file_poll`,经 `SYS_EVT_CFG_SAVE` 事件唤醒;netTask/uiTask 不得直接触碰配置引擎,见 P1-3)
|
||||
- 全景 `docs/项目架构总览.md`(六层分层 / 启动时序 / 存储·网络·UI 栈 / 目录组织)
|
||||
- 全景 `docs/架构设计/项目架构总览.md`(六层分层 / 启动时序 / 存储·网络·UI 栈 / 目录组织)
|
||||
|
||||
## 硬件引脚
|
||||
|
||||
@@ -85,12 +87,12 @@ STM32F407ZGTx @168MHz(HSE 8MHz → PLL M=4/N=168/P=2);**仅 Keil MDK-ARM v
|
||||
- 所有 `net_*` socket 操作经 `netMsgQueue` 消息队列在 netTask 串行执行(线程安全);非 netTask 任务直接调 `net_*` API,勿直接碰 CH395F 驱动
|
||||
- **`net_*` 公开 API 的错误码经"任务通知值"回传**(2026-09-21 实证):`net_msg_t` 是**按值拷入队列**的,netTask 改的是自己那份副本,调用方永远看不到 → 错误码搭 `xTaskNotify()` 通知值回来(失败=负的具体错误码如 `NET_ERR_WOULDBLOCK`、成功=字节数/描述符),公开 API 恢复 errno 后对外统一返回 -1。**勿给 `net_msg_t` 加"回传用"字段**(调用方只会读到栈垃圾;曾据此"修"错误码,导致 `ui_net_sink` 每次空轮询都误判为真错误 → 连上即 `net_close`)
|
||||
- **单连接 socket 的断开语义**:监听 Socket 在 CONNECT 后自身即数据通道(`g_client == g_listen`),EOF 时 net 层已 `auto_relisten`;应用层**不得**在 EOF 时 `net_close` 该 fd(会连监听一起毁掉 → 端口"连接被拒"),仅当数据 fd ≠ 监听 fd(模拟器多连接后端)时才关
|
||||
- 网口配置:`/config.ini` [network] 段(工厂默认 192.168.1.100/24、gw .1;MAC 全零 = 芯片内置;UI 保存立即生效;旧档 `/cfg/netcfg.bin` 首启自动迁移)→ `docs/网络配置说明.md`
|
||||
- 网口配置:`/config.ini` [network] 段(工厂默认 192.168.1.100/24、gw .1;MAC 全零 = 芯片内置;UI 保存立即生效;旧档 `/cfg/netcfg.bin` 首启自动迁移)→ `docs/子系统设计/网络配置说明.md`
|
||||
- **新 .c 文件必须手动注册到两处**才能双端编译:`MDK-ARM/STM32F407-Demo.uvprojx` + `simulator/CMakeLists.txt`(用 `new-source-file` skill)
|
||||
- 测试构建:`test/test_config.h` 的 `TEST_SUITE_CH395F/STORAGE/GD5F/RTC` **互斥**(一次只能启用一个,`#error`);全部注释 = 产品构建;**破坏性用例默认关闭**:同文件 `ENABLE_DESTRUCTIVE_TESTS`(默认注释)控制写/擦 NAND、格式化、坏块注入与 FatFS 写类用例——关闭时套件为**只读模式**(开机横幅 `mode: READ-ONLY`,可随时在在用设备上跑、不动卷内容与容量),只在**产品首次上电/产线首启**或明确需要时打开(`mode: DESTRUCTIVE`);2026-09-21 实测一轮破坏性 GD5F 运行即让 dhara 多记一个坏块(容量 95248 → 95200;该计数持久化在 dhara journal checkpoint 头里,普通恢复模式清不掉,需全片擦除——见 `docs/测试说明/存储维护与容量恢复.md`);CH395F 套件 `test/ch395f_test.h`:硬件层 Phase 1~5 与 NET 层 Phase 6~11 互斥;CH395F 硬件层模式下 netTask(基础线程:无条件创建、全构建唯一实例)入口自挂起(不运行),testTask 独占 CH395F
|
||||
- **改驱动前先读对应 `docs/问题记录/*_Trap_Records.md`**(CH395F / GD5F2GQ5UE / SD2506);各模块测试指南见 `docs/测试说明/`;**存储维护/容量恢复**(全片擦除恢复 dhara 坏块记账)见 `docs/测试说明/存储维护与容量恢复.md`
|
||||
- **LVGL I1 绘制缓冲含 palette 头(2026-09-21 实证)**:索引色格式 draw buffer 布局 = `[palette 8B][pixel data stride×h]`(`lv_draw_buf_create` 加 8B、`lv_draw_buf_goto_xy`/`lv_refr get_max_row` 都按此跳/扣),但 `lv_display_set_buffers`/`lv_draw_buf_init` 的容量校验**只看 `stride×h`**——只给 3200B 会被静默接受:末 8 个像素字节写到缓冲外(曾打脏相邻 `s_frame_box[0]` 指针 → HardFault),且 flush 收到的首地址含 palette(整帧错位 8 字节)。`ui_port.c` 按 `stride×h + palette` 供给并在 flush 时 `+palette` 取像素;详见 `docs/UI 设计/UI_设计架构.md` §1.4 第 8 条
|
||||
- **MCU 端必须显式应用 dark mono 主题(2026-09-21 实证,远端"纯白屏"根因)**:`lv_display_create()` 会按 `lv_theme_mono_init(disp, false)`(白底黑字)初始化**单例**主题,且 `lv_display_set_theme()` 只把主题重应用到 `screens[0]`(底层)→ **活动屏幕仍是 LVGL 类默认浅灰 `F5F5F5`**;而 UI 内容恒用 `lv_color_white()` 绘制 → 白底白字不可见、远端整帧 99% 为亮(客户端显示纯白)。修法(`ui_port.c`):`lv_theme_mono_init(disp, true, ...)` + `lv_display_set_theme()` + 对活动屏幕再 `lv_theme_apply()`(实测 `F5F5F5` → `000000`);同时显式写 I1 调色板头 8B(`[0]=黑 [1]=白`,LVGL 不替调用方初始化);详见 `docs/UI 设计/UI_设计架构.md` §1.4 第 9 条
|
||||
- **LVGL I1 绘制缓冲含 palette 头(2026-09-21 实证)**:索引色格式 draw buffer 布局 = `[palette 8B][pixel data stride×h]`(`lv_draw_buf_create` 加 8B、`lv_draw_buf_goto_xy`/`lv_refr get_max_row` 都按此跳/扣),但 `lv_display_set_buffers`/`lv_draw_buf_init` 的容量校验**只看 `stride×h`**——只给 3200B 会被静默接受:末 8 个像素字节写到缓冲外(曾打脏相邻 `s_frame_box[0]` 指针 → HardFault),且 flush 收到的首地址含 palette(整帧错位 8 字节)。`ui_port.c` 按 `stride×h + palette` 供给并在 flush 时 `+palette` 取像素;详见 `docs/UI设计/UI_设计架构.md` §1.4 第 8 条
|
||||
- **MCU 端必须显式应用 dark mono 主题(2026-09-21 实证,远端"纯白屏"根因)**:`lv_display_create()` 会按 `lv_theme_mono_init(disp, false)`(白底黑字)初始化**单例**主题,且 `lv_display_set_theme()` 只把主题重应用到 `screens[0]`(底层)→ **活动屏幕仍是 LVGL 类默认浅灰 `F5F5F5`**;而 UI 内容恒用 `lv_color_white()` 绘制 → 白底白字不可见、远端整帧 99% 为亮(客户端显示纯白)。修法(`ui_port.c`):`lv_theme_mono_init(disp, true, ...)` + `lv_display_set_theme()` + 对活动屏幕再 `lv_theme_apply()`(实测 `F5F5F5` → `000000`);同时显式写 I1 调色板头 8B(`[0]=黑 [1]=白`,LVGL 不替调用方初始化);详见 `docs/UI设计/UI_设计架构.md` §1.4 第 9 条
|
||||
|
||||
## 串口助手 serial_tool
|
||||
|
||||
@@ -110,6 +112,6 @@ STM32F407ZGTx @168MHz(HSE 8MHz → PLL M=4/N=168/P=2);**仅 Keil MDK-ARM v
|
||||
|
||||
## 文档与图形
|
||||
|
||||
- 配置文件 `docs/配置文件设计说明.md`;墙钟 `docs/系统墙钟时间维护说明.md`;控制台单写者日志 `docs/控制台单写者日志设计说明.md`;代码规范 `docs/代码规范/`;测试说明 `docs/测试说明/`;审计发现 `docs/项目审计改进清单.md`;已知待办 `待处理内容.md`(内存预算);引用关系图 `docs/引用关系图说明.md`
|
||||
- 配置文件 `docs/子系统设计/配置文件设计说明.md`;墙钟 `docs/子系统设计/系统墙钟时间维护说明.md`;控制台单写者日志 `docs/子系统设计/控制台单写者日志设计说明.md`;代码规范 `docs/代码规范/`;测试说明 `docs/测试说明/`;审计发现 `docs/审查记录/项目审计改进清单.md`;已知待办 `待处理内容.md`(内存预算);引用关系图 `docs/架构设计/引用关系图说明.md`
|
||||
- 图形走 **`draw-diagram` skill**:精确布局图(协议帧/分层/屏障)用 `tools/arch_diagram/gen_*.py` 生成器(产物放 `docs/images/`,脚本与 .svg 一并提交);拓扑图(流程/时序/状态机)用 Mermaid;**勿手绘 ASCII 框图**
|
||||
- **文件引用关系图**走 `tools/refgraph`:`& 'tools\refgraph\gen_refgraph.bat'` 生成文件级 + 模块级引用图(产物 `docs/images/引用关系图.*`,脚本与 .dot/.svg/.json 一并提交,PNG 本地预览不提交);项目文件变化后重跑更新;渲染依赖 Graphviz(winget 可装)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-09-14
|
||||
* 修改记录:
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/运行与自检记录设计说明.md §4)
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §4)
|
||||
*/
|
||||
|
||||
#ifndef SYS_LOG_H
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-09-14
|
||||
* 修改记录:
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/运行与自检记录设计说明.md §4.4)
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §4.4)
|
||||
* v1.1 2026-09-21 王建锋 消息队列改为内核启动后由 syslog_drain 惰性创建
|
||||
* (修复 osKernelStart 前创建 FreeRTOS 内核对象导致的启动失败)
|
||||
*/
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-09-14
|
||||
* 修改记录:
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/运行与自检记录设计说明.md §5.3)
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.3)
|
||||
*/
|
||||
|
||||
/* 头文件包含区 */
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-09-14
|
||||
* 修改记录:
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/运行与自检记录设计说明.md §5.3)
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.3)
|
||||
*/
|
||||
#ifndef UI_PAGE_RUNLOG_H
|
||||
#define UI_PAGE_RUNLOG_H
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-09-14
|
||||
* 修改记录:
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/运行与自检记录设计说明.md §5.4)
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.4)
|
||||
*/
|
||||
|
||||
/* 头文件包含区 */
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-09-14
|
||||
* 修改记录:
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/运行与自检记录设计说明.md §5.4)
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.4)
|
||||
*/
|
||||
#ifndef UI_PAGE_SELFTEST_H
|
||||
#define UI_PAGE_SELFTEST_H
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-09-14
|
||||
* 修改记录:
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/运行与自检记录设计说明.md §5.2)
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.2)
|
||||
*/
|
||||
|
||||
/* 头文件包含区 */
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-09-14
|
||||
* 修改记录:
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/运行与自检记录设计说明.md §5.2)
|
||||
* v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.2)
|
||||
*/
|
||||
|
||||
#ifndef UI_STANDBY_H
|
||||
|
||||
@@ -43,7 +43,7 @@ flowchart TB
|
||||
APP --> BSP --> MW --> HAL --> HW
|
||||
```
|
||||
|
||||
> 更详细的全景架构(六层分层 + 任务与就绪屏障 + 启动时序 + 存储/网络/UI 栈 + 目录组织)见 **`docs/项目架构总览.md`**。
|
||||
> 更详细的全景架构(六层分层 + 任务与就绪屏障 + 启动时序 + 存储/网络/UI 栈 + 目录组织)见 **`docs/架构设计/项目架构总览.md`**。
|
||||
|
||||
### 启动流程
|
||||
|
||||
@@ -66,14 +66,19 @@ main.c
|
||||
|
||||
### FreeRTOS 任务
|
||||
|
||||
<!-- TASK_TABLE:BEGIN generated by scripts/gen_task_table.py -->
|
||||
| 任务 | 栈大小 | 优先级 | 职责 |
|
||||
|------|--------|--------|------|
|
||||
| defaultTask | 2048 words | Normal | FTL + FatFS 挂载(一次性) |
|
||||
| netTask | 4096 words | Normal | 网络初始化 + CH395F 轮询 |
|
||||
| ftpTask | 4096 words | Normal | FTP 服务(等待网络+存储就绪) |
|
||||
| testTask | 4096 words | BelowNormal | 硬件测试入口 |
|
||||
| uiTask | 16384 words | BelowNormal | LVGL UI 界面 |
|
||||
| timeSyncTask | 2048 words | Normal | 墙钟时间同步 |
|
||||
| defaultTask | 1024 words | Normal | FTL + FatFS 挂载、配置引擎属主、syslog 唯一写者 |
|
||||
| netTask | 1024 words | Normal | 网络初始化 + CH395F 轮询 |
|
||||
| ftpTask | 1024 words | Normal | FTP 服务(等待网络+存储就绪) |
|
||||
| testTask | 2048 words | BelowNormal | 硬件测试入口 |
|
||||
| uiTask | 4096 words | BelowNormal | LVGL UI 界面 |
|
||||
| timeSyncTask | 512 words | Normal | 墙钟时间同步 |
|
||||
<!-- TASK_TABLE:END -->
|
||||
|
||||
> 上表与 `Src/freertos.c` 的 `osThreadAttr_t` 一致(2026-09-25 校准);改动栈大小前先读
|
||||
> `docs/内存管理/RAM使用分析与优化方案.md` 的定栈规则与 `docs/待处理内容.md` 的内存预算项。
|
||||
|
||||
### 任务启动顺序管理
|
||||
|
||||
@@ -153,16 +158,22 @@ STM32F4-Base/
|
||||
│ ├── ftp_speed_test.py # FTP 传输速度测试(主机端)
|
||||
│ ├── ftp_capture.py # FTP 流量抓取(主机端)
|
||||
│ └── time_sync_server.py # 时间同步推送服务(主机端)
|
||||
├── docs/ # 项目文档
|
||||
│ ├── UI 设计/ # LVGL UI:架构 / 菜单页面 / 制作流程 / 字体 / 模拟器 / 自动化测试 + mockups 样机
|
||||
├── docs/ # 项目文档(全量索引见 docs/README.md)
|
||||
│ ├── README.md # 文档索引:目录结构 + 推荐阅读顺序 + 全量清单
|
||||
│ ├── 待处理内容.md # 跨文档待办登记簿
|
||||
│ ├── 架构设计/ # 项目架构总览 / 存储架构 / 启动顺序 / 配图流程 / 引用关系图
|
||||
│ ├── 子系统设计/ # 配置 / 网络 / 墙钟 / 日志 / 运行自检记录 设计说明
|
||||
│ ├── 网络/ # BSD Socket API 使用指南 + 内部函数调用关系
|
||||
│ ├── 测试说明/ # 测试标准流程、各模块测试指南、串口助手、烧录复位
|
||||
│ ├── 代码规范/ # C 代码规范、pre-commit / cppcheck 使用说明
|
||||
│ ├── 问题记录/ # 已知陷阱与解决方案
|
||||
│ ├── 测试说明/ # 测试指南
|
||||
│ ├── 芯片手册/ # 硬件数据手册
|
||||
│ ├── 测试开发标准流程.md # 测试开发标准流程
|
||||
│ ├── 测试文档模板规范.md # 测试文档模板规范
|
||||
│ ├── 图形绘制流程.md # 文档配图绘制流程(SVG 生成器 / Mermaid 选型 / 约定 / 检查清单)
|
||||
│ └── *.md # 存储架构 / 墙钟时间 / 启动顺序等(UI 相关文档在 UI 设计/)
|
||||
│ ├── 内存管理/ # RAM 使用分析与优化方案 + 快照数据(data/)
|
||||
│ ├── 问题记录/ # 各模块 Trap Records 与专项审计
|
||||
│ ├── 审查记录/ # 项目审查报告与审计改进清单
|
||||
│ ├── 环境与部署/ # 环境搭建与部署核对清单
|
||||
│ ├── UI设计/ # LVGL UI:架构 / 菜单页面 / 制作流程 / 字体 / 模拟器 / 自动化测试 + mockups
|
||||
│ ├── 硬件平台/ # 网表分析报告与语义图
|
||||
│ ├── 芯片手册/ # 外部芯片数据手册(只读资料)
|
||||
│ └── images/ # 文档技术配图(SVG 产物,脚本生成)
|
||||
├── scripts/ # pre-commit 本地钩子脚本
|
||||
│ ├── check_coding_standard.py # 代码规范机械检查
|
||||
│ └── check_mojibake.py # U+FFFD 乱码检查
|
||||
@@ -217,7 +228,7 @@ MDK-ARM\download.bat
|
||||
|
||||
### LVGL PC 模拟器
|
||||
|
||||
PC 端 UI 开发调试(无需烧录 MCU,与 MCU 共用 `Drivers/BSP/UI/` 源码),详见 `docs/UI 设计/LVGL模拟器部署与使用说明.md`:
|
||||
PC 端 UI 开发调试(无需烧录 MCU,与 MCU 共用 `Drivers/BSP/UI/` 源码),详见 `docs/UI设计/LVGL模拟器部署与使用说明.md`:
|
||||
|
||||
```powershell
|
||||
& "simulator\build_sim.bat" # 一键构建(自动探测本机 VS2019/2022/2026 生成器)
|
||||
@@ -231,7 +242,7 @@ UI 改动回归门禁(菜单像素回归 + 内容页黄金参考 + 池水位
|
||||
.venv\Scripts\python.exe simulator/tests/check_content_pages.py
|
||||
```
|
||||
|
||||
详见 `docs/UI 设计/UI_自动化测试流程.md`。
|
||||
详见 `docs/UI设计/UI_自动化测试流程.md`。
|
||||
|
||||
## 驱动开发指南
|
||||
|
||||
@@ -370,22 +381,25 @@ pre-commit run --all-files
|
||||
|
||||
## 文档
|
||||
|
||||
> 📚 **全量文档索引见 [`docs/README.md`](docs/README.md)**(目录结构 + 推荐阅读顺序 + 按角色导航)。
|
||||
|
||||
| 文档 | 说明 |
|
||||
|------|------|
|
||||
| `docs/项目架构总览.md` | **项目全景架构**(六层分层 + 任务/就绪屏障 + 启动时序 + 存储/网络/UI 栈 + 目录组织) |
|
||||
| `docs/项目部署环境要求.md` | **部署环境要求**(开发机 / 目标板 / 网络与现场 / 远端客户端)+ 分步安装命令 + 下载来源速查 + 验收清单 |
|
||||
| `docs/STM32F4-Base存储架构说明.md` | 三层存储软件栈详解(FatFS → dhara FTL → NAND) |
|
||||
| `docs/项目启动顺序管理.md` | Event Flags 就绪屏障设计 |
|
||||
| `docs/系统墙钟时间维护说明.md` | RTC + 墙钟时间子系统 |
|
||||
| `docs/网络配置说明.md` | 网口设置页配置(UI 可改的 IP/掩码/网关/MAC:持久化 + 立即生效 + 页面操作) |
|
||||
| `docs/BSD_Socket_API_使用指南.md` | BSD Socket API 使用指南(`net_socket` / `net_select`:线程安全 / 快速开始 / TCP / UDP / I/O 多路复用 / 事件回调 / API 参考 / 常见问题) |
|
||||
| `docs/UI 设计/UI_设计架构.md` | LVGL UI 系统架构(菜单 / 内容页 / 内存预算) |
|
||||
| `docs/UI 设计/菜单页面设计.md` | 菜单导航行为、数据流与内容页设计 |
|
||||
| `docs/UI 设计/UI_界面制作流程.md` | 参考图 → 设计规格 → LVGL 代码管线(P0~P4 门禁) |
|
||||
| `docs/UI 设计/UI_中文字体生成与配置.md` | 中文字体生成与配置 |
|
||||
| `docs/UI 设计/LVGL模拟器部署与使用说明.md` | LVGL PC 模拟器部署 |
|
||||
| `docs/UI 设计/UI_自动化测试流程.md` | UI 回归门禁(脚本 + 池水位常量 + 黄金参考更新) |
|
||||
| `docs/代码规范/嵌入式C语言代码规范(V1.0).md` | C 语言代码规范 |
|
||||
| `docs/README.md` | **文档索引**(全量清单 + 阅读顺序 + 新增文档约定) |
|
||||
| `docs/架构设计/项目架构总览.md` | **项目全景架构**(六层分层 + 任务/就绪屏障 + 启动时序 + 存储/网络/UI 栈 + 目录组织) |
|
||||
| `docs/环境与部署/项目部署环境要求.md` | **部署环境要求**(开发机 / 目标板 / 网络与现场 / 远端客户端)+ 分步安装命令 + 下载来源速查 + 验收清单 |
|
||||
| `docs/架构设计/STM32F4-Base存储架构说明.md` | 三层存储软件栈详解(FatFS → dhara FTL → NAND) |
|
||||
| `docs/架构设计/项目启动顺序管理.md` | Event Flags 就绪屏障设计 |
|
||||
| `docs/子系统设计/系统墙钟时间维护说明.md` | RTC + 墙钟时间子系统 |
|
||||
| `docs/子系统设计/网络配置说明.md` | 网口设置页配置(UI 可改的 IP/掩码/网关/MAC:持久化 + 立即生效 + 页面操作) |
|
||||
| `docs/网络/BSD_Socket_API_使用指南.md` | BSD Socket API 使用指南(`net_socket` / `net_select`:线程安全 / 快速开始 / TCP / UDP / I/O 多路复用 / 事件回调 / API 参考 / 常见问题) |
|
||||
| `docs/UI设计/UI_设计架构.md` | LVGL UI 系统架构(菜单 / 内容页 / 内存预算) |
|
||||
| `docs/UI设计/菜单页面设计.md` | 菜单导航行为、数据流与内容页设计 |
|
||||
| `docs/UI设计/UI_界面制作流程.md` | 参考图 → 设计规格 → LVGL 代码管线(P0~P4 门禁) |
|
||||
| `docs/UI设计/UI_中文字体生成与配置.md` | 中文字体生成与配置 |
|
||||
| `docs/UI设计/LVGL模拟器部署与使用说明.md` | LVGL PC 模拟器部署 |
|
||||
| `docs/UI设计/UI_自动化测试流程.md` | UI 回归门禁(脚本 + 池水位常量 + 黄金参考更新) |
|
||||
| `docs/代码规范/嵌入式C语言代码规范_V1.0.md` | C 语言代码规范 |
|
||||
| `docs/代码规范/pre-commit使用说明.md` | 自动化代码审查部署与使用 |
|
||||
| `docs/代码规范/cppcheck使用说明.md` | cppcheck 规则、配置与误报抑制 |
|
||||
| `docs/测试说明/自动化测试流程.md` | 构建 → 烧录 → 串口校验闭环 |
|
||||
|
||||
@@ -0,0 +1,237 @@
|
||||
# docs/ 文档索引
|
||||
|
||||
> **定位**:本目录是 STM32F4-Base 项目的**工程文档库**——架构设计、子系统设计、测试规范、审查记录与外部资料。
|
||||
> **权威入口**:日常开发以仓库根 `AGENTS.md`(面向 AI/开发者)为第一入口;本文档提供**人类可读的全量索引与推荐阅读顺序**。
|
||||
> **约定**:目录名不含空格;新增文档必须登记到本索引(见文末「新增文档约定」)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 目录结构
|
||||
|
||||
```
|
||||
docs/
|
||||
├── README.md 本索引(阅读顺序 + 全量清单)
|
||||
├── 待处理内容.md 跨文档待办登记簿(高频入口,保留在顶层)
|
||||
├── 架构设计/ 全局架构与设计方法论
|
||||
├── 子系统设计/ 各功能子系统的设计说明
|
||||
├── 网络/ BSD Socket API 使用与内部实现
|
||||
├── 测试说明/ 测试流程、模块测试指南、工具说明
|
||||
├── 代码规范/ 编码规范与静态检查门禁
|
||||
├── 文档规范.md 本文档体系的规范(命名/链接/门禁/结构)
|
||||
├── 内存管理/ RAM 预算、分配策略与优化调研
|
||||
├── 问题记录/ 模块陷阱台账与专项审计
|
||||
├── 审查记录/ 项目审查报告与改进清单
|
||||
├── 环境与部署/ 环境搭建与部署核对清单
|
||||
├── UI设计/ UI 架构、页面设计、字体与模拟器
|
||||
├── 硬件平台/ 网表分析报告与语义图
|
||||
├── 芯片手册/ 外部芯片数据手册转录(只读资料)
|
||||
└── images/ 文档技术配图(SVG 产物,由脚本生成)
|
||||
```
|
||||
|
||||
> ⚠️ `docs/芯片手册/`(约 120 MB / 1754 张图)为**只读外部输入资料**,与代码演进无关;
|
||||
> 后续按《项目审查与优化建议报告》D-1 建议拆分独立仓库或降采样(见 `审查记录/项目审查与优化建议报告.md`)。
|
||||
|
||||
---
|
||||
|
||||
## 2. 推荐阅读顺序
|
||||
|
||||
新成员/新接手者按此顺序,可在最短时间内建立全局认知:
|
||||
|
||||
| 顺序 | 文档 | 读它能得到什么 |
|
||||
|:---:|---|---|
|
||||
| 1 | [`项目架构总览.md`](架构设计/项目架构总览.md) | 六层分层、启动时序、存储/网络/UI 三栈、目录组织 |
|
||||
| 2 | [`项目启动顺序管理.md`](架构设计/项目启动顺序管理.md) | Event Flags 就绪屏障(取代魔法延时)的任务启动模型 |
|
||||
| 3 | [`项目部署环境要求.md`](环境与部署/项目部署环境要求.md) | 开发机/目标板/现场部署的完整环境核对清单 |
|
||||
| 4 | [`项目部署环境要求.md`](环境与部署/项目部署环境要求.md) → 构建 | 跑通 `@build` / `@test`(见根 `AGENTS.md`) |
|
||||
| 5 | [`测试开发标准流程.md`](测试说明/测试开发标准流程.md) | 测试分层 L0~L3 与门禁决策表 |
|
||||
| 6 | [`嵌入式C语言代码规范_V1.0.md`](代码规范/嵌入式C语言代码规范_V1.0.md) | 命名/格式/注释规范(提交门禁强制) |
|
||||
| 7 | [`项目架构总览.md`](架构设计/项目架构总览.md) → 按需 | 进入具体子系统设计文档 |
|
||||
|
||||
**按角色**:
|
||||
- **应用/驱动开发** → §3 架构设计 → §4 子系统设计 → §6 问题记录(**改驱动前必读对应 Trap Records**)
|
||||
- **测试/验证** → §5 测试说明 → §2 环境与部署
|
||||
- **UI 开发** → §7 UI 设计 → §5 测试说明(串口助手、UI 自动化测试流程)
|
||||
- **接手/评审** → §8 审查记录 → §5 待处理内容
|
||||
|
||||
---
|
||||
|
||||
## 3. 架构设计
|
||||
|
||||
| 文档 | 内容 |
|
||||
|---|---|
|
||||
| [`项目架构总览.md`](架构设计/项目架构总览.md) | 系统全景:六层分层、启动时序、存储·网络·UI 栈、目录组织 |
|
||||
| [`STM32F4-Base存储架构说明.md`](架构设计/STM32F4-Base存储架构说明.md) | GD5F2GQ5UE SPI NAND 之上的三层存储软件栈(FTL / dhara / FatFs) |
|
||||
| [`项目启动顺序管理.md`](架构设计/项目启动顺序管理.md) | CMSIS-RTOS v2 Event Flags 就绪屏障(`SYS_EVT_NET_READY` 等) |
|
||||
| [`图形绘制流程.md`](架构设计/图形绘制流程.md) | 文档配图规范:SVG 生成器 / Mermaid 选型与检查清单 |
|
||||
| [`引用关系图说明.md`](架构设计/引用关系图说明.md) | 文件级 `#include` 引用关系图生成(`tools/refgraph`,产物 `images/`) |
|
||||
|
||||
---
|
||||
|
||||
## 4. 子系统设计
|
||||
|
||||
| 文档 | 内容 |
|
||||
|---|---|
|
||||
| [`配置文件设计说明.md`](子系统设计/配置文件设计说明.md) | `/config.ini` 配置引擎:分层、解析、持久化与旧档迁移 |
|
||||
| [`网络配置说明.md`](子系统设计/网络配置说明.md) | 网口设置页:IP/掩码/网关,UI 保存即时生效 |
|
||||
| [`系统墙钟时间维护说明.md`](子系统设计/系统墙钟时间维护说明.md) | `sys_clock`:RTC 基准、tick 回绕防护、30 天惰性再基准化 |
|
||||
| [`控制台单写者日志设计说明.md`](子系统设计/控制台单写者日志设计说明.md) | 控制台日志单写者模型(避免多任务交错输出) |
|
||||
| [`运行与自检记录设计说明.md`](子系统设计/运行与自检记录设计说明.md) | `/log/run.log`·`selftest.log` 定长记录与待机显示 |
|
||||
| [`网络/BSD_Socket_API_使用指南.md`](网络/BSD_Socket_API_使用指南.md) | **上层视图**:BSD Socket API 公开语义、示例、常见问题 |
|
||||
| [`网络/BSD_Socket_API_函数调用关系.md`](网络/BSD_Socket_API_函数调用关系.md) | **内部视图**:netTask / 消息队列 / L3 挂起 / 重试对账的调用关系与设计意图 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 测试说明
|
||||
|
||||
**总流程与规范**
|
||||
|
||||
| 文档 | 内容 |
|
||||
|---|---|
|
||||
| [`测试开发标准流程.md`](测试说明/测试开发标准流程.md) | 测试开发总流程:规划→板端套件→主机工具→门禁→沉淀;门禁决策表 |
|
||||
| [`自动化测试流程.md`](测试说明/自动化测试流程.md) | `@test` 闭环细节:命令 / 串口标记 / 失败模式 |
|
||||
| [`测试文档模板规范.md`](测试说明/测试文档模板规范.md) | 测试文档模板与命名规则(TM / TC / DP) |
|
||||
| [`链路延迟测试说明.md`](测试说明/链路延迟测试说明.md) | 网络链路时延分段定义、判定基线、执行流程 |
|
||||
|
||||
**模块测试指南**(动手写测试前先读)
|
||||
|
||||
| 文档 | 内容 |
|
||||
|---|---|
|
||||
| [`CH395F_Test_Guide.md`](测试说明/CH395F_Test_Guide.md) | CH395F 以太网控制器(硬件层 Phase 1~5 / NET 层 Phase 6~11) |
|
||||
| [`GD5F2GQ5UE_Test_Guide.md`](测试说明/GD5F2GQ5UE_Test_Guide.md) | GD5F2GQ5UE SPI NAND 存储测试 |
|
||||
| [`SD2506_Test_Guide.md`](测试说明/SD2506_Test_Guide.md) | SD2506 RTC 测试 |
|
||||
| [`FTP_Test_Guide.md`](测试说明/FTP_Test_Guide.md) | FTP 服务测试 |
|
||||
|
||||
**工具与运维**
|
||||
|
||||
| 文档 | 内容 |
|
||||
|---|---|
|
||||
| [`串口助手使用指南.md`](测试说明/串口助手使用指南.md) | 串口助手命令用法 / 工作流 / 排障 |
|
||||
| [`串口助手设计说明.md`](测试说明/串口助手设计说明.md) | 串口助手契约 / daemon 行为 / 陷阱 |
|
||||
| [`ST-LINK_CLI_复位使用说明.md`](测试说明/ST-LINK_CLI_复位使用说明.md) | 烧录 / 复位 / 回读校验(`ST-LINK_CLI` 完整用法) |
|
||||
| [`存储维护与容量恢复.md`](测试说明/存储维护与容量恢复.md) | 全片擦除恢复 dhara 坏块记账 / 容量恢复 |
|
||||
| [`m2_data/README.md`](测试说明/m2_data/README.md) · `m3_data/` | 链路时延测试采集数据(JSON 原始记录) |
|
||||
|
||||
> UI 相关测试见 [`UI设计/UI_自动化测试流程.md`](UI设计/UI_自动化测试流程.md)。
|
||||
|
||||
---
|
||||
|
||||
## 6. 代码规范 · 文档规范 · 内存管理 · 问题记录
|
||||
|
||||
### 6.1 代码规范(提交门禁相关)
|
||||
|
||||
| 文档 | 内容 |
|
||||
|---|---|
|
||||
| [`嵌入式C语言代码规范_V1.0.md`](代码规范/嵌入式C语言代码规范_V1.0.md) | 命名/格式/头文件/注释规范(含机械检查项) |
|
||||
| [`pre-commit使用说明.md`](代码规范/pre-commit使用说明.md) | 提交门禁配置、检查范围与排除项 |
|
||||
| [`cppcheck使用说明.md`](代码规范/cppcheck使用说明.md) | cppcheck 配置与告警处置 |
|
||||
|
||||
### 6.1b 文档规范(写/改文档前必读)
|
||||
|
||||
| 文档 | 内容 |
|
||||
|---|---|
|
||||
| [`文档规范.md`](文档规范.md) | **文档体系强制约定**:目录/命名(无空格)、编码换行、链接形态(互链用根相对、图片用目录相对)、`[计划]` 标记、门禁三档、结构要素与常见错误速查 |
|
||||
|
||||
### 6.2 内存管理(**新增任务/缓冲/栈前必读**)
|
||||
|
||||
| 文档 | 内容 |
|
||||
|---|---|
|
||||
| [`RAM使用分析与优化方案.md`](内存管理/RAM使用分析与优化方案.md) | **内存主文档**:占用分析、优化方案、定栈规则 |
|
||||
| [`内存内容分配策略.md`](内存管理/内存内容分配策略.md) | 各内存区(SRAM/CCM)的分配策略 |
|
||||
| [`存储栈RAM优化调研.md`](内存管理/存储栈RAM优化调研.md) | 存储栈 RAM 优化调研与结论 |
|
||||
| `data/` | `ram_report_*.md` / `stack_report_*.md` 快照数据(由 `scripts/` 生成) |
|
||||
|
||||
### 6.3 问题记录(**改驱动前必读**)
|
||||
|
||||
| 文档 | 内容 |
|
||||
|---|---|
|
||||
| [`CH395F_Trap_Records.md`](问题记录/CH395F_Trap_Records.md) | CH395F 以太网控制器陷阱台账 |
|
||||
| [`GD5F2GQ5UE_Trap_Records.md`](问题记录/GD5F2GQ5UE_Trap_Records.md) | GD5F2GQ5UE SPI NAND 陷阱台账 |
|
||||
| [`SD2506_Trap_Records.md`](问题记录/SD2506_Trap_Records.md) | SD2506 RTC 陷阱台账 |
|
||||
| [`Net层阻塞模型业界对照与演进方案.md`](问题记录/Net层阻塞模型业界对照与演进方案.md) | Net 层阻塞模型与业界方案对照 |
|
||||
| [`错误码传播审计.md`](问题记录/错误码传播审计.md) | 错误码传播缺陷审计(9 类模式 × 子系统) |
|
||||
|
||||
---
|
||||
|
||||
## 7. UI 设计
|
||||
|
||||
| 文档 | 内容 |
|
||||
|---|---|
|
||||
| [`UI_设计架构.md`](UI设计/UI_设计架构.md) | UI 分层架构、LVGL 移植要点与踩坑(I1 palette 头、dark mono 主题) |
|
||||
| [`菜单页面设计.md`](UI设计/菜单页面设计.md) | 菜单树与导航设计 |
|
||||
| [`内容页架构.md`](UI设计/内容页架构.md) | 内容页组织与渲染 |
|
||||
| [`UI_界面制作流程.md`](UI设计/UI_界面制作流程.md) | 界面制作 P0→P4 流程与 Gate 判据 |
|
||||
| [`UI_中文字体生成与配置.md`](UI设计/UI_中文字体生成与配置.md) | 中文字库生成、子集化与配置 |
|
||||
| [`UI_自动化测试流程.md`](UI设计/UI_自动化测试流程.md) | UI 模拟器像素回归(ui-verify 五步) |
|
||||
| [`LVGL模拟器部署与使用说明.md`](UI设计/LVGL模拟器部署与使用说明.md) | PC 端 LVGL 模拟器部署与使用 |
|
||||
| [`RemoDispBus协议与接收设计说明.md`](UI设计/RemoDispBus协议与接收设计说明.md) | 远端显示总线协议与接收设计 |
|
||||
| `mockups/` | 各页面参考图与说明 |
|
||||
|
||||
---
|
||||
|
||||
## 8. 审查记录 · 环境与部署 · 外部资料
|
||||
|
||||
### 8.1 审查记录
|
||||
|
||||
| 文档 | 内容 |
|
||||
|---|---|
|
||||
| [`项目审查与优化建议报告.md`](审查记录/项目审查与优化建议报告.md) | 项目全景审查:文档/代码/架构/可靠性问题清单(D-1~D-7、N-xx、Px-xx) |
|
||||
| [`项目审计改进清单.md`](审查记录/项目审计改进清单.md) | 审计待办清单(P0~P3,带状态与日期) |
|
||||
|
||||
### 8.2 环境与部署
|
||||
|
||||
| 文档 | 内容 |
|
||||
|---|---|
|
||||
| [`项目部署环境要求.md`](环境与部署/项目部署环境要求.md) | 开发机软件环境、目标板资源预算、现场部署与验收步骤 |
|
||||
|
||||
### 8.3 台账与外部资料
|
||||
|
||||
| 位置 | 内容 |
|
||||
|---|---|
|
||||
| [`待处理内容.md`](待处理内容.md) | **跨文档待办登记簿**(台架/审计发现、暂不在修复范围的事项) |
|
||||
| `硬件平台/` | 网表详细分析报告与语义图(V0.0 / V0.1) |
|
||||
| `芯片手册/` | 外部芯片数据手册转录(CH395F / GD5F2GQ5UE / SD2506 / TPAFE5160 / RTL8305NBI 等) |
|
||||
| `images/` | 文档技术配图(`.svg` 产物,由 `tools/arch_diagram/`、`tools/refgraph/` 生成) |
|
||||
|
||||
---
|
||||
|
||||
## 9. 新增文档约定
|
||||
|
||||
1. **目录归属**:按上表选目录;新子领域先建**无空格**目录名(如 `xxx设计/`),并在此索引登记。
|
||||
2. **命名**:主题词 + 类型后缀(`xxx设计说明.md` / `xxx_Test_Guide.md` / `xxx_Trap_Records.md`)。
|
||||
3. **登记**:新增文档**必须**在本文档对应章节补一行;否则视为未完成。
|
||||
4. **链接**:文档间引用统一用**仓库根相对路径**(`docs/xxx/yyy.md`),不使用 `../` 相对链接。
|
||||
5. **配图**:走 [`架构设计/图形绘制流程.md`](架构设计/图形绘制流程.md)(`draw-diagram` skill),产物统一放 `images/`,脚本与 `.svg` 一并提交。
|
||||
6. **门禁**:文档提交同样过 pre-commit(乱码 / 行尾空白 / gitlint + **文档链接存在性 `doc-links` / 任务表一致性 `task-table`**,见 [`文档规范.md`](文档规范.md) §4 与 [`代码规范/pre-commit使用说明.md`](代码规范/pre-commit使用说明.md))。
|
||||
|
||||
> **目录/文件名一律不含空格**(D-6,2026-09-25 起强制):空格会迫使脚本、链接、CI 处处加引号,
|
||||
> 且 URL 编码形态(`UI%20设计`)易被漏改。现全库已无含空格目录。
|
||||
|
||||
---
|
||||
|
||||
## 10. 已知文档问题(待清理)
|
||||
|
||||
> 来源:《项目审查与优化建议报告》D-3/D-7。
|
||||
> **D-3 / D-6 / D-7 已处理完毕**(2026-09-25):全库链接存在性检查通过(66 文档 0 失效)、任务表与
|
||||
> `Src/freertos.c` 一致、文档规范已建立。下表保留**仍需跟踪**的项。
|
||||
|
||||
| 问题 | 位置 | 说明 |
|
||||
|---|---|---|
|
||||
| 指向未实现工具 | `UI_界面制作流程.md`、`UI_自动化测试流程.md` → `tools/ui_mock/` | 文档承诺了未实现的 UI 渲染/比对工具(其引用已按 §3.3 标注「已删除」状态词) |
|
||||
| 产物缺失 | `内存管理/RAM使用分析与优化方案.md` → `scripts/ram_baseline.tsv` | 方案写了、工具未建(引用已加 `[计划]` 标记) |
|
||||
| ~~目录名含空格~~ | ~~`UI 设计/`~~ | ✅ 已修复(2026-09-25,D-6):改名为 `UI设计/`,全仓库 67 处引用同步;命名约定见 [`文档规范.md`](文档规范.md) §1 |
|
||||
| ~~缺一致性门禁~~ | — | ✅ 已落地(2026-09-25/26,D-7 三档齐):`scripts/check_doc_links.py`(存在性)+ `scripts/gen_task_table.py`(数值)+ `scripts/check_mem_numbers.py`(体积),接入 pre-commit `doc-links` / `task-table` / `mem-numbers` 钩子 |
|
||||
| ~~`docs/文档规范.md` 未创建~~ | — | ✅ 已创建(2026-09-25):[`文档规范.md`](文档规范.md) |
|
||||
|
||||
> 完整清单与建议见 [`审查记录/项目审查与优化建议报告.md`](审查记录/项目审查与优化建议报告.md) §3.3。
|
||||
|
||||
---
|
||||
|
||||
## 11. 变更记录
|
||||
|
||||
| 日期 | 变更 | 说明 |
|
||||
|---|---|---|
|
||||
| 2026-09-25 | 目录重组 + 索引建立 | 顶层 16 篇散落 md 归入 5 个新目录(`架构设计/` `子系统设计/` `网络/` `审查记录/` `环境与部署/`);全仓库 90 处引用同步;新建本索引(D-5) |
|
||||
| 2026-09-25 | D-6 目录去空格 | `docs/UI 设计/` → `docs/UI设计/`;全仓库 67 处引用同步(含 URL 编码形态 `UI%20设计`);命名约定写入 §9 |
|
||||
| 2026-09-25 | D-7 文档-代码一致性门禁 | 新建 `scripts/check_doc_links.py`(链接存在性,含行内代码豁免/就近状态词/`[计划]` 标记)、`scripts/gen_task_table.py`(任务表由 `Src/freertos.c` 生成/校验,锚点 `TASK_TABLE:BEGIN/END`);接入 pre-commit `doc-links`/`task-table` 钩子;全库 66 文档 0 失效 |
|
||||
| 2026-09-26 | D-7 体积档落地 | 新建 `scripts/check_mem_numbers.py`(内存/Flash 数字以 `.map` 为事实源,锚点 `MEM_SNAPSHOT:BEGIN/END` + 陈旧散句数字扫描);接入 pre-commit `mem-numbers` 钩子;上线即抓出 6 处真实失真(RW_IRAM1 82,048→87,040、ROM 249,432→262,660 等) |
|
||||
| 2026-09-25 | 新建 `文档规范.md` | 正式确立文档体系规范(目录命名/编码换行/链接形态/门禁/结构/写作约定);补入本索引 §6.1b |
|
||||
@@ -280,11 +280,11 @@ if (n > 0) {
|
||||
|
||||
| 主题 | 文档 |
|
||||
|---|---|
|
||||
| 网口配置(含远程显示服务自愈) | `docs/网络配置说明.md` |
|
||||
| 项目分层架构 | `docs/项目架构总览.md` |
|
||||
| 启动顺序 / 就绪屏障 | `docs/项目启动顺序管理.md` |
|
||||
| UI 设计架构 | `docs/UI 设计/UI_设计架构.md` |
|
||||
| LVGL 模拟器部署 | `docs/UI 设计/LVGL模拟器部署与使用说明.md` |
|
||||
| 网口配置(含远程显示服务自愈) | `docs/子系统设计/网络配置说明.md` |
|
||||
| 项目分层架构 | `docs/架构设计/项目架构总览.md` |
|
||||
| 启动顺序 / 就绪屏障 | `docs/架构设计/项目启动顺序管理.md` |
|
||||
| UI 设计架构 | `docs/UI设计/UI_设计架构.md` |
|
||||
| LVGL 模拟器部署 | `docs/UI设计/LVGL模拟器部署与使用说明.md` |
|
||||
| CH395F 网络测试 | `docs/测试说明/CH395F_Test_Guide.md` |
|
||||
|
||||
---
|
||||
@@ -120,7 +120,7 @@ flowchart TD
|
||||
> 推论:行通栏 144px,文字**左对齐**(左留白 4px)+ 字体自带侧边距 = 视觉留白;行尾 ▶ 右对齐(右留白 4px)。选中行整行反色(白底黑字)。
|
||||
|
||||
### 3.7 设计规格 `NN_界面名_说明.md`
|
||||
**文件**:`docs/UI 设计/mockups/NN_界面名_说明.md`(`mockups/` 目录仅存"原始参考图 + 设计规格";骨架见附录 A)
|
||||
**文件**:`docs/UI设计/mockups/NN_界面名_说明.md`(`mockups/` 目录仅存"原始参考图 + 设计规格";骨架见附录 A)
|
||||
|
||||
**规格(顺序固定)**:
|
||||
1. **布局参数表** —— 每个 px 值都列出(P1 翻译的依据,必须与验证等式自洽)+ 验证等式
|
||||
@@ -265,7 +265,7 @@ flowchart TD
|
||||
|
||||
## 七、P4:归档
|
||||
|
||||
1. 更新 `docs/UI 设计/UI_设计架构.md`:
|
||||
1. 更新 `docs/UI设计/UI_设计架构.md`:
|
||||
- 变更记录(日期 + 一行)
|
||||
- 受影响章节:文件地图 / 关键参数 / 菜单架构 / 键位语义
|
||||
2. 设计规格 `NN_界面名_说明.md` **保留**于 `mockups/`(定稿版 = 设计档案,后续改界面须先改规格再改代码)
|
||||
@@ -410,5 +410,5 @@ P4 [ ] UI_设计架构.md 变更记录更新
|
||||
| 2026-09-09 | 内容页三屏(装置信息/交流量/直流量,`ui_content_page`)落地后回填:C3 字符集 78→97 汉字(193 字形);§十 新增两坑——UI BOM 源文件 `snprintf` 中文格式串触发 C4819(改 `lv_snprintf`)、常驻动态样式池永久占用(改 `LV_STYLE_CONST_INIT` 常量样式,x64 实测省 88 B/个) |
|
||||
| 2026-09-09 | 用户密钥密码页落地后回填:C3 字符集 97→102 汉字(198 字形,补"本/用/户/密/钥");新文案走 P4 字体重生成 + `check_content_pages.py` 新增密码页 4 状态黄金参考 |
|
||||
| 2026-09-10 | 网口设置内容页落地后回填:C3 字符集 102→111 字符(208 字形,补网口设置/地址/掩码等,并修复 `lv_font_conv` 丢弃的低码位符号 U+FF0C 全角逗号 → 页脚逗号不再空白);新文案走 P4 字体重生成 + `check_content_pages.py` 新增网口设置 4 状态黄金参考(可编辑/只读/编辑光标反显/保存 OK);模拟器 `main` 调 `net_cfg_load` 使参考图显示工厂默认值 |
|
||||
| 2026-09-13 | 移除 HTML 样机阶段:五阶段 → **四阶段管线**(P0 需求录入+设计规格 / P1 规格→代码 / P2 模拟器 / P3 MCU / P4 归档);设计基准改为"规格布局参数表 + 参考图",P2 比对基准由"样机渲染图"改为"参考图 + 规格参数表"(根因分流:修代码 / 回 P0 修规格);用户视觉确认点由 HTML 浏览器移到 P2 模拟器窗口/出图;删除 `mockups/01_主界面.html`、`render_01.png`、`tools/ui_mock/render_mockup.py`,保留 `NN_说明.md` 规格与原始参考图;`NN_说明.md` 升格为唯一设计基准(P1 照参数表翻译代码,P2 出图对照参数表 + 原图);`UI_自动化测试流程.md` 门禁编号同步改为 P2/P3 |
|
||||
| 2026-09-13 | 移除 HTML 样机阶段:五阶段 → **四阶段管线**(P0 需求录入+设计规格 / P1 规格→代码 / P2 模拟器 / P3 MCU / P4 归档);设计基准改为"规格布局参数表 + 参考图",P2 比对基准由"样机渲染图"改为"参考图 + 规格参数表"(根因分流:修代码 / 回 P0 修规格);用户视觉确认点由 HTML 浏览器移到 P2 模拟器窗口/出图;删除 `mockups/01_主界面.html`、`render_01.png`、`tools/ui_mock/render_mockup.py`(**均已删除**),保留 `NN_说明.md` 规格与原始参考图;`NN_说明.md` 升格为唯一设计基准(P1 照参数表翻译代码,P2 出图对照参数表 + 原图);`UI_自动化测试流程.md` 门禁编号同步改为 P2/P3 |
|
||||
| 2026-09-14 | 运行记录/自检记录页 + 待机屏落地后回填:C3 字符集 111→122 字(217 字形,补输/入/错/误/上/电/重/芯/片/异/常——**故障描述串在非 UI 源码中 extract_cn 扫不到,须手动补字**);新文案走 P4 字体重生成 + `check_content_pages.py` pwc 态参考更新(密码错误提示);池基线 4784→5440 / 往返 4864→5520(+656B = 待机模块常驻屏+容器,见两测试脚本头部注记) |
|
||||
@@ -275,4 +275,4 @@ ENTER/→ 进子框:
|
||||
| 2026-09-09 | 内容页拆分执行(`内容页架构.md` §九 变更记录):`ui_content_page` 提纯为纯框架(描述符表 + NULL 防护 + 描述符驱动绘制/按键、4 个扩展钩子);三页数据拆出 `ui_page_device_info` / `ui_page_ac` / `ui_page_dc`(extern const 描述符对象);双端注册;Keil 0 错 0 警 + 模拟器 0 警告 + `ui-verify` 五门禁全绿(像素一致、池 4784/4864 B 不变) |
|
||||
| 2026-09-09 | 用户密钥密码页落地(首个表单/操作页,§4.7 / `内容页架构.md` §4.1):框架描述符新增 title_y/hide_deco/hide_footer/key_intercept + 新 API `ui_content_page_invalidate`;新模块 `ui_page_password`(3 数字框反显光标 + arm API);菜单受保护叶子路由(arm→开密码页,确认一致后回调**先关页再续做进入动作**);字体 97→102 汉字(198 字形);双端注册;回归扩至 7 页 + 往返水位,五门禁全绿 |
|
||||
| 2026-09-10 | 网口设置内容页(§4.7 / `内容页架构.md`):新增 `Drivers/BSP/NETCFG`(Flash 持久化 + CRC-16,工厂默认 192.168.1.100/24)+ 页面插件 `ui_page_net_cfg`(5 行动态值 + 可编辑:↑↓调字节/←→移光标/ENTER 确认,保存行 ENTER → `net_cfg_save` 下次上电生效);框架新增钩子 `init_cb` + API `ui_content_page_selected_row`;`net_init` 增 `mac` 参数、netTask 等 `SYS_EVT_STORAGE_READY` → `net_cfg_load` → `net_init(ip,mask,gw,mac)` → 回写实际 MAC 影子;字体 102→111 字符(208 字形,修复低码位符号丢失);双端注册;回归扩至 11 页,五门禁全绿 |
|
||||
| 2026-09-14 | 运行记录/自检记录内容页 + 待机显示模块:新增 `App/log/sys_log`(定长 64B 文本记录引擎,MCU 落 NAND `/log/run.log`、`/log/selftest.log`,FTP 可直下)+ 页面插件 `ui_page_runlog` / `ui_page_selftest`(动态列表:count_cb + refresh,每条 2 行时间戳/描述)+ `ui_standby`(空闲超时自动切待机屏,仅确认键回菜单);密码页错误提示"密码输入错误"+清空重输;字体 111→122 字(217 字形);详见 `docs/运行与自检记录设计说明.md` |
|
||||
| 2026-09-14 | 运行记录/自检记录内容页 + 待机显示模块:新增 `App/log/sys_log`(定长 64B 文本记录引擎,MCU 落 NAND `/log/run.log`、`/log/selftest.log`,FTP 可直下)+ 页面插件 `ui_page_runlog` / `ui_page_selftest`(动态列表:count_cb + refresh,每条 2 行时间戳/描述)+ `ui_standby`(空闲超时自动切待机屏,仅确认键回菜单);密码页错误提示"密码输入错误"+清空重输;字体 111→122 字(217 字形);详见 `docs/子系统设计/运行与自检记录设计说明.md` |
|
||||
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
@@ -432,7 +432,7 @@ python tools/menu_gen/gen_menu.py
|
||||
## 四、显示规范:横向级联子框模型
|
||||
|
||||
> **本章是显示层(§五)要实现的"图纸"**:讲"页"(每级的子项列表)在**屏上怎么摆**——每级一个**框**,贴靠在其**父框右侧**——一棵**横向的树**(往右生长)。
|
||||
> 以下规则由参考图 02~07(`docs/UI 设计/mockups/`)逐像素实测得出(设备 px,误差 ≤3px);参考图为**手工 mockup**,与实现的偏差见 §8.2 注 5。
|
||||
> 以下规则由参考图 02~07(`docs/UI设计/mockups/`)逐像素实测得出(设备 px,误差 ≤3px);参考图为**手工 mockup**,与实现的偏差见 §8.2 注 5。
|
||||
|
||||
### 4.1 总览
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# cppcheck C 静态分析 — 使用说明
|
||||
|
||||
> 本文档是 `docs/pre-commit使用说明.md` 的配套详解,聚焦 cppcheck 钩子的检查规则、配置参数与误报抑制方法。
|
||||
> pre-commit 的整体部署架构与其他钩子规则见 `docs/pre-commit使用说明.md`。
|
||||
> 本文档是 `docs/代码规范/pre-commit使用说明.md` 的配套详解,聚焦 cppcheck 钩子的检查规则、配置参数与误报抑制方法。
|
||||
> pre-commit 的整体部署架构与其他钩子规则见 `docs/代码规范/pre-commit使用说明.md`。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -17,7 +17,10 @@ git commit
|
||||
├─ check-yaml 校验 YAML 语法
|
||||
├─ cppcheck C 静态分析(自有代码)
|
||||
├─ no-mojibake 阻止 U+FFFD 乱码文件
|
||||
└─ coding-standard C 代码规范检查(规范V1.0 可机械校验项)
|
||||
├─ coding-standard C 代码规范检查(规范V1.0 可机械校验项)
|
||||
├─ doc-links 文档链接存在性(D-3/D-7,.md)
|
||||
├─ task-table FreeRTOS 任务表一致性(D-2/D-7)
|
||||
└─ mem-numbers 内存/Flash 数字一致性(D-7 体积档)
|
||||
└─ commit-msg(.git/hooks/commit-msg)
|
||||
└─ gitlint 校验 commit message 格式
|
||||
```
|
||||
@@ -26,12 +29,15 @@ git commit
|
||||
|
||||
### 依赖清单
|
||||
|
||||
| 组件 | 安装方式 | 用途 |
|
||||
| 依赖 组件 | 安装方式 | 用途 |
|
||||
|---|---|---|
|
||||
| pre-commit 4.6.2 | `uv tool install pre-commit` | 钩子框架 |
|
||||
| cppcheck 2.21.0 | `winget install cppcheck` | C 静态分析引擎 |
|
||||
| scripts/check_mojibake.py | 随仓库提交 | U+FFFD 乱码检测(纯 Python,无依赖) |
|
||||
| scripts/check_coding_standard.py | 随仓库提交 | 代码规范检查(纯 Python,无依赖) |
|
||||
| scripts/check_doc_links.py | 随仓库提交 | 文档链接存在性检查(纯 Python,无依赖) |
|
||||
| scripts/gen_task_table.py | 随仓库提交 | FreeRTOS 任务表生成/校验(纯 Python,无依赖) |
|
||||
| scripts/check_mem_numbers.py | 随仓库提交 | 内存/Flash 数字一致性(纯 Python,无依赖) |
|
||||
|
||||
> **PATH 要求**:cppcheck 安装后需在系统 PATH 中(`C:\Program Files\Cppcheck`)。winget 自动写入 User PATH,但当前终端不会立即生效,需**重开终端**。
|
||||
|
||||
@@ -114,7 +120,7 @@ cppcheck 是开源 C/C++ 静态分析工具,**不运行代码**,通过语法
|
||||
|
||||
### 2.8 coding-standard — C 代码规范检查
|
||||
|
||||
依据 `docs/代码规范/嵌入式C语言代码规范(V1.0).md`,用 `scripts/check_coding_standard.py` 对**可机械化校验**的规则做提交前拦截(纯 Python 正则扫描,无依赖)。
|
||||
依据 `docs/代码规范/嵌入式C语言代码规范_V1.0.md`,用 `scripts/check_coding_standard.py` 对**可机械化校验**的规则做提交前拦截(纯 Python 正则扫描,无依赖)。
|
||||
|
||||
| 项 | 说明 |
|
||||
|---|---|
|
||||
@@ -149,7 +155,77 @@ cppcheck 是开源 C/C++ 静态分析工具,**不运行代码**,通过语法
|
||||
|
||||
**排除文件**(与 cppcheck 钩子范围一致,另加):`Src/`、`Inc/`(CubeMX 生成,重新生成即覆盖)、`Drivers/BSP/GD5F2GQ5UE/nand_ftl.*`(dhara/FatFS 接口适配层,函数名由外部 API 固定)。
|
||||
|
||||
### 2.9 gitlint — Commit Message 格式
|
||||
### 2.9 doc-links — 文档链接存在性(D-3/D-7)
|
||||
|
||||
用 `scripts/check_doc_links.py` 校验 Markdown 文档里引用的仓库内路径是否真实存在(纯 Python 标准库,无依赖)。
|
||||
|
||||
| 项 | 说明 |
|
||||
|---|---|
|
||||
| **触发条件** | 改动任意 `.md` 文件,且其中链接指向不存在的仓库内路径 |
|
||||
| **处理方式** | **阻止提交**(改路径,或按规范加 `[计划]` / 状态词) |
|
||||
| **检查范围** | `[文本](相对路径)` 链接(相对当前文档解析)+ 反引号内 `` `docs/xxx.md` `` 仓库根相对路径 |
|
||||
| **典型报错** | `[示例] docs/架构设计/图形绘制流程.md:73 [markdown 链接] images/RemoDispBus帧格式.svg` |
|
||||
|
||||
**豁免**(不算失效):`[计划]` 前缀;该行含 `[示例]` 标记(引用报错样例/日志片段时用);引用**附近 ±40 字符**内的状态词(未创建/尚未创建/已删除/待排期);占位符(`*`、`<模块>`、`NN_`、`${...}`);**行内代码 span 里的链接写法**(`` 这类语法示例);外部 URL 与纯锚点;`docs/芯片手册/` 等外部资料目录。
|
||||
|
||||
**排除文件**:`.opencode/node_modules/`、`Lib/lvgl/`、`simulator/`、`MDK-ARM/RTE/`、`docs/芯片手册/`。
|
||||
|
||||
```powershell
|
||||
# 全库扫描(开发时自检)
|
||||
& '.venv\Scripts\python.exe' scripts/check_doc_links.py --all
|
||||
```
|
||||
|
||||
> 规范依据:[`docs/文档规范.md`](../文档规范.md) §3(链接规范)、§4(门禁)。
|
||||
|
||||
### 2.10 task-table — FreeRTOS 任务表一致性(D-2/D-7)
|
||||
|
||||
用 `scripts/gen_task_table.py` 以 `Src/freertos.c` 的 `osThreadAttr_t` 为**唯一事实源**,校验 `README.md` / `AGENTS.md` 中的任务表是否同步(防止改栈后文档失真——2026-09 曾两张表都比源码落后一大截)。
|
||||
|
||||
| 项 | 说明 |
|
||||
|---|---|
|
||||
| **触发条件** | 改动 `README.md` / `AGENTS.md` / `Src/freertos.c`,且受管表格区与源码不一致 |
|
||||
| **处理方式** | **阻止提交**;跑 `--write` 由脚本自动重写表格 |
|
||||
| **受管区** | `<!-- TASK_TABLE:BEGIN generated by scripts/gen_task_table.py -->` ~ `<!-- TASK_TABLE:END -->` 之间 |
|
||||
| **典型报错** | `[FAIL] 以下文档的任务表与 Src/freertos.c 不一致:README.md` |
|
||||
|
||||
```powershell
|
||||
& '.venv\Scripts\python.exe' scripts/gen_task_table.py --check # 检查(钩子用)
|
||||
& '.venv\Scripts\python.exe' scripts/gen_task_table.py --write # 自动同步表格
|
||||
& '.venv\Scripts\python.exe' scripts/gen_task_table.py --diff # 只看期望表格
|
||||
```
|
||||
|
||||
> ⚠️ **改栈流程**:先改 `Src/freertos.c` → 跑 `--write` 同步文档 → 提交。钩子报不一致时**不要手改表格**。
|
||||
> 脚本按原换行符 / BOM 状态回写,不会造成整文件行尾漂移。
|
||||
|
||||
### 2.11 mem-numbers — 内存/Flash 数字一致性(D-7 体积档)
|
||||
|
||||
用 `scripts/check_mem_numbers.py` 以 `.map` 为**唯一事实源**,校验文档里的内存/Flash 数字。
|
||||
文档中手抄的 `RW_IRAM1 82,048 B / 62.6%` 这类数字会随代码变化而失真——实测 2026-09-26 复核时
|
||||
文档仍写 `82,048 / 62.6%`,实际 `.map` 已是 `87,040 / 66.4%`。
|
||||
|
||||
| 项 | 说明 |
|
||||
|---|---|
|
||||
| **触发条件** | 改动 `docs/内存管理/*.md` / `App`·`Src`·`Inc` 源码 / 本脚本 |
|
||||
| **处理方式** | **阻止提交**;受管区跑 `--write` 自动同步;散句陈旧数字需人工复核 |
|
||||
| **受管区** | `<!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py -->` ~ `<!-- MEM_SNAPSHOT:END -->` |
|
||||
| **典型报错** | `[FAIL] 以下文档的内存快照与 .map 不一致:docs/内存管理/RAM使用分析与优化方案.md` |
|
||||
| **前置** | 需存在 `.map`(`@build` 产物);缺失时脚本报 `[FAIL] 找不到 .map 事实源` 并提示先构建 |
|
||||
|
||||
```powershell
|
||||
& '.venv\Scripts\python.exe' scripts/check_mem_numbers.py --scan # 钩子用(含陈旧散句扫描)
|
||||
& '.venv\Scripts\python.exe' scripts/check_mem_numbers.py --write # 同步受管快照
|
||||
& '.venv\Scripts\python.exe' scripts/check_mem_numbers.py --diff # 只看期望快照
|
||||
```
|
||||
|
||||
**陈旧数字扫描**:从 `docs/内存管理/data/ram_report_*.md` 历史快照提取「曾为区域用量、现已变化」
|
||||
的值,正文若仍以现状口吻引用即告警。含「历史/旧/曾/快照/`data/`/实施时」等词的行使行豁免;
|
||||
讲任务栈/内存池/峰值水位的行也跳过(数字语义不同)。
|
||||
|
||||
> ⚠️ **设计取舍**:朴素"扫所有 4~7 位数字"实测 **45 处误报**(栈配置 `4096`、堆 `49,152`、
|
||||
> 峰值 `1184` 都是合法值)。改为"只报历史快照里出现的、当前已变的区域值"后 **0 误报**。
|
||||
> 宁可窄而准——吵的门禁会被绕过。
|
||||
|
||||
### 2.12 gitlint — Commit Message 格式
|
||||
|
||||
| 项 | 说明 |
|
||||
|---|---|
|
||||
@@ -187,7 +263,7 @@ git commit -m "修复网络超时重连逻辑"
|
||||
|---|---|---|
|
||||
| trailing-whitespace | `Fixing xxx.c` → 需要重新 `git add` | 钩子已自动修复文件,`git add` 后重新提交 |
|
||||
| end-of-file-fixer | 同上 | 同上 |
|
||||
| cppcheck | 报 warning/performance/portability/style | 根据报告修复代码;误报用行内抑制或 `--suppress`(详见 `docs/cppcheck使用说明.md`)|
|
||||
| cppcheck | 报 warning/performance/portability/style | 根据报告修复代码;误报用行内抑制或 `--suppress`(详见 `docs/代码规范/cppcheck使用说明.md`)|
|
||||
| no-mojibake | `U+FFFD replacement chars found` | 从 git 历史恢复干净版本(不可逆!) |
|
||||
| coding-standard | `L行号 [Sx x.x.x] 规则说明` | 按违规项修复(命名加前缀/大写化、补函数注释、sprintf 改 snprintf 等) |
|
||||
| gitlint | `Title exceeds max length` | 精简 commit message 标题 |
|
||||
@@ -272,12 +348,16 @@ $env:PATH = [Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [Env
|
||||
|
||||
| 文件 | 位置 | 说明 |
|
||||
|---|---|---|
|
||||
| `.pre-commit-config.yaml` | 仓库根 | 钩子配置(8 个钩子 + 1 个预留) |
|
||||
| `.pre-commit-config.yaml` | 仓库根 | 钩子配置(12 个钩子 + 1 个预留) |
|
||||
| `.gitlint` | 仓库根 | gitlint 规则(宽松,兼容中文) |
|
||||
| `scripts/check_mojibake.py` | scripts/ | U+FFFD 检测脚本 |
|
||||
| `scripts/check_coding_standard.py` | scripts/ | 代码规范检查脚本(规范 V1.0 可机械校验项) |
|
||||
| `docs/代码规范/嵌入式C语言代码规范(V1.0).md` | docs/代码规范/ | 代码规范原文(S1~S19 规则来源) |
|
||||
| `scripts/check_doc_links.py` | scripts/ | 文档链接存在性检查(D-3/D-7) |
|
||||
| `scripts/gen_task_table.py` | scripts/ | FreeRTOS 任务表生成/校验(D-2/D-7) |
|
||||
| `scripts/check_mem_numbers.py` | scripts/ | 内存/Flash 数字一致性(D-7 体积档) |
|
||||
| `docs/代码规范/嵌入式C语言代码规范_V1.0.md` | docs/代码规范/ | 代码规范原文(S1~S19 规则来源) |
|
||||
| `docs/代码规范/cppcheck使用说明.md` | docs/代码规范/ | cppcheck 钩子详解(规则/配置/抑制) |
|
||||
| `docs/文档规范.md` | docs/ | 文档体系规范(链接形态/命名/门禁要求) |
|
||||
| `docs/代码规范/pre-commit使用说明.md` | 本文档 | 部署与使用说明 |
|
||||
|
||||
---
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
- F407 另有 **64KB CCM RAM**:**已于 2026-09-21 启用**并把 FreeRTOS 堆迁入(§1.2)
|
||||
- 起步时没有任何运行时测量手段:不知道每个任务实际用了多少栈,改栈全靠拍脑袋
|
||||
|
||||
当前状态(2026-09-21,`data/ram_report_20260921.md` + `data/stack_report_20260921.md`):RW_IRAM1 **82,048 / 131,072 B(62.6%)**、RW_CCM **49,184 / 65,536 B(75.0%)**、6 个任务栈全部 PASS(ftpTask 余量 71%,§0.6)。
|
||||
当前状态(**以 §2.1 受管快照为准**,由 `.map` 自动生成):RW_IRAM1 **87,040 / 131,072 B(66.4%)**、RW_CCM **49,184 / 65,536 B(75.0%)**、6 个任务栈全部 PASS(ftpTask 余量 71%,§0.6)。
|
||||
|
||||
本方案三个目标:
|
||||
|
||||
@@ -30,12 +30,26 @@
|
||||
|
||||
### 2.1 总预算
|
||||
|
||||
| 区域 | 大小 | 当前使用(2026-09-21 最新) | 来源 |
|
||||
> **本表由 `.map` 自动生成,勿手改**——改代码后跑 `python scripts/check_mem_numbers.py --write` 同步;
|
||||
> 提交时 pre-commit `mem-numbers` 钩子会校验一致性(见 `docs/文档规范.md` §4)。
|
||||
|
||||
<!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py -->
|
||||
| 区域 | 用量 | 容量 | 占比 |
|
||||
|---|---|---|---|
|
||||
| 主 SRAM (0x20000000) | 128KB | 静态 82,048 B(80.1 KB / **62.6%**,余 49,024 B) | scatter `STM32F407-Demo.sct:22`(RW_IRAM1 Max 0x20000) |
|
||||
| CCM SRAM (0x10000000) | 64KB | 49,184 B(**75.0%**,FreeRTOS 堆 2026-09-21 迁入,§1.2;余 16,352 B) | scatter `STM32F407-Demo.sct:25`;RM0090 §3.1.1 |
|
||||
| FreeRTOS 堆 (heap_4) | 48KB(49,152 B) | 装栈 + 队列 + 余量;**位于 RW_CCM**(实测 `free=8,784 / min_ever=4,848` B) | `Inc/FreeRTOSConfig.h:71` `configTOTAL_HEAP_SIZE` |
|
||||
| C 库堆/栈 (startup) | 512B / 1KB | 启动期 main() 用 | map `startup_stm32f407xx.o` HEAP/STACK 节 |
|
||||
| ER_IROM1 | 261,932 B (255.79 KB) | 1,048,576 B (1024 KB) | 25.0% |
|
||||
| RW_IRAM1 | 87,040 B (85.00 KB) | 131,072 B (128 KB) | 66.4% |
|
||||
| RW_CCM | 49,184 B (48.03 KB) | 65,536 B (64 KB) | 75.0% |
|
||||
| **Flash (ROM 合计)** | **262,660 B (256.5 KB)** | 1,048,576 B (1024 KB) | **25.0%** |
|
||||
<!-- MEM_SNAPSHOT:END -->
|
||||
|
||||
各区的容量与常量来源:
|
||||
|
||||
| 项 | 说明 | 来源 |
|
||||
|---|---|---|
|
||||
| 主 SRAM (0x20000000) | 128 KB(RW_IRAM1 Max `0x20000`) | scatter `STM32F407-Demo.sct:22` |
|
||||
| CCM SRAM (0x10000000) | 64 KB;FreeRTOS 堆于 2026-09-21 迁入(§1.2) | scatter `STM32F407-Demo.sct:25`;RM0090 §3.1.1 |
|
||||
| FreeRTOS 堆 (heap_4) | 48 KB(49,152 B),**位于 RW_CCM**;实测 `free=8,784 / min_ever=4,848` B | `Inc/FreeRTOSConfig.h:71` `configTOTAL_HEAP_SIZE` |
|
||||
| C 库堆/栈 (startup) | 512 B / 1 KB,启动期 main() 用 | map `startup_stm32f407xx.o` HEAP/STACK 节 |
|
||||
|
||||
### 2.2 静态大项排行(2026-09-21 当前,完整台账 `data/ram_report_20260921.md`)
|
||||
|
||||
@@ -60,7 +74,8 @@
|
||||
|
||||
**RW_CCM(CCM)**:`heap_4.o` 49,184 B(FreeRTOS 堆 49,152 B + RW 32 B)——2026-09-21 由主 SRAM 迁入(§1.2),不再计入主 SRAM。
|
||||
|
||||
**静态合计(2026-09-21,map Grand Totals)**:RW_IRAM1 **82,048 B(80.1 KB / 128 KB,62.6%)** + RW_CCM **49,184 B(75.0% / 64 KB)** = **131,232 B(RW+ZI)**。
|
||||
**静态合计(以 §2.1 受管快照为准)**:RW_IRAM1 **87,040 B(85.00 KB / 128 KB,66.4%)** + RW_CCM **49,184 B(48.03 KB / 64 KB,75.0%)** = **136,224 B(RW+ZI)**。
|
||||
> 历史(2026-09-21):RW_IRAM1 82,048 B(62.6%)+ RW_CCM 49,184 B = 131,232 B。
|
||||
|
||||
> **DMA 可达性**:第 4/6/7 项(NAND FTL、CH395F SPI2、GD5F BBT)为 DMA 缓冲,**必须留在主 SRAM**、禁止迁 CCM/SRAM3——权威清点与规则见 `内存内容分配策略.md`(本文不重复)。
|
||||
> 2026-09-11 历史排行(`heap_4.o` 49,152 B 尚在 SRAM1、静态合计 122.7 KB 的旧布局)见 `data/ram_report_20260911.md`,仅供回溯。
|
||||
@@ -100,7 +115,7 @@
|
||||
|
||||
量化补充(来源:2026-09-11 审计快照,口径与方法见 §8.4):
|
||||
|
||||
- 两池(FreeRTOS 48KB + LVGL 40KB)曾占主 SRAM 的 **68%**,是当时"SRAM 几乎耗尽(95.4%,余 5.8KB)"的直接原因;**堆迁 CCM 后该结构性压力已解除**(现 RW_IRAM1 62.6%)
|
||||
- 两池(FreeRTOS 48KB + LVGL 40KB)曾占主 SRAM 的 **68%**,是当时"SRAM 几乎耗尽(95.4%,余 5.8KB)"的直接原因;**堆迁 CCM 后该结构性压力已解除**(现 RW_IRAM1 66.4%,见 §2.1)
|
||||
- heap_4 **不合并相邻空闲块** → 长期运行需盯碎片,`min_ever`(现 4,848 B)是硬指标而非 `free`
|
||||
- 未映射资源:SRAM3 64KB(scatter 未映射;clone 芯片可能无此区);CCM 已用
|
||||
- 曾经的三条中风险项:新任务无处安置(已缓解)、堆碎片(仍存)、栈溢出检测缺失 → **已于阶段 0 开启 `configCHECK_FOR_STACK_OVERFLOW=2` 并实测抓到过溢出**(§0.1)
|
||||
@@ -141,14 +156,17 @@
|
||||
| C 库堆 | 512 B | `Heap_Size EQU 0x200` → **自研代码禁用 C 库 `malloc`**(AGENTS.md 铁律;lftpd 的 `malloc` 隐患见 §2.4-1 与阶段 2.1) |
|
||||
| C 库代码(Flash) | ~4.2 KB | printf / 浮点 / 字符串 |
|
||||
|
||||
#### 2.6.4 Flash 1 MB 分布(2026-09-21)
|
||||
#### 2.6.4 Flash 1 MB 分布
|
||||
|
||||
| 段 | 大小 (B) | 占比 |
|
||||
| 段 | 大小 (B) | 占比(对 1 MB) |
|
||||
|---|---|---|
|
||||
| Code (inc. data) | 234,976 | 22.4% |
|
||||
| RO Data | 13,824 | 1.3% |
|
||||
| RW 初值 | 632 | — |
|
||||
| **合计 ROM** | **249,432** | **23.8%**(余 ~780 KB) |
|
||||
| Code (inc. data) | 246,456 | 23.5% |
|
||||
| RO Data | 15,476 | 1.5% |
|
||||
| RW 初值 | 728 | — |
|
||||
| **合计 ROM** | **262,660** | **25.0%**(余 ~786 KB) |
|
||||
|
||||
> 本表随代码变化;权威数字与占比见 §2.1 受管快照(`ER_IROM1` / **Flash (ROM 合计)** 行)。
|
||||
> 历史快照:2026-09-21 为 Code 234,976 / RO 13,824 / 合计 ROM 249,432(23.8%)。
|
||||
|
||||

|
||||
|
||||
@@ -390,7 +408,7 @@ ISR 余量:该任务运行期间可能被中断打断的最深中断链(SPI/
|
||||
| `lftpd_log.c:9` `lftpd_log_internal` | 256 | 深层日志点 |
|
||||
|
||||
- **结果**:ftpTask 实测峰值 **3480 → 1184 B**(余量 616 → **2912 B / 71%**,判定 PASS);静态调用图 2528 → 472 B;帧宽榜中 lftpd 全部退出前 15。
|
||||
- **代价**:静态 BSS **+4,616 B**(RW_IRAM1 77,432 → 82,048 B / 128 KB,余量仍 ~48 KB;CCM 与 Flash 不变)。
|
||||
- **代价(2026-09-21 实施时)**:静态 BSS **+4,616 B**(RW_IRAM1 77,432 → 82,048 B / 128 KB;CCM 与 Flash 不变)。
|
||||
- **验证**:`@build` 0/0 → 烧录 → `@test` PASS → `ftp_up_dl_test.py` 10/10 PASS + `ftp_speed_test.py --size 128` 逐字节一致(功能与搬迁前完全一致,反证无别名/重入问题)。
|
||||
- **结论:原 ① 方案(ftpTask 涨到 1600 words)不再需要**,栈保持 1024 words(4096 B)。
|
||||
|
||||
@@ -428,10 +446,10 @@ ISR 余量:该任务运行期间可能被中断打断的最深中断链(SPI/
|
||||
|
||||
## 5. 预期效果
|
||||
|
||||
| 项目 | 现状(2026-09-21 实测) | 剩余项全部落地后(1.1/1.3/1.5/2.2) |
|
||||
| 项目 | 现状(2026-09-21 实测,**主 SRAM 数字已随代码更新,以 §2.1 为准**) | 剩余项全部落地后(1.1/1.3/1.5/2.2) |
|
||||
|---|---|---|
|
||||
| 主 SRAM 静态占用 | 82,048 B / 128KB(62.6%) | **~27KB / 128KB**(LVGL 池 + UI 缓冲迁 CCM、`ui_net_sink` 关) |
|
||||
| 主 SRAM 余量 | 49,024 B(47.9KB) | **~101KB** |
|
||||
| 主 SRAM 静态占用 | 87,040 B / 128KB(66.4%) | **~27KB / 128KB**(LVGL 池 + UI 缓冲迁 CCM、`ui_net_sink` 关) |
|
||||
| 主 SRAM 余量 | 44,032 B(43.0KB) | **~101KB** |
|
||||
| CCM 使用 | 49,184 B / 64KB(75.0%,FreeRTOS 堆) | ~56KB / 64KB(堆 32K + 池 16K + UI 缓冲 + BBT) |
|
||||
| 任务栈合计 | 38,912 B(38.0KB) | ~21.5KB(§1.3 修正目标) |
|
||||
| FreeRTOS 堆 | 49,152 B(`free=8,784 / min_ever=4,848` B) | 32,768 B(余 ≥8KB,全负载验证) |
|
||||
|
||||
@@ -386,4 +386,4 @@ PC 端 `python test/time_sync_server.py` 每 `interval` 秒推送一次,epoch
|
||||
|------|------|
|
||||
| 2026-09-15 | v1.3:① `sys_clock_get` 30 天惰性再基准化——修复 49.7 天墙钟回绕(§3/§7/§12);② `sys_clock_init` 检查 RTC 读返回值/写回复验,失败降级为默认时间基准并返回 -1——激活"时钟芯片异常"自检(§5/§6/§9);③ 修正未初始化哨兵判断(§12-6);④ 时间同步任务启动/Socket 占用描述同步为事件屏障 + 单连接实现(§15);⑤ 新增日志串用 ASCII——本机 ARMCC 按 CP936 解读无 BOM 源文件,奇数汉字字符串会吞掉结束引号致编译失败(见 AGENTS.md 编码铁律) |
|
||||
|
||||
*文档依据 `App/util/sys_clock.c` / `App/time_sync.c` 实现与《嵌入式C语言代码规范(V1.0)》整理。*
|
||||
*文档依据 `App/util/sys_clock.c` / `App/time_sync.c` 实现与《嵌入式C语言代码规范_V1.0》整理。*
|
||||
@@ -81,7 +81,7 @@ mac=00:00:00:00:00:00
|
||||
- **保存(外科手术式)**:注释 / 未知段 / 未知键逐行保留,受管键按 RAM 副本原位改写、缺失键补写;写盘 = 临时文件 `/config.TMP` + `f_rename` 原子替换(掉电不损坏目标文件)。
|
||||
- **外部变更自动重载**(P4 阶段接入):2s 轮询检测 (size, mtime) 变化、4s 沉降(连续 2 次轮询稳定)后重载 `[network]` 段并重建网络——FTP 上传编辑后的文件无需重启即生效。
|
||||
|
||||
完整设计(引擎 / 双端 / 并发模型 D15)见 `docs/配置文件设计说明.md`。
|
||||
完整设计(引擎 / 双端 / 并发模型 D15)见 `docs/子系统设计/配置文件设计说明.md`。
|
||||
|
||||
### 3.2 旧版档迁移(首启)
|
||||
|
||||
@@ -255,9 +255,9 @@ ENTER 进入选中地址行 → `↑/↓` 调活动字节(0..255 **环绕**)
|
||||
|---|---|
|
||||
| CH395F 已知陷阱 | `docs/问题记录/CH395F_Trap_Records.md` |
|
||||
| 网络测试指南 | `docs/测试说明/CH395F_Test_Guide.md` |
|
||||
| 启动顺序 / 就绪屏障 | `docs/项目启动顺序管理.md` |
|
||||
| 项目分层架构 | `docs/项目架构总览.md` |
|
||||
| 内容页框架(含网口设置页) | `docs/UI 设计/内容页架构.md` |
|
||||
| 启动顺序 / 就绪屏障 | `docs/架构设计/项目启动顺序管理.md` |
|
||||
| 项目分层架构 | `docs/架构设计/项目架构总览.md` |
|
||||
| 内容页框架(含网口设置页) | `docs/UI设计/内容页架构.md` |
|
||||
|
||||
---
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
> **版本**:v1.1(已实施)
|
||||
> **日期**:2026-09-14
|
||||
> **状态**:S1–S9 全部完成——双端构建 0/0、`--logtest` PASS、ui-verify 五门禁全绿;真机 @test 待上电回归(§8.2)
|
||||
> **关联文档**:`项目架构总览.md` · `STM32F4-Base存储架构说明.md` · `系统墙钟时间维护说明.md` · `UI 设计/内容页架构.md`(如存在)· `docs/UI 设计/mockups/`(待机显示页面.jpg / 运行记录页.jpg / 自检记录页.jpg / 密码页面实际机器的示例图片.jpg)
|
||||
> **关联文档**:`项目架构总览.md` · `STM32F4-Base存储架构说明.md` · `系统墙钟时间维护说明.md` · `UI设计/内容页架构.md`(如存在)· `docs/UI设计/mockups/`(待机显示页面.jpg / 运行记录页.jpg / 自检记录页.jpg / 密码页面实际机器的示例图片.jpg)
|
||||
|
||||
## 1. 背景与需求
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
| 日志行格式与时间戳 | syslog(RFC 5424):一行一条记录;TIMESTAMP 采用 **ISO 8601/RFC 3339**(`YYYY-MM-DDTHH:MM:SS[.frac][Z]`,机器可读、字典序可排序);MSG 用 UTF-8。本设计取空格变体 `YYYY-MM-DD HH:MM:SS`(与既有 `sys_clock_get_str` 输出一致),另附 epoch 秒字段供程序化解析 | RFC 5424 §6.2.3/§6.4(datatracker.ietf.org/doc/html/rfc5424) |
|
||||
| 写入模型 | Linux printk:消息先进 **RAM 环形缓冲**,由**专用线程**异步刷持久存储;热路径禁止同步 I/O。本设计对应"RAM 待发队列 + defaultTask 单写者落盘" | kernel.org/doc/html/latest/core-api/printk-basics.html |
|
||||
| FatFs 追加语义 | `FA_OPEN_APPEND`(= FA_WRITE\|FA_SEEKEND):打开即定位 EOF,文件不存在则创建;配合 `f_lseek(fp, FILE_SIZE)` 可取文件大小。本设计每条记录一次 `f_open→f_write(64B)→f_close` | 工程内 `Lib/FatFs/ff.h:399`、`ff.c:3871`(与官方文档一致) |
|
||||
| NAND 写入代价 | dhara FTL 已做磨损均衡;FAT32 下每次小追加约消耗 1 个簇(4KB)。本场景**写频率极低**(每上电 1~N 条、故障才写),簇开销与磨损可接受;以文件容量上限约束增长 | `docs/STM32F4-Base存储架构说明.md` §6.3 + GD5F 驱动参数 |
|
||||
| NAND 写入代价 | dhara FTL 已做磨损均衡;FAT32 下每次小追加约消耗 1 个簇(4KB)。本场景**写频率极低**(每上电 1~N 条、故障才写),簇开销与磨损可接受;以文件容量上限约束增长 | `docs/架构设计/STM32F4-Base存储架构说明.md` §6.3 + GD5F 驱动参数 |
|
||||
|
||||
**选型结论**:纯文本、**定长 64B 记录、一行一条**(ISO 时间戳 + epoch + UTF-8 描述);追加写 + 容量上限截断;RAM 队列 + 单写者任务落盘。
|
||||
不选变长行(需扫描计数/解析,掉电半行难界定);不选二进制格式(违背 R5 FTP 直读)。
|
||||
@@ -141,7 +141,7 @@ mac=00:00:00:00:00:00
|
||||
|
||||
### 4.1 分层
|
||||
|
||||

|
||||

|
||||
|
||||
### 4.2 模块清单
|
||||
|
||||
@@ -502,7 +502,7 @@ void adc_cfg_init(void)
|
||||
| **P4** | 轮询 + D15 协议 + 测试标记 | `net_task.c`(沉降去抖轮询 + 落盘收敛 + 串口标记)、`lftpd.c`(STOR tmp+rename) | `@build`;`@test` 启动新标记(`cfg file: loaded OK` 等);FTP 上传无半截可见(rename 原子) |
|
||||
| **P5** ✅ 2026-09-14 | 模拟器迁移 | `simulator/sim/cfg_file_store_sim.c`(新)、删 `net_cfg_store_sim.c`、`simulator/main.c`(2s 轮询 + `--cfgtest` 自检)、`CMakeLists.txt` | sim 构建 0 警告 + 4 场景无头 PASS(工厂 / 有效旧档迁移 / 无效旧档保留 / UI 无头);`sim_netcfg.bin` 自动迁移 + 轮询沉降重载 + 外科保存无损回环 —— **已实测通过** |
|
||||
| **P6** | 文档同步 | `网络配置说明.md`(§0/3/6/7 重写)、`AGENTS.md`、`README.md`、`项目架构总览.md` + `gen_arch_svg.py`、`内容页架构.md`、BSD 指南、`simulator/README.md`、`ui_page_net_cfg.c` 头注释、`docs/测试说明/` | pre-commit 全绿;全库无"Flash"旧表述残留 |
|
||||
| **P7** | FTP 闭环脚本 | `test/ftp_config_test.py`(新)+ 测试说明 | 真机闭环 PASS(§11.2) |
|
||||
| **P7** | FTP 闭环脚本 | `[计划] test/ftp_config_test.py`(尚未创建,见 §11.2 设计稿)+ 测试说明 | 真机闭环 PASS(§11.2) |
|
||||
| **P8** | 总回归 + 提交 | `@build` + `@test` + 模拟器 ui-verify + `pre-commit --all-files` | 0 错误 0 警告;全 PASS |
|
||||
|
||||
**建议提交边界**:C1 = P2+P3(FS 线程安全 + 配置引擎)/ C2 = P4+P5(网络配置迁移 + 模拟器)/ C3 = P6+P7(文档 + 测试脚本);P8 发现的收尾问题并入最近一次提交。
|
||||
@@ -522,7 +522,7 @@ void adc_cfg_init(void)
|
||||
|
||||
既有标记不变:`App init OK` / `Network Init` / `net init: OK`;Forbidden:`FAIL` / `ERROR` / `HardFault`。
|
||||
|
||||
### 11.2 FTP 闭环脚本(`test/ftp_config_test.py`,`.venv` python,stdlib ftplib)
|
||||
### 11.2 FTP 闭环脚本(`[计划] test/ftp_config_test.py`,尚未创建,以下为设计稿;`.venv` python,stdlib ftplib)
|
||||
|
||||
```
|
||||
1. 登录(按 FTP 测试说明的约定)
|
||||
@@ -9,7 +9,7 @@
|
||||
| 审查方式 | 静态审查 + 链接图(.map)量化分析 + 构建脚本/门禁核对;**未做上机动态验证**(除特别标注外) |
|
||||
| 目标 | 结构合理性、文档分布合理性、模块设计合理性、改进路线图、内存优化、UI 标准化 |
|
||||
|
||||
> **与既有文档的关系**:本报告不重复 `docs/项目审计改进清单.md`(逐条缺陷台账)与 `docs/内存管理/RAM使用分析与优化方案.md`(内存专项方案),而是做**体系层评审 + 量化补强 + 新增发现**。新增发现统一编号 `N-xx`,已在台账中的条目按 `P1-x/P2-x/P3-x` 引用。
|
||||
> **与既有文档的关系**:本报告不重复 `docs/审查记录/项目审计改进清单.md`(逐条缺陷台账)与 `docs/内存管理/RAM使用分析与优化方案.md`(内存专项方案),而是做**体系层评审 + 量化补强 + 新增发现**。新增发现统一编号 `N-xx`,已在台账中的条目按 `P1-x/P2-x/P3-x` 引用。
|
||||
|
||||
> **落地进展(2026-09-18)**:**N-01 已修复**(L0 方案,台账 `P0-1`)——`cfg_file_store` 后端新增 `cfg_store_alloc/cfg_store_free/cfg_store_heap_free`,MCU 端落到 FreeRTOS 堆(`pvPortMalloc`),共享核心 C 库分配符号清零 + 编译期堆峰值预算 + 四条失败路径上报自检记录。双端 0 错 0 警、`--cfgtest` PASS;map 复核 `malloc.o` 已不参与链接且 `Removing startup_stm32f407xx.o(HEAP), (512 bytes)`,**SRAM1 由 126,584 B / 96.6%(余 4,488 B)降到 126,064 B / 96.2%(余 5,008 B)**。本报告其余内存数字仍以修复前的 2026-09-16 map 为基线,逐条换算时扣 512 B 即可;真机 `@test` 正向确认仍待执行。
|
||||
|
||||
@@ -143,9 +143,9 @@ Select-String -Path 'MDK-ARM\STM32F407-Demo\STM32F407-Demo.map' -Pattern '__heap
|
||||
|
||||
**评价**:AGENTS.md 已把"新文件必须注册两处"写成铁律并有 `new-source-file` skill,但**缺少反向校验**("存在但未注册")。这是纯粹的机械检查缺口。
|
||||
|
||||
**建议(S-3,1 小时工作量)**:新增 `scripts/check_registration.py`,规则:
|
||||
**建议(S-3,1 小时工作量)**:新增 `[计划] scripts/check_registration.py`,规则:
|
||||
1. `App/**.c`、`Drivers/BSP/**.c`(排除 `*_sim.c`、`*_mcu.c` 之外的模式白名单)必须同时出现在 uvprojx 与 CMakeLists;
|
||||
2. 例外必须写进 `scripts/registration_allowlist.txt` 并注明原因(如"待 RS485 协议启用");
|
||||
2. 例外必须写进 `[计划] scripts/registration_allowlist.txt` 并注明原因(如"待 RS485 协议启用");
|
||||
3. 挂入 pre-commit 的 `local` hooks(与 `no-mojibake` 同列)。
|
||||
这样 §2.3 的 5 个文件会立刻变成"要么注册、要么显式豁免"。
|
||||
|
||||
@@ -190,7 +190,7 @@ graph TD
|
||||
| `docs/` 合计 | 652 | **47.19 MB** | **60.3%** |
|
||||
| └ `docs/芯片手册/images` | 564 张 JPG | **40.5 MB** | **51.7%** |
|
||||
| └ `docs/images/引用关系图.json` | 1 | 1,052 KB | 1.3% |
|
||||
| └ `docs/UI 设计/mockups` | 15 | 1,110 KB | 1.4% |
|
||||
| └ `docs/UI设计/mockups` | 15 | 1,110 KB | 1.4% |
|
||||
| `.git` pack | — | 46.6 MB | — |
|
||||
| 工程文档(Markdown,自研) | 40 | 14,124 行 | — |
|
||||
| 外部资料(Markdown,datasheet 转录) | 16 | 59,142 行 | — |
|
||||
@@ -203,7 +203,7 @@ graph TD
|
||||
### 3.2 做得好的(应保留并显式制度化)
|
||||
|
||||
1. **文档密度与可执行性**:每篇都带"步骤 + 判据"(如 UI 制作流程有 P0→P4 Gate);测试说明按模块拆分并给出预期串口标记,可直接接 `@test`。
|
||||
2. **陷阱台账**:`docs/问题记录/*_Trap_Records.md` + `docs/项目审计改进清单.md`(P1-1..P3-13,带 ✅ 状态与日期)——这是本工程最有价值的资产,多数嵌入式项目没有。
|
||||
2. **陷阱台账**:`docs/问题记录/*_Trap_Records.md` + `docs/审查记录/项目审计改进清单.md`(P1-1..P3-13,带 ✅ 状态与日期)——这是本工程最有价值的资产,多数嵌入式项目没有。
|
||||
3. **图与脚本同提交**:`tools/arch_diagram/`、`tools/refgraph/` 生成器 + 产物入库,图可再生而非手绘。
|
||||
4. **UI 设计资产链完整**:原始参考图 → 说明 md → 代码,可追溯。
|
||||
|
||||
@@ -214,7 +214,7 @@ graph TD
|
||||
**影响**:clone 慢、备份慢、code review 时 diff 噪音大;`docs/芯片手册/` 的 564 张图属于**只读输入资料**,与代码演进无关。
|
||||
|
||||
**建议**(三选一,按代价递增):
|
||||
1. **最省**:把 564 张 JPG 降采样到长边 1,200 px(40.5 MB → 约 8 MB),一次性提交并在 `docs/文档规范.md` 写入"入库图片上限 200 KB/张";
|
||||
1. **最省**:把 564 张 JPG 降采样到长边 1,200 px(40.5 MB → 约 8 MB),一次性提交并在 `[计划] docs/文档规范.md` 写入"入库图片上限 200 KB/张";
|
||||
2. **推荐**:`docs/芯片手册/` 拆为独立仓库 `dtu-datasheets`,用 `git submodule` 挂回原路径(现有全部链接不需改写);
|
||||
3. **最正**:Git LFS(需要托管端支持)。
|
||||
|
||||
@@ -225,6 +225,7 @@ graph TD
|
||||
**建议**:
|
||||
- 立即修正(一次性);
|
||||
- **根治**:任务表由脚本从 `Src/freertos.c` 解析生成,README/AGENTS 引用同一生成块(`scripts/gen_task_table.py` 输出 Markdown 片段,pre-commit 校验一致性)。这与 §7 的"文档-代码一致性门禁"合并实施。
|
||||
> ✅ **2026-09-25 已处理**:README 任务表已修正为 `1024/1024/1024/2048/4096/512`;两表均改为**受管生成区**(锚点 `<!-- TASK_TABLE:BEGIN/END -->`),`scripts/gen_task_table.py` 以 `Src/freertos.c` 的 `osThreadAttr_t` 为唯一事实源生成 / 校验(`--check` / `--write` / `--diff`),pre-commit `task-table` 钩子拦截漂移。改栈流程写入 `docs/文档规范.md` §4.2。
|
||||
|
||||
#### D-3(P1)约 18 条断链(目录搬迁与工具未落地导致)
|
||||
|
||||
@@ -233,29 +234,34 @@ graph TD
|
||||
| 类型 | 代表位置 | 说明 |
|
||||
|------|---------|------|
|
||||
| 目录搬迁遗留 | `docs/测试说明/{FTP,GD5F2GQ5UE,SD2506}_Test_Guide.md`、`测试开发标准流程.md:358`、`问题记录/CH395F_Trap_Records.md:434` | 仍指旧路径(`docs/` 根下) |
|
||||
| 路径片段错误 | `docs/代码规范/cppcheck使用说明.md:3`、`docs/配置文件设计说明.md:159/160/494/568-570` | 相对层级算错或文件已改名 |
|
||||
| 路径片段错误 | `docs/代码规范/cppcheck使用说明.md:3`、`docs/子系统设计/配置文件设计说明.md:159/160/494/568-570` | 相对层级算错或文件已改名 |
|
||||
| **指向不存在的工具** | `UI_界面制作流程.md:413`、`UI_自动化测试流程.md:104` → `tools/ui_mock/` | **文档承诺了未实现的 UI 渲染/比对工具**(§6.5 golden 回归的前置件) |
|
||||
| **指向不存在的产物** | `docs/内存管理/RAM使用分析与优化方案.md:172/279/136` → `scripts/ram_baseline.tsv`、`docs/内存管理/RAM预算台账.md`、`App/util/app_mem_stats.*` | 方案写了、工具没建 → 读者按文档执行会失败 |
|
||||
| **指向不存在的产物** | `docs/内存管理/RAM使用分析与优化方案.md:172/279/136` → `[计划] scripts/ram_baseline.tsv`、`[计划] docs/内存管理/RAM预算台账.md`、`[计划] App/util/app_mem_stats.*` | 方案写了、工具没建 → 读者按文档执行会失败 |
|
||||
| 目标路径变更 | `图形绘制流程.md:135`(真实目标在 `docs/images/`)、`串口助手设计说明.md:200` | |
|
||||
|
||||
**建议**:新增 `scripts/check_doc_links.py`(校验仓库内相对链接与代码引用路径),挂 pre-commit;对"计划中的文件"统一用 `[计划]` 前缀标记而非直接链接,避免门禁长期红灯。
|
||||
|
||||
#### D-4(P2)孤儿文档
|
||||
|
||||
`docs/内存管理/内存使用分析规划.md` 无任何入链(项目自有文档中唯一孤儿)。**建议**:并入 `RAM使用分析与优化方案.md` 的"规划"章节,或在 `docs/README.md` 索引中显式列出。
|
||||
`内存管理/内存使用分析规划.md` 无任何入链(项目自有文档中唯一孤儿)。**建议**:并入 `RAM使用分析与优化方案.md` 的"规划"章节,或在 `docs/README.md` 索引中显式列出。
|
||||
> ✅ **2026-09-21 已处理**:该文档与《STM32F4-Base 内存使用分析报告》一并并入 `RAM使用分析与优化方案.md`(现为内存管理主文档),两个文件已删除;口径与方法论见其 §8.4,快照数据见 `docs/内存管理/data/`。
|
||||
|
||||
#### D-5(P2)缺一个文档入口/索引
|
||||
|
||||
`docs/` 根下平铺 12 篇 md + 8 个子目录,无 `docs/README.md` 索引;权威入口实际是 `AGENTS.md`(面向 agent)与 `docs/项目架构总览.md`。**新成员的阅读顺序不可见**。
|
||||
`docs/` 根下平铺 12 篇 md + 8 个子目录,无 `docs/README.md` 索引;权威入口实际是 `AGENTS.md`(面向 agent)与 `docs/架构设计/项目架构总览.md`。**新成员的阅读顺序不可见**。
|
||||
|
||||
**建议**:新建 `docs/README.md`,按"上手 → 架构 → 模块 → 测试 → 规范 → 台账 → 外部资料"给出有序清单(约 60 行即可),并从 README.md 链接过去。
|
||||
> ✅ **2026-09-25 已处理**:已建 `docs/README.md`(目录结构树 + 推荐阅读顺序 + 按角色导航 + 9 大章节全量清单 + 新增文档约定 + 已知问题),并从根 `README.md` 链接过去。同轮把顶层 16 篇散落 md 归入 5 个新目录(`架构设计/`/`子系统设计/`/`网络/`/`审查记录/`/`环境与部署/`),全仓库 90 处引用同步。
|
||||
|
||||
#### D-6(P2)命名与目录约定不统一
|
||||
|
||||
中文目录名含空格(`docs/UI 设计/`)在脚本/链接/CI 中易出错(本工程已出现多处需引号包裹的路径);同一目录混用 `UI_界面制作流程.md`(下划线+中文)与 `内容页架构.md`(纯中文)与 `RemoDispBus协议与接收设计说明.md`(中英连写)。
|
||||
中文目录名含空格(`docs/UI设计/`)在脚本/链接/CI 中易出错(本工程已出现多处需引号包裹的路径);同一目录混用 `UI_界面制作流程.md`(下划线+中文)与 `内容页架构.md`(纯中文)与 `RemoDispBus协议与接收设计说明.md`(中英连写)。
|
||||
|
||||
**建议**:确立 `docs/文档规范.md`:目录名一律**无空格**(`UI设计` 或 `ui`)、文件名"主题词+类型"、`snake_case` 用于英文段;新增文档必须出现在 `docs/README.md`。存量文档按 D-3 修链接时**顺带**重命名,一次做完。
|
||||
> ✅ **2026-09-25 已处理**:
|
||||
> - **目录去空格**:`docs/UI 设计/` → `docs/UI设计/`,全仓库 67 处引用同步(含 markdown 链接的 URL 编码形态 `UI%20设计`);现全库**已无含空格目录**。
|
||||
> - **`docs/文档规范.md` 已创建**:正式确立目录命名(无空格)、文件名风格(主题词+类型后缀 + 明确禁止字符)、编码换行、链接形态、门禁三档、结构要素、写作约定与常见错误速查。
|
||||
> - **文件名风格统一**:按 §1.2 约定复核 `docs/` 全部文件(见规范 §1.2);`内容页架构.md` 等纯中文名保留(符合"主题词+类型"约定,未强制加下划线),仅纠正违反"无空格/无敏感字符"者。
|
||||
|
||||
#### D-7(P2)文档与代码之间没有一致性门禁
|
||||
|
||||
@@ -268,6 +274,12 @@ D-2/D-3 的共同根因:**没有任何机械检查**保证"文档说的 = 代
|
||||
| 数值 | 任务栈/优先级/端口/引脚表与代码一致 | `gen_task_table.py` + 端口常量表提取 |
|
||||
| 体积 | 文档中引用的"内存/Flash 数字"与最新 map 一致 | 复用 `scripts/ram_report.py` 输出 |
|
||||
|
||||
> ✅ **2026-09-25 / 09-26 已处理(三档全部落地)**:
|
||||
> - **存在性**:`scripts/check_doc_links.py` 已落地并接入 pre-commit `doc-links` 钩子。校验 md 互链(相对文档解析)与反引号内仓库根相对路径;豁免 `[计划]` 前缀、`[示例]` 标记、就近状态词、占位符、行内代码 span、外部 URL。全库 **67 文档 0 失效**。开发过程中实测抓出 **7 处迁移漏改的图片相对链接**(`images/` 未改 `../images/`)与 1 处真断链(`tools/ui_mock/render_mockup.py`,已标「已删除」)——门禁价值实证。
|
||||
> - **数值**:`scripts/gen_task_table.py` 以 `Src/freertos.c` 为唯一事实源生成/校验 README/AGENTS 任务表,pre-commit `task-table` 钩子拦截。
|
||||
> - **体积**(2026-09-26):`scripts/check_mem_numbers.py` 以 `.map` 为唯一事实源,校验 `docs/内存管理/` 的受管快照区(`MEM_SNAPSHOT` 锚点)+ 扫描正文里的**陈旧区域数字**,pre-commit `mem-numbers` 钩子拦截。**上线即抓出真实失真**:文档写 `RW_IRAM1 82,048 B / 62.6%`、`ROM 249,432 / 23.8%`,实际 `.map` 已是 `87,040 / 66.4%`、`262,660 / 25.0%`(共修正 6 处)。
|
||||
> - 文档体系规范(含门禁三档、受管区锚点、陈旧数字扫描的误报取舍)正式确立为 `docs/文档规范.md`。
|
||||
|
||||
### 3.4 文档结论
|
||||
|
||||
**内容质量高、分布形态差**。按 D-1..D-7 处理后可从 B- 提升到 A-:工程量约 1 人日(不含拆仓),收益是 clone 时间与"文档可信度"。
|
||||
@@ -353,7 +365,7 @@ D-2/D-3 的共同根因:**没有任何机械检查**保证"文档说的 = 代
|
||||
| B(最稳) | 改**静态缓冲**:`static uint8_t s_cfg_in[CFG_FILE_MAX_LEN+1]` + `s_cfg_out[CFG_OUT_MAX]`。属主已收敛到 defaultTask 单任务 → 无并发风险 | 但当前 SRAM1 只剩 4,488 B,**放不下 9 KB** → 必须与 §5.3 的 CCM 迁移或 LVGL 池收缩一起做 |
|
||||
| C | 提高 `Heap_Size` 或 retarget `_sys_heap` 到 `pvPortMalloc` | 512 B 是 MicroLIB 的兜底(`printf` 内部也会用);单独放大不解决"两套堆"的根本问题 |
|
||||
|
||||
> **实施记录(2026-09-18,按方案 A 落地,两处必要调整)**:① 分配接口**不写在 `cfg_file.c` 里,而是加到 `cfg_file_store` 后端**(`cfg_store_alloc` / `cfg_store_free` / `cfg_store_heap_free`)——`cfg_file.c` 是双端共享源码,直接写 `pvPortMalloc` 会让 PC 模拟器断链;MCU 后端 = `pvPortMalloc/vPortFree`,模拟器后端 = `malloc/free`。② 编译期峰值约束改用 **typedef 负数组**(`CFG_HEAP_BUDGET = 10,240 B`)——ARMCC 5 只到 C99,**没有 `_Static_assert`**(方案 A 原文此处需修正)。③ 另补 4 条失败路径的 `syslog_post(SYSLOG_SELFTEST, …)` 与 `load: OK …, heap free NB` 实测行。台账:`docs/项目审计改进清单.md` **P0-1**;设计文档:`docs/配置文件设计说明.md` §6.2/§8 + v1.11。
|
||||
> **实施记录(2026-09-18,按方案 A 落地,两处必要调整)**:① 分配接口**不写在 `cfg_file.c` 里,而是加到 `cfg_file_store` 后端**(`cfg_store_alloc` / `cfg_store_free` / `cfg_store_heap_free`)——`cfg_file.c` 是双端共享源码,直接写 `pvPortMalloc` 会让 PC 模拟器断链;MCU 后端 = `pvPortMalloc/vPortFree`,模拟器后端 = `malloc/free`。② 编译期峰值约束改用 **typedef 负数组**(`CFG_HEAP_BUDGET = 10,240 B`)——ARMCC 5 只到 C99,**没有 `_Static_assert`**(方案 A 原文此处需修正)。③ 另补 4 条失败路径的 `syslog_post(SYSLOG_SELFTEST, …)` 与 `load: OK …, heap free NB` 实测行。台账:`docs/审查记录/项目审计改进清单.md` **P0-1**;设计文档:`docs/子系统设计/配置文件设计说明.md` §6.2/§8 + v1.11。
|
||||
|
||||
> **诚实标注**:本结论由静态分析得出(映射表 + 启动文件 + 调用图三重证据),**尚未上机确认**。`test/verify_log.ps1:34-35` 的 Forbidden 标记含 `FAIL`,而失败路径会打印 `read: malloc 4097B FAIL` / `template: malloc 5120B FAIL`,因此**一次 `@test` 即可判定**(若近期 `@test` 曾 PASS,需先确认当时是否真的进入了文件读取分支,例如 `/config.ini` 不存在或大小为 0)。**(2026-09-18 已按上述实施;修复后的真机 `@test` 正向确认——`load: OK` 出现且 `FAIL` 零命中——仍待执行。)**
|
||||
|
||||
@@ -509,8 +521,8 @@ D-2/D-3 的共同根因:**没有任何机械检查**保证"文档说的 = 代
|
||||
### 5.5 内存治理长效机制
|
||||
|
||||
1. **`scripts/ram_report.py` 升级为门禁**:超阈值(如 SRAM1 > 92%)即失败,并在 PR 描述里自动附 Top-10 对象表。
|
||||
2. **建立 `scripts/ram_baseline.tsv`**(`docs/内存管理/RAM使用分析与优化方案.md:172` 已承诺但未创建):每次构建记录 Code/RO/RW/ZI/Top 对象,形成趋势。
|
||||
3. **RAM 预算台账**(同上,文档已承诺 `docs/内存管理/RAM预算台账.md`):按子系统配额(网络 12 KB / 存储 12 KB / UI 16 KB / RTOS 48 KB / 应用 8 KB),超配额必须先申请。
|
||||
2. **建立 `[计划] scripts/ram_baseline.tsv`**(`docs/内存管理/RAM使用分析与优化方案.md:172` 已承诺但未创建):每次构建记录 Code/RO/RW/ZI/Top 对象,形成趋势。
|
||||
3. **RAM 预算台账**(同上,文档已承诺 `[计划] docs/内存管理/RAM预算台账.md`):按子系统配额(网络 12 KB / 存储 12 KB / UI 16 KB / RTOS 48 KB / 应用 8 KB),超配额必须先申请。
|
||||
4. **DMA 可达性清单**(新增,源于 N-11):文档化"哪些缓冲必须 SRAM1",并在 CCM 迁移时对该清单加 `_Static_assert`/地址断言(`assert((addr & 0xFFF00000) == 0x20000000)`)。
|
||||
5. **禁止新增 C 库 `malloc`**(源于 N-01):写进 `docs/代码规范/`,并在 `check_coding_standard.py` 加正则检查(`App/`、`Drivers/` 内出现 `malloc(` 即告警)。
|
||||
|
||||
@@ -618,8 +630,8 @@ const ui_page_desc_t ui_page_deadzone = UI_FORM_PAGE("遥测死区", s_items_dea
|
||||
产物:`ui_page_registry.c` 含 `node_index → (page_id, archetype, desc*)` 常量表 + `ui_page_registry_for(node)`;`ui_menu.c` 只需一次调用。生成器同时校验:`@page` 指向的描述符是否存在、是否有节点声明了页但无实例、是否有实例未被任何节点引用(编译期断言或生成期报错)。
|
||||
|
||||
**闭环门禁(1 天)**:
|
||||
1. `scripts/check_registration.py`(同 §2.3 S-3)保证新页面两端都注册;
|
||||
2. **golden 回归落地**(补上文档承诺的 `tools/ui_mock/`):利用现成的 **PC 模拟器**做渲染基线——`simulator` 增加 `--shot <page> <out.bin>`(已有 `--standby shot.bin` 先例)导出 1bpp 帧,Python 脚本转 PNG 并与 `docs/UI 设计/baseline/*.png` 逐像素比对,差异 > 0 即 FAIL。这样 `UI_界面制作流程.md:413` 与 `UI_自动化测试流程.md:104` 的引用由"空头承诺"变成可执行门禁;
|
||||
1. `[计划] scripts/check_registration.py`(同 §2.3 S-3)保证新页面两端都注册;
|
||||
2. **golden 回归落地**(补上文档承诺的 `tools/ui_mock/`):利用现成的 **PC 模拟器**做渲染基线——`simulator` 增加 `--shot <page> <out.bin>`(已有 `--standby shot.bin` 先例)导出 1bpp 帧,Python 脚本转 PNG 并与 `docs/UI设计/baseline/*.png` 逐像素比对,差异 > 0 即 FAIL。这样 `UI_界面制作流程.md:413` 与 `UI_自动化测试流程.md:104` 的引用由"空头承诺"变成可执行门禁;
|
||||
3. 字符集自动校验:构建前扫描所有 `ui_*.c` 中的汉字,与 `ui_cn_chars.txt` 求差集,缺失即 FAIL(把 `font-regen` 从"记得跑"变成"漏跑就红")。
|
||||
|
||||
### 6.4 UI 侧的内存纪律(必须写进规范)
|
||||
@@ -685,15 +697,15 @@ UI 剩余页面批量落地(U5)、目录级层次迁移(S-1 的物理搬
|
||||
|
||||
| 交付物 | 类型 | 来源条目 |
|
||||
|--------|------|---------|
|
||||
| `scripts/check_registration.py` | 新脚本 + pre-commit hook | S-3 / N-06 |
|
||||
| `[计划] scripts/check_registration.py` | 新脚本 + pre-commit hook | S-3 / N-06 |
|
||||
| `scripts/check_doc_links.py` | 新脚本 + pre-commit hook | D-3 |
|
||||
| `scripts/gen_task_table.py` | 文档一致性生成器 | D-2 / D-7 |
|
||||
| `scripts/ram_baseline.tsv` + `docs/内存管理/RAM预算台账.md` | 文档承诺落地 | §5.5 |
|
||||
| `[计划] scripts/gen_task_table.py` | 文档一致性生成器 | D-2 / D-7 |
|
||||
| `[计划] scripts/ram_baseline.tsv` + `[计划] docs/内存管理/RAM预算台账.md` | 文档承诺落地 | §5.5 |
|
||||
| `Drivers/BSP/UI/ui_tokens.h` | 令牌层 | U1 |
|
||||
| `Drivers/BSP/UI/ui_w_{list,kv,records,form,msgbox,title}.{c,h}` | 组件库(需双端注册) | U2/U3 |
|
||||
| `tools/menu_gen/gen_menu.py` 扩展 + `ui_page_registry.c` 生成 | 生成器 | U3 |
|
||||
| `tools/ui_mock/{render_mockup.py,i1_to_png.py}` + `docs/UI 设计/baseline/` | golden 回归 | U4 |
|
||||
| `docs/内存管理/DMA可达性清单.md` | 规范(含"哪些缓冲禁止进 CCM") | N-11 |
|
||||
| `tools/ui_mock/{render_mockup.py,i1_to_png.py}` + `docs/UI设计/baseline/` | golden 回归 | U4 |
|
||||
| `[计划] docs/内存管理/DMA可达性清单.md` | 规范(含"哪些缓冲禁止进 CCM") | N-11 |
|
||||
| `docs/README.md`(文档索引) | 文档 | D-5 |
|
||||
|
||||
---
|
||||
@@ -724,15 +736,15 @@ UI 剩余页面批量落地(U5)、目录级层次迁移(S-1 的物理搬
|
||||
| 文件:行 | 失效链接 | 处置 |
|
||||
|---------|---------|------|
|
||||
| `docs/代码规范/cppcheck使用说明.md:3` | 相对路径层级错误 | 改 `../` 层级 |
|
||||
| `docs/配置文件设计说明.md:159,160,494,568,569,570` | 指向已改名/搬迁文件 | 逐项改指 `net_cfg.c`/`cfg_file_store.h` 等 |
|
||||
| `docs/子系统设计/配置文件设计说明.md:159,160,494,568,569,570` | 指向已改名/搬迁文件 | 逐项改指 `net_cfg.c`/`cfg_file_store.h` 等 |
|
||||
| `docs/测试说明/FTP_Test_Guide.md`、`GD5F2GQ5UE_Test_Guide.md`、`SD2506_Test_Guide.md` | 目录搬迁遗留(旧 `docs/` 根路径) | 改新相对路径 |
|
||||
| `docs/测试说明/测试开发标准流程.md:358` | 同上 | 同上 |
|
||||
| `docs/问题记录/CH395F_Trap_Records.md:434` | 同上 | 同上 |
|
||||
| `docs/UI 设计/UI_界面制作流程.md:413` | `tools/ui_mock/`(不存在) | 与 U4 一并实现,或标注 `[计划]` |
|
||||
| `docs/UI 设计/UI_自动化测试流程.md:104` | 同上 | 同上 |
|
||||
| `docs/内存管理/RAM使用分析与优化方案.md:136,172,279` | `App/util/app_mem_stats.*`、`scripts/ram_baseline.tsv`、`docs/内存管理/RAM预算台账.md`(均不存在) | 随 §5.5 创建;未创建前标 `[计划]` |
|
||||
| `docs/UI设计/UI_界面制作流程.md:413` | `tools/ui_mock/`(不存在) | 与 U4 一并实现,或标注 `[计划]` |
|
||||
| `docs/UI设计/UI_自动化测试流程.md:104` | 同上 | 同上 |
|
||||
| `docs/内存管理/RAM使用分析与优化方案.md:136,172,279` | `[计划] App/util/app_mem_stats.*`、`[计划] scripts/ram_baseline.tsv`、`[计划] docs/内存管理/RAM预算台账.md`(均不存在) | 随 §5.5 创建;未创建前标 `[计划]` |
|
||||
| `docs/测试说明/串口助手设计说明.md:200` | 目标路径变更 | 改指现路径 |
|
||||
| `docs/图形绘制流程.md:135` | 目标实际在 `docs/images/` | 改路径 |
|
||||
| `docs/架构设计/图形绘制流程.md:135` | 目标实际在 `docs/images/` | 改路径 |
|
||||
|
||||
## 附录 C 评审中确认"无需改动"的设计(避免后续误改)
|
||||
|
||||
@@ -748,4 +760,4 @@ UI 剩余页面批量落地(U5)、目录级层次迁移(S-1 的物理搬
|
||||
|
||||
---
|
||||
|
||||
**报告结束。** 建议把 §7 的 P0 六条直接追加进 `docs/项目审计改进清单.md`(沿用其编号体系,本报告编号 `N-01…N-18` 作为交叉引用),并把 §5/§6 的落地项写进 `docs/内存管理/RAM预算台账.md` 与 `docs/文档规范.md`。
|
||||
**报告结束。** 建议把 §7 的 P0 六条直接追加进 `docs/审查记录/项目审计改进清单.md`(沿用其编号体系,本报告编号 `N-01…N-18` 作为交叉引用),并把 §5/§6 的落地项写进 `[计划] docs/内存管理/RAM预算台账.md` 与 `[计划] docs/文档规范.md`。
|
||||
@@ -0,0 +1,255 @@
|
||||
# 文档规范
|
||||
|
||||
> **适用对象**:本仓库 `docs/` 下的全部 Markdown 文档,以及根目录 `README.md`、`AGENTS.md`。
|
||||
> **强制程度**:§1~§6 为**强制**(pre-commit 机械校验,违反即拦截提交);§7~§8 为**约定**(评审时人工把关)。
|
||||
> **相关文档**:[`README.md`](README.md)(文档索引)、[`代码规范/pre-commit使用说明.md`](代码规范/pre-commit使用说明.md)(钩子清单)、[`架构设计/图形绘制流程.md`](架构设计/图形绘制流程.md)(配图流程)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 目录与命名
|
||||
|
||||
### 1.1 目录
|
||||
|
||||
| 规则 | 说明 |
|
||||
|---|---|
|
||||
| **目录名一律不含空格** | 空格迫使脚本/链接/CI 处处加引号,且 URL 编码形态(`UI%20设计`)极易被漏改(D-6,2026-09-25 起强制;全库已无含空格目录) |
|
||||
| **按领域归入子目录** | 顶层不放散落 `.md`;新领域先建无空格子目录,再在 [`README.md`](README.md) 登记 |
|
||||
| 现有目录 | `架构设计/` `子系统设计/` `网络/` `测试说明/` `代码规范/` `内存管理/` `问题记录/` `审查记录/` `环境与部署/` `UI设计/` `硬件平台/` `芯片手册/` `images/` |
|
||||
|
||||
### 1.2 文件名
|
||||
|
||||
| 规则 | 说明 |
|
||||
|---|---|
|
||||
| **不含空格** | 同目录规则 |
|
||||
| **主题词 + 类型后缀** | `xxx设计说明.md` / `xxx_Test_Guide.md` / `xxx_Trap_Records.md` / `xxx使用说明.md` |
|
||||
| 中英混排 | 中文主题词直接写(如 `系统墙钟时间维护说明.md`);含专有名词/缩写可用下划线连接(如 `BSD_Socket_API_使用指南.md`) |
|
||||
| 只用 ASCII 与中文 | **不含** `()【】〔〕` 等全角括号、不含 `&`、`?`、`*`、`<`、`>`、`|`、`:`、`"`、`\` 等路径敏感字符 |
|
||||
| 版本号写法 | 版本后缀用下划线连接,**不用全角括号**:`xxx_V1.0.md`(✅)/ `xxx(V1.0).md`(❌) |
|
||||
|
||||
> **例外**:`docs/芯片手册/` 为外部芯片数据手册转录,文件名**沿用上游原名**(含空格等),不受本节约束。
|
||||
|
||||
---
|
||||
|
||||
## 2. 编码与换行
|
||||
|
||||
| 项 | 要求 |
|
||||
|---|---|
|
||||
| 编码 | **UTF-8**;`.md` 文档**不带 BOM** |
|
||||
| 换行 | 与文件现状保持一致;**新建文档用 LF** |
|
||||
| 行尾空白 | 禁止(pre-commit `trailing-whitespace` 自动清理) |
|
||||
| 文件尾 | 必须以单个换行结束(`end-of-file-fixer`) |
|
||||
| 乱码 | 禁止出现 `U+FFFD`(替换字符,字节序列 `EF BF BD`) |
|
||||
|
||||
> ⚠️ **本仓库 BOM 铁律**(见 `AGENTS.md`):C 源码中 `Drivers/BSP/UI/*`、`App/task/ui_task.c`、`App/cfg_file.c`、`Lib/lv_conf.h` 等**带 BOM**,被工具改写后 BOM 会静默丢失 → ARMCC 改按 CP936 解码 → 中文字面量编译失败。
|
||||
> **文档(`.md`)不受此限**,一律用无 BOM UTF-8。但用脚本批量改写文档时,仍须**按原样回写换行符**(本仓库 `core.autocrlf=true` 且无 `.gitattributes`,工作区换行混杂),否则会产生整文件行尾漂移的巨型 diff。
|
||||
|
||||
---
|
||||
|
||||
## 3. 链接规范
|
||||
|
||||
### 3.1 文档间互链:仓库根相对路径
|
||||
|
||||
文档之间引用**一律使用仓库根相对路径**(形如 `` `docs/xxx/yyy.md` `` 或 `[文本](docs/xxx/yyy.md)`),**不使用** `../` 相对链接。
|
||||
|
||||
> 理由:根相对路径对文档所在层级不敏感,迁移子目录时**零改动**;`../` 形态在目录调整时会成片失效。
|
||||
|
||||
### 3.2 图片链接:文档所在目录相对
|
||||
|
||||
图片是**例外**——用**相对当前文档**的路径:
|
||||
|
||||
| 文档位置 | 图片写法 |
|
||||
|---|---|
|
||||
| `docs/xxx.md`(docs 根下) | `` |
|
||||
| `docs/子目录/xxx.md` | `` |
|
||||
|
||||
> ⚠️ **踩坑记录**:2026-09-25 目录重组时,5 篇文档从 `docs/` 迁入子目录,`images/xxx.svg` 未同步改为 `../images/xxx.svg` → **7 处真实断链**(由 D-7 门禁 `check_doc_links.py` 揪出)。迁移含图文档时务必检查此项。
|
||||
|
||||
### 3.3 引用尚未创建 / 已删除的文件
|
||||
|
||||
| 场景 | 写法 | 示例 |
|
||||
|---|---|---|
|
||||
| 计划中、尚未创建 | **反引号内加 `[计划] ` 前缀** | `` `[计划] scripts/gen_task_table.py` `` |
|
||||
| 已删除 | 写明「已删除」等状态词 | `删除 \`tools/ui_mock/render_mockup.py\`(**已删除**)` |
|
||||
| 引用报错样例 / 日志片段(含路径) | **该行加 `[示例]` 标记** | `\| **典型报错** \| \`[示例] docs/a.md:1 [markdown 链接] x.svg\` \|` |
|
||||
|
||||
**为什么**:`check_doc_links.py` 会豁免这些标记;否则门禁会把"诚实标注了未创建"的引用误判为断链。
|
||||
|
||||
### 3.4 链接写法示例须放行内代码
|
||||
|
||||
讲「怎么写链接」的**语法示例**必须包在反引号里(行内代码 span):
|
||||
|
||||
- ✅ 正确:`` 写 `` 的形式 ``
|
||||
- ❌ 错误:`写  的形式`(会被门禁当作真实链接去校验存在性)
|
||||
|
||||
`check_doc_links.py` 扫描前会剥离行内代码 span,故写法示例不会误报;但**反引号内的仓库根相对路径**(`docs/xxx.md`)仍会被校验——那是本工程的引用约定形态。
|
||||
|
||||
---
|
||||
|
||||
## 4. 门禁:文档-代码一致性(D-7)
|
||||
|
||||
三个层次,全部由 pre-commit 机械校验:
|
||||
|
||||
| 层次 | 钩子 | 检查内容 | 触发条件 |
|
||||
|---|---|---|---|
|
||||
| **存在性** | `doc-links` | `docs/**/*.md` 里的链接、反引号路径是否指向真实文件 | 改动任意 `.md` |
|
||||
| **数值** | `task-table` | `README.md`、`AGENTS.md` 的 FreeRTOS 任务表是否与 `Src/freertos.c` 一致 | 改动 `README.md` / `AGENTS.md` / `Src/freertos.c` |
|
||||
| **体积** | `mem-numbers` | 内存/Flash 数字是否与最新 `.map` 一致(受管区 + 陈旧散句数字) | 改动内存文档 / `App`·`Src`·`Inc` 源码 / 脚本 |
|
||||
| **体积** | `check-added-large-files` | 阻止 >1MB 大文件入库 | 任意文件 |
|
||||
|
||||
### 4.1 本地手动运行
|
||||
|
||||
```powershell
|
||||
# 全库文档链接存在性
|
||||
& '.venv\Scripts\python.exe' scripts/check_doc_links.py --all
|
||||
|
||||
# 任务表一致性(只检查)
|
||||
& '.venv\Scripts\python.exe' scripts/gen_task_table.py --check
|
||||
|
||||
# 任务表不一致时:自动重写受管表格区
|
||||
& '.venv\Scripts\python.exe' scripts/gen_task_table.py --write
|
||||
|
||||
# 内存数字(受管快照 + 陈旧散句数字扫描)
|
||||
& '.venv\Scripts\python.exe' scripts/check_mem_numbers.py --scan
|
||||
& '.venv\Scripts\python.exe' scripts/check_mem_numbers.py --write # 同步受管快照
|
||||
|
||||
# 只看期望内容,不写文件
|
||||
& '.venv\Scripts\python.exe' scripts/gen_task_table.py --diff
|
||||
& '.venv\Scripts\python.exe' scripts/check_mem_numbers.py --diff
|
||||
|
||||
# 生成完整内存台账(人工分析用)
|
||||
& '.venv\Scripts\python.exe' scripts/ram_report.py -o docs/内存管理/data/ram_report_<日期>.md
|
||||
```
|
||||
|
||||
### 4.2 受管区域(锚点)
|
||||
|
||||
文档里凡**随代码变化的具体数值**,都必须放进受管区,由脚本生成、禁止手改:
|
||||
|
||||
**任务表**(`README.md` / `AGENTS.md`)——表格外的说明文字原样保留:
|
||||
|
||||
```markdown
|
||||
<!-- TASK_TABLE:BEGIN generated by scripts/gen_task_table.py -->
|
||||
| Task | 栈 (words) | 优先级 |
|
||||
|---|---|---|
|
||||
| ... |
|
||||
<!-- TASK_TABLE:END -->
|
||||
```
|
||||
|
||||
**内存/Flash 快照**(`docs/内存管理/RAM使用分析与优化方案.md` §2.1):
|
||||
|
||||
```markdown
|
||||
<!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py -->
|
||||
| 区域 | 用量 | 容量 | 占比 |
|
||||
|---|---|---|---|
|
||||
| ... |
|
||||
<!-- MEM_SNAPSHOT:END -->
|
||||
```
|
||||
|
||||
> **改栈流程**:先改 `Src/freertos.c` 的 `osThreadAttr_t` → 跑 `gen_task_table.py --write` → 提交。
|
||||
> **改内存流程**:先改代码 + `@build` 出 `.map` → 跑 `check_mem_numbers.py --write` → 提交。
|
||||
> 钩子报不一致时**不要手改受管区**——跑 `--write` 让脚本重算。
|
||||
|
||||
#### 陈旧数字扫描(`mem-numbers --scan`)
|
||||
|
||||
除受管区外,脚本还会扫正文里的**陈旧区域数字**:从 `docs/内存管理/data/ram_report_*.md`
|
||||
历史快照提取「曾经是区域用量、现已变化」的值(如旧 `RW_IRAM1 82,048`),
|
||||
若正文仍以陈述现状的口吻引用即告警。
|
||||
|
||||
**允许保留旧数字的情况**(脚本按行内关键词自动放行):该行含
|
||||
「历史 / 旧 / 曾 / 此前 / 快照 / `data/` / 修复前 / 优化前 / 迁入前 / 实施时 / 当时」等标记。
|
||||
讲任务栈 / 内存池 / 峰值水位等**非区域用量**的行也自动跳过(那些数字语义不同)。
|
||||
|
||||
> 设计取舍:朴素地"扫所有 4~7 位数字"实测产生 **45 处误报**(栈配置 `4096`、堆配置 `49,152`、
|
||||
> 峰值 `1184` 全是合法数字),门禁会被无视。改为"只报历史快照里出现过、当前已变的区域值"后
|
||||
> **误报 0、真问题全中**。宁可窄而准,不可宽而吵。
|
||||
|
||||
### 4.3 豁免机制
|
||||
|
||||
`check_doc_links.py` 的豁免(不算失效,不报错):
|
||||
|
||||
- `` `[计划] ` `` 前缀标记
|
||||
- 该行含 `[示例]` 标记(引用报错样例 / 日志片段等含路径的引文)
|
||||
- 引用**附近 ±40 字符**内出现「未创建 / 尚未创建 / 已删除 / 待排期」等状态词
|
||||
- 含通配符 `*`、尖括号 `<模块>` 等占位符
|
||||
- 模板变量样式(`NN_` / `XX_` / `界面名` / `模块名` / `${...}` / `%s` 等)
|
||||
- 行内代码 span 里的链接写法
|
||||
- 外部 URL(`http/https/mailto`)与纯锚点(`#...`)
|
||||
- `docs/芯片手册/` 等外部资料目录
|
||||
|
||||
> ⚠️ 状态词按**就近**(±40 字符)判定,不是整行——否则文件名本身含「不存在」「删除」等字样时会误豁免同行的其它真实引用(2026-09-25 实测修正)。
|
||||
|
||||
---
|
||||
|
||||
## 5. 文档结构
|
||||
|
||||
### 5.1 必备要素
|
||||
|
||||
| 要素 | 要求 |
|
||||
|---|---|
|
||||
| **一级标题** | 文档首行为 `# 标题`,标题即主题,不写"文档""说明"等冗余后缀 |
|
||||
| **开篇引言** | 可选 `>` 引用块,写明**适用对象 / 阅读前提 / 相关文档** |
|
||||
| **章节编号** | 多章节文档用 `## 1.` `### 1.1` 编号,便于交叉引用(`§3.2`) |
|
||||
| **变更记录** | 设计类、流程类文档**建议**末尾保留「变更记录」表(`日期 \| 变更 \| 说明`) |
|
||||
|
||||
### 5.2 新增文档检查清单
|
||||
|
||||
新增一篇文档时逐项确认:
|
||||
|
||||
- [ ] 放在正确的子目录(目录名无空格)
|
||||
- [ ] 文件名符合命名约定(无空格 / 主题词+类型后缀)
|
||||
- [ ] UTF-8 无 BOM、LF 换行
|
||||
- [ ] 互链用仓库根相对路径;图片用当前目录相对路径
|
||||
- [ ] 尚未创建/已删除的引用加 `[计划]` 或状态词
|
||||
- [ ] 已在 [`README.md`](README.md) 对应章节登记一行(**否则视为未完成**)
|
||||
- [ ] 若涉及任务表/栈,跑 `gen_task_table.py --check`
|
||||
- [ ] `pre-commit run --files <新文档>` 通过
|
||||
|
||||
---
|
||||
|
||||
## 6. 与代码文档的边界
|
||||
|
||||
| 内容 | 归属 |
|
||||
|---|---|
|
||||
| 项目级铁律、构建/烧录/测试命令、平台约束 | `AGENTS.md`(AI 协作上下文,**精简优先**) |
|
||||
| 开发者入门、架构速览、目录导航 | `README.md` |
|
||||
| 详细设计、专项说明、测试指南 | `docs/` 下对应子目录 |
|
||||
| 跨文档待办登记 | `docs/待处理内容.md` |
|
||||
| 审查发现与改进方案 | `docs/审查记录/` |
|
||||
|
||||
> **避免重复**:同一事实只在一处详述,其它位置用链接指向。典型如 FreeRTOS 任务表——`Src/freertos.c` 是唯一事实源,`README.md`/`AGENTS.md` 的表由脚本生成,不在别处再抄一份。
|
||||
|
||||
---
|
||||
|
||||
## 7. 写作约定
|
||||
|
||||
| 项 | 约定 |
|
||||
|---|---|
|
||||
| 语气 | 陈述事实,不用"我们认为""大家注意"等口语 |
|
||||
| 标点 | 中文正文用全角标点;代码、路径、命令、文件名用行内代码 ``` `...` ``` |
|
||||
| 术语 | 首次出现给全称 + 缩写(如"配置引擎(cfg_file)"),此后统一用同一术语 |
|
||||
| 表格 | 对比、清单、参数优先用表格而非长段落 |
|
||||
| 命令 | 用 `powershell` 代码块,含 `& '.venv\Scripts\python.exe'` 等本仓库统一入口 |
|
||||
| 图 | 拓扑类用 Mermaid 代码块;技术配图走 SVG 生成器(见 [`架构设计/图形绘制流程.md`](架构设计/图形绘制流程.md)) |
|
||||
| 状态标记 | ✅ 已完成 / ⚠️ 注意事项 / ❌ 禁止 / 📌 要点(克制使用,不滥用 emoji) |
|
||||
|
||||
---
|
||||
|
||||
## 8. 常见错误速查
|
||||
|
||||
| 现象 | 原因 | 修复 |
|
||||
|---|---|---|
|
||||
| `doc-links` 报失效链接 | 文件被移动/删除后引用未同步 | 改引用路径,或加 `[计划]` / 状态词 |
|
||||
| `doc-links` 报语法示例行 | 链接示例没包反引号 | 把示例包进 `` ` `` |
|
||||
| `task-table` 报不一致 | `freertos.c` 改栈后文档未同步 | 跑 `gen_task_table.py --write` |
|
||||
| 提交 diff 出现整文件行尾变化 | 脚本改写时强制了 LF/CRLF | 改写须按原换行符回写(见 §2) |
|
||||
| 图片不显示 | 文档迁入子目录后未改 `../images/` | 补 `../`(见 §3.2) |
|
||||
| 引用"计划中"文件被拦 | 没加 `[计划] ` 前缀 | 加前缀 |
|
||||
|
||||
---
|
||||
|
||||
## 变更记录
|
||||
|
||||
| 日期 | 变更 | 说明 |
|
||||
|---|---|---|
|
||||
| 2026-09-25 | 建立本文档 | 正式确立目录/命名/编码/链接/门禁/结构与写作约定;承接 D-6(去空格)与 D-7(一致性门禁),配套交付 `scripts/check_doc_links.py`、`scripts/gen_task_table.py` 两个门禁脚本与 `doc-links`/`task-table` 两个 pre-commit 钩子 |
|
||||
| 2026-09-25 | 文件名风格统一(D-6 剩余) | `代码规范/嵌入式C语言代码规范(V1.0).md` → `嵌入式C语言代码规范_V1.0.md`(全角括号 → 下划线),同步 5 个文档 + 1 个脚本共 9 处引用;§1.2 明确禁用全角括号与版本号写法;`docs/芯片手册/` 作为外部资料例外 |
|
||||
| 2026-09-26 | 体积档门禁落地(D-7 第三档) | 交付 `scripts/check_mem_numbers.py` + pre-commit `mem-numbers` 钩子;§4.2 增「受管区域(锚点)」与「陈旧数字扫描」两节,记录误报取舍 |
|
||||
@@ -4,11 +4,11 @@
|
||||
|
||||
本 项目在 GD5F2GQ5UE SPI NAND Flash(256MB)上实现了三层存储软件栈:
|
||||
|
||||

|
||||

|
||||
|
||||
> 上图由 `tools/arch_diagram/gen_storage_stack_svg.py` 生成(手绘 SVG,布局确定、层间单向箭头);改分层后编辑脚本顶部 `L_*` / `ROWS` 数据重跑即可。
|
||||
|
||||

|
||||

|
||||
|
||||
> 上图由 `tools/arch_diagram/gen_partition_svg.py` 生成(分区宽 ∝ MB 数 + 偏移标尺);改分区后编辑脚本顶部 `FIELDS` 数据重跑即可。
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
```
|
||||
成功输出 `OK <字节> bytes, canvas <W>x<H> -> <路径>`。脚本内置 `ElementTree.fromstring` 自检——**XML 不合法会直接抛错**,不会产出坏图。
|
||||
4. **目检**:浏览器打开 `docs/images/*.svg`,确认文字不溢出盒外、框 / 线 / 标签对齐、配色正确。
|
||||
5. **引用**:在对应 `.md` 里用**相对路径** ``——`docs/` 根目录下的 md 写 ``;`docs/UI 设计/` 等子目录的 md 写 ``。
|
||||
5. **引用**:在对应 `.md` 里用**相对路径**:根目录下的 md 指向 `docs/images/` 下的图(形如 ``);`docs/UI设计/` 等子目录的 md 则写 `../images/` 前缀的等价写法。
|
||||
6. **提交**:脚本(源)+ 生成的 `.svg`(产物)**一起**提交(产物入库,类比生成物 `ui_menu_tab.c`)。
|
||||
|
||||
### 3.2 SVG 约定(手写 / 新增生成器时遵循)
|
||||
@@ -132,6 +132,6 @@ sequenceDiagram
|
||||
|
||||
| 日期 | 变更 |
|
||||
|---|---|
|
||||
| 2026-09-11 | 创建:统一图形绘制流程(选型 / SVG 生成器 / Mermaid / 约定 / 检查清单);新增 `tools/arch_diagram/gen_frame_svg.py`(通用协议帧图)+ `docs/RemoDispBus帧格式.svg` |
|
||||
| 2026-09-11 | 新增专门配图目录 `docs/images/`:收拢 `docs/` 根与 `docs/UI 设计/images/` 下 5 张 SVG;同步更新 3 个生成器 OUT 路径、4 处文档图片引用、`AGENTS.md` 与 `.gitignore`(PNG 预览规则);流程沉淀为 `draw-diagram` skill |
|
||||
| 2026-09-11 | 创建:统一图形绘制流程(选型 / SVG 生成器 / Mermaid / 约定 / 检查清单);新增 `tools/arch_diagram/gen_frame_svg.py`(通用协议帧图)+ `docs/images/RemoDispBus帧格式.svg` |
|
||||
| 2026-09-11 | 新增专门配图目录 `docs/images/`:收拢 `docs/` 根与 `docs/UI设计/images/` 下 5 张 SVG;同步更新 3 个生成器 OUT 路径、4 处文档图片引用、`AGENTS.md` 与 `.gitignore`(PNG 预览规则);流程沉淀为 `draw-diagram` skill |
|
||||
| 2026-09-11 | 存量 ASCII 框图清理:`STM32F4-Base存储架构说明.md` 两图(存储栈分层 / 物理分区布局)重绘为 SVG(生成器家族新增 `gen_storage_stack_svg.py` / `gen_partition_svg.py`);`RemoDispBus协议与接收设计说明.md` 删 ASCII 帧图(SVG 帧格式图已在,信息无损失);`测试说明/CH395F_Test_Guide.md` 4 图(2 组件架构 + 2 会话时序)转 Mermaid |
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
这与 CubeMX"一次性创建全部任务"的模式完全兼容:任务仍由 `MX_FREERTOS_Init` 统一创建,但各自在入口 `wait`,相当于"创建即挂起、就绪才放行"。
|
||||
|
||||

|
||||

|
||||
|
||||
> 上图:**左 = 生产者(set)· 中 = 事件组 `sys_evtHandle` · 右 = 消费者(wait)**;任务卡与事件位对齐同一行,`bit1 → ftpTask` 的额外依赖用 **All 汇合点**(`osFlagsWaitAll`)表达。
|
||||
> 源码 `tools/arch_diagram/gen_barrier_svg.py`(改数据重跑即可),PNG 预览本地渲染、不入库。
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
## 1. 全景分层架构
|
||||
|
||||

|
||||

|
||||
|
||||
> 上图由 `tools/arch_diagram/gen_arch_svg.py` 生成(**手绘 SVG**,布局确定、零连线交叉);改架构后编辑脚本顶部 `ROWS` 数据重跑即可,源数据与 §1.1 表一致。
|
||||
> 需要 PNG 预览(PPT/聊天分享):用 Edge 无头渲染 `docs/images/项目架构总览.svg` 即可(PNG 不入库)。
|
||||
@@ -66,14 +66,14 @@
|
||||
|
||||
### 2.2 就绪屏障(Event Flags,取代魔法延时)
|
||||
|
||||

|
||||

|
||||
|
||||
> 三栏式:**左 = 生产者(set)· 中 = 事件组 `sys_evtHandle` · 右 = 消费者(wait)**。
|
||||
> 任务卡与事件位对齐同一行,箭头 = `set` / `wait` 关系;`bit1 → ftpTask` 的额外依赖用 **All 汇合点**表达(`osFlagsWaitAll`)。
|
||||
> 源码 `tools/arch_diagram/gen_barrier_svg.py`(改数据重跑即可);PNG 预览本地渲染、不入库。
|
||||
|
||||
**设计原则**:生产者与消费者互不知晓,只经事件组解耦;新增子系统只需定义新 bit + 各自 wait/set,不改已有任务。
|
||||
(详见 `docs/项目启动顺序管理.md`)
|
||||
(详见 `docs/架构设计/项目启动顺序管理.md`)
|
||||
|
||||
**⚠ 就绪位必须 `osFlagsNoClear`(2026-09-21 实证,FTP 永不监听事故)**:`osEventFlagsWait` **默认消费**所等位(CMSIS 包装 → `xEventGroupWaitBits(xClearOnExit=pdTRUE)`,`cmsis_os2.c:1243-1249`),而就绪位表达的是**持久状态**——多人等待时必须人人可读。修前 `netTask` 等 `STORAGE_READY` 时清掉 bit1、`uiTask`/`timeSyncTask` 等 `NET_READY` 时清掉 bit0,导致 `ftpTask` 的 `WaitAll(bit0|bit1)` 两位永不同时为 1 → **任务永久阻塞、零日志零报错、21 端口从未监听**(靠栈水位异常才定位到)。
|
||||
|
||||
@@ -164,7 +164,7 @@ flowchart LR
|
||||
```
|
||||
|
||||
- 掉电持久化:`net_cfg` 配置(通用配置文件 `/config.ini`,INI `[network]` 段,cfg_file 引擎),保存后下次上电生效、或立即生效(网络重建)、外部变更 4s 沉降后自动重载;旧版 NCFG 二进制(`/cfg/netcfg.bin`)首启自动迁移。
|
||||
- 日志记录:`sys_log` 引擎写定长 64B 文本记录到 `/log/run.log`(运行记录)与 `/log/selftest.log`(自检记录),defaultTask 唯一写者,FTP 可直下(详见 `docs/运行与自检记录设计说明.md`);实时调试流 = 控制台单写者日志(USART1,4KB 环形缓冲 + defaultTask 唯一发送,详见 `docs/控制台单写者日志设计说明.md`)。
|
||||
- 日志记录:`sys_log` 引擎写定长 64B 文本记录到 `/log/run.log`(运行记录)与 `/log/selftest.log`(自检记录),defaultTask 唯一写者,FTP 可直下(详见 `docs/子系统设计/运行与自检记录设计说明.md`);实时调试流 = 控制台单写者日志(USART1,4KB 环形缓冲 + defaultTask 唯一发送,详见 `docs/子系统设计/控制台单写者日志设计说明.md`)。
|
||||
- NAND 坏块表(BBT)持久化在保留块池,不交给 dhara 管理。
|
||||
|
||||
---
|
||||
@@ -305,15 +305,15 @@ flowchart LR
|
||||
|
||||
| 主题 | 文档 |
|
||||
|---|---|
|
||||
| 启动顺序 / 就绪屏障 | `docs/项目启动顺序管理.md` |
|
||||
| 存储架构(NAND/FTL/FatFs) | `docs/STM32F4-Base存储架构说明.md` |
|
||||
| 墙钟时间维护 | `docs/系统墙钟时间维护说明.md` |
|
||||
| 控制台单写者日志(USART1 调试流) | `docs/控制台单写者日志设计说明.md` |
|
||||
| 启动顺序 / 就绪屏障 | `docs/架构设计/项目启动顺序管理.md` |
|
||||
| 存储架构(NAND/FTL/FatFs) | `docs/架构设计/STM32F4-Base存储架构说明.md` |
|
||||
| 墙钟时间维护 | `docs/子系统设计/系统墙钟时间维护说明.md` |
|
||||
| 控制台单写者日志(USART1 调试流) | `docs/子系统设计/控制台单写者日志设计说明.md` |
|
||||
| RAM 预算与优化 | `docs/内存管理/RAM使用分析与优化方案.md` |
|
||||
| 栈/内存观测工具 | `scripts/stack_report.py`(Keil 静态调用图 × 串口 `[STACK]` 水位,判定取两者更坏者)· `scripts/ram_report.py`(.map 静态占用)—— 用法与基线见内存方案 §0.6 |
|
||||
| FTP 功能与陷阱 | `docs/测试说明/FTP_Test_Guide.md`(启动门 §8.6 / 单客户端 §8.7)· 脚本 `test/ftp_up_dl_test.py`、`test/ftp_speed_test.py` |
|
||||
| UI 设计架构 / 内容页 / 菜单 | `docs/UI 设计/UI_设计架构.md` · `内容页架构.md` · `菜单页面设计.md` |
|
||||
| UI 自动化测试 | `docs/UI 设计/UI_自动化测试流程.md` |
|
||||
| UI 设计架构 / 内容页 / 菜单 | `docs/UI设计/UI_设计架构.md` · `内容页架构.md` · `菜单页面设计.md` |
|
||||
| UI 自动化测试 | `docs/UI设计/UI_自动化测试流程.md` |
|
||||
| 驱动已知陷阱 | `docs/问题记录/{CH395F,GD5F2GQ5UE,SD2506}_Trap_Records.md` |
|
||||
| 各模块测试指南 | `docs/测试说明/` |
|
||||
| 代码规范 | `docs/代码规范/` |
|
||||
@@ -336,8 +336,8 @@ flowchart LR
|
||||
| 2026-09-10 | §2.2 就绪屏障图由 Mermaid 改为**手绘 SVG**(`tools/arch_diagram/gen_barrier_svg.py` → `就绪屏障.svg`):三栏(生产者 / 事件组 / 消费者)+ 水平对齐 + All 汇合点,消除原图 9 条边的交叉;PNG 预览本地渲染、不入库 |
|
||||
| 2026-09-13 | `sys_clock` 由 ③基础服务层改归 **④中间件层**(通用平台时间服务,日志/文件/对时共用;文件移入 `App/util/` 与 crc/ringbuf 同目录,include 路径不变):`FatFs` → `sys_clock` 成为**层内引用**,工程反向依赖消除;同日新增的 §1.2 "反向依赖例外" 条目撤销 |
|
||||
| 2026-09-14 | 通用配置文件(P3):网口配置存储由 `/cfg/netcfg.bin`(NCFG 二进制)迁移至 `/config.ini`(INI `[network] 段`,`App/cfg_file` 引擎 + `cfg_file_store` 双端后端);`net_cfg` 对外 API 不变;旧档首启自动迁移;`cfg_file` 列为 MCU/模拟器共享源码 |
|
||||
| 2026-09-14 | 运行/自检记录:新增 `App/log/sys_log`(定长 64B 文本记录引擎,MCU 后端 `/log/run.log`·`selftest.log`,defaultTask 唯一写者)+ UI 页面插件 `ui_page_runlog`/`ui_page_selftest`(动态列表)+ `ui_standby` 待机屏(空闲超时切入);密码页错误提示;字体 111→122 字(217 字形);详见 `docs/运行与自检记录设计说明.md` |
|
||||
| 2026-09-14 | 运行/自检记录:新增 `App/log/sys_log`(定长 64B 文本记录引擎,MCU 后端 `/log/run.log`·`selftest.log`,defaultTask 唯一写者)+ UI 页面插件 `ui_page_runlog`/`ui_page_selftest`(动态列表)+ `ui_standby` 待机屏(空闲超时切入);密码页错误提示;字体 111→122 字(217 字形);详见 `docs/子系统设计/运行与自检记录设计说明.md` |
|
||||
| 2026-09-21 | **§2.2 屏障语义修正 + FTP 永不监听缺陷修复**:`osEventFlagsWait` 默认消费所等位,就绪位(`NET_READY`/`STORAGE_READY`)被 netTask/uiTask/timeSync 先消费后,`ftpTask` 的 `WaitAll(两位)` 永不成立 → 任务永久阻塞、21 端口从未监听(静默);5 处就绪位等待统一加 `osFlagsNoClear`(命令位 `CFG_SAVE`/`NET_RECONFIG` 保持消费型)。同轮新增**栈可观测性**:`Src/freertos.c` 的 `stack_probe_poll`(串口 `[STACK]` 水位)+ `scripts/stack_report.py`(Keil 静态调用图 × 运行时水位,判定取两者更坏者);§2.1 任务表补齐实测栈数据并修正过期的 defaultTask/testTask 栈配置,§3 时序图补 `NoClear` 与 FTP 启动日志,§5 补 FTP 启动门/单客户端实测注意 |
|
||||
| 2026-09-21 | **栈宽整改落地(内存方案 §1.4:lftpd 大局部缓冲静态化)**:`Drivers/BSP/NET/lftpd/lftpd.c` + `lftpd_log.c` 共 **9 处**大局部数组(`message[256]`/`response[512]`/`name[256]`×2/`buffer[1024]`×2/`read_buffer[512]`/`arg_buf[512]`/`client` 会话上下文/日志 `buffer[256]`)改为函数级 `static`(lftpd 单客户端、全部在 ftpTask 内串行);**ftpTask 实测峰值 3480 → 1184 B(余量 15% → 71%,判定 PASS)**,静态调用图 2528 → 472 B,代价静态 BSS +4,616 B(RW_IRAM1 82,048 / 131,072 B,余量仍 ~48 KB);§2.1 栈实测数据同步,原"涨栈到 1600 words"方案取消;FTP 功能回归 10/10 + 128KB 逐字节一致 |
|
||||
| 2026-09-24 → 09-25 | **控制台单写者日志**(09-24 实证驱动:多任务并发日志字符级交错 + HardFault 脏指针直达 UART):4KB 环形缓冲 + defaultTask 唯一发送(行级原子 + 指针可控)+ 内核前/ISR/异常钩子有界直发回退 + `fputc` 收敛到单写者路径;09-24 初版实施于 `Src/usart.c` USER CODE 区,09-25 迁出至 `App/log/console_log.{h,c}`(HAL 生成文件不含应用代码),`dbg_log.h` 改 `#include "console_log.h"`(调用点零改动),`Src/usart.c` 恢复纯 CubeMX 形态;`@build` 0/0 + `@test` PASS;详见 `docs/控制台单写者日志设计说明.md` |
|
||||
| 2026-09-24 → 09-25 | **控制台单写者日志**(09-24 实证驱动:多任务并发日志字符级交错 + HardFault 脏指针直达 UART):4KB 环形缓冲 + defaultTask 唯一发送(行级原子 + 指针可控)+ 内核前/ISR/异常钩子有界直发回退 + `fputc` 收敛到单写者路径;09-24 初版实施于 `Src/usart.c` USER CODE 区,09-25 迁出至 `App/log/console_log.{h,c}`(HAL 生成文件不含应用代码),`dbg_log.h` 改 `#include "console_log.h"`(调用点零改动),`Src/usart.c` 恢复纯 CubeMX 形态;`@build` 0/0 + `@test` PASS;详见 `docs/子系统设计/控制台单写者日志设计说明.md` |
|
||||
| 2026-09-25 | **defaultTask 任务体文件拆分**:`Src/freertos.c` 的 `StartDefaultTask` 任务体(存储 bring-up / 配置引擎属主 / 控制台单写者 attach+drain / syslog 落盘 / LED / 栈水位探针 `stack_probe_poll`)整体迁至 `App/task/default_task.c`(`default_task_func()`,与其余任务文件同址);`freertos.c` 恢复"CubeMX 接线 + 崩溃钩子"形态(719→361 行),`@build` 0/0 复验;栈配置属性仍定义于 `freertos.c`(`stack_report` 数据源不变) |
|
||||
@@ -100,7 +100,7 @@
|
||||
- `TC-NET-801`:100KB 文件上发(MCU→PC);
|
||||
- `TC-NET-802`:100KB 文件下发(PC→MCU);
|
||||
- `TC-NET-803`:round-trip(可选)。
|
||||
- 详见 `docs/CH395F_Test_Guide.md` 阶段 8。
|
||||
- 详见 `docs/测试说明/CH395F_Test_Guide.md` 阶段 8。
|
||||
|
||||
---
|
||||
|
||||
@@ -181,7 +181,7 @@
|
||||
|
||||
## 10. 参考文档
|
||||
|
||||
- `docs/CH395F_Test_Guide.md` —— 网络测试总说明(含阶段 8 文件传输、FTP 陷阱清单)
|
||||
- `docs/NET_Socket_FTP_Support_Plan.md` —— FTP / PASV Socket 改造方案
|
||||
- `docs/CH395F_Trap_Records.md` —— CH395F 已知陷阱
|
||||
- `docs/BSD_Socket_API_使用指南.md` —— BSD Socket API 用法
|
||||
- `docs/测试说明/CH395F_Test_Guide.md` —— 网络测试总说明(含阶段 8 文件传输、FTP 陷阱清单)
|
||||
- `[计划]` FTP / PASV Socket 改造方案(尚未创建)
|
||||
- `docs/问题记录/CH395F_Trap_Records.md` —— CH395F 已知陷阱
|
||||
- `docs/网络/BSD_Socket_API_使用指南.md` —— BSD Socket API 用法
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# GD5F2GQ5UE NAND Flash 测试规范
|
||||
|
||||
> 本规范参照 `docs/CH395F_Test_Guide.md` 结构编写,覆盖 `Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c`
|
||||
> 本规范参照 `docs/测试说明/CH395F_Test_Guide.md` 结构编写,覆盖 `Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c`
|
||||
> 全部公开/私有函数,并向上延伸到 FTL(`nand_ftl.c`)与 FatFS diskio。
|
||||
> 详细芯片行为见 `docs/GD5F2GQ5UExxG.md`,已知陷阱见 `docs/GD5F2GQ5UE_Trap_Records.md`。
|
||||
> 详细芯片行为见 `docs/芯片手册/GD5F2GQ5UExxG.md`,已知陷阱见 `docs/问题记录/GD5F2GQ5UE_Trap_Records.md`。
|
||||
|
||||
## 1. 概述
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
历史背景:本驱动曾出现“时间写不进”问题,根因是寄存器宏写成 `0x0FH`(KEIL/ARMCC
|
||||
不识别 `H` 整数后缀,被编译为 0),导致 `SD2506_REG_CTR1` 实际等于 0(秒寄存器),
|
||||
`sd2506_write_enable()` 把 WRTC 写错地址、写保护永不解除。修正为 `0x0FU` 后恢复。
|
||||
详见 `docs/SD2506_Trap_Records.md`。
|
||||
详见 `docs/问题记录/SD2506_Trap_Records.md`。
|
||||
|
||||
## 2. 启用与编译
|
||||
|
||||
|
||||
@@ -197,7 +197,7 @@ flowchart LR
|
||||
| `requirements.txt` | 增 `pyserial`(**保持纯 ASCII** 注释) |
|
||||
| `.gitignore` | 增 `tools/serial_tool/state/` |
|
||||
| `opencode.json`(仓库根) | **删除 `mcp.serial` 段**(指向缺失二进制,已失效) |
|
||||
| `docs/测试说明/serial-mcp-server_串口调试.md` | **删除**(内容精华并入本文;工具历史见 §12) |
|
||||
| `测试说明/serial-mcp-server_串口调试.md` | **已删除**(内容精华并入本文;工具历史见 §12) |
|
||||
| `AGENTS.md` | "串口调试"节改写为 serial_tool(配置源仍 `serial_config.json`);"自动化测试"节同步新流程 |
|
||||
| `.opencode/command/test.md` | Step 0/2/Notes 改写(前置检查 = serial_tool 可用性 + `ports`;流程 = §7.1) |
|
||||
| `docs/测试说明/自动化测试流程.md` | 采集机制描述同步(去 serial-mcp-server 表述) |
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
| `docs/测试说明/测试文档模板规范.md` | 测试文档模板、命名规则(TM / TC / DP) |
|
||||
| `docs/测试说明/串口助手设计说明.md` | 串口调试 / 采集工具与陷阱(Python 串口助手) |
|
||||
| `docs/测试说明/串口助手使用指南.md` | 串口助手命令用法 / 工作流 / 排障 |
|
||||
| `docs/UI 设计/UI_自动化测试流程.md` | UI 模拟器回归(ui-verify)细节 |
|
||||
| `docs/UI设计/UI_自动化测试流程.md` | UI 模拟器回归(ui-verify)细节 |
|
||||
| `docs/代码规范/pre-commit使用说明.md` | pre-commit 门禁配置与范围 |
|
||||
| `docs/项目部署环境要求.md` | 构建 / 测试工具链环境 |
|
||||
| `docs/环境与部署/项目部署环境要求.md` | 构建 / 测试工具链环境 |
|
||||
| `docs/测试说明/<模块>_Test_Guide.md` | 各模块测试规范(CH395F / GD5F / SD2506 / FTP) |
|
||||
|
||||
---
|
||||
@@ -355,4 +355,4 @@ flowchart LR
|
||||
| 日期 | 变更 |
|
||||
|---|---|
|
||||
| 2026-09-15 | §3.4 更新:P1-6 修复落地(基础线程策略)——USER CODE 区冗余 netTask 创建删除 + `net_task_func` 入口 `ENABLE_HW_LAYER_TESTS` 自挂起守卫;"代码事实/设计约束"按修复后现状重写(硬件层模式中断断言恢复安全、NET 层/产品仍按"netTask 恒在轮询"设计);彻底方案(`.ioc` 移除)经评估未采用。同日构建验证发现两处**存量**测试固件缺陷(与 P1-6 无关,A/B 对照确证):① `net_test_task.c` `s_rx_buf` 使用先于声明 → NET 层配置自 2026-08(88160a5)起不可编译;② 128KB 静态 RAM 预算溢出(产品镜像 123.6KB,HW 全阶段固件超 8.7KB、NET 固件超 ~28KB)——已立 P1-9/P1-10 跟踪 |
|
||||
| 2026-09-13 | 重写:对齐现测试架构——统一 `test_config.h` 套件(旧版仅描述 CH395F 单套件与 `ch395fTestTask` 旧入口);新增 @test 自动化闭环、pre-commit 门禁、UI 模拟器五步门禁、主机侧工具约定;新增"测试构建下 netTask"已知问题(旧版"硬件层模式 netTask 不创建"表述与代码不符,改为设计约束并给出重构路径);修正附录路径(旧版 `docs/CH395F_Test_Guide.md` 等已移入 `docs/测试说明/`);新增双端注册、内存预算、陷阱沉淀要求 |
|
||||
| 2026-09-13 | 重写:对齐现测试架构——统一 `test_config.h` 套件(旧版仅描述 CH395F 单套件与 `ch395fTestTask` 旧入口);新增 @test 自动化闭环、pre-commit 门禁、UI 模拟器五步门禁、主机侧工具约定;新增"测试构建下 netTask"已知问题(旧版"硬件层模式 netTask 不创建"表述与代码不符,改为设计约束并给出重构路径);修正附录路径(旧版 `docs/测试说明/CH395F_Test_Guide.md` 等已移入 `docs/测试说明/`);新增双端注册、内存预算、陷阱沉淀要求 |
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|---|---|
|
||||
| `测试开发标准流程.md` | 测试开发总流程(规划 → 实现 → 门禁 → 沉淀);本文是其"测试规划(文档先行)"环节的可执行模板 |
|
||||
| `自动化测试流程.md` | `@test` 闭环命令、参数与失败模式;本文"回归接入"章节引用它 |
|
||||
| `docs/UI 设计/UI_自动化测试流程.md` | UI 类改动的模拟器回归门禁(L2 层) |
|
||||
| `docs/UI设计/UI_自动化测试流程.md` | UI 类改动的模拟器回归门禁(L2 层) |
|
||||
| `docs/问题记录/<模块>_Trap_Records.md` | 陷阱记录;测试文档"已知陷阱"章节引用它 |
|
||||
|
||||
---
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
- **初始化回归**:`App/task/ui_task.c` 已有 `UI port init: OK` / `UI menu init: OK` / `UI net sink: started`
|
||||
打印(见 `@test` 命令示例);将其加入 `-Required` 即可经串口自动回归 UI 初始化。
|
||||
- **屏幕内容回归**:由 LVGL 模拟器像素回归覆盖(文本级断言 + 11 页黄金参考 + 池水位门禁,
|
||||
见 `docs/UI 设计/UI_自动化测试流程.md`);上机屏幕仍需人工目检(L3 层,见 `测试开发标准流程.md` §1)。
|
||||
见 `docs/UI设计/UI_自动化测试流程.md`);上机屏幕仍需人工目检(L3 层,见 `测试开发标准流程.md` §1)。
|
||||
|
||||
## 扩展用法
|
||||
|
||||
|
||||
@@ -709,7 +709,7 @@ sock4 auto-relisten ok / relisten retry ok ← 监听器随后自行恢复
|
||||
9. **S8** 日志改非阻塞(`fputc` → 环形缓冲 + TX 中断/DMA;处理溢出丢弃与 HardFault 冲刷);
|
||||
10. **S9** 客户端侧(DTU-RemtoeLCD):按键后立即取帧、不传 PNG(直接发 1bpp/差量 + canvas 绘制)、
|
||||
自适应节拍(帧耗时补偿)、验证 PC 一律有线同交换机;
|
||||
11. **M4**(可选)`test/run_latency_test.py` 一键编排(open/clear/flash/wait-idle/peer/collect/merge/verdict)——待排期;
|
||||
11. **M4**(可选)`[计划] test/run_latency_test.py` 一键编排(open/clear/flash/wait-idle/peer/collect/merge/verdict)——待排期;
|
||||
12. **M5**(可选,在役设备)非独占采样器:事件触发、10s 旁路打点入 syslog——设计预留;
|
||||
13. 协议补位(尾批退路,仅当客户端无法改动时;见 §7.4)。
|
||||
14. **日志并发保护(2026-09-22 新增,与 S8 同源、优先级上调)**:开机多任务并发 `printf` 丢整行
|
||||
@@ -762,9 +762,9 @@ sock4 auto-relisten ok / relisten retry ok ← 监听器随后自行恢复
|
||||
|
||||
| 主题 | 位置 |
|
||||
|---|---|
|
||||
| RemoDispBus 协议与接收设计(含 INIT 8B 勘误) | `docs/UI 设计/RemoDispBus协议与接收设计说明.md` |
|
||||
| UI 设计架构(离屏渲染 + 推流) | `docs/UI 设计/UI_设计架构.md` |
|
||||
| BSD Socket API 与双端后端 | `docs/BSD_Socket_API_使用指南.md` |
|
||||
| RemoDispBus 协议与接收设计(含 INIT 8B 勘误) | `docs/UI设计/RemoDispBus协议与接收设计说明.md` |
|
||||
| UI 设计架构(离屏渲染 + 推流) | `docs/UI设计/UI_设计架构.md` |
|
||||
| BSD Socket API 与双端后端 | `docs/网络/BSD_Socket_API_使用指南.md` |
|
||||
| CH395F 陷阱史(Trap 9/20 等) | `docs/问题记录/CH395F_Trap_Records.md` |
|
||||
| 错误码传播审计(E-02 / E-04 / E-33 / E-34) | `docs/问题记录/错误码传播审计.md` |
|
||||
| CH395F 测试套件(吞吐 Phase 8 等) | `docs/测试说明/CH395F_Test_Guide.md` |
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
> 用途:新机器搭建、环境交接、现场部署时的**一站式环境核对清单**——开发机软件环境、
|
||||
> 目标板硬件与资源预算、网络/服务现场部署、远端客户端环境、验收步骤与常见环境问题。
|
||||
> 文中所有版本/参数/数值均取自仓库内配置或本机实测(`AGENTS.md`、`MDK-ARM/*.bat`、
|
||||
> `simulator/README.md`、`docs/内存管理/`、`docs/网络配置说明.md`、`docs/测试说明/` 等),
|
||||
> `simulator/README.md`、`docs/内存管理/`、`docs/子系统设计/网络配置说明.md`、`docs/测试说明/` 等),
|
||||
> 换机器时以仓库文件为准逐项核对。
|
||||
|
||||
---
|
||||
@@ -107,7 +107,7 @@ flowchart LR
|
||||
```
|
||||
|
||||
> 模拟器与 MCU **共用 UI 源码**(`Drivers/BSP/UI/`),无硬件业务(网络推流除外,Winsock 版)。
|
||||
> 详见 `simulator/README.md`、`docs/UI 设计/LVGL模拟器部署与使用说明.md`。
|
||||
> 详见 `simulator/README.md`、`docs/UI设计/LVGL模拟器部署与使用说明.md`。
|
||||
|
||||
### 2.4 Python 环境(脚本工具链)
|
||||
|
||||
@@ -139,7 +139,7 @@ python tools/font_gen/extract_cn.py # 任意 python3:
|
||||
& '.venv\Scripts\python.exe' tools/font_gen/make_font.py # 宋体 12px 1bpp + 字符集 → ui_font_cn_12.c
|
||||
```
|
||||
|
||||
> 任何 UI 文案新增汉字后必须走此流程(缺字 = 屏幕空白块),详见 `docs/UI 设计/UI_中文字体生成与配置.md`。
|
||||
> 任何 UI 文案新增汉字后必须走此流程(缺字 = 屏幕空白块),详见 `docs/UI设计/UI_中文字体生成与配置.md`。
|
||||
|
||||
### 2.6 串口调试 / 自动化测试工具
|
||||
|
||||
@@ -177,7 +177,7 @@ winget install Graphviz.Graphviz
|
||||
& 'tools\refgraph\gen_refgraph.bat' # → docs/images/引用关系图.*(.dot/.svg/.png/.json)+ 生成报告
|
||||
```
|
||||
|
||||
> 图例、语义(文本层引用/未解析归外部)、更新流程与已知限制见 `docs/引用关系图说明.md`。
|
||||
> 图例、语义(文本层引用/未解析归外部)、更新流程与已知限制见 `docs/架构设计/引用关系图说明.md`。
|
||||
> Keil 工程包含路径解析自 `MDK-ARM/*.uvprojx`(自动跟随);模拟器包含路径变化需同步脚本 `SIM_INCLUDE_DIRS`。
|
||||
|
||||
### 2.9 开发机一次性搭建(分步安装命令)
|
||||
@@ -457,7 +457,7 @@ pre-commit run --all-files
|
||||
|
||||
- 文件系统:FatFS(FAT32)挂 NAND;**上电无卷自动格式化**(`f_mkfs`);格式化会清除卷上全部文件(含网口配置 `/config.ini`)
|
||||
- RTC:SD2506 芯片(驱动 `Drivers/BSP/SD2506/`)提供墙钟基准与日志时间戳;首次使用建议先经 8888 对时
|
||||
- 启动时序:`app_main_init`(存储 → 时钟 → RS485 → NAND → ADC → 启动转换)→ 就绪屏障(STORAGE / NET / FTP / TIMESYNC 事件)→ 六任务运行;详见 `docs/项目启动顺序管理.md`、`docs/项目架构总览.md`
|
||||
- 启动时序:`app_main_init`(存储 → 时钟 → RS485 → NAND → ADC → 启动转换)→ 就绪屏障(STORAGE / NET / FTP / TIMESYNC 事件)→ 六任务运行;详见 `docs/架构设计/项目启动顺序管理.md`、`docs/架构设计/项目架构总览.md`
|
||||
|
||||
### 4.4 现场验收清单
|
||||
|
||||
@@ -479,7 +479,7 @@ pre-commit run --all-files
|
||||
| 项 | 要求 | 说明 |
|
||||
|---|---|---|
|
||||
| 操作系统 | 任意(Windows / Linux / macOS,有浏览器或 Python 即可) | 与设备同网段 |
|
||||
| 远程显示客户端 | **DTU-RemoteLCD**(独立项目:Flask + WebSocket 参考实现)或任意符合 RemoDispBus 协议的 TCP 客户端 | 连设备 **TCP 7003**;协议见 `docs/UI 设计/RemoDispBus协议与接收设计说明.md` |
|
||||
| 远程显示客户端 | **DTU-RemoteLCD**(独立项目:Flask + WebSocket 参考实现)或任意符合 RemoDispBus 协议的 TCP 客户端 | 连设备 **TCP 7003**;协议见 `docs/UI设计/RemoDispBus协议与接收设计说明.md` |
|
||||
| 对时工具 | 任意可 TCP 推送的工具/脚本 | 向设备 **8888** 推送 |
|
||||
| FTP 客户端 | 任意(资源管理器 / FileZilla 等) | 设备端 lftpd,端口 21 |
|
||||
| 浏览器 | Chrome / Edge | 查看参考客户端 Web 页;开发期浏览文档 SVG 图 |
|
||||
@@ -515,15 +515,15 @@ pre-commit run --all-files
|
||||
|
||||
| 主题 | 文档 |
|
||||
|---|---|
|
||||
| 项目全景架构 | `docs/项目架构总览.md` |
|
||||
| 启动顺序 / 就绪屏障 | `docs/项目启动顺序管理.md` |
|
||||
| 项目全景架构 | `docs/架构设计/项目架构总览.md` |
|
||||
| 启动顺序 / 就绪屏障 | `docs/架构设计/项目启动顺序管理.md` |
|
||||
| 内存预算详析 / 优化方案 / 栈观测 | `docs/内存管理/RAM使用分析与优化方案.md`(主文档)· `docs/内存管理/内存内容分配策略.md`(区域与 DMA 规则) |
|
||||
| 网口配置 / 生效链路 | `docs/网络配置说明.md` |
|
||||
| 远程显示协议 | `docs/UI 设计/RemoDispBus协议与接收设计说明.md` |
|
||||
| LVGL 模拟器部署 | `docs/UI 设计/LVGL模拟器部署与使用说明.md`、`simulator/README.md` |
|
||||
| 网口配置 / 生效链路 | `docs/子系统设计/网络配置说明.md` |
|
||||
| 远程显示协议 | `docs/UI设计/RemoDispBus协议与接收设计说明.md` |
|
||||
| LVGL 模拟器部署 | `docs/UI设计/LVGL模拟器部署与使用说明.md`、`simulator/README.md` |
|
||||
| 串口调试 / 自动化测试 | `docs/测试说明/串口助手使用指南.md`、`docs/测试说明/串口助手设计说明.md`、`docs/测试说明/自动化测试流程.md` |
|
||||
| pre-commit / cppcheck | `docs/代码规范/pre-commit使用说明.md`、`docs/代码规范/cppcheck使用说明.md` |
|
||||
| 引用关系图(文件引用) | `docs/引用关系图说明.md`(生成工具 `tools/refgraph`;渲染依赖 Graphviz,§2.8) |
|
||||
| 引用关系图(文件引用) | `docs/架构设计/引用关系图说明.md`(生成工具 `tools/refgraph`;渲染依赖 Graphviz,§2.8) |
|
||||
| 各模块测试指南 | `docs/测试说明/CH395F_Test_Guide.md`、`GD5F2GQ5UE_Test_Guide.md`、`SD2506_Test_Guide.md`、`FTP_Test_Guide.md` |
|
||||
| 已知硬件陷阱 | `docs/问题记录/CH395F_Trap_Records.md` 等 |
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> **恢复说明**:本文档曾在提交 `4e9ac0d`(2026-08-28)中误删,2026-09-13 从 git 历史恢复。API 随代码多轮同步(2026-09-13:`net_init` 4 参数 / `net_socket` 2 参数 / 网络代次号 / `NET_NO_OS` 双端构建;2026-09-23:`net_recv_to` / `net_sock_state` / `net_resync_listen` / `net_relisten`、L3 pending 化、D10 非阻塞重监听、Trap 22 周期对账、Trap 23 排渣隔离)。详见文末变更记录。
|
||||
>
|
||||
> **伴读文档**:本文回答"上层该怎么调";**内部函数之间的调用关系、每个函数的设计作用与意图**(netTask / 消息队列 / L3 挂起 / D10 重试 / Trap 22 对账 / Trap 23 排渣各子系统,含总体调用图与端到端时序)见 `docs/BSD_Socket_API_函数调用关系.md`。
|
||||
> **伴读文档**:本文回答"上层该怎么调";**内部函数之间的调用关系、每个函数的设计作用与意图**(netTask / 消息队列 / L3 挂起 / D10 重试 / Trap 22 对账 / Trap 23 排渣各子系统,含总体调用图与端到端时序)见 `docs/网络/BSD_Socket_API_函数调用关系.md`。
|
||||
|
||||
## 目录
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
### 2.1 分层架构
|
||||
|
||||

|
||||

|
||||
|
||||
### 2.2 文件说明
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
|
||||
> **双端构建**:`net_socket.h/.c`、`net_select.h/.c` 同时参与 MCU 端与 PC 模拟器端编译;模拟器端定义 `NET_NO_OS`,裁掉消息队列 / 事件回调等 OS 相关接口,仅保留 BSD Socket 核心 API(模拟器网络后端为 Winsock,`net_init` 不初始化 CH395F,详见 §2.3)。
|
||||
>
|
||||
> **网口配置**:IP / 掩码 / 网关 / MAC 由 `Drivers/BSP/NETCFG/net_cfg` 持久化(上电加载,UI 网口设置页可改并立即生效),见 `docs/网络配置说明.md`。
|
||||
> **网口配置**:IP / 掩码 / 网关 / MAC 由 `Drivers/BSP/NETCFG/net_cfg` 持久化(上电加载,UI 网口设置页可改并立即生效),见 `docs/子系统设计/网络配置说明.md`。
|
||||
|
||||
### 2.3 PC 模拟器端:net_socket_sim
|
||||
|
||||
@@ -806,7 +806,7 @@ void net_generation_inc(void);
|
||||
| `net_get_generation` | 获取当前网络代次号(首次 `net_init` 成功前为 0,每次网络重建 +1) |
|
||||
| `net_generation_inc` | 代次号加 1(netTask 重建成功、网络已可用后调用) |
|
||||
|
||||
**用途**:长驻 TCP 服务(FTP :21 / 对时 :8888 / 远程显示 :7003)在监听循环中检测代次号变化后主动重建监听 Socket,网口配置立即生效后可自动在新 IP 上恢复(重建会断开既有连接,属预期行为)。详见 `docs/网络配置说明.md` §4。
|
||||
**用途**:长驻 TCP 服务(FTP :21 / 对时 :8888 / 远程显示 :7003)在监听循环中检测代次号变化后主动重建监听 Socket,网口配置立即生效后可自动在新 IP 上恢复(重建会断开既有连接,属预期行为)。详见 `docs/子系统设计/网络配置说明.md` §4。
|
||||
|
||||
#### net_poll - 状态轮询
|
||||
|
||||
@@ -974,7 +974,7 @@ int net_resync_listen(int sockfd);
|
||||
int net_relisten(int sockfd);
|
||||
```
|
||||
|
||||
TCP 监听型 Socket:芯片侧 open+listen(D10 非阻塞重试)。芯片侧已在监听时:首次 open 失败 → close 重建 → 监听短暂中断 ~1s;两种情形都收敛到"监听器确定在位"。用途:代次号变化后显式重建(见 `docs/网络配置说明.md` §4)、应用判定连接已死需确定性监听。正常流无需(auto_relisten + 对账已覆盖)。返回 0 成功 / -1 失败。
|
||||
TCP 监听型 Socket:芯片侧 open+listen(D10 非阻塞重试)。芯片侧已在监听时:首次 open 失败 → close 重建 → 监听短暂中断 ~1s;两种情形都收敛到"监听器确定在位"。用途:代次号变化后显式重建(见 `docs/子系统设计/网络配置说明.md` §4)、应用判定连接已死需确定性监听。正常流无需(auto_relisten + 对账已覆盖)。返回 0 成功 / -1 失败。
|
||||
|
||||
**net_getsockname — 获取 Socket 本地地址(IP+端口)**
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# BSD Socket API 函数调用关系与设计说明
|
||||
|
||||
> **定位**:本文档是 `docs/BSD_Socket_API_使用指南.md`(下称"使用指南")的**内部视图**伴读文档。
|
||||
> **定位**:本文档是 `docs/网络/BSD_Socket_API_使用指南.md`(下称"使用指南")的**内部视图**伴读文档。
|
||||
> 使用指南回答"**上层该怎么调**"(公开语义 / 示例 / 常见问题);本文回答"**内部函数各自做什么、互相怎么调用、为什么这么设计**"(调用关系 / 设计意图 / 踩坑)。
|
||||
>
|
||||
> **范围**:MCU 端 `Drivers/BSP/NET/net_socket.c`(约 2870 行,全部函数)。
|
||||
@@ -320,7 +320,7 @@ sequenceDiagram
|
||||
N->>N: 控制块全部清零
|
||||
N->>C: check_exist → reset → fun_para(0x09)/MSS/重传/KeepAlive
|
||||
N->>C: IP·GW·掩码(或 DHCP)→ ch395f_init → MAC → 8 Socket 缓冲布局
|
||||
Note over N,A: net_stack_bring_up:PHY/链路就绪 → net_generation_inc<br/>FTP/UI/对时据**代次变化**放弃旧监听并重建(见 docs/网络配置说明.md §4)
|
||||
Note over N,A: net_stack_bring_up:PHY/链路就绪 → net_generation_inc<br/>FTP/UI/对时据**代次变化**放弃旧监听并重建(见 docs/子系统设计/网络配置说明.md §4)
|
||||
```
|
||||
|
||||
---
|
||||
@@ -381,10 +381,10 @@ sequenceDiagram
|
||||
|
||||
## 9. 相关文档
|
||||
|
||||
- `docs/BSD_Socket_API_使用指南.md` —— 公开 API 语义、示例、常见问题(本文的上半部)
|
||||
- `docs/网络/BSD_Socket_API_使用指南.md` —— 公开 API 语义、示例、常见问题(本文的上半部)
|
||||
- `docs/问题记录/CH395F_Trap_Records.md` —— Trap 01~23 机制细节(本文引用处)
|
||||
- `docs/问题记录/Net层阻塞模型业界对照与演进方案.md` —— L3 pending 化的设计推演
|
||||
- `docs/问题记录/错误码传播审计.md` —— E-02 头阻塞与错误码回传全审计
|
||||
- `docs/测试说明/链路延迟测试说明.md` —— D1/D10/L3/D14 等时延探针与自愈路径的台架证据
|
||||
- `docs/网络配置说明.md` §4 —— 代次号与网络重建时序
|
||||
- `docs/子系统设计/网络配置说明.md` §4 —— 代次号与网络重建时序
|
||||
- `docs/测试说明/CH395F_Test_Guide.md` —— 单连接模型测试规则(TC-NET-6xx)
|
||||