docs(报告): 补漏——§0.1 六维评分与口径/附录数字追平 R-9 后状态

用户指出 §0.1「内存使用」行仍写"LVGL 池 + UI 两份缓冲 54,146 B
仍在 SRAM1,而 CCM 只剩 7,904 B → R-2 后半被堵死,须先 R-9"。
上一条 R-9 提交只改了 §0.2/§0.3/§0.4/§5.x,漏了 §0.1、§1 术语表、
§3.1 体量表与附录 A 证据表。全库重扫后修这些:

- §0.1 内存使用:SRAM1 74.9% → **56.1%(余 57,504 B)**,瓶颈收敛
  到 CCM 单点(87.9%、只剩 7,904 B),待迁体量 29,570 B,只差
  "缩堆"一步;评级 B → **B+**(SRAM1 由卡点变富裕、治理三件套与
  观测齐备;扣分项换成 CCM 单点 + MicroLIB C 堆无机械检查)
- §0.1 Flash、§1 术语表、§6.4:231,036 → **231,084**
- §1 术语表:`ROM = 231,324 B` 是**算术错**,Code+RO+RW 实为
  **232,196 B**(§5.1 早前已修,这处漏了)
- §1 术语表 RAM 占用定义:98,144 / 74.9% → **73,568 / 56.1%**
- 附录 A 证据行:改 `RW_IRAM1 Size: 0x00011f60`、余 57,504 B
- §0.1 与 §3.1:工程文档 88 篇 / 31,416 行 → **87 篇 / 30,781 行**、
  受控文件 2,466 / 79.3 MB → **2,465 / 79.2 MB**(随 506eccc 删除
  错误码传播审计.md,−1 篇 / −635 行);同表 docs/ **56.9 MB** 与
  手册图片 **703 张 / 36.3 MB** 实测未变,保留
- §0.1 / §0.2 / §0.4 与附录的复核日期统一标 2026-10-15
- 最近复核行的 HEAD 改指 a7f5265,并注明"后续文档与模拟器侧提交
  不影响固件",避免每提交一次就再次过期

未改一处:§3.1"全部 Markdown 只有 5.4 MB"——本次复算得 5.8 MB /
192 篇,但原计数规则无法复现,差异也远超一次删除的量级,不猜着改,
留给下次复核定口径。

校验:check_doc_links --all 通过(142 文档、章节引用无法判定 0);
check_mem_numbers 与 .map 一致;无 BOM / CRLF / U+FFFD。
This commit is contained in:
2026-10-15 10:14:34 +08:00
parent 172b3f4a20
commit ff9fcbd43c
@@ -3,7 +3,7 @@
| 项目 | 内容 |
|------|------|
| 审查日期 | 2026-09-18(初版) |
| **最近复核** | **2026-10-15**(R-9 落地后重链接),基线 `HEAD = 803f771`(分支 `v2-on-ui`);固件基线 = `MDK-ARM/STM32F407-Demo/STM32F407-Demo.map`(0 Error / 0 Warning)。⚠ 该次构建**含并行未提交改动**(`App/cfg/cfg_file.*`、`Drivers/BSP/SD2506/*`)→ Code 212,344 比 2026-10-14 干净基线多 48 B;本报告只在**内存/Flash 水位**上追这次构建,其余结论仍属 2026-10-14 复核 |
| **最近复核** | **2026-10-15**(R-9 落地后重链接),基线 `HEAD = a7f5265`(分支 `v2-on-ui`,工作树干净;其后的 `0cece5a` 文档提交与 `172b3f4` 模拟器侧改动都不影响固件);固件基线 = `MDK-ARM/STM32F407-Demo/STM32F407-Demo.map`(0 Error / 0 Warning,Code 212,344 = 已含 `506eccc` 的 `cfg_file` / `sd2506` 改动,比 2026-10-14 那次干净基线多 48 B)。本报告只在**内存/Flash 水位**上追这次构建,其余结论仍属 2026-10-14 复核 |
| **销项状态** | 本报告采用**修复即销项**:已修复项的正文与表格行已删除,去处见文末**已销项条目的记录去处**;未闭环清单见 **§0.2 / §0.4** |
| 审查范围 | 仓库全量(2,466 个受版本控制文件 / 79.3 MB);重点为自研代码 50,874 行(191 文件)与构建产物内存画像 |
| 审查方式 | 静态审查 + 链接图(.map)量化分析 + 构建脚本/门禁核对;**未做上机动态验证**(除特别标注外) |
@@ -19,18 +19,18 @@
## 0. 执行摘要
### 0.1 六维评分(2026-10-14 复核)
### 0.1 六维评分(2026-10-15 复核)
| 维度 | 评分 | 一句话结论 | 仍开放的主要缺口 |
|------|------|-----------|-----------------|
| 项目结构 | **A−** | 六层分层真实可执行、命名一致、门禁到位;反向依赖控制在 4 处 | `NETCFG`/`UI` 语义层错位(S-1)、4 处裸 `extern`(S-2)、`rs485_task.c` 仍在注册白名单里等 B2 |
| 文档分布 | **A−** | 工程文档 **88 篇 / 31,416 行**,`docs/README.md` 索引 + `docs/文档规范.md` + 三档一致性门禁全部落地,`check_doc_links --all` = 0 失效 | **D-1**:`docs/` 占仓库 **71.8%**、手册图片 **36.3 MB**、`.git` 已 **235 MB**(已决策暂不处理,登记观察) |
| 文档分布 | **A−** | 工程文档 **87 篇 / 30,781 行**(2026-10-15 随 `错误码传播审计.md` 删除而 −1 篇 / −635 行),`docs/README.md` 索引 + `docs/文档规范.md` + 三档一致性门禁全部落地,`check_doc_links --all` = 0 失效 | **D-1**:`docs/` 占仓库 **71.8%**、手册图片 **36.3 MB**、`.git` 已 **235 MB**(已决策暂不处理,登记观察) |
| 模块设计 | **A−** | 看门狗(IWDG + 心跳位图 + 4 个 Fault 现场 + `.noinit`)、就绪屏障、卷锁、FTP 鉴权、`Error_Handler` 自恢复、ADC 全链均已落地 | **N-12/N-13** dhara 移植两处缺陷(数据丢失风险)、**N-16** 日志逐条开关、驱动层无统一错误码约定(S-5)、RS485 无协议栈(随 B2 暂缓) |
| 内存使用 | **B** | 堆迁 CCM + 栈/堆三面观测常开 + `mem-budget` 92% 门禁;SRAM1 **74.9%** | **LVGL 池 + UI 两份缓冲 54,146 B 仍在 SRAM1**,而 CCM 只剩 **7,904 B** → R-2 后半被堵死,须先 R-9(§5.3) |
| Flash 使用 | **A−** | F-1/F-2/F-3 落地省 64,576 B → 占用 **22.0%(231,036 B)** | F-4/F-5/F-6 ≈10 KB + 编译时长(§5.4) |
| 内存使用 | **B+** | 堆迁 CCM + 栈/堆三面观测常开 + `mem-budget` 92% 门禁 + 预算台账与趋势基线;**R-9 已落地(2026-10-15)→ SRAM1 由 74.9% 降到 56.1%(余 57,504 B),不再是卡点** | **瓶颈收敛到 CCM 单点:87.9%、只剩 7,904 B**,而待迁的 LVGL 池 + UI 两份缓冲 = **29,570 B** → R-2 后半只差"缩堆 56→32 KB"这一步(§5.3);MicroLIB 512 B C 堆仍无机械检查(§5.5) |
| Flash 使用 | **A−** | F-1/F-2/F-3 落地省 64,576 B → 占用 **22.0%(231,084 B)** | F-4/F-5/F-6 ≈10 KB + 编译时长(§5.4) |
| UI 标准化 | **B** | golden 回归已建(`simulator/tests/` 四脚本,含池水位门禁) | 无令牌层 / 无组件库 / 无页注册表(手写 `case` 仍在)、**27 页**未落地、golden 与字符集差集未挂门禁(§6) |
### 0.2 未闭环问题(Top 3,2026-10-14)
### 0.2 未闭环问题(Top 3,2026-10-15)
| # | 编号 | 问题 | 影响 | 现状 |
|---|------|------|------|------|
@@ -49,7 +49,7 @@
---
## 0.4 未闭环清单(2026-10-14 复核)
## 0.4 未闭环清单(2026-10-15 复核)
> 只列**未办 / 半办**项;已修项按「修复即销项」删除(去处见文末)。图例:❌ 未办 / 🟡 半办。
> **顺序权威在 [`../任务规划/README.md`](../任务规划/README.md) §2,本表为评审快照**;登记簿编号在括号内。
@@ -107,8 +107,8 @@ Select-String -Path 'MDK-ARM\STM32F407-Demo\STM32F407-Demo.map' -Pattern '__heap
| 术语 | 定义 |
|------|------|
| 自研代码 | `App/`、`Drivers/BSP/`(不含 `Lib/`、`Middlewares/`、HAL/CMSIS)、`test/`;不含 CubeMX 生成的 `Src/`、`Inc/` |
| Flash 占用 | `Code + RO-data` = `ER_IROM1` **231,036 B(22.0% of 1 MB)**;`ROM` 再加 `RW-data` 初始化表 = 231,324 B |
| RAM 占用 | `RW-data + ZI-data`,**跨两个区域** = SRAM1 `RW_IRAM1` **98,144 / 131,072(74.9%)** + CCM `RW_CCM` **57,376 / 65,280(87.9%)** + `UNINIT_CCM` 48 B(`.noinit` 崩溃现场保留区)。⚠ 原报告"CCM 不在 scatter 内计 0"的口径已不成立 |
| Flash 占用 | `Code + RO-data` = `ER_IROM1` **231,084 B(22.0% of 1 MB)**;`ROM` 再加 `RW-data` 初始化表 = 232,196 B |
| RAM 占用 | `RW-data + ZI-data`,**跨两个区域** = SRAM1 `RW_IRAM1` **73,568 / 131,072(56.1%)** + CCM `RW_CCM` **57,376 / 65,280(87.9%)** + `UNINIT_CCM` 48 B(`.noinit` 崩溃现场保留区)。⚠ 原报告"CCM 不在 scatter 内计 0"的口径已不成立 |
| "死代码" | 该对象在镜像中有码,但其功能被工程配置(如 `LV_COLOR_DEPTH 1`)或调用点扫描(零调用者)证明不可达 |
> **内存数字的权威源**:区域水位与子系统配额由 `../内存管理/RAM预算台账.md`(受管区,`ram_baseline.py --write` 生成)持有,趋势在 `scripts/ram_baseline.tsv`。本报告只在支撑结论处引用,不与之竞争事实源。
@@ -191,11 +191,11 @@ Select-String -Path 'MDK-ARM\STM32F407-Demo\STM32F407-Demo.map' -Pattern '__heap
| 对象 | 文件数 | 体积 | 占仓库 |
|------|--------|------|--------|
| 仓库受控文件总计 | 2,466 | **79.3 MB** | 100% |
| 仓库受控文件总计 | 2,465 | **79.2 MB** | 100% |
| `docs/` 合计 | — | **56.9 MB** | **71.8%** |
| └ `docs/芯片手册/` 图片 | 703 张 | **36.3 MB** | **45.8%** |
| `.git` 目录 | — | **235.3 MB** | — |
| 工程文档(Markdown,自研) | 88 篇 / **31,416 行** | — | — |
| 工程文档(Markdown,自研) | 87 篇 / **30,781 行**(2026-10-15 随 `错误码传播审计.md` 删除,−1 篇 / −635 行) | — | — |
| 外部资料(Markdown,datasheet 转录) | 14 篇 / 58,244 行 | — | — |
**关键失衡**:工程文档与外部资料的行数比已从 1:4.2 改善到 **1:1.9**,但**全部 Markdown 只有 5.4 MB,图片体量(36.3 MB)是它的 6.7 倍、占仓库近一半**,`git clone` 的净耗时几乎全花在扫描手册图片上。⚠ `.git` 已达 **235 MB**(受控文件才 79.3 MB),说明历史里存过多版图片/产物——**D-1 单靠拆仓或 LFS 不足以解决 clone 耗时,还需一次历史重写**。
@@ -537,7 +537,7 @@ const ui_page_desc_t ui_page_deadzone = UI_FORM_PAGE("遥测死区", s_items_dea
|------|------|
| 页面**不得**新增静态大缓冲;文本缓冲统一用 `UI_BUF_STRLEN` | 现有 `s_ts/s_desc` 已是范式 |
| 每页**只用** `lv_style_const_prop_t`,禁止运行期 `lv_style_init` | 已验证动态样式每次泄漏 88 B |
| 优先自绘(`lv_draw_*` + `lv_text_get_width`),新控件需评审(会破坏 §5.4 F-2 **已落地**的裁剪,且须两端同步) | LVGL 现占镜像 **38.0%**(87,706 / 231,036 B) |
| 优先自绘(`lv_draw_*` + `lv_text_get_width`),新控件需评审(会破坏 §5.4 F-2 **已落地**的裁剪,且须两端同步) | LVGL 现占镜像 **38.0%**(87,706 / 231,084 B) |
| 帧缓冲任何改动必须遵守 R-4(副本数 ≤ 2) | 当前 4 副本 12.8 KB |
| `LVGL 池`用量必须经 `lv_mem_monitor` / 池水位门禁实测后才允许扩大 | **16 KB**(R-9 于 2026-10-15 由 40 KB 降下;实测峰值 6,568 B = 池的 40%,余 ≈9.8 KB) |
@@ -583,9 +583,9 @@ const ui_page_desc_t ui_page_deadzone = UI_FORM_PAGE("遥测死区", s_items_dea
## 附录 A 关键证据索引
| 结论 | 证据(2026-10-14) |
| 结论 | 证据(2026-10-15 `.map`) |
|------|---------------------|
| SRAM1 74.9%、余 32,928 B;CCM 87.9%、余 7,904 B | map `Execution Region RW_IRAM1 Size: 0x00017f60, Max: 0x00020000` / `RW_CCM Size: 0x0000e020, Max: 0x0000ff00`;`ram_baseline.tsv` 末行 |
| SRAM1 56.1%、余 57,504 B;CCM 87.9%、余 7,904 B | map `Execution Region RW_IRAM1 Size: 0x00011f60, Max: 0x00020000` / `RW_CCM Size: 0x0000e020, Max: 0x0000ff00`;`ram_baseline.tsv` 末行 |
| MicroLIB C 堆 = 512 B | `MDK-ARM/startup_stm32f407xx.s` `Heap_Size EQU 0x200`;map `Removing startup_stm32f407xx.o(HEAP), (512 bytes)`(未被引用 → 整段移除) |
| 任务栈全部动态分配 | `Src/freertos.c` 的 `osThreadAttr_t` 无 `.stack_mem`;8 条产品任务栈合计 9,792 words(R-6 未办) |
| DMA 可达性三层防线(原 N-11 的处置) | 编译期窗口断言 `gd5f2gq5ue.h:96-107`(负数组 typedef)→ 启动期自检 `nand_ftl.c:241-243` → 运行时守卫 `gd5f_dma_buf_ok()`(`gd5f2gq5ue.c:121-139`);规则族 R1~R4 → `../内存管理/内存内容分配策略.md` §4;负路径用例 TC-GD5F-704/705 |
@@ -629,6 +629,7 @@ const ui_page_desc_t ui_page_deadzone = UI_FORM_PAGE("遥测死区", s_items_dea
| **2026-10-15** | **登记簿同步销项** | 本报告的 N-03c / N-11 对应登记簿 **N-20 / N-26** 两行已按「完成即销项」从 `../任务规划/登记簿.md` §5 删除(并清 `../任务规划/README.md` §1/§2 与 `排期详述.md` §1 的引用,W4 链由 6 项减为 5 项、结构/健壮性计数 9→7)。删除前补齐去处记录:`../子系统设计/看门狗设计说明.md` §4.4 新增 `Error_Handler` 统一降级一节、`../内存管理/内存内容分配策略.md` §4 R2 补编译期窗口断言与启动期自检两层 + §8 落点索引两行。同批订正登记簿三处过时内容:N-23 残余去掉已删除的 `lftpd_log.c`、N-25 去掉已删除的 `NET_RECV_TIMEOUT_MS`、N-27 剔除不可行的 R-5 并把 CCM 余量改为实测 7,904 B、N-29 的 `.git` 由 149 MB 订正为实测 235.3 MB |
| **2026-10-15** | **执行本报告条目:R-9 落地并销项** | `LV_MEM_SIZE` 40→16 KB(`Lib/lv_conf.h` + `simulator/lv_conf.h` 同步,`lv-conf-sync` 生效值比对 PASS)。**依据**:池水位门禁实测菜单基线 5,368 B / 开页-关页往返 5,448 B / 最重页面峰值 6,568 B。**验证**:`@build` 0 错 0 警,ZI 精确 −24,576 B → SRAM1 98,144/74.9% → **73,568/56.1%(余 57,504 B)**,CCM 不变;PC 侧 11 页黄金参考逐字节 10/11 一致、往返池水位 5,448 B 未变(唯一差异 `netcfg_save` 经 40 KB A/B 复测确认与本次改动无关,真因见下一行)。**连带改写**:§0.2 Top3 第 2 条、§0.3 主线一、§0.4 内存两行、§5.1 基线表(追 2026-10-15 `.map`)、§5.2 诊断 1(瓶颈由 SRAM1 换到 CCM)、§5.3(R-9 行删除、R-2 收益改 −29,570 B)、§6.4 池容量行;同步 `../内存管理/RAM使用分析与优化方案.md`、`../内存管理/RAM预算台账.md` §3、`../UI设计/UI_设计架构.md`、`../UI设计/UI_界面制作流程.md`、`../UI设计/LVGL模拟器部署与使用说明.md`、`simulator/README.md`、`../产品需求/产品需求设计文档.md`。**真机复跑 ✅**:`@test` PASS(`fw build: Oct 15 2026 07:31:34`,无 `[ERR]`/Fault,开机 622 ms 到 `net init: OK`),`menu build done: used=3192` = 建池后 15,020 B 的 21%。台账受管区与内存快照区已 `--write` 回填 → `mem-budget` / `mem-numbers` 两钩子转绿 |
| **2026-10-15** | **修 `netcfg_save` 假失败:回归改为自洽运行** | 上一条那个"唯一差异"查到真因,**不是代码回归**:`--cfgtest` 的 E-01 场景 2 伪造一份 4000 B 纯注释配置档并断言"拒写后原文件不动",**连通过路径也不删除它**;留在工作目录后每次运行都被加载 → 外科手术保存要在 4000 B 注释后补写受管段 → 输出必超 `CFG_FILE_MAX_LEN` → 引擎**按设计拒写** → 保存行显示 `ERR`。修三处:`simulator/main.c` 给 `--cfgtest` 加外壳(无论成败一律删除伪造档)、`check_menu_rows.py` 与 `check_content_pages.py` 改在**空临时目录**里跑(`cwd=tmp`)、脚本里已作废的 `sim_netcfg.bin` 兼容清理改为只提示不删除。修后 **11/11 页 + 往返池水位 5,448 B 全过,未刷任何黄金参考**(参考本来就是对的)。排查口径 → `../UI设计/UI_自动化测试流程.md` §五 |
| **2026-10-15** | **补漏:§0.1 六维评分与口径/附录数字追平 R-9 后状态** | 前面那条只改了 §0.2/§0.3/§0.4/§5.x,**漏掉 §0.1、§1 术语表、附录 A 证据表**(用户指出):① 内存使用行仍写"54,146 B 仍在 SRAM1 / SRAM1 74.9% / 须先 R-9"→ 改为 SRAM1 **56.1%(余 57,504 B)**、瓶颈收敛到 CCM 单点、只差"缩堆"一步,评级 **B → B+**(理由:SRAM1 由卡点变富裕,治理三件套与观测齐备;扣分项换成 CCM 单点 + C 堆无机械检查)② Flash `231,036` → **`231,084`**(§0.1 / §1 术语表 / §6.4 三处),并修掉术语表里 `ROM = 231,324 B` 这个**算术错**(`Code + RO + RW` 实为 **232,196 B**)③ RAM 占用定义 `98,144 / 74.9%` → **`73,568 / 56.1%`** ④ 附录 A 证据行改 `RW_IRAM1 Size: 0x00011f60`、余量 57,504 B ⑤ 文档分布 **88 篇 / 31,416 行 → 87 篇 / 30,781 行**、§3.1 体量表受控文件 **2,466 / 79.3 MB → 2,465 / 79.2 MB**(均随 `错误码传播审计.md` 删除,−1 篇 / −635 行;同表 `docs/` **56.9 MB**、手册图片 **703 张 / 36.3 MB** 复核未变)⑥ §0.1/§0.2/§0.4 与附录的复核日期统一标 **2026-10-15**,最近复核行的 `HEAD` 改指 `a7f5265` 并注明"后续文档与模拟器侧提交不影响固件",避免每提交一次就过期 |
| **2026-10-14** | **清理:删除已完成与过时内容** | ① **已修复项按销项删除**(去处见下表):N-02(FTP 鉴权)、N-03c(`Error_Handler` 降级)、**N-11(DMA 可达性三层防线 + 规则族 R1~R4)**、S-3(注册反向校验)、P2-5/P2-6(SD2506 负温度与 WRTC)、P2-8(`NET_RECV_TIMEOUT_MS` 已删)、P2-9(`mkdir` 幂等重试)、§5.5 前三条(内存治理三件套)、交付物清单已建项。② **删除过时层**:2026-09-16 / 2026-10-11 双列基线表与"复核期间未提交改动"口径说明、旧"组合结果预估"表、逐条"2026-10-11 复核"批注、历史变更记录行——内存数字改由 `../内存管理/RAM预算台账.md` 与 `scripts/ram_baseline.tsv` 持有。③ **按 2026-10-14 `.map` 与代码重测**全部保留结论的数字(含 `lftpd_log.c` 已删除并入 `lftpd_auth.c`,N-06 残余只剩 `rs485_task.c` 一条刻意缺口)。④ **修正三处错误**:R-5(`configMAX_PRIORITIES` 56→32)**判定不可行**(CMSIS-RTOS2 `#error`);原 §7 把报告 S-5(驱动统一错误码)与登记簿 S-5(卷锁覆盖面)混为一谈;原 §5.5 第 4 条建议的 `_Static_assert` 形态在 AC5 上取不到链接期地址,已被"窗口断言 + 启动自检 + 运行时守卫"三层取代。⑤ 报告自有编号**不回改、不重排**(`../编号规范.md`) |
### 已销项条目的记录去处