docs(任务规划): 波次号 W1~W8 改为语义名,两个任务卡文件改名

用户裁定:W4 这类字母+数字让人难以理解。W 号看着像执行顺序,实际 W8 排在
W3/W4 之前,读者必须先查表才知道谁先谁后;去掉编号后执行顺序就是 §2.0 表
从上到下,少一层映射。

- 波次改语义名:采集保护收尾 / 数据可信 / 预算与内存 / 结构债 / 验证常态 /
  UI 扩展 / 仓库决策
- 文件改名(git mv):W1-采集保护收尾.md → 采集保护收尾.md,
  W8-数据可信.md → 数据可信.md
- 删掉只为编号存在而写的两条注记(W2/W3 槽位保留、W3 不重编号)
- 并行分道方案的分支 ID 同步:task/W8-scale-doc → task/cal-scale-doc 等
- 编号登记表:WAVE 族标为废止并关闭悬空检查(属主文档已不再定义 W 号),
  C-WAVE / D-WAVE 两族 title 补废止说明
- 同步 15 处跨文档引用(README 文件夹地图、产品需求 §9.2、编号规范 §4.1、
  报告 §0.3 波次表、RAM 台账、保护规划变更记录等)
- 不动的同形异义:网表 W4.0 封装宽度、芯片手册 W1 载带尺寸、MSVC /W4
This commit is contained in:
2026-10-25 01:44:25 +08:00
parent 7048e9cb9a
commit 1e6996ecd0
20 changed files with 121 additions and 117 deletions
+1 -1
View File
@@ -236,7 +236,7 @@ docs/
| 位置 | 内容 |
|---|---|
| [`任务规划/`](任务规划/README.md) | **统一待办登记簿(文件夹)**——`README.md` = 排序权威(波次 W1~W8)+ 编号空间 + 维护约定;`W8-数据可信.md` = **当前波次**(通道标定 → 遥测链 → 运行参数,14 张卡);`W1-采集保护收尾.md` = W1 剩余(只剩 M3 送检);`登记簿.md` = N/S/T-x 长期观察;`排期详述.md` / `暂缓-RS485.md` / `测试与架构专项.md` = 波内详表 / 冻结簇 / 专项;`基线与待确认.md` = 待确认(开放问题,OQ 族属主);**`并行分道方案.md` = 待办横向归道(写域 域1~域8 + 道A~道H + 批次 + 合并次序)**;只保留未闭环项,完成即删 |
| [`任务规划/`](任务规划/README.md) | **统一待办登记簿(文件夹)**——`README.md` = 排序权威(推进顺序 + 波次语义名)+ 编号空间 + 维护约定;`数据可信.md` = **当前波次**(通道标定 → 遥测链 → 运行参数,14 张卡);`采集保护收尾.md` = 「采集保护收尾」剩余(只剩 M3 送检);`登记簿.md` = N/S/T-x 长期观察;`排期详述.md` / `暂缓-RS485.md` / `测试与架构专项.md` = 波内详表 / 冻结簇 / 专项;`基线与待确认.md` = 待确认(开放问题,OQ 族属主);**`并行分道方案.md` = 待办横向归道(写域 域1~域8 + 道A~道H + 批次 + 合并次序)**;只保留未闭环项,完成即删 |
| `硬件平台/` | 网表详细分析报告与语义图(V0.0 / V0.1);**[`ADC通道映射说明.md`](硬件平台/ADC通道映射说明.md)——V0.1 十七路 ADC 语义/网名/通道号权威映射表(固件取数、UI 显示、自检注入以此为准)** |
| `芯片手册/` | 外部芯片数据手册转录(CH395F / GD5F2GQ5UE / SD2506 / TPAFE5160 / RTL8305NBI 等) |
| `images/` | 文档技术配图(`.svg` 产物,由 `tools/arch_diagram/`、`tools/refgraph/` 生成) |
+1 -1
View File
@@ -266,6 +266,6 @@ ui_page_ac / ui_page_yx / ui_page_setlist ...
## 9. 与既有规划的关系
- 本文替代"剩余页面尚未规划"的状态(原 `docs/任务规划/README.md` §2.0 中 W6 的 U5 条目按"暂缓、未规划"记载)。
- 本文替代"剩余页面尚未规划"的状态(原 `docs/任务规划/README.md` §2.0 中「UI 扩展」的 U5 条目按"暂缓、未规划"记载)。
- 页面工作**不应独立于数据层推进**:批 1 的第 1 项(快照层)与采集/遥测链共享同一批数据,建议与"测量子系统"同波次排期。
- 与 `docs/问题记录/采集与数据处理短板评测.md` 的对应:该文的标定(`docs/问题记录/采集与数据处理短板评测.md` §4.1)与遥测链(同文 §4.2)落地后,交流量/直流量/遥测系数三页才有真实数据可显示。
@@ -780,7 +780,7 @@ cfg-file-unit-test、test-suite-switch、gitlint。
### 9.2 阶段路线图
> **顺序唯一权威 → [`../任务规划/README.md`](../任务规划/README.md) §2(统一推进顺序,波次 W1~W7;
> **顺序唯一权威 → [`../任务规划/README.md`](../任务规划/README.md) §2(统一推进顺序,波次见 §2.0;
> RS-485/B2 整簇暂缓见其 §2.4,2026-10-12 用户决定)**。
> 本节自 2026-10-11 起不再维护路线图(原阶段图删除,避免与登记簿漂移;原 C4"defaultTask 栈余量 10%"
> 已于 2026-10-10 削链闭环销项,见 `../内存管理/RAM使用分析与优化方案.md`)。
+33 -29
View File
@@ -8,16 +8,16 @@
> | 文件 | 内容 | 变更频率 / 写者 |
> |---|---|---|
> | `README.md`(本文件) | 编号空间(§0)· 未闭环一览(§1)· **推进顺序权威(§2)** · 维护约定(§3) | 低频;仅主工作树 |
> | `W1-采集保护收尾.md` | W1 剩余:只剩 M3 送检(B10) | 低频——送检窗口前后改 |
> | `W8-数据可信.md` | **当前波次(2026-10-23 用户定项)**:通道标定 → 遥测链 → 运行参数段;含事实基线、折算模型、**14 张任务卡**(含"已知电压注入验证"与"端子变比确认"两卡)、前置决策 | **高频**——开工后状态流转只改它 |
> | `排期详述.md` | W4 结构债 / W5 验证常态 波内详表 | 低频 |
> | `采集保护收尾.md` | 「采集保护收尾」剩余:只剩 M3 送检(B10) | 低频——送检窗口前后改 |
> | `数据可信.md` | **当前波次(2026-10-23 用户定项)**:通道标定 → 遥测链 → 运行参数段;含事实基线、折算模型、**14 张任务卡**(含"已知电压注入验证"与"端子变比确认"两卡)、前置决策 | **高频**——开工后状态流转只改它 |
> | `排期详述.md` | 「结构债」/「验证常态」波内详表 | 低频 |
> | `并行分道方案.md` | **待办横向归道**:文件级写域(域1~域8)· 八条道(道A~道H)· 批次与合并次序 · 不能并行的事项 | 低频——分道或批次变化时改;**明细不复制**,只做归道 |
> | `暂缓-RS485.md` | B2 RS-485 整簇冻结清单(用户决定) | 极少 |
> | `登记簿.md` | N-x / S-x / T-x 长期登记(网络 / 存储 / 硬件 / 测试 / 报告并轨) | 中频——新发现进对应表 |
> | `测试与架构专项.md` | P1-10 收尾 + S1x / A-x 专项 | 低频 |
> | `基线与待确认.md` | **只放还没答案的问题**(OQ 族属主登记处);基线类内容已移出到模块文档 | 参考,少改 |
>
> **怎么用**:想知道"现在该做什么、按什么顺序" → 本文件 **§2**;想知道"当前波次任务卡状态 / 验收判据 / 并行道" → `W8-数据可信.md`;
> **怎么用**:想知道"现在该做什么、按什么顺序" → 本文件 **§2**;想知道"当前波次任务卡状态 / 验收判据 / 并行道" → `数据可信.md`;
> 想知道"某条待办的来龙去脉" → 按编号查 `登记簿.md` / `测试与架构专项.md`;想知道"还差哪些验证" → `排期详述.md` §2。
>
> **只保留待办**:已完成条目直接删除,不留变更记录(历史见 `git log` 与各模块文档);
@@ -38,7 +38,7 @@
| `N-x` / `S-x` / `T-x` | 台架/审计观察登记项 / 存储·日志管线 / 测试与工具链 | **存量冻结沿用、不再新增**(新条目见上一行);`N-x` 含硬件改版项(需下一版硬件,固件侧只记口径,如 N-18) |
| `S1~S14` / `A-1~A-7` | 2026-10-02 复审的测试充分性与架构专项 | 编号**不回收** |
| `E-xx` | 错误码传播审计发现(**历史族**) | 属主文档已于 2026-10-15 删除;编号冻结(`docs/编号规范.md` §4.1 / §4.3),存量引用仅作历史指称,新发现一律 `DEF` |
| `B`/`C`/`D` 前缀 | §2 排序条目编号:B=功能主线、C=结构债、D=验证窗口 | 编号不回收,见 §2 |
| `B` 前缀 | 功能主线排期条目 `B0`~`B10`(见 §2) | 存量冻结、不再新增。原 `C`(结构债)/ `D`(验证窗口)两族 **2026-10-25 废止**,条目改语义名——它们与 UI 设计约束、设计决策记录同字母不同义 |
| 报告 `N-x`/`R-x`/`F-x`/`S-x`/`U-x`/`D-x` | `项目审查与优化建议报告.md` **自有编号** | ⚠ **与本登记簿同名不同义**(报告 N-16 = 日志逐条开关,登记簿 N-16 = A2/A4 负向台架)→ **引用一律带文档名**。其未闭环项 2026-10-11 并入本登记簿(新编 `N-19`~`N-29` + U 簇,出处列保留报告编号) |
> ⚠ **为什么 2026-10-14 改用语义标识**(一条实测失效案例):原规则写着"编号**不回收**",但
@@ -64,19 +64,19 @@
| 仓库 | 1 | N-29(`.git` **233 MB**,**已决策暂不处理、登记观察**) |
| 硬件 | 1 | N-18(V0.2 改版项) |
| 测试 / 基础设施 | 5 | T-7(CI 远端两 job 闭环 + 第二机交叉验证)· S12(断言宏)· A-4(采集链路测试约束,RS485 侧随 B2 暂缓)· A-5 残余(CI 体积门禁盲区)· 串口助手 A6/A7 补验(待 CH340) |
| UI | 1 | U5 页面落地(**未排期**,最早 W8 M4 之后) |
| UI | 1 | U5 页面落地(**未排期**,最早在「数据可信」M4 之后) |
| **暂缓** | 2 簇 | **B2 RS-485 整簇**(`暂缓-RS485.md`)· **N-27 内存优化簇剩余**(R-2 后半 / R-3 / R-4 / R-6;重开条件见 `../问题记录/项目审查与优化建议报告.md` §5.3)。⚠ 已落地的 R-9 与 `mem-budget` 门禁/台账/趋势**不回退** |
| **数据可信(W8)** | 1 簇 · **14 张卡** | 已知电压注入验证 · 端子变比确认 · 通道标定系数与折算 · 标定落盘 · 未标定即闭锁 · 下游三常数重定 · 量纲回归 · 遥测快照 200 ms · 运行参数段 · 频率点绑定(详表 `W8-数据可信.md`) |
| **数据可信**(当前波次) | 1 簇 · **14 张卡** | 已知电压注入验证 · 端子变比确认 · 通道标定系数与折算 · 标定落盘 · 未标定即闭锁 · 下游三常数重定 · 量纲回归 · 遥测快照 200 ms · 运行参数段 · 频率点绑定(详表 `数据可信.md`) |
> **网络侧 E-xx 存量项**(历史编号族,属主文档已于 2026-10-15 删除,编号冻结见
> `docs/编号规范.md` §4.3):E-27 / E-28 挂「net 层跨上下文收口」(见 `排期详述.md` §1);
> E-47 待 CH395F 驱动侧定案;E-12 为 `FF_FS_LOCK` / 单写者纪律记录项;E-31 后续与 E-62
> 为回归监督项(纪律已固化于 `AGENTS.md`,无需改动)。
> UI 标准化只剩 U5 页面落地,见 §2 W6;lftpd 主机测试缺口为整簇排期项。
> UI 标准化只剩 U5 页面落地,见 §2「UI 扩展」;lftpd 主机测试缺口为整簇排期项。
### 1.1 结构性判断(排序依据)
1. **功能主线优先(用户决定 2026-10-12)**:把"采集→相量→保护→上送"链路收口到"台架闭环 + 功能面完整 + 可送检"。前两项已达成,W1 只剩 M3 送检(`W1-采集保护收尾.md`)。**RS-485 对下采集(B2)暂缓**(`暂缓-RS485.md`),主线不等它。
1. **功能主线优先(用户决定 2026-10-12)**:把"采集→相量→保护→上送"链路收口到"台架闭环 + 功能面完整 + 可送检"。前两项已达成,「采集保护收尾」只剩 M3 送检(`采集保护收尾.md`)。**RS-485 对下采集(B2)暂缓**(`暂缓-RS485.md`),主线不等它。
2. **内存预算红线已机械化**:`mem-budget` 钩子拦 RW_IRAM1/RW_CCM >92%,子系统配额 / CCM 台账 / 趋势基线 → `docs/内存管理/RAM预算台账.md`。**R-2 后半与 R-3 / R-4 / R-6 整簇暂缓**(CCM 只剩 **7,904 B**,重开条件见 `../问题记录/项目审查与优化建议报告.md` §5.3)——**门禁与台账继续常开,它们正是"何时该重开"的传感器**。
3. **验证债仅剩窗口性事项**(L5 基线重锁 / A2-A4 负向台架 / 探针窗口心跳 / 串口助手补验 + P1-10 收尾),不单独排期、逢窗口顺手做。
@@ -87,41 +87,45 @@
> **本节是全项目所有工作流唯一的权威顺序**:`产品需求设计文档.md` §9.2、`../算法/继电保护功能复现规划.md`、
> `项目审查与优化建议报告.md` §0.3 中的路线图均为局部视图,**顺序变更只改本节,其它文档只留指针**。
> 排序原则:**安全风险 > 产品功能主线 > 数据正确性 > 预算/结构债 > 验证常态 > UI 扩展 > 仓库决策**(当前无未闭环安全项)。
> 波内详表在挂接文件里(`W1-采集保护收尾.md` / `排期详述.md` / `暂缓-RS485.md`),但**波次增删与先后只改 §2.0**。
> 波内详表在挂接文件里(`采集保护收尾.md` / `排期详述.md` / `暂缓-RS485.md`),但**波次增删与先后只改 §2.0**。
### 2.0 波次总览
> **波次不带编号**(2026-10-25 起):波次名本身就是标识。原先的 `W1`~`W8` 已废止——它们看着像
> 执行顺序,实际 `W8` 排在 `W3`/`W4` 之前,读者必须先查表才知道谁先谁后。现在**执行顺序就是
> 本表从上到下**,不再多一层映射。
| 波次 | 内容 | 为什么在这 |
|---|---|---|
| **W1 采集+保护收尾** | **只剩 M3 送检**(B10,Fixed Date)——任务卡与判据见 `W1-采集保护收尾.md` | 收口目标"台架闭环 + 功能面完整 + 可送检"的前两项已达成;**真约束只剩送检窗口**,窗口一到全道让路、窗口前 2 日特性冻结 |
| **W8 数据可信** | **通道标定 → 遥测链 → 运行参数**:M4 系数与量纲 / M5 遥测链 / M6 运行参数与点表;14 张卡与事实基线见 `W8-数据可信.md` | **用户决定(2026-10-23):下一步做通道标定,先于 UI 页面与结构债**。它是唯一"改一处、全链受益"的入口(`App/task/adc_task.c:335` 是码值→工程量的唯一位置),也是 W6 页面与 104 遥测的共同前置——先做页面则 `ui_data_feed` 组装的码值帧要返工。**编号是分配序,执行序以本表从上到下为准**:本波紧随 W1,排在 W3/W4 之前。⚠ 2026-10-23 补记:ADC 至今**从未采过已知电压**(连极性都没验过,见 `W8-数据可信.md` §2.6),故第一张卡是"已知电压注入验证"——只需一块万用表,不需要信号源/示波器,是开工的第一刀 |
| **W3 预算与内存** | ⏸ **整簇暂缓**:R-2 后半(缩堆 56→32 KB → 29.5 KB 迁 CCM)· R-3 · R-4 · R-6;R-5 已判定不可行 | **不再排期**:没有功能在等这块预算,而搬迁要动 scatter、要逐条过 DMA 可达性清单、缩堆还要上板复测。**W3 槽位保留、不重编号**(避免全库改 W4~W7 引用)。重开条件 → `../问题记录/项目审查与优化建议报告.md` §5.3 |
| **W4 结构债** | **USART1 改为只发不收 → 日志管线与 S8 合并评估 → net 层跨上下文收口 → 注册校验白名单清理 → 写回 flush / 性能语义簇 / 空 TU**(详表 `排期详述.md` §1) | 无紧急,按性价比排:USART1 那条灭 IWDG 误复位的机制根源;net 层收口体量大、验证重,放后 |
| **W5 验证常态** | P1-10 收尾 · T-7 CI · L5 基线重锁 · A2/A4 负向台架 · 探针窗口心跳 · 串口助手 A6/A7 · S12 · A-5(详表 `排期详述.md` §2) | 窗口性,逢机顺带,不单独排期 |
| **W6 UI 扩展** | **U5 页面落地**——27 是目标数不是差集(现存 7 个页面实现;27 个空叶子已归并为 7 模块 + 2 项前置能力) | **未排期**(2026-10-20 用户裁定暂缓)。地基已齐(U1~U4 落地、`ui-golden` 与字符集差集检查已挂 pre-commit),新增一页 = 3 处人工 + 1 条生成器命令。**最早在 W8 的 M4 之后开工**——`ui_data` / `ui_data_feed` 需要真数据(`W8-数据可信.md` §10)。逐页规格见 `../UI设计/页面扩充详细方案.md` |
| **W7 仓库决策** | **N-29** `.git` **233 MB** + 图片 36.3 MB | **已决策(2026-10-11):暂不处理、登记观察**——推送/协作前重评(`git filter-repo` 历史重写影响未推送提交与协作者) |
| **采集保护收尾** | **只剩 M3 送检**(B10,Fixed Date)——任务卡与判据见 `采集保护收尾.md` | 收口目标"台架闭环 + 功能面完整 + 可送检"的前两项已达成;**真约束只剩送检窗口**,窗口一到全道让路、窗口前 2 日特性冻结 |
| **数据可信**(当前) | **通道标定 → 遥测链 → 运行参数**:M4 系数与量纲 / M5 遥测链 / M6 运行参数与点表;14 张卡与事实基线见 `数据可信.md` | **用户决定(2026-10-23):下一步做通道标定,先于 UI 页面与结构债**。它是唯一"改一处、全链受益"的入口(`App/task/adc_task.c:335` 是码值→工程量的唯一位置),也是「UI 扩展」页面与 104 遥测的共同前置——先做页面则 `ui_data_feed` 组装的码值帧要返工。本波紧随「采集保护收尾」,排在「预算与内存」「结构债」之前。⚠ 2026-10-23 补记:ADC 至今**从未采过已知电压**(连极性都没验过,见 `数据可信.md` §2.6),故第一张卡是"已知电压注入验证"——只需一块万用表,不需要信号源/示波器,是开工的第一刀 |
| **预算与内存** | ⏸ **整簇暂缓**:R-2 后半(缩堆 56→32 KB → 29.5 KB 迁 CCM)· R-3 · R-4 · R-6;R-5 已判定不可行 | **不再排期**:没有功能在等这块预算,而搬迁要动 scatter、要逐条过 DMA 可达性清单、缩堆还要上板复测。重开条件 → `../问题记录/项目审查与优化建议报告.md` §5.3 |
| **结构债** | **USART1 改为只发不收 → 日志管线与 S8 合并评估 → net 层跨上下文收口 → 注册校验白名单清理 → 写回 flush / 性能语义簇 / 空 TU**(详表 `排期详述.md` §1) | 无紧急,按性价比排:USART1 那条灭 IWDG 误复位的机制根源;net 层收口体量大、验证重,放后 |
| **验证常态** | P1-10 收尾 · T-7 CI · L5 基线重锁 · A2/A4 负向台架 · 探针窗口心跳 · 串口助手 A6/A7 · S12 · A-5(详表 `排期详述.md` §2) | 窗口性,逢机顺带,不单独排期 |
| **UI 扩展** | **U5 页面落地**——27 是目标数不是差集(现存 7 个页面实现;27 个空叶子已归并为 7 模块 + 2 项前置能力) | **未排期**(2026-10-20 用户裁定暂缓)。地基已齐(U1~U4 落地、`ui-golden` 与字符集差集检查已挂 pre-commit),新增一页 = 3 处人工 + 1 条生成器命令。**最早在「数据可信」的 M4 之后开工**——`ui_data` / `ui_data_feed` 需要真数据(`数据可信.md` §10)。逐页规格见 `../UI设计/页面扩充详细方案.md` |
| **仓库决策** | **N-29** `.git` **233 MB** + 图片 36.3 MB | **已决策(2026-10-11):暂不处理、登记观察**——推送/协作前重评(`git filter-repo` 历史重写影响未推送提交与协作者) |
| **暂缓** | **B2 RS-485 整簇**(`暂缓-RS485.md`) | **用户决定(2026-10-12):当前不处理 RS-485** |
| **硬件改版** | N-18 8 路电气量全接 TPAFE(V0.2) | 下一版硬件;固件侧已用语义映射隔离,改版只动映射表 |
> **W2 / W3 槽位保留、不复用也不重编号 W3~W7**(避免全库改引用)。
### 2.1 顺序一图
```
W1 收尾 只剩 B10 送检(M3, Fixed Date) 详表 W1-采集保护收尾.md
采集保护收尾 只剩 B10 送检(M3, Fixed Date) 详表 采集保护收尾.md
↓
W8 数据可信 通道标定 → 遥测链 → 运行参数(M4 系数与量纲 → M5 遥测链 → M6 运行参数与点表) 详表 W8-数据可信.md
关键路径: 量程口径 → 标定模块 → 落盘 → 未标定即闭锁 → 量纲回归;W6 可在 M4 后开工
数据可信 通道标定 → 遥测链 → 运行参数
M4 系数与量纲 → M5 遥测链 → M6 运行参数与点表 详表 数据可信.md
关键路径: 量程口径 → 标定模块 → 落盘 → 未标定即闭锁 → 量纲回归
「UI 扩展」可在 M4 后开工
↓
W3 预算 ⏸ 整簇暂缓(重开条件见 项目审查与优化建议报告 §5.3)
预算与内存 ⏸ 整簇暂缓(重开条件见 项目审查与优化建议报告 §5.3)
↓
W4 结构 USART1 只发不收 → 日志管线与 S8 → net 层收口 → 白名单清理 → 写回/性能/空TU
结构债 USART1 只发不收 → 日志管线与 S8 → net 层收口 → 白名单清理 → 写回/性能/空TU
↓
W5 验证 P1-10 · T-7 CI · L5 基线重锁 · A2/A4 负向台架 · 探针心跳 · 串口助手 · S12 · A-5
验证常态 P1-10 · T-7 CI · L5 基线重锁 · A2/A4 负向台架 · 探针心跳 · 串口助手 · S12 · A-5
↓
W6 UI U5 页面落地(未排期,最早 W8 M4 之后)
W7 仓库 N-29 .git 233MB(已决策暂不处理) 硬件:N-18 V0.2
暂缓 B2 RS-485 整簇(见 暂缓-RS485.md)
UI 扩展 U5 页面落地(未排期,最早「数据可信」M4 之后)
仓库决策 N-29 .git 233MB(已决策暂不处理) 硬件:N-18 V0.2
暂缓 B2 RS-485 整簇(见 暂缓-RS485.md)
```
---
@@ -134,7 +138,7 @@ W7 仓库 N-29 .git 233MB(已决策暂不处理) 硬件:N-18 V0.2
- 已闭环条目的**结论与证据沉淀进模块文档**,本文件夹不再重复。
- **2026-10-14 起新条目用「语义标识」**:`#` 列填一行短语(如 `沉降窗 800ms 上限只留痕`),
**不再新增字母+数字编号**(规则见 `docs/任务规划/README.md` §0 表首行);存量编号
(P-x / N-x / S-x / T-x / S1x / A-x / B·C·D 前缀)**冻结沿用**,而**已随销项消失的号永久作废**、
(P-x / N-x / S-x / T-x / S1x / A-x / B 前缀)**冻结沿用**,而**已随销项消失的号永久作废**、
不得作为新条目候选——"不回收"在只写规则、不留痕迹的情况下不可执行(撞号实测见
`docs/任务规划/README.md` §0 注);E-xx(历史编号族)冻结于 `docs/编号规范.md` §4.3。
- **引用审查报告编号一律带文档名**(报告 N-16 ≠ 登记簿 N-16、报告 S-3 ≠ 登记簿 S-3);
+24 -24
View File
@@ -2,7 +2,7 @@
> **本文只做三件事**:把未闭环待办**归到道**、划**文件级写域**、定**合并次序**。
> **明细不复制**——DoD / 硬依赖 / 验收判据仍在 `docs/任务规划/登记簿.md`、
> `docs/任务规划/W8-数据可信.md`、`docs/任务规划/W1-采集保护收尾.md`、
> `docs/任务规划/数据可信.md`、`docs/任务规划/采集保护收尾.md`、
> `docs/算法/继电保护功能复现规划.md`。机制(worktree / 两把锁 / `done` 流程)见
> `docs/环境与部署/并行任务工作树方案.md`。
>
@@ -34,10 +34,10 @@
| 道 | 名称 | 批 | 写域 |
|---|---|---|---|
| **道A** | 标定与量纲(W8 M4,关键路径) | 1 | 域1+域2+域3+域4 |
| **道A** | 标定与量纲(「数据可信」M4,关键路径) | 1 | 域1+域2+域3+域4 |
| **道B** | UI 组件层(等数据时先做的活) | 1 | 域5 |
| **道C** | 工具链与验证(断言/门禁/构建实测) | 1 | 域8 |
| **道D** | 遥测链(W8 M5/M6) | 2 | 域1+域4+域2 |
| **道D** | 遥测链(「数据可信」M5/M6) | 2 | 域1+域4+域2 |
| **道E** | UI 页面(27 叶 + 3 页回炉) | 2 | 域5 |
| **道F** | 结构债与网络(net 层收口 / 日志管线 / 探针心跳 / 写回 flush) | 2 | 域6+域7 |
| **道G** | 保护元件扩展 | 3 | 域3+域2 |
@@ -46,8 +46,8 @@
**关键判断**:用户最关心的"保护待做"**大部分不能与标定并行**——因为保护元件的判据全是
"与定值比",而定值是工程单位(10 A / 120 V),标定没落地时新元件写出来就是"码值比二次值",
和现在 `prot_elm` 的错配是同一个病。真正能提前的只有**比值类判据**(涌流制动、CT 断线、
突变量启动),但它们要往 `prot_set` 里加定值项 → 改 `PS_ID_COUNT` 与 blob VER → 与 W8 的
落盘/闭锁卡互斥。**所以保护整簇排在 W8 M4 之后**,逐项归道见 §4.2。
突变量启动),但它们要往 `prot_set` 里加定值项 → 改 `PS_ID_COUNT` 与 blob VER → 与「数据可信」
的落盘/闭锁卡互斥。**所以保护整簇排在「数据可信」M4 之后**,逐项归道见 §4.2。
---
@@ -98,7 +98,7 @@
> 覆盖 `docs/任务规划/` 全部未闭环项 + 保护复现规划 L 项 + UI 两篇规划。
> "批"列 = 第几轮开工;`—` = 现在不排(理由见 §9)。
### 4.1 W8 数据可信(14 卡)
### 4.1 数据可信(14 卡)
| 条目 | 写域 | 道 | 批 |
|---|---|---|---|
@@ -154,8 +154,8 @@
| `ui_data` 快照层 + `ui_data_feed` | 域5 + `App/app/` | **道E UI 页面** | 2 |
| 27 个空叶子 + 3 页回炉(30 页次) | 域5 + `ui_menu_tree.txt` + 生成物 | **道E UI 页面** | 2 |
> **`ui_data` 为什么排在批 2 而不是批 1**:`ui_data_feed` 组装的 `eng` 字段要等 W8 M4 的结论
> (`docs/任务规划/W8-数据可信.md` §2.6 与 §10)。组件层(编辑器/定值表/记录 reader)
> **`ui_data` 为什么排在批 2 而不是批 1**:`ui_data_feed` 组装的 `eng` 字段要等「数据可信」M4
> 的结论(`docs/任务规划/数据可信.md` §2.6 与 §10)。组件层(编辑器/定值表/记录 reader)
> 与标定无关,所以单独提到批 1——**这是本次分道最大的收益点**:让 UI 在等标定的同时有活干。
### 4.4 结构债、验证与其它
@@ -187,15 +187,15 @@
### 5.1 道A「标定与量纲」(关键路径)
**目标**:把 `adc_task.c:335` 的 `frame[s] = (float)code;` 换成折算,让采样环里第一次是电压。
**含**:W8 卡 1 → 卡 3 → 卡 2 → 卡 4 → 卡 5 → 卡 6 → 卡 7,加 L5-2 码值越界。
**含**:本波卡 1 → 卡 3 → 卡 2 → 卡 4 → 卡 5 → 卡 6 → 卡 7,加 L5-2 码值越界。
| 分支 | 内容 | 预计 | 写域 | 依赖 |
|---|---|---|---|---|
| `task/W8-scale-doc` | 卡 1(量程口径定死)+ 卡 3(`CFG_VAL_INT`) | 0.5~1 d | 文档 + 域2 | 无 |
| `task/W8-adc-cal` | 卡 2(`adc_cal.*`)+ 卡 4(落盘)+ L5-2 | 1~1.5 d | 域1 + 域2 | 上一条 |
| `task/W8-lockout-dim` | 卡 5(未标定闭锁)+ 卡 6(三常数)+ 卡 7(量纲回归) | 1~1.5 d | 域3 + 域4 + 域2 | 上一条 |
| `task/cal-scale-doc` | 卡 1(量程口径定死)+ 卡 3(`CFG_VAL_INT`) | 0.5~1 d | 文档 + 域2 | 无 |
| `task/cal-adc-cal` | 卡 2(`adc_cal.*`)+ 卡 4(落盘)+ L5-2 | 1~1.5 d | 域1 + 域2 | 上一条 |
| `task/cal-lockout-dim` | 卡 5(未标定闭锁)+ 卡 6(三常数)+ 卡 7(量纲回归) | 1~1.5 d | 域3 + 域4 + 域2 | 上一条 |
**退出判据**:M4 六条(`docs/任务规划/W8-数据可信.md` §3)全满足;`@build` 0/0;
**退出判据**:M4 六条(`docs/任务规划/数据可信.md` §3)全满足;`@build` 0/0;
主机单测绿;台架 `@test` 的期望已按"默认构建下保护不动作"更新。
**与谁撞**:`iec104_pts.c`(卡 6 改 `k_yc[].deadband`)会与批 2 的道D 撞 → **道A 先合**;
@@ -237,7 +237,7 @@
### 5.4 台架道(主工作树,不占工作树名额)
批 1 期间台架只做一件事:**W8 卡 0 已知电压注入验证**(只需万用表,不需要信号源/示波器)。
批 1 期间台架只做一件事:**「数据可信」卡 0 已知电压注入验证**(只需万用表,不需要信号源/示波器)。
它验证的是"ADC 到底读得准不准",是道A 系数冻结的前置。
节奏:道A 分支合入 → 主工作树 `@build` → 持 `bench.lock` → 注入三点 → 记录斜率 →
@@ -287,7 +287,7 @@
|---|---|---|
| **USART1 改为只发不收**(S-3) | 改 `.ioc` → CubeMX 重生成会**打回 5 处手工定制**(IWDG 延迟启动、Fault Handler、FreeRTOSConfig 加固区等),且重写 `Src/*` 大片生成文件 → 与任何分支必冲突 | **独占一轮**:清空所有工作树 → 在主工作树做 → `check_cubemx_survival.py` 全过 → 台架闭环 |
| **字库重生成** | `make_font.py` 重写 `ui_font_cn_12.c`(整文件生成物),两人同时扩字会互相覆盖 | 归道B 一个分支独占;后续加字必须重新走一次 |
| **往 `prot_set` 加定值项** | 改 `PS_ID_COUNT` → blob VER 2→3 → 影响落盘格式、104 定值段、UI 整定页分组 | 只在**没有任何 W8 定值卡在飞**的时候做(批 3 的道G) |
| **往 `prot_set` 加定值项** | 改 `PS_ID_COUNT` → blob VER 2→3 → 影响落盘格式、104 定值段、UI 整定页分组 | 只在**没有任何「数据可信」定值卡在飞**的时候做(批 3 的道G) |
---
@@ -298,9 +298,9 @@ $PY = ".venv\Scripts\python.exe"
$WT = ".dsh\skills\task-worktree\scripts\task_worktree.py"
# 批 1 道A(ID 必须唯一:台账按 ID 落盘,branch = task/<ID>-<slug>)
& $PY $WT new W8-scale doc
& $PY $WT new W8-adc cal
& $PY $WT new W8-lockout dim
& $PY $WT new cal-scale doc
& $PY $WT new cal-adc cal
& $PY $WT new cal-lockout dim
# 批 1 道B
& $PY $WT new UI-font subset
@@ -311,15 +311,15 @@ $WT = ".dsh\skills\task-worktree\scripts\task_worktree.py"
& $PY $WT new S12 assert
# 台架(在主工作树,验证已合入镜像)
& $PY $WT lock acquire bench --task W8-adc
& $PY $WT lock acquire bench --task cal-adc
# ……注入验证 / @test……
& $PY $WT lock release bench --task W8-adc --bench-pass
& $PY $WT lock release bench --task cal-adc --bench-pass
```
> ⚠ **`new` 必须给两个参数**(`<ID> <slug>`),少一个直接 rc=3;**ID 不能重复**——
> 台账是 `.state/<ID>.json`,同 ID 第二次 `new` 会报"任务已存在"。所以同簇多任务要靠
> ID 区分(上面 `W8-scale` / `W8-adc` / `W8-lockout` 三段即三个不同 ID,分支名恰好是
> `task/W8-scale-doc` / `task/W8-adc-cal` / `task/W8-lockout-dim`)。
> ID 区分(上面 `cal-scale` / `cal-adc` / `cal-lockout` 三段即三个不同 ID,分支名恰好是
> `task/cal-scale-doc` / `task/cal-adc-cal` / `task/cal-lockout-dim`)。
>
> ⚠ **活跃任务数按"台账 + 目录是否存在"统计**,不是按 git 注册表。遗留目录会让名额被白占——
> 开工前先 `list` 确认没有 `<ID>` 显示 `? ?`(那是分支已删、目录还在的残骸)。
@@ -329,8 +329,8 @@ $WT = ".dsh\skills\task-worktree\scripts\task_worktree.py"
> 删完补一条 `git worktree prune`。
> **删前先确认目录里没有联接**(`.venv` / `simulator/SDL2`)——直接删会把主工作树的 `.venv` 带走。
> 分支 ID 用语义 slug(`W8-scale-doc` / `UI-font-subset`),与 `docs/任务规划/README.md` §0 的
> "新条目用语义标识"一致;存量编号(N-x / S-x / C-x)仍可直接当 ID 用。
> 分支 ID 用语义 slug(`cal-scale-doc` / `UI-font-subset`),与 `docs/任务规划/README.md` §0 的
> "新条目用语义标识"一致;存量编号(N-x / S-x)仍可直接当 ID 用。
---
+2 -2
View File
@@ -1,7 +1,7 @@
# 结构债与验证常态
> 波次总览与顺序权威在 `docs/任务规划/README.md` §2;当前波次任务卡在 `W8-数据可信.md`,
> W1 只剩 M3 送检(`W1-采集保护收尾.md`)。
> 波次总览与顺序权威在 `docs/任务规划/README.md` §2;当前波次任务卡在 `数据可信.md`,
> 「采集保护收尾」只剩 M3 送检(`采集保护收尾.md`)。
> 本文件只放**已排期但非当前波次**的详述表——低频改动,随窗口更新。
>
> **条目一律用语义名**(2026-10-25 起):原先「C 组短码」(结构债 1/3/5/6)与「D 组短码」
@@ -1,11 +1,11 @@
# W8 数据可信(通道标定 → 遥测链 → 运行参数)
# 数据可信(通道标定 → 遥测链 → 运行参数)
> **一句话结论**:全项目现在唯一"改一处、全链受益"的入口是 `App/task/adc_task.c:335` 的
> `frame[s] = (float)code;`——它是码值变成工程量的**唯一**位置。本波把它拆成三段:
> 系数可信(M4)→ 遥测可信(M5)→ 整定可信(M6)。做完之后保护定值、104 遥测、
> UI 交流量才第一次有名副其实的数值。
>
> **本文定位**:W8 波次的任务卡与验收判据。**排序权威在 `docs/任务规划/README.md` §2**;
> **本文定位**:本波次的任务卡与验收判据。**排序权威在 `docs/任务规划/README.md` §2**;
> 本文只写"这一波做什么、按什么判据算做完"。上游分析见
> `docs/问题记录/采集与数据处理短板评测.md`(四类短板的成因与分档)。
>
@@ -43,12 +43,12 @@ frame[s] = (float)code;
| 候选 | 判据 |
|---|---|
| **W8 数据可信(本波)** | 它是 W6 页面与 104 遥测的**共同前置**:先做页面,`ui_data_feed` 组装出的是码值帧,标定落地后组装逻辑要重写一遍 = 纯返工 |
| W6 剩余 27 页 | 依赖 W8 的产出(`ui_data_rt_t.eng` 才能填 1);现在做只能继续塞占位值 |
| W4 结构债 | 无人在等;net 层跨上下文收口体量大、验证重 |
| **数据可信(本波)** | 它是「UI 扩展」页面与 104 遥测的**共同前置**:先做页面,`ui_data_feed` 组装出的是码值帧,标定落地后组装逻辑要重写一遍 = 纯返工 |
| 「UI 扩展」剩余 27 页 | 依赖本波的产出(`ui_data_rt_t.eng` 才能填 1);现在做只能继续塞占位值 |
| 「结构债」 | 无人在等;net 层跨上下文收口体量大、验证重 |
| 录波 + 104 文件传输 | 独立立项,且依赖工程量(录波通道必须有物理量含义) |
**代价对比**:本波 S 段约 200 行(系数表 + 折算 + 落盘),W6 那 30 页次是几千行。
**代价对比**:本波 S 段约 200 行(系数表 + 折算 + 落盘),「UI 扩展」那 30 页次是几千行。
---
@@ -267,7 +267,7 @@ typedef struct {
读侧先读索引再拷该区。`phasor` 已经是"adcTask 写 / protectTask 读"的同一形态,
**不是新机制**,不引入锁。
- 104 的 `s_src_yc_read()` 改为读快照(不再自己遍历相量)。
- W6 的 `ui_data_feed` 也读快照 → **同一份数据,两个消费者**,这是"高内聚"的具体落点。
- 「UI 扩展」的 `ui_data_feed` 也读快照 → **同一份数据,两个消费者**,这是"高内聚"的具体落点。
- 200 ms 是**上送节拍**,不是平均窗:相量本身已经是 1 ms 刷新的有效值,再平均会引入滞后。
---
@@ -374,7 +374,7 @@ typedef struct {
| 开入 / 开出固件 | 固件里**完全没有**这两类代码(`docs/问题记录/采集与数据处理短板评测.md` 登记),是另一个波次的量级 |
| 温度非线性折算 | 见 §7 决策 5 |
| 端子二次值(一次/二次变比换算) | **条件项**:卡 0b 拿到变比才做;拿不到则本波只到"ADC 引脚电压",`eng` 保持 0,缺口登记进 `docs/任务规划/登记簿.md` |
| UI 页面(含交流量回炉) | 归 W6;本波只保证 `meas_snap_t` 可供其消费 |
| UI 页面(含交流量回炉) | 归「UI 扩展」;本波只保证 `meas_snap_t` 可供其消费 |
---
@@ -382,7 +382,7 @@ typedef struct {
| 波次 | 关系 |
|---|---|
| **W1(收尾)** | W1 的 B10 送检卡里"L1-5 标定复核"依赖本波卡 12;本波是 B10 的前置 |
| **W6(UI)** | 本波交付 `meas_snap_t` + `adc_cal_flags()` → W6 的 `ui_data_rt_t` 才能填 `eng`(M4 后为 0 = 引脚电压,卡 0b 之后为 1 = 二次值),交流量页第 7 行"标定状态"才有真值。**W6 应在本波 M4 之后开工**,不必等 M6 |
| **W4(结构债)** | 无交集 |
| **采集保护收尾** | 该波的 B10 送检卡里"L1-5 标定复核"依赖本波卡 12;本波是 B10 的前置 |
| **UI 扩展** | 本波交付 `meas_snap_t` + `adc_cal_flags()` → 「UI 扩展」的 `ui_data_rt_t` 才能填 `eng`(M4 后为 0 = 引脚电压,卡 0b 之后为 1 = 二次值),交流量页第 7 行"标定状态"才有真值。**「UI 扩展」应在本波 M4 之后开工**,不必等 M6 |
| **结构债** | 无交集 |
| **N-18(V0.2 硬件改版)** | 本波的 `CLIPPED` 位就是 N-18 在软件里的可见形态;V0.2 改版后该位恒 0,页面与 104 绑定零改动 |
+1 -1
View File
@@ -1,6 +1,6 @@
# 测试与架构改进专项(P1 收尾 / S1x / A-x)
> 编号空间见 `docs/任务规划/README.md` §0;排期位置见 `docs/任务规划/README.md` §2(W5 验证常态)。
> 编号空间见 `docs/任务规划/README.md` §0;排期位置见 `docs/任务规划/README.md` §2「验证常态」。
> **S1~S14 / T-1~T-5 / A-1~A-7** 是 2026-10-02 版复审的**条目编号**——编号**不随条目删除而回收**;
> 其他文档若引用这些编号,其证据见对应模块文档与 `git log`。已完成事项的证据沉淀:
> `../测试说明/系统时钟单元测试说明.md`(S1-a)、`../测试说明/配置文件单元测试说明.md`(S1-b)、
+6 -6
View File
@@ -1,7 +1,7 @@
# 登记簿(长期观察项;存量 `N-x / S-x / T-x`,**新条目用语义标识**)
> 编号空间与"不回收"规则见 `docs/任务规划/README.md` §0;排期位置见 `docs/任务规划/README.md` §2 波次总览;
> 当前波次任务卡(带 DoD / 写范围 / 状态)在 `W8-数据可信.md`——**W1 的 M1/M2 已收口,只剩 M3 送检**;
> 当前波次任务卡(带 DoD / 写范围 / 状态)在 `数据可信.md`——**「采集保护收尾」的 M1/M2 已收口,只剩 M3 送检**;
> 并行归道(写域 / 道 / 合并次序)见 `并行分道方案.md`。
> **本文件是低频文件**:新发现按类别进对应表;销项 = 删行 + 清引用(`docs/任务规划/README.md` §3)。
> **2026-10-14 起新条目的 `#` 列填「语义标识」**——一行短语直接说清是什么事(如
@@ -42,10 +42,10 @@
| # | 事项 | 影响 / 现状 | 处置方向 | 波次 | 出处 |
|---|---|---|---|---|---|
| N-22 | 写回缓存无空闲/掉电强制 flush(整页写与换页已 flush) | 写回窗口内掉电丢最近日志/配置写 | defaultTask 空闲 N ms flush | W4 | 报告 N-14 |
| N-22 | 写回缓存无空闲/掉电强制 flush(整页写与换页已 flush) | 写回窗口内掉电丢最近日志/配置写 | defaultTask 空闲 N ms flush | 结构债 | 报告 N-14 |
| N-23 残余 | **KNOWN_GAPS 白名单清理**——现存唯一缺口 = `App/task/rs485_task.c`(E-59 门禁下刻意不接线,随 B2 暂缓,见 `暂缓-RS485.md`) | 白名单不清 = "写了不编译"盲区仍在 | 随 B2 一并出白名单(`--strict` 供审计复跑) | 结构债 | 报告 N-06 残余 |
| N-25 | 性能/资源建议簇:PASV 每次新建监听;PHY 强制 100M 无自协商回退;`NET_MAX_SOCKETS 8` 与单连接语义不符;`HAL_Delay(1)` 阻塞 DE(**DE 项随 B2 暂缓,见 `暂缓-RS485.md`**) | 次级性能/语义一致性 | 逐项见 `../问题记录/项目审查与优化建议报告.md` §4.2/§4.7,随窗口评估 | W4 | 报告 N-09/PHY/P3-x/rs485 |
| N-25 | 性能/资源建议簇:PASV 每次新建监听;PHY 强制 100M 无自协商回退;`NET_MAX_SOCKETS 8` 与单连接语义不符;`HAL_Delay(1)` 阻塞 DE(**DE 项随 B2 暂缓,见 `暂缓-RS485.md`**) | 次级性能/语义一致性 | 逐项见 `../问题记录/项目审查与优化建议报告.md` §4.2/§4.7,随窗口评估 | 结构债 | 报告 N-09/PHY/P3-x/rs485 |
| N-27 | **内存优化簇剩余**:R-2 后半(缩堆 56→32 KB → 迁 CCM)· R-3 · R-4 · R-6 | ⏸ **整簇暂缓**(2026-10-15 用户裁定):没有功能在等这块预算,而搬迁要动 scatter、要逐条过 DMA 可达性清单、缩堆还要上板复测。⚠ 代价落在"以后加任务 / 抬栈 / 加堆"那一刻——CCM 只剩 7,904 B、FreeRTOS 堆 `min_ever` 8,464 B,届时 `mem-budget` 会先报警 | 重开条件见 `../问题记录/项目审查与优化建议报告.md` §5.3。⚠ **R-5 已判定不可行**(CMSIS-RTOS2 `freertos_os2.h` 有 `#if (configMAX_PRIORITIES != 56) #error`,改小直接编译失败),不再列入 | **暂缓** | 报告 R-2 剩余/R-3/R-4/R-6/§5.5 |
| N-28 | **报告 F-5:uvprojx 里 127 个空 TU**(201 个 LVGL `.c` 中 127 个 `.map` 零产出) | 增量构建实测 4~5 s、远程 CI 刻意不跑 `@build` → **非产品指标**;报告原"编译时长 −40%"无基线记录 | 🟡 观察:等有实测的全量构建耗时痛点再做——用 Keil 原生 `<IncludeInBuild>0</IncludeInBuild>`(可逆)而非删条目,且排在任何 `lv_conf.h` 改动之后;动手前先补一次全量构建计时做基线 | W4 | 报告 F-5 |
| N-29 | **仓库膨胀**:`.git` **233 MB**(2026-10-25 实测)+ 手册图片 36.3 MB(受控文件合计仅 79.3 MB,`.git` 已是它的 3 倍) | clone/备份慢,且持续恶化 | 降采样 / 拆 submodule / LFS 三选一 **+ 一次 `git filter-repo` 历史重写**(三项都不解决历史膨胀)。**已决策(2026-10-11):暂不处理、登记观察**——推送/协作前重评 | **W7** | 报告 D-1 |
| U 簇 | **U5 页面落地**——⚠ "27 页"是目标数、不是差集:现存 **7 个页面实现**(`ui_page_ac/dc/device_info/net_cfg/password/runlog/selftest.c`,`ui_page_registry.c` 是生成物不算页面),27 个空叶子已归并为 **7 模块 + 2 项前置能力**(`../UI设计/页面补齐规划.md`) | 地基已齐(U1~U4 已落地;`ui-golden` 与 UI 字符集差集检查均已挂 pre-commit),新增一页 = 3 处人工 + 1 条生成器命令;缺的是产品定义与真数据 | **未排期**(2026-10-20 用户裁定暂缓);最早在 W8 M4 之后开工——`ui_data` / `ui_data_feed` 组装的是码值帧,先做会返工(`W8-数据可信.md` §10)。逐页规格:`../UI设计/页面扩充详细方案.md` | W6 | `../UI设计/页面补齐规划.md` |
| N-28 | **报告 F-5:uvprojx 里 127 个空 TU**(201 个 LVGL `.c` 中 127 个 `.map` 零产出) | 增量构建实测 4~5 s、远程 CI 刻意不跑 `@build` → **非产品指标**;报告原"编译时长 −40%"无基线记录 | 🟡 观察:等有实测的全量构建耗时痛点再做——用 Keil 原生 `<IncludeInBuild>0</IncludeInBuild>`(可逆)而非删条目,且排在任何 `lv_conf.h` 改动之后;动手前先补一次全量构建计时做基线 | 结构债 | 报告 F-5 |
| N-29 | **仓库膨胀**:`.git` **233 MB**(2026-10-25 实测)+ 手册图片 36.3 MB(受控文件合计仅 79.3 MB,`.git` 已是它的 3 倍) | clone/备份慢,且持续恶化 | 降采样 / 拆 submodule / LFS 三选一 **+ 一次 `git filter-repo` 历史重写**(三项都不解决历史膨胀)。**已决策(2026-10-11):暂不处理、登记观察**——推送/协作前重评 | **仓库决策** | 报告 D-1 |
| U 簇 | **U5 页面落地**——⚠ "27 页"是目标数、不是差集:现存 **7 个页面实现**(`ui_page_ac/dc/device_info/net_cfg/password/runlog/selftest.c`,`ui_page_registry.c` 是生成物不算页面),27 个空叶子已归并为 **7 模块 + 2 项前置能力**(`../UI设计/页面补齐规划.md`) | 地基已齐(U1~U4 已落地;`ui-golden` 与 UI 字符集差集检查均已挂 pre-commit),新增一页 = 3 处人工 + 1 条生成器命令;缺的是产品定义与真数据 | **未排期**(2026-10-20 用户裁定暂缓);最早在「数据可信」M4 之后开工——`ui_data` / `ui_data_feed` 组装的是码值帧,先做会返工(`数据可信.md` §10)。逐页规格:`../UI设计/页面扩充详细方案.md` | UI 扩展 | `../UI设计/页面补齐规划.md` |
@@ -1,11 +1,11 @@
# W1 采集 + 保护收尾(只剩 M3 送检)
# 采集 + 保护收尾(只剩 M3 送检)
> **本波只剩余一项未开工的事**:M3 可送检(B10)。M1 台架闭环与 M2 功能面完整已于 2026-10-12
> 达成并销项,本文件不再保留其任务卡与证据链(证据在模块文档与 `git log`)。
> 排序权威(波次总览)在 `docs/任务规划/README.md` §2;并行 / 工作树 / 两把锁的机制见
> `docs/任务规划/并行分道方案.md`。
## 1. W1 目标(用户决定 2026-10-12)
## 1. 本波目标(用户决定 2026-10-12)
把"采集→相量→保护→上送"链路从"代码落地"收口到**台架闭环 + 功能面完整 + 可送检**。
前两项已达成,**本文件只剩"可送检"**。
@@ -25,6 +25,6 @@
|---|---|---|---|---|---|---|---|
| **B10** | **标准源注入 + 第三方 104 主站往返(送检窗口)** | 标准源注入:L1-5 标定复核 / L1-7 等周波 / P1 过流·过负荷 / P2 电压 + 频率类判据全通过;第三方主站总召/周期/变位/遥控全流程(`../子系统设计/IEC104上行设计说明.md` §7/§8 核对单);证据归档 | M1 + M2(均已达成) | 🟡 | —(窗口内缺陷修复走 Expedite 类) | ⬜ | 保护规划 §7 P1/P2 验收;`../子系统设计/IEC104上行设计说明.md` §7/§8 |
> ⚠ **B10 与 W8 的依赖**:B10 的"L1-5 标定复核"依赖 W8 的通道标定卡(卡 12),即 **W8 是 B10 的前置**。
> 该依赖已在 `docs/任务规划/W8-数据可信.md` §10 登记,两边不要各写一套;送检窗口若早于 W8 M4,
> 先按卡 0 的注入结果对齐口径。
> ⚠ **B10 与「数据可信」的依赖**:B10 的"L1-5 标定复核"依赖「数据可信」的通道标定卡(卡 12),
> 即 **「数据可信」是 B10 的前置**。该依赖已在 `docs/任务规划/数据可信.md` §10 登记,两边不要
> 各写一套;送检窗口若早于「数据可信」的 M4,先按卡 0 的注入结果对齐口径。
@@ -111,7 +111,7 @@ C2 dhara 失败类 +84;RO 另 +208,全是 C2 的失败类名表)→ `ER_IR
> 堆 `min_ever` 7152 → **6640 B**(-512 B,符合预算)。
> 此前 2026-10-04 的 V5 30 min 重采曾把 defaultTask 推到 **3664B/4096(余量 432B ≈ 10%,登记 S-1)**;
> 2026-10-10 的栈整改(**未抬栈**,见 §4 阶段 0 的"2026-10-10 复测")把它压回 **2152B/4096**,S-1 已销项。
> **2026-10-12 N-33 栈收口(登记簿销项,W1/M1)**:B7 定值持久化把 defaultTask 静态链推到 **3016 B**
> **2026-10-12 N-33 栈收口(登记簿销项,「采集保护收尾」M1)**:B7 定值持久化把 defaultTask 静态链推到 **3016 B**
> (storage_bring_up→cfg 写→f_rename→dhara GC→控制台回显尾),1024 words 余 1080 B < 30% 线;
> timeSyncTask 链 **1264 B**(同一控制台回显尾),512 words 余 784 B < ISR 底线 → **抬栈**
> defaultTask 1024→**1280**、timeSyncTask 512→**640**(堆 +1536 B,台账 §6 已登记);
+3 -3
View File
@@ -1,7 +1,7 @@
# RAM 预算台账(配额 · 趋势 · 门禁)
> **定位**:`docs/内存管理/RAM使用分析与优化方案.md` §8.2 模板与
> `docs/问题记录/项目审查与优化建议报告.md` §5.5 三件套的**落地件**(2026-10-12,登记簿 N-27 前半 / W1-0)。
> `docs/问题记录/项目审查与优化建议报告.md` §5.5 三件套的**落地件**(2026-10-12,登记簿 N-27 前半)。
> 回答三个问题:**每个子系统还能用多少 RAM**(配额)、**总量趋势往哪走**(基线 TSV)、
> **超了怎么拦**(92% 门禁)。
>
@@ -58,7 +58,7 @@ UI 16 KB / RTOS 堆 56 KB / 应用 8 KB**。归集口径(按 `.map` 对象名
- **UI ⚠ 超配额 = 已知长期挂账,不是新增违规**:LVGL 池 16 KB(R-9 已于 2026-10-15 落地,由 40 KB 收缩)+
帧/远显缓冲 ≈12.8 KB,实测 30,412 B。配额 16 KB 描述的是 **R-2 把 UI 侧缓冲迁进 CCM 之后的目标态**,
而 **R-2 后半已按用户裁定 2026-10-15 整簇暂缓**(`docs/任务规划/README.md` §2 W3 已标暂缓)→
而 **R-2 后半已按用户裁定 2026-10-15 整簇暂缓**(`docs/任务规划/README.md` §2「预算与内存」已标暂缓)→
**这条 ⚠ 会长期挂着**,判读时按已知挂账处理,别每轮当新问题追;重开条件 → `../问题记录/项目审查与优化建议报告.md` §5.3。
- **RTOS 堆 = 配额本身**:56 KB 即 `configTOTAL_HEAP_SIZE`(2026-10-12 B5 由 48 KB 扩容,见 §6;
`heap_4.o` 另含 32 B 元数据,不计超);**改堆 = 改配额**,必须先过本文件 §6 登记。
@@ -93,6 +93,6 @@ UI 16 KB / RTOS 堆 56 KB / 应用 8 KB**。归集口径(按 `.map` 对象名
| 日期 | 变更 | 原因 / 出处 |
|---|---|---|
| 2026-10-12 | 建档:三件套落地(本台账 + `scripts/ram_baseline.py` + `scripts/ram_baseline.tsv` + pre-commit `mem-budget` 钩子) | 登记簿 N-27 前半(W1-0);`docs/问题记录/项目审查与优化建议报告.md` §5.5 |
| 2026-10-12 | 建档:三件套落地(本台账 + `scripts/ram_baseline.py` + `scripts/ram_baseline.tsv` + pre-commit `mem-budget` 钩子) | 登记簿 N-27 前半;`docs/问题记录/项目审查与优化建议报告.md` §5.5 |
| 2026-10-12 | **RTOS 堆配额 48 KB → 56 KB**(`QUOTAS` 同步) | B5 protectTask 立项:iec104Task(2.5KB)+protectTask(2KB)+TCB 入堆后 48KB 池 min_ever 预估跌破 3,072 B 告警线 → `.ioc` L1 参数 `configTOTAL_HEAP_SIZE` 49152→57344(CCM 水位 75.3%→87.9%,仍 <92% 门禁;CCM 空闲降至 ≈8 KB)。连带影响见 §3 R-2 后半链注记 |
| 2026-10-12 | **任务栈 +1536 B(堆内用量,配额 56 KB 不变)**:defaultTask 1024→1280 words(+1024 B)、timeSyncTask 512→640 words(+512 B);产品任务栈合计 37,632→39,168 B | 登记簿 N-33 栈收口:B7 定值持久化把 defaultTask 静态链推到 3016 B(余 1080 < 30% 线)、timeSyncTask 链 1264 B(余 784 < ISR 底线 1024);B6 台架背书 min_ever=10000 → 抬后实测 `heap free=16400 / min_ever=8464`(与预算 −1536 完全吻合,>3072 告警线);`stack_report` 9 任务 0 FAIL + `@test` PASS,见 `RAM使用分析与优化方案.md` §1.4 |
@@ -3,7 +3,7 @@
> **定位**:DTU 上行规约 IEC 60870-5-104(DL/T 634.5104-2009)的设计基线——
> 范围、点表、链路流程、板端接入、预算与测试。规格来源
> `docs/算法/继电保护功能复现规划.md` §1.5(B0 产品定义,验收 = 省电科院点表);
> 代码落点 `App/protocol/iec104/`;未闭环的验收项挂 `docs/任务规划/W1-采集保护收尾.md`(B10 送检)。
> 代码落点 `App/protocol/iec104/`;未闭环的验收项挂 `docs/任务规划/采集保护收尾.md`(B10 送检)。
> **角色**:本 DTU = **被控站(受控端)**,104 **TCP 服务器,端口 2404**;主站
> (控制端,点表参考 `192.168.1.199`)主动连入。
@@ -208,7 +208,7 @@ D:/Code/DTU Code/
### 7.3 并行道与写范围规则(规划层 ↔ 执行层映射)
规划层(任务卡在 `docs/任务规划/W8-数据可信.md` 与 `docs/任务规划/W1-采集保护收尾.md`,
规划层(任务卡在 `docs/任务规划/数据可信.md` 与 `docs/任务规划/采集保护收尾.md`,
五字段 = **DoD / 硬依赖 / 资源 / 写范围 / 状态**;归道见 `docs/任务规划/并行分道方案.md`)
按**资源属性**把任务切进三条道,本方案(工作树 + 锁)是它的执行层:
+3 -3
View File
@@ -142,10 +142,10 @@ STM32(U17)为 LQFP144 脚号。
## 8. 逐通道验证方法(上板自检口径)
1. **TPAFE 侧**:对目标 `AIN` 注入 1 V DC → 观察对应 `buf[i]` 变化(UA→`buf[6]`、UN→`buf[5]`、IA→`buf[2]`),同时 U3.14 `BUSY` 有脉冲;**语义与下标不符即映射错**。⚠ **本步无执行记录**(2026-10-23 核查;`V0.0_网表详细分析报告.md` §5.1 第 6 条的同一验证也从未执行)。已排入 `docs/任务规划/W8-数据可信.md` 卡 0,并把两条判据降为**不需要示波器**的口径:① "`BUSY` 有脉冲"改用固件帧计数——注入前后 `tpafe5160_frame_seq()` 仍严格 1000 Hz 递增即等价;② 幅值判据改用万用表读注入点实际电压 + 同时读 `adc_input_raw()` 码值,三点线性拟合(R² ≥ 0.999)。
1. **TPAFE 侧**:对目标 `AIN` 注入 1 V DC → 观察对应 `buf[i]` 变化(UA→`buf[6]`、UN→`buf[5]`、IA→`buf[2]`),同时 U3.14 `BUSY` 有脉冲;**语义与下标不符即映射错**。⚠ **本步无执行记录**(2026-10-23 核查;`V0.0_网表详细分析报告.md` §5.1 第 6 条的同一验证也从未执行)。已排入 `docs/任务规划/数据可信.md` 卡 0,并把两条判据降为**不需要示波器**的口径:① "`BUSY` 有脉冲"改用固件帧计数——注入前后 `tpafe5160_frame_seq()` 仍严格 1000 Hz 递增即等价;② 幅值判据改用万用表读注入点实际电压 + 同时读 `adc_input_raw()` 码值,三点线性拟合(R² ≥ 0.999)。
2. **STM32 侧**:对目标引脚(如 PC4=UB)注入 0.5 V → 读 `ADC_CHANNEL_14` 应变化;若不变而相邻通道变化 → 通道宏写错(见 §5 警告)。⚠ **本步尚未执行**(2026-10-10 L1-3 台架只验证了"9 通道全部转换成功 + 零超时 + 互异非饱和 + 跨次开机读数不同",台架无信号源);映射的**代码侧**一致性有两道保证:① `App/algo/adc_input.c` 的 `k_adc_map[]` 与 CubeMX 标签(`ADC17_UB`=PC4 等)逐条对齐;② 开机自检 `adc_input_init()` 校验每个 STM32 语义通道都落在 `k_stm32_rank_ch[]` 扫描序列内(挡"映射到不扫描的通道 → 恒读陈旧值")。
3. **备用通道**:RESERVED 路不接入任何语义,UI 与上报里不得出现;若实测有读数漂移,只记录不消费。
4. **端子侧变比(2026-10-23 补)**:上面 1/2 两条都只到 **ADC 引脚**。**"端子电压 → ADC 引脚电压"的变比在仓库里没有任何文档给出**(`docs/硬件平台/` 只有 `.tel` 网表与分析报告,无子板原理图),而 `V0.0_网表详细分析报告.md` §4.7 已把 `1k 串联 + 1k 到地` 这组网络定性为"**源阻抗匹配(手册推荐做法,非分压)**"。故**不得**用"2:1 分压"直接换算出二次值;该变比由 `docs/任务规划/W8-数据可信.md` 卡 0b 实测确认。
4. **端子侧变比(2026-10-23 补)**:上面 1/2 两条都只到 **ADC 引脚**。**"端子电压 → ADC 引脚电压"的变比在仓库里没有任何文档给出**(`docs/硬件平台/` 只有 `.tel` 网表与分析报告,无子板原理图),而 `V0.0_网表详细分析报告.md` §4.7 已把 `1k 串联 + 1k 到地` 这组网络定性为"**源阻抗匹配(手册推荐做法,非分压)**"。故**不得**用"2:1 分压"直接换算出二次值;该变比由 `docs/任务规划/数据可信.md` 卡 0b 实测确认。
---
@@ -157,4 +157,4 @@ STM32(U17)为 LQFP144 脚号。
| 2026-10-09 | **CubeMX 生成 ADC1(9 通道)落地**:新增 `Src/adc.c`/`Inc/adc.h` + HAL adc 三文件并挂进 uvprojx、`HAL_ADC_MODULE_ENABLED` 生效、`MX_ADC1_Init()` 入 `main.c`;分频 PCLK2/4 = 21 MHz——面板里 DIV2 已被 `FadcConstraint`(36 MHz)约束禁掉,**故不加 `.ioc` 键 / 代码守卫 / 审计项等额外防护**(曾加过,按决定撤除,理由见 §7"ADC 时钟"行);修正 PA0 标签笔误 `AD9_RES`→`ADC9_RES`。⚠ 本次重生成打回了 5 处定制(IWDG 延迟启动锚点、HardFault + 3 个 Fault 手工 Handler、`FreeRTOSConfig.h` 加固区、`freertos.c` 三处栈核算注释),已全部复原;存活审计新增 1 项 `adc1-hal-enabled`(共 19 项),现 19 通过 / 1 警告(timeSyncTask 手工定义)/ 0 失败,`@build` 0 错 0 警 |
| 2026-10-10 | **口径更正**:8 路电气量分属 TPAFE / STM32 两片转换器**定性为 V0.1 硬件缺陷**,撤销 2026-10-09 建档时"有意分配、不要修正"的说法;补记缺陷实质(跨转换器无同一时刻性、16 位双极性 vs 12 位单极性、语义与归属交叉)与 **V0.2 改版要求**(8 路电气量全部接 TPAFE,与 5 路备用路对调串联电阻目的地,BOM 不变);§7 新增"通道归属"行,明确 V0.1 上禁止跨转换器做相位/功率类运算。同步更正 `V0.1_网表详细分析报告.md` §1.4(新增 V10)/ §6-3,登记簿新增 **N-18** |
| 2026-10-10 | **STM32 ADC1 消费者落地(L1-3/L1-4)**:新增 `App/algo/adc_input.c/h`——语义映射表 `k_adc_map[]` 按本文件 §3/§5 逐条落地(`UA/UN/IA`→TPAFE `buf[6]/[5]/[2]`,`UB/UC/IB/IC/IN/TEMP`→`CH14/3/6/1/2/5`),并提供 `adc_input_raw()` **按语义取数**;`stm32_scan()` 实现 9 通道软件触发顺序扫描;`adc_input_init()` 增**映射自检**(STM32 映射通道必在扫描序列内)。§7 的"STM32 ADC 外设 / `adc_task` / TPAFE 采样触发"三行同步更新(后两者原为陈旧描述:TIM6 周期触发、L1 层取数)。§8 步骤 2 标注**引脚级注入验证尚未执行**。台架 `@test` PASS(`adc1_rc=0` / `adc1_err=0`、`ADC input layer init: OK`;首帧 `UA=11429 UN=11454 IA=11452`、`UB=1018 UC=1044 IB=943 IC=1069 IN=1052 T=850`——互异非饱和,且两次开机读数不同 → 实时转换而非常量),证据 `测试说明/boot_log_data/20261010_prod_adc_l1_boot_log.txt` |
| 2026-10-23 | **验证现状核查与排期**:确认 §8 步骤 1/2 与 `V0.0_网表详细分析报告.md` §5.1 第 6 条的"首次功能级 ADC 验证"**均无执行记录**——现有台架判据只证"通路活"(9 通道转换成功、零超时、互异非饱和、跨次开机不同),不证读数正确,连极性都未验。新增 §8 步骤 4:**"端子电压 → ADC 引脚电压"的变比在仓库内无任何文档**(无子板原理图),且 `1k 串联 + 1k 到地` 已被 §4.7 定性为"源阻抗匹配、非分压",故撤销"按 2:1 换算二次值"的用法。验证方法同步降为**不需要示波器 / 信号源**:`BUSY` 脉冲改用 `tpafe5160_frame_seq()` 帧计数,幅值改用万用表 + 三点线性拟合。排期见 `docs/任务规划/W8-数据可信.md` 卡 0 / 0b |
| 2026-10-23 | **验证现状核查与排期**:确认 §8 步骤 1/2 与 `V0.0_网表详细分析报告.md` §5.1 第 6 条的"首次功能级 ADC 验证"**均无执行记录**——现有台架判据只证"通路活"(9 通道转换成功、零超时、互异非饱和、跨次开机不同),不证读数正确,连极性都未验。新增 §8 步骤 4:**"端子电压 → ADC 引脚电压"的变比在仓库内无任何文档**(无子板原理图),且 `1k 串联 + 1k 到地` 已被 §4.7 定性为"源阻抗匹配、非分压",故撤销"按 2:1 换算二次值"的用法。验证方法同步降为**不需要示波器 / 信号源**:`BUSY` 脉冲改用 `tpafe5160_frame_seq()` 帧计数,幅值改用万用表 + 三点线性拟合。排期见 `docs/任务规划/数据可信.md` 卡 0 / 0b |
@@ -605,7 +605,7 @@ B0 产品定义 ✅(2026-10-10 已确认,见 §1.5)
| 2026-10-11 | **L1-6 采样有效性校验落地** | 新增 `App/algo/adc_health.c/h`(**纯逻辑判定层**,零平台依赖免桩单测):① 静默——两侧帧序号连续 ≥100 ms 无前进(电平位,可自愈;`adc_health_flags()` 为 L5-4 闭锁预留);② 丢帧——TPAFE 序号一次前进 >1 计 `tgap`(与 STM32 侧 `adc1_gap` 对称,边沿事件不告警——消费者超拍是已知现象,告警会淹没真故障);③ 单调性——序号倒退锁存位;④ 错误增量——FRSTDATA / HAL 错误回调 / STM32 停摆计数增量(事件位与锁存位**编号对齐**,消费者按位图"每类每次开机留痕一次")。`adc_task.c` 只做告警编排:严重事件/上升沿 `DBG_ERROR` + `SYSLOG_SELFTEST`("adc sampling fault"),下降沿 `DBG_INFO`,心跳行增 `tgap`。主机单测 `test/host/adc_health/` **31 用例全绿**(100 ms 门限两侧、tick 回绕、边沿语义、NULL 守卫、init 幂等;`adc-health-unit-test` 钩子登记)。台架 `@test` PASS:零 `[ERR]`(健康不误报)、`tgap=1→2` 与 `adc1_gap` 同步可见、`frames` 1000.0 Hz;证据 `boot_log_data/20261011_prod_adc_health_boot_log.txt`。⚠ **抬栈**:`adc_health_report`→`syslog_post` 控制台回显尾使 adcTask 静态最坏链 832→**1080 B**(512 words 余 968 B < 1024 B 底线)→ **512→640 words**,复测余 **1480 B / 57%**、堆 min_ever 7152→6640 B(AGENTS 任务表 / `docs/内存管理/RAM使用分析与优化方案.md` §2.3 已同步)。§3.1 L1-6 置 ✅ |
| 2026-10-11 | **P1/P2 软件侧:定值模型 + 保护元件框架** | 新增 `App/algo/prot_set.c/h`(**定值模型**:Q10 定点与参考 2^10 口径一致;31 项元数据表**通讯地址逐项对照参考 `Comm/Pub/Const_CommSetPara.c`**——过流 Ⅰ/Ⅱ/Ⅲ = 0x8856~0x8861、过负荷 = 0x8871~0x8874、零序过压 = 0x888E~0x8890、过压/欠压沿用告警段 0x8027~0x802A;范围校验 + 整表装载 all-or-nothing + **sum32 正/反码封存自检闭锁**(参考 `dwTagSum/dwTagSumN` 模式,L5-1);⚠ 默认值/范围为**拟定**,参考 EEPROM 出厂表不在本仓库,待对照修订)+ `App/algo/prot_elm.c/h`(**元件框架**:通用"越限 + 返回系数滞回 + 定时限"核,数据驱动实例表 7 行 = OC1/OC2/OC3/OL(IA)+ OV/UV(UA)+ 3U0(UN);`prot_elm_eval()` 纯判据可主机单测,`prot_elm_run()` 为 phasor→测量薄适配(相量未就绪整拍跳过);定值闭锁 → 全元件复位)。主机单测 `test/host/prot_set/`(30 用例)+ `test/host/prot_elm/`(27 用例:1.01× 启动 / 100 ms 到点 / 滞回保持与释放 / 欠量方向 / 投退 / 闭锁联动 / 时基回绕)全绿,钩子 `prot-set-unit-test` / `prot-elm-unit-test` 登记。`@build` 0 错 0 警(**未接线 → 链接器整对象移除,零 Flash/RAM 足迹**);板端接线随 protectTask 立项(栈预算 + IWDG 门禁),标准源注入验收随其后。§3.3 L3-1/3/4/6 置 🔶、L3-2/5 注明框架就绪待通道/频率算法;§3.5 L5-1/2/4 置 🔶;§5.4 落实进度注 |
| 2026-10-12 | **B5 板端接线:protectTask 立项落地** | 新增 `App/task/protect_task.c/h`(**纯编排**,判据仍在 `App/algo/`):20 ms 节拍三件事——① **L5-4 采样故障闭锁**:`adc_health_flags()` 电平位(TPAFE/STM32 stall + 序号倒退)命中 → `prot_elm_init()` 复位 + 本拍不 eval(stall 自愈自动恢复;锁存类事件位不闭锁——非"当前测量不可信");② **L5-1 定值校验和巡检**(每拍 `prot_set_selfcheck()`,31 项 sum32 开销可忽略;⚠ 与 104 定值写的竞态窗口 µs 级、同次写 seal 即清锁,如实登记,P4 定值持久化收口);③ `prot_elm_run()` + 动作位图边沿日志(`[PROT]`,V0.1 无出口 → 动作 = 遥信 + 日志)。**线程契约收口**:`prot_elm_request_reset()`(单字标志,任意上下文)——104 YK11 在 iec104Task 落请求、下一拍 eval 头部消费,杜绝与 protectTask eval 竞态(`iec104_pts.c` 改走此口);定值/元件初始化移入 `app_main_init`(内核前,phasor_init 之后)。**门禁(E-59 同款)**:`TASK_WD_PROTECT = 8` 入 `wd_required_mask()` 两分支(产品 `0xF7`→`0x1F7`、HW 层 `0xF5`→`0x1F5`,看门狗单测 39 断言同步);栈 **512 words**,`stack_report.py` 实测静态最坏链 **872 B / 余 1176 B / 57%**;**FreeRTOS 堆 48→56 KB**(`.ioc` L1 参数 + `FreeRTOSConfig.h` 同步,CCM 75.3%→87.9% < 92% 门禁,`RAM预算台账.md` §6 登记配额 48→56 KB)。任务手写于 `Src/freertos.c` USER CODE 区(Normal,V0.1 无出口不需 AboveNormal;§2.2 表已注"1 ms/高"为 P2 瞬时值口径)。单测 +1(TC-PE-010 复归请求:不当拍生效、下一拍消费,滞回保持区可区分复位与否)→ prot_elm 28 用例全绿。`@build` 0 错 0 警(Code=204348,ZI +8,196 = 堆 +8 KB);台架 `@test`(PROT 锚点 + `[STACK] protect` 水位 + 104 YX 联动)待做。§3.3 L3-1/3 注板端落地、§3.5 L5-4 置 ✅、§7 P1 里程碑更新 |
| 2026-10-12 | **B7 定值持久化 + 全局软压板 + 竞态收口(W1 任务卡)** | **定值模型增项** `PS_GLOBAL_EN`(全局软压板,枚举尾追加,编号不回收);**原子写**:`prot_set_set_sealed()` 影子区拷贝→改→重封→**单字交换活跃区**(双缓冲 +124 B 静态),`prot_set_selfcheck()` 改 seqlock 式复核(封存和两读不一致 = 提交撞见 → 本轮跳过)——B5 登记的"104 写 vs 巡检"µs 级误锁窗口就此消除(§3.5 L5-1 注收口)。**持久化**:新增 `App/cfg/prot_set_store.c/h`(双端注册 + 模拟器豁免点名)——blob = magic`PSET`+版本+计数+值区+sum32 正/反码对(144 B),`/prot_set.bin` 走 `cfg_store_write_atomic`(临时文件+rename,掉电安全);**写路径** = C_SE/YK12 执行段置脏 → iec104Task `dirty_peek` 投递 `SYS_EVT_PROT_SET_SAVE`(事件位 bit7)→ defaultTask(配置引擎属主)落盘,写失败脏回置 = 下轮重试;**装载** = storage_bring_up 在 STORAGE_READY 前整表原子 parse(损坏/越界/版本换代 → 拒绝保出厂默认 + 自检留痕 `prot set corrupt`;文件缺失 = 首启正常静默)。**YK12 转真**:`iec104_pts.c` 两段式(选择段校验 DPC、执行段 set_sealed),protectTask 下一拍读退出态 → 复位元件 + 停判据(`global plate OUT/IN` 边沿日志);本地定值项 `comm_addr=0` 显式不可寻址(防 IOA=0 误命中)。单测:prot_set 63 断言(+33:软压板/原子写/脏握手/blob 往返/坏 magic/截断/坏版本/**伪造自洽越界**对抗样本)、iec104 94 断言(+7:YK12 两段转真/置脏/本地项 C_RD EVI)。`@build` 0 错 0 警(Code=205500 +1152 B,ZI +280 = 双缓冲+blob 缓冲,`ram_baseline` 已刷)。**台架腿完成(2026-10-12)**:`@test` PASS + PC 主站 `test/host/iec104_master.py --b7-pre` **21/21**(YK12 两段 OFF→0.05 A 低定值不动作 / ON→YX15·16 即动作,C_SE→C_RD 回读)、`--b7-post` **13/13**(**压板退出态跨复位保持**:开机日志 `global plate OUT -> protection disabled` + 低定值仍不动作、重启后 YK12 ON 联动在位)、`--b7-mark/--b7-check` **4/4+4/4**(**非默认定值 7.5 跨复位保持**,C_RD=7.500,与出厂默认可区分);开机日志两次 `[CFG] prot set loaded (/prot_set.bin)`;证据 `docs/测试说明/boot_log_data/`(20261012_B7_* 两份) |
| 2026-10-12 | **B6 台架 `@test` 闭环复测(B4/B5 验收窗口,W1 任务卡)** | 首跑(HEAD `d3107f3`)**FAIL**:`protect task start` 锚点行字节级交错损坏(`st[art: cycle=220ms elm=70`,两次开机同形复现)= protectTask 启动行违反控制台写者注册前门控纪律(B5 台架腿未跑故未暴露,机理与实证见 `docs/子系统设计/控制台单写者日志设计说明.md` §11 2026-10-12 行);其余 8 Required / 零 `[ERR]` / 锚点×1 / 回读一致全过。**修复** = 启动锚点行改 `dbg_console_writer_ready()` 首拍补打(adcTask 首帧门控同款,+16 B)。**复测 PASS**(B7 `1fe163b`+fix):锚点行完好(+577 ms,attach 后);**首采水位** `protect` 828/2048(free_min 1220,59%)、`iec104` 424/2560(83%)、新 56 KB 堆 free=17936 **min_ever=10000**(>3072 告警线零告警,**N-33 抬栈 min_ever 背书就绪**);采样闭锁不误报。**PC 主站往返**:新增 `test/host/iec104_master.py`(纯标准库主站客户端)STARTDT→总召四组+actterm→C_SE 两段写临时压低 OC1 定值**确定性**触发 YX15·16 变位(COT=3)→恢复复归→YK11 两段正答→C_RD 读回 10.000,**18/18 PASS**(`d3107f3` 与 B7+fix 两版固件各一轮),串口侧 `[I104] accepted`/`[PROT] elm OC1-IA` 边沿/YK11 复位→UV-UA +10 s 重返联一致。证据 `docs/测试说明/boot_log_data/20261012_B6_*`(含缺陷复现 MISS 快照)。B5 行"台架 `@test` 待做"遗留**闭环**;B7 台架腿的 C_SE 写路径已随本窗验证(断电重启保持 + YK12→YX 仍待窗) |
| 2026-10-12 | **B7 定值持久化 + 全局软压板 + 竞态收口(采集保护收尾任务卡)** | **定值模型增项** `PS_GLOBAL_EN`(全局软压板,枚举尾追加,编号不回收);**原子写**:`prot_set_set_sealed()` 影子区拷贝→改→重封→**单字交换活跃区**(双缓冲 +124 B 静态),`prot_set_selfcheck()` 改 seqlock 式复核(封存和两读不一致 = 提交撞见 → 本轮跳过)——B5 登记的"104 写 vs 巡检"µs 级误锁窗口就此消除(§3.5 L5-1 注收口)。**持久化**:新增 `App/cfg/prot_set_store.c/h`(双端注册 + 模拟器豁免点名)——blob = magic`PSET`+版本+计数+值区+sum32 正/反码对(144 B),`/prot_set.bin` 走 `cfg_store_write_atomic`(临时文件+rename,掉电安全);**写路径** = C_SE/YK12 执行段置脏 → iec104Task `dirty_peek` 投递 `SYS_EVT_PROT_SET_SAVE`(事件位 bit7)→ defaultTask(配置引擎属主)落盘,写失败脏回置 = 下轮重试;**装载** = storage_bring_up 在 STORAGE_READY 前整表原子 parse(损坏/越界/版本换代 → 拒绝保出厂默认 + 自检留痕 `prot set corrupt`;文件缺失 = 首启正常静默)。**YK12 转真**:`iec104_pts.c` 两段式(选择段校验 DPC、执行段 set_sealed),protectTask 下一拍读退出态 → 复位元件 + 停判据(`global plate OUT/IN` 边沿日志);本地定值项 `comm_addr=0` 显式不可寻址(防 IOA=0 误命中)。单测:prot_set 63 断言(+33:软压板/原子写/脏握手/blob 往返/坏 magic/截断/坏版本/**伪造自洽越界**对抗样本)、iec104 94 断言(+7:YK12 两段转真/置脏/本地项 C_RD EVI)。`@build` 0 错 0 警(Code=205500 +1152 B,ZI +280 = 双缓冲+blob 缓冲,`ram_baseline` 已刷)。**台架腿完成(2026-10-12)**:`@test` PASS + PC 主站 `test/host/iec104_master.py --b7-pre` **21/21**(YK12 两段 OFF→0.05 A 低定值不动作 / ON→YX15·16 即动作,C_SE→C_RD 回读)、`--b7-post` **13/13**(**压板退出态跨复位保持**:开机日志 `global plate OUT -> protection disabled` + 低定值仍不动作、重启后 YK12 ON 联动在位)、`--b7-mark/--b7-check` **4/4+4/4**(**非默认定值 7.5 跨复位保持**,C_RD=7.500,与出厂默认可区分);开机日志两次 `[CFG] prot set loaded (/prot_set.bin)`;证据 `docs/测试说明/boot_log_data/`(20261012_B7_* 两份) |
| 2026-10-12 | **B6 台架 `@test` 闭环复测(B4/B5 验收窗口,采集保护收尾任务卡)** | 首跑(HEAD `d3107f3`)**FAIL**:`protect task start` 锚点行字节级交错损坏(`st[art: cycle=220ms elm=70`,两次开机同形复现)= protectTask 启动行违反控制台写者注册前门控纪律(B5 台架腿未跑故未暴露,机理与实证见 `docs/子系统设计/控制台单写者日志设计说明.md` §11 2026-10-12 行);其余 8 Required / 零 `[ERR]` / 锚点×1 / 回读一致全过。**修复** = 启动锚点行改 `dbg_console_writer_ready()` 首拍补打(adcTask 首帧门控同款,+16 B)。**复测 PASS**(B7 `1fe163b`+fix):锚点行完好(+577 ms,attach 后);**首采水位** `protect` 828/2048(free_min 1220,59%)、`iec104` 424/2560(83%)、新 56 KB 堆 free=17936 **min_ever=10000**(>3072 告警线零告警,**N-33 抬栈 min_ever 背书就绪**);采样闭锁不误报。**PC 主站往返**:新增 `test/host/iec104_master.py`(纯标准库主站客户端)STARTDT→总召四组+actterm→C_SE 两段写临时压低 OC1 定值**确定性**触发 YX15·16 变位(COT=3)→恢复复归→YK11 两段正答→C_RD 读回 10.000,**18/18 PASS**(`d3107f3` 与 B7+fix 两版固件各一轮),串口侧 `[I104] accepted`/`[PROT] elm OC1-IA` 边沿/YK11 复位→UV-UA +10 s 重返联一致。证据 `docs/测试说明/boot_log_data/20261012_B6_*`(含缺陷复现 MISS 快照)。B5 行"台架 `@test` 待做"遗留**闭环**;B7 台架腿的 C_SE 写路径已随本窗验证(断电重启保持 + YK12→YX 仍待窗) |
| 2026-10-12 | **B8 频率测量层 + 过频/低频保护(L3-5,W1 任务卡)** | 新增 `App/algo/freq.c/h`(L2.5 测频:共轭乘积相位增量 + 解缠绕 + **自适应窗长** K_eff=round(8·Fs/(2·f̂))——定长窗受 20 点矩形窗**负序泄漏纹波**限制(实测最坏 0.317 Hz)、60 拍 Kay 复数和 0.197 Hz(交叉项和角不按 1/K² 衰减),自适应窗把窗长对齐纹波周期 fs/(2f) 整数倍 → **0.0101 Hz**;假值钳制带 35~65 Hz 与系统合理带分离(贴边钳制会非对称丢纹波半周 → 45 Hz 点 +0.16 Hz 偏置);幅值门 <50 码 → valid=0 保持;UA→IA 优先级;`freq_run()` 挂 adcTask `phasor_run()` 后,心跳 `freq(hb)` 行)。**定值 32→40**:尾追加 OF/UF 8 项(51.0/49.0 Hz、dly 1000 ms、返回系数 0.99/1.01;全部本地项 `comm_addr=0`,参考逐项地址不在本仓库待对照);`bad_mask`→`uint64_t`(TC-PS-011 断言 bit39 可指认);**blob VER 1→2**(144→176 B;升级语义换代/损坏分流:旧档 → `prot_set_store_load()` **rc=2 换代** INFO ≠ **rc<0 真损坏** ERROR+自检,defaultTask 不误报)。**prot_elm 7→9**:`PE_OF`/`PE_UF` + `pe_cfg_t.src`(0=相量有效值 / 1=freq 测频;freq 无读数按方向填"必不启动"值,不整拍跳过);OF/UF 暂无独立 YX 点,动作仅经 YX15 总聚合可见(独立分点 = B10 送检点表);YC `0x401D` 频率点仍 QDS=IV(接真值 + 独立分点归 B10)。单测:`test/host/freq/` **46 断言**(J1 扫频 45~55 Hz ≤0.02 实测 0.0101 / J2 噪声 1% ≤0.10 实测 0.0160 / J3 启动收敛 ≤40 ms 实测 20 / J4 阶跃 50→51 ≤120 ms 实测 98——**精度优先于响应**显式取舍:98 ms ≪ OF/UF 动作延时定值默认 1000 ms / J5 浮空 valid=0 漂移 0.13 / J6 双跳变 60 ms 回 ±0.05;三代弯路推导写 `freq.c` 文件头防重蹈)+ prot_set **90**(+27:40 项/VER 2/64 位 bad_mask/旧档拒绝)+ prot_elm **47**(+OF/UF 滞回·方向隔离·测频接线);回归 phasor 57 / iec104 94 无退化。`@build` 0 错 0 警(Code=207468);RW_IRAM1 +632 B(73.3%→73.8%)、CCM 不变、Flash +2,244 B(21.6%);**adcTask/protectTask 栈链不变**(freq_run 帧未进最坏链,无需抬栈)。§3.3 L3-5 置 ✅(软件侧)、§7 P2 更新;`freq-unit-test` 钩子登记(31→32) |
| 2026-10-12 | **B9 动作记录 + 时标 SOE(L4-4/L4-5,W1 任务卡)** | 新增 `App/log/soe_rec.c/h`(64 B 定长 SOE 记录纯编解码:类型 1~6 = 元件动作/复归、软压板投/退、采样数据块/恢复 + 元件号 + IV 位 + seq(u32) + CP56Time2a + epoch_s + value + sum8)与 `App/log/soe_store.c/h`(板端胶水:SPSC 无锁环 8 深惰性创建 + `soe_store_drain()` 挂 `syslog_drain()` 尾,defaultTask 唯一落盘写者)。**动作路径零 NAND I/O**:protectTask 只投递(post **禁 DBG**——曾把静态链从 872 垫到 1192 FAIL,丢弃计数留痕挪 drain 侧),**protectTask 静态链 872 B / 57% 改前后逐字节不变**(DoD 硬约束)。**104 自发单点改 M_SP_TB_1(type 30,带 CP56 时标)**——idx≥4 且时标有效;总召/周期上送保持 M_SP_NA_1 不变;主站工具 `iec104_master.py` 同步解析 type 1/30。单测 `test/host/soe/` **32 断言**(往返/截断/坏校验和/IV 位/seq 连续性)+ iec104 **94→97**(TB 编解码 + pts 自发选型 + IV);`soe-unit-test` 钩子登记(32→33)。**台架腿**(sync 追平 B8/N33 后重跑,覆盖将被合并的代码):`@test` PASS(锚点 `set=40 elm=9`、无 `[ERR]`)+ **顺带兜住 B8 板端面**(`freq(hb): f=0 valid=0` 浮空不发散、`prot set blob version change (ver=1 cnt=32), defaults in use` = 换代 INFO ≠ CORRUPT 实证)+ `--b7-pre` 21/21 / `--b7-post` 13/13 不回归 + 自发 YX M_SP_TB_1 带 ts(动作/复归/重启后联动三段)+ FTP 下载 `SOE.LOG` **56 条** `decode_soe.py` PASS(boot 段内 seq 严格 +1、CP56↔epoch UTC 交叉一致)。RAM:RW_IRAM1 +1,088 B(SPSC 环 512 + 静态 FIL 528 + 计数器,74.7%);Flash +1,856 B。§3.4 L4-4/L4-5 置 ✅、§7 P4 更新;出口 L4-1~L4-3 仍 ⬜(V0.1 无出口硬件,R7 否定确认口径不变) |
+1 -1
View File
@@ -148,7 +148,7 @@
| `TM-[A-Z]{1,4}-\d{2}` | 测试阶段 | 各测试文档 | 模块码取 §6 统一表(`TM-PHY-01` → `TM-NET-01`) |
| `DP-[A-Z]{1,4}-\d{2}` | 设计原则 | 各测试文档 | **加模块码**(现 `DP-01` 跨文档会撞) |
| `L\d` / `L\d-\d{1,2}` | 采集与保护分层、层内条目 | `docs/算法/继电保护功能复现规划.md` §3 | 保留(代码侧 141 处引用,是全项目最规范的一族,作样板);`L` 前缀**专属**此族 |
| `W\d+` | 波次 | `docs/任务规划/README.md` §2.0 | 保留;游标 `W8`;子任务卡不再用 `W1-0` 形态(并入 `WI`) |
| `W\d+` | 波次 | `docs/任务规划/README.md` §2.0 | **2026-10-25 废止**:波次改用语义名,理由见该文档 §2.0;游标冻结 `W8`,存量仅作历史指称;子任务卡不再用 `W1-0` 形态(并入 `WI`) |
### 4.2 目标前缀(阶段 1 改名后启用)
@@ -282,8 +282,8 @@
这四项合起来是**一次完整的"测量子系统"立项**,建议按一个波次做,因为它们共享同一批参数与同一条数据通路;拆开做会互相返工。
> **已立项(2026-10-23)**:本阶段 = **W8「数据可信」**,任务卡、事实基线与验收判据见
> `docs/任务规划/W8-数据可信.md`。排序已由 `docs/任务规划/README.md` §2 接管,本文只保留成因分析。
> **已立项(2026-10-23)**:本阶段 = **「数据可信」**,任务卡、事实基线与验收判据见
> `docs/任务规划/数据可信.md`。排序已由 `docs/任务规划/README.md` §2 接管,本文只保留成因分析。
### 阶段二:精度与安全网
@@ -327,7 +327,7 @@ defaultTask 单属主;原子写经卷锁;旧档迁移已删除。**仍列为
原"8 人日方案"正文(四层架构设问、逐日排期、27 页清单)已随落地删除;现行做法与约束只在两处详述:
`../UI设计/UI_设计架构.md`(分层、令牌、双端同步、陷阱表)与 `../UI设计/UI_自动化测试流程.md`(回归与
黄金参考);历史决策与验收证据见本文**变更记录**(2026-10-15 W6 三行)与 `../UI设计/菜单页面设计.md`。
黄金参考);历史决策与验收证据见本文**变更记录**(2026-10-15「UI 扩展」三行)与 `../UI设计/菜单页面设计.md`。
### 6.4 UI 侧的内存纪律(写进规范,勿再试探)
@@ -339,18 +339,18 @@ defaultTask 单属主;原子写经卷锁;旧档迁移已删除。**仍列为
### 6.5 实施顺序(历史,已执行完)
W6 簇按 U4 → U1 → U3 → U2 的顺序执行完毕(U2 停在"够用即止"),顺序与理由见 §6.1 与变更记录
「UI 扩展」簇按 U4 → U1 → U3 → U2 的顺序执行完毕(U2 停在"够用即止"),顺序与理由见 §6.1 与变更记录
2026-10-15 三行;不再另存排期。
## 7. 统一改进路线图(不另立权威)
| 波次 | 本报告条目(今天状态) | 备注 |
|---|---|---|
| ~~W3 预算与内存~~ ⏸ | R-9 ✅ / R-2 后半、R-3、R-4、R-6 暂缓 | 暂缓期间无验收动作,观测照常 |
| W4 结构债 | N-14 ⏸、F-5 🟡、S-1/S-2/S-4/S-5、N-25 | `--strict` 已默认;S-5 契约/门禁已落地并收编三模块,`consume-result` 已把"丢弃返回值"纳入机械检查(基线 19→1→38;剩 GD5F 码集收编、C4 快照、37 条丢弃点、标坏策略) |
| W5 验证常态 | ~~覆盖率~~ ✅、~~`malloc` 正则~~ ✅(均 2026-10-23)、TC 差异 13 处升门禁 | 剩 TC 一条 |
| W6 UI 扩展 | U2 残余、U5 页量 | 随产品需求,不再单列专项 |
| W7 仓库决策 | D-1(N-29) | 已决策暂不处理;对外交付前重评 |
| ~~预算与内存~~ ⏸ | R-9 ✅ / R-2 后半、R-3、R-4、R-6 暂缓 | 暂缓期间无验收动作,观测照常 |
| 结构债 | N-14 ⏸、F-5 🟡、S-1/S-2/S-4/S-5、N-25 | `--strict` 已默认;S-5 契约/门禁已落地并收编三模块,`consume-result` 已把"丢弃返回值"纳入机械检查(基线 19→1→38;剩 GD5F 码集收编、C4 快照、37 条丢弃点、标坏策略) |
| 验证常态 | ~~覆盖率~~ ✅、~~`malloc` 正则~~ ✅(均 2026-10-23)、TC 差异 13 处升门禁 | 剩 TC 一条 |
| UI 扩展 | U2 残余、U5 页量 | 随产品需求,不再单列专项 |
| 仓库决策 | D-1(N-29) | 已决策暂不处理;对外交付前重评 |
## 附录 A 关键证据索引(2026-10-22)
@@ -419,20 +419,20 @@ W6 簇按 U4 → U1 → U3 → U2 的顺序执行完毕(U2 停在"够用即止
|------|------|------|
| 2026-09-18 | 初版 | 全量审查;基线 `HEAD = 2d0ec35`、`.map` 链接于 2026-09-16;产出 N-01..N-18 / D-1..D-7 / S-1..S-5 / R-1..R-9 / F-1..F-6 / U1..U5 编号体系 |
| 2026-10-11 | 实施 + 销项:F-1/F-2/F-3 | 两份 `lv_conf.h` 对齐同一特性子集 → 省 64,576 B;验证链(`@build` / ui-verify / `@test`)与对象级对照见 `../内存管理/RAM使用分析与优化方案.md` §2.6.4 |
| **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** | **登记簿同步销项** | 本报告的 N-03c / N-11 对应登记簿 **N-20 / N-26** 两行已按「完成即销项」从 `../任务规划/登记簿.md` §5 删除(并清 `../任务规划/README.md` §1/§2 与 `排期详述.md` §1 的引用,「结构债」链由 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-15** | **裁定:内存优化簇整簇暂缓** | 用户判定"把 LVGL 池与 UI 帧缓冲(现 ≈29.6 KB)搬进 CCM 作为后续功能预算来源"这个决定不合适,内存优化的事先放一放。据此:§0.2 **Top 3 → Top 2**(R-2 剩余移出名列,表下加一条 ⏸ 说明);§0.3 主线一由"把内存从卡死变富裕"改写为"**这条线到此为止**";§0.4 两条内存条目 🟡/❌ → **⏸ 暂缓**;§5.1 结论段与 §5.2 诊断 1 补"不代表现在要动";**§5.3 加暂缓横幅**(三条理由 + 保留常开的治理面 + 三条重开条件),R-2 / R-3 / R-4 / R-6 优先级列一律 ~~P1/P2~~ → **⏸ 暂缓**。**已落地的 R-9 不回退**(−24,576 B 是净收益且已台架验收);`mem-budget` 92% 门禁、预算台账、趋势基线、栈/堆观测**全部保留常开**——它们是传感器,不是优化动作。同步 `../任务规划/登记簿.md` N-27、`../任务规划/README.md` W3、`../内存管理/RAM预算台账.md` §3、`../内存管理/RAM使用分析与优化方案.md` 阶段 1.2 / 2 |
| **2026-10-15** | **裁定:内存优化簇整簇暂缓** | 用户判定"把 LVGL 池与 UI 帧缓冲(现 ≈29.6 KB)搬进 CCM 作为后续功能预算来源"这个决定不合适,内存优化的事先放一放。据此:§0.2 **Top 3 → Top 2**(R-2 剩余移出名列,表下加一条 ⏸ 说明);§0.3 主线一由"把内存从卡死变富裕"改写为"**这条线到此为止**";§0.4 两条内存条目 🟡/❌ → **⏸ 暂缓**;§5.1 结论段与 §5.2 诊断 1 补"不代表现在要动";**§5.3 加暂缓横幅**(三条理由 + 保留常开的治理面 + 三条重开条件),R-2 / R-3 / R-4 / R-6 优先级列一律 ~~P1/P2~~ → **⏸ 暂缓**。**已落地的 R-9 不回退**(−24,576 B 是净收益且已台架验收);`mem-budget` 92% 门禁、预算台账、趋势基线、栈/堆观测**全部保留常开**——它们是传感器,不是优化动作。同步 `../任务规划/登记簿.md` N-27、`../任务规划/README.md`「预算与内存」、`../内存管理/RAM预算台账.md` §3、`../内存管理/RAM使用分析与优化方案.md` 阶段 1.2 / 2 |
| **2026-10-15** | **执行本报告条目:N-12 / N-13 / N-16 落地并销项** | **N-12**:`dhara_nand_is_free()` 改整页扫描(栈上 64 B 分块、页首命中即早退,成本与旧实现同价)。**N-13:本报告原建议经核对不成立,已按实际契约改修**——本仓裁剪版 dhara 既没有 `DHARA_NO_PAGE`(哨兵实为 `DHARA_PAGE_NONE`,`journal.h:46`)也没有 `DHARA_E_UNSUPPORTED`(`error.h:20-31` 枚举里没有,照抄直接编译失败),且 `map.c` 三处 `dhara_journal_copy` 调用点各自已挡掉哨兵(`map.c:260`、`:434`+`:440`、`:242`);真风险是**移植层零上界校验**(越界页号被地址位截断成真实页 → 静默读写错页),故改为六个 HAL 入口统一几何上界守卫 + `DHARA_E_CORRUPT_MAP`(不能用 `BAD_BLOCK`:`journal.c:904` 会据此标坏块;不能用 `RECOVER`:`map.c:275` 会据此启动回收)。**N-16**:写侧一次排空合并成"每文件一次 open/write/close"(≤8 条 = 512 B 静态缓冲;**掉电语义不变**——批次仍在同一次 drain 内 close,close 回写目录项这个不同 LPN 会逼出 FTL 单页写回缓存;失败尾部回投队列,条目不丢);读侧 8 条滑动窗口 + 写者代数失效(API 与 UI 零改动)。**刻意不批量**:`sys_log_evidence()` 的 `wdev.log` 仍逐条落盘——取证路径要求立刻进 NAND 并靠 flush 诱导逼出脏页。**验证**:`@build` 0 错 0 警(Code 212,344→**213,536**、ZI 129,880→**131,520**,+1,640 B 全为静态缓冲,不吃栈);`@test` PASS 且**台架 journal 恢复点与修复前同轨**(`sectors used` 恒 14,094、`Map head` 每轮 +128 单调推进、`epoch` 稳定 3 → 整页 `is_free` 未改变恢复语义、无双编程);`stack_report.py` 9 个任务全 PASS(defaultTask 静态最坏链 3,024 B / 余 40%,实测峰值 2,164 B / 余 57%);新增主机侧移植层单测 `test/host/nand_port/`(假芯片 + 旧算法对照用例)。实施记录 → `../架构设计/STM32F4-Base存储架构说明.md` §5.3、`../子系统设计/运行与自检记录设计说明.md` §4.4/§4.5 |
| **2026-10-15** | **删除 §0.2「未闭环问题」小节** | Top 2 修复销项后该节只剩指针与暂缓说明,而三条内容都已在别处**单点详述**:未闭环清单 → §0.4;内存簇暂缓 → §0.3 主线一与 §5.3 横幅;Top 2 修复证据 → 上一条变更记录与文末「已销项条目的记录去处」。按 `../文档规范.md`「同一事实只在一处详述」删除,不留空壳。**§0.3 / §0.4 编号保持不变、不重排**——`../任务规划/README.md` §2 前言引用本报告 §0.3,本报告内部另有 §0.4 交叉引用,重排会全断(与本表 2026-10-14 行第 ⑤ 条"报告自有编号不回改、不重排"同一口径)。文首「销项状态」行的指针由「§0.2 / §0.4」改为「§0.4」 |
| **2026-10-15** | **删除 §0.3 主线建议第 1 条("内存这条线到此为止")** | 该条是同日暂缓裁定的**复述层**,同一事实已有三处单点详述:§0.4 内存两行(⏸ 暂缓)、§5.3 暂缓横幅(三条理由 + 保留常开的治理面 + 重开条件)、登记簿 N-27 与 `../内存管理/` 两份文档的横幅。按 `../文档规范.md`「同一事实只在一处详述」删复述、留权威。⚠ 上一条变更记录里"内存簇暂缓 → §0.3 主线一"这个去处**自此失效,以本行为准**(变更记录本身不改,它是历史)。§0.3 现只剩 UI 一条主线;标题「两条主线建议」→「主线建议」,**§0.3 编号不变**(`../任务规划/README.md` §2 前言引用的是编号不是标题) |
| **2026-10-15** | **启动 W6 UI 标准化簇**(用户裁定,覆盖 2026-10-11 的「本轮不排期」) | §0.3 删掉内存主线后只剩 UI 这一条,随即启动。已按 §6.5 的 U1~U5 拆成 5 个工作包上共享任务板,第一波 **U1 令牌层 ∥ U4 门禁补强** 两名成员并行(写范围严格不相交:U1 只写 `Drivers/BSP/UI/` + `App/task/ui_task.c`,U4 只写 `scripts/` + 门禁与规范文档)。**并行度的真实约束不是任务数量,而是注册文件**:新增 `.c` 必须改 `uvprojx` + `CMakeLists.txt` 两个共享文件,同工作树两人同改必互相踩,故 U3(生成器/注册表)是必须串行的一段,U2/U5 排在它后面——U5 的页面批量要等 U3 把注册自动化之后才谈得上并行。同步 §6.5 注与本表 W6 行;`../任务规划/README.md` §2.0 W6 行同步。另修正交付物清单:移植层单测拟名 `test/host/dhara/` 实际落地为 `test/host/nand_port/`,状态 ❌ → ✅ |
| **2026-10-15** | **§6 顶部加"建议栏不可照抄"总警示** | 启动 W6 后按 §6 执行 U1/U3/U4,**四次证伪**:① §6.3 要新建 `UI_SCREEN_W/H` 而 `ui_port.h:21-22` 早有同名宏;② `LV_COLOR_BLACK/WHITE` 在 LVGL 9.3 不存在**且极性反了**(墨色实为 white),照抄先编译失败、改完整屏反色;③ "27 页未落地"是**目标页数**、现存 `ui_page_*.c` 实测 7 个;④ 生成器草图漏掉**密码页非节点绑定**。另有 L0 清单 9 条取值错,明细在 §6.3 更正块。**不再逐条打补丁**,改为节顶立总口径:动手前逐条 grep 对代码核、不符一律以代码为准、差集必须回报不得静默修正;并明确**"发现"栏可信、"建议"栏不可照抄**。同一规律在 §4 的 N-13(`DHARA_E_UNSUPPORTED` 不存在)已复现,故这不是 UI 章节局部问题,而是"建议"这一体裁的通病 → 后续任务卡须显式写"报告建议值不可直接采用" |
| **2026-10-15** | **W6 第一波落地:U1 + U3 验证通过并回填现状表** | Lead 亲自验证(成员被模型路由变更连续打断,最终停用):`@build` **0 错 0 警**;golden **菜单 8 状态全像素 + 内容页 11 页逐字节一致**、池水位 **5368 / 5448 B 与 U1 基线相同**、参考图 sha256 **差异 0 条**(证明无人用 `--update` 刷基线);`registration-check`(含第 ④ 类"页面必须被表引用")与 `font-charset` **Passed**;`ER_IROM1` **232,052 B**(较已提交 HEAD −228 B)、`RW_IRAM1` **75,232 B 零增量**;对 38 个在途修改文件逐个核对 **BOM / CRLF / U+FFFD 全部与 HEAD 一致**。**单位成本实测**(临时页 `zzprobe` 绑到 `遥信量` 叶子 → 只跑生成器 → 带页 `@build` 0/0 → 注册表出现 `{5u, &ui_page_zzprobe_desc}` → 回滚后 6 个产出文件的 `zzprobe` 残留计数均为 0、重编回基线)得出 **新增一页 = 3 处人工(新 `.c` + 新 `.h` + 树那一行加 ` #page=<名>`)+ 1 条生成器命令,手工编辑注册文件 0 处**,并确认生成器 `registered` / `pruned` **双向对账**(不只增、也减)。据此修正 §0.1 UI 行(B → **B+**)、§6.1「内容页」与「设计令牌」两行、§6.5 U3 行;并把 §6.5 U4 从我上一版**误写的 3/3 改回 2/3**(golden 两脚本至今未挂 pre-commit,"脚本已存在"≠"已进自动门禁");§6.5 U3 原口径"8 处降到 1 处"改为**真实 3 处**。**"分三笔提交"计划作废**:U1 与 U3 改同一批文件、文件内交叠,硬切会产生不可编译的中间态,改为整波一笔 |
| **2026-10-15** | **启动「UI 扩展」标准化簇**(用户裁定,覆盖 2026-10-11 的「本轮不排期」) | §0.3 删掉内存主线后只剩 UI 这一条,随即启动。已按 §6.5 的 U1~U5 拆成 5 个工作包上共享任务板,第一波 **U1 令牌层 ∥ U4 门禁补强** 两名成员并行(写范围严格不相交:U1 只写 `Drivers/BSP/UI/` + `App/task/ui_task.c`,U4 只写 `scripts/` + 门禁与规范文档)。**并行度的真实约束不是任务数量,而是注册文件**:新增 `.c` 必须改 `uvprojx` + `CMakeLists.txt` 两个共享文件,同工作树两人同改必互相踩,故 U3(生成器/注册表)是必须串行的一段,U2/U5 排在它后面——U5 的页面批量要等 U3 把注册自动化之后才谈得上并行。同步 §6.5 注与本表「UI 扩展」行;`../任务规划/README.md` §2.0「UI 扩展」行同步。另修正交付物清单:移植层单测拟名 `test/host/dhara/` 实际落地为 `test/host/nand_port/`,状态 ❌ → ✅ |
| **2026-10-15** | **§6 顶部加"建议栏不可照抄"总警示** | 启动「UI 扩展」后按 §6 执行 U1/U3/U4,**四次证伪**:① §6.3 要新建 `UI_SCREEN_W/H` 而 `ui_port.h:21-22` 早有同名宏;② `LV_COLOR_BLACK/WHITE` 在 LVGL 9.3 不存在**且极性反了**(墨色实为 white),照抄先编译失败、改完整屏反色;③ "27 页未落地"是**目标页数**、现存 `ui_page_*.c` 实测 7 个;④ 生成器草图漏掉**密码页非节点绑定**。另有 L0 清单 9 条取值错,明细在 §6.3 更正块。**不再逐条打补丁**,改为节顶立总口径:动手前逐条 grep 对代码核、不符一律以代码为准、差集必须回报不得静默修正;并明确**"发现"栏可信、"建议"栏不可照抄**。同一规律在 §4 的 N-13(`DHARA_E_UNSUPPORTED` 不存在)已复现,故这不是 UI 章节局部问题,而是"建议"这一体裁的通病 → 后续任务卡须显式写"报告建议值不可直接采用" |
| **2026-10-15** | **「UI 扩展」第一波落地:U1 + U3 验证通过并回填现状表** | Lead 亲自验证(成员被模型路由变更连续打断,最终停用):`@build` **0 错 0 警**;golden **菜单 8 状态全像素 + 内容页 11 页逐字节一致**、池水位 **5368 / 5448 B 与 U1 基线相同**、参考图 sha256 **差异 0 条**(证明无人用 `--update` 刷基线);`registration-check`(含第 ④ 类"页面必须被表引用")与 `font-charset` **Passed**;`ER_IROM1` **232,052 B**(较已提交 HEAD −228 B)、`RW_IRAM1` **75,232 B 零增量**;对 38 个在途修改文件逐个核对 **BOM / CRLF / U+FFFD 全部与 HEAD 一致**。**单位成本实测**(临时页 `zzprobe` 绑到 `遥信量` 叶子 → 只跑生成器 → 带页 `@build` 0/0 → 注册表出现 `{5u, &ui_page_zzprobe_desc}` → 回滚后 6 个产出文件的 `zzprobe` 残留计数均为 0、重编回基线)得出 **新增一页 = 3 处人工(新 `.c` + 新 `.h` + 树那一行加 ` #page=<名>`)+ 1 条生成器命令,手工编辑注册文件 0 处**,并确认生成器 `registered` / `pruned` **双向对账**(不只增、也减)。据此修正 §0.1 UI 行(B → **B+**)、§6.1「内容页」与「设计令牌」两行、§6.5 U3 行;并把 §6.5 U4 从我上一版**误写的 3/3 改回 2/3**(golden 两脚本至今未挂 pre-commit,"脚本已存在"≠"已进自动门禁");§6.5 U3 原口径"8 处降到 1 处"改为**真实 3 处**。**"分三笔提交"计划作废**:U1 与 U3 改同一批文件、文件内交叠,硬切会产生不可编译的中间态,改为整波一笔 |
| **2026-10-20** | **补上 U4 缺的第三件:golden 像素回归入提交门禁(35→36 钩子)** | 先实测成本再定形态:改一个 UI 源文件后「增量重编模拟器 + 两条 golden」合计 **2~4 秒**,支持走自动门禁(若实测要几分钟,正确做法是明确不挂、改为文档化人工门禁——一个逼人 `--no-verify` 的门禁等于没有门禁)。新增 `scripts/check_ui_golden.py` 包装器(**有意忽略 argv 并 `pass_filenames: false`**:两条 golden 按整棵菜单树 + 全量参考图工作,不接受文件参数),新钩子 `ui-golden` 的 `files:` 覆盖 UI 源 + `ui_task.{c,h}` + 模拟器 tests/sim/src + `lv_conf.h` + 包装器与本配置文件自身。
⚠ **端到端验的是钩子不是脚本**:干净树连跑 3 次 `rc=0` 全 Passed;注入 `ui_page_dc.c` 的 `.top_y +5` → **钩子 Failed** 并点名 `[dc] FAIL 与参考页不一致(1882 px 差异)`;还原后 `git diff` 干净、`simulator/tests/ref` 的 `git status` 为空(**全程未用 `--update` 刷基线**)。诚实记录一次瑕疵:首次实测在连续注入/还原的紧邻重建之间偶发失败一次,疑似 MSBuild 节点争用,已把"单次失败先复跑、连续两次才当真、不许直接绕过"写进钩子注释。
据此 §6.5 U4 由 **2/3 → 3/3**(这次是"真进了自动门禁",不是"脚本存在")、§6.1 golden 行转 ✅、§0.1 UI 行缺口描述更新、`AGENTS.md` 钩子数与文末索引 35→36、`pre-commit使用说明.md` 概览计数同步。**W6 剩余**:U2 合并两页记录、U5 落地目标页(须先对齐"目标页 vs 现存 7 个 `ui_page_*.c`"差集)。
据此 §6.5 U4 由 **2/3 → 3/3**(这次是"真进了自动门禁",不是"脚本存在")、§6.1 golden 行转 ✅、§0.1 UI 行缺口描述更新、`AGENTS.md` 钩子数与文末索引 35→36、`pre-commit使用说明.md` 概览计数同步。**「UI 扩展」剩余**:U2 合并两页记录、U5 落地目标页(须先对齐"目标页 vs 现存 7 个 `ui_page_*.c`"差集)。
| **2026-10-22** | **v3.0 全量重写:删过时条目 + 按今天的仓库重新审计**(用户裁定"过时的都删除,重新写") | 旧正文按今天的实测重取数重判:六维评分旧表、UI「8 人日方案」正文、波次交付物清单、以及所有已闭环条目整段删除;**697 → 436 行**(−37%)。
**重写依据(全部当日实测,不再引用旧数字)**:镜像 `ER_IROM1` 231,768 B / 22.1%(Code 213,188)、`RW_IRAM1` 75,264 B / 57.4%(余 55,808)、`RW_CCM` 57,376 B / **87.9%(余 7,904)**、堆 `min_ever` 8,464 B、任务栈 9/9 PASS(`data/ram_report_20261022.md`、`data/stack_report_20261022.md`);仓库 2,498 文件 / 80.0 MB、`.git` 248 MB、`docs/芯片手册` 717 文件 / 39.5 MB 占 docs 87%;37 个钩子、16 套主机单测、TC 593∶271 交集 265。
**改判的三条旧结论**:① §6 的 U1/U3/U4 原写「❌ 未建」,实际已落地(`ui_tokens.h` 69 行、`ui_page_registry.c` 描述符注册表、`ui-golden`+`font-charset` 两枚钩子);U2 只有 `ui_w_records` 一个组件;"27 页未落地"实为 7 页。② "新增一页 ≤30 行"目标**未达**(最省 40 行),如实记为未达项。③ §0.4 与登记簿已漂开 → 本版把待办清单降级为**快照 + 指向登记簿**,权威只留一处。
@@ -661,7 +661,7 @@ USER CODE 区内只留「读 RCC_CSR → 写 RMVF 清除」两句、顺序约束
| **2026-10-22** | **结构债 S-4 闭环 + S-2 第一步(用户批准「先只跑 1+2」)** | **S-4**:删除 `App/app/app_cfg.h` 里 4 个**零消费点**宏(`APP_NET_ENABLE`/`APP_ADC_ENABLE`/`APP_RS485_ENABLE`/`APP_SYS_TIME_SRC`),文件降格为「决策占位说明」——修改记录 v1.2 写明为什么删与将来怎么接回;并去掉 `app_main.c` 里只为它存在的 include。留「看着能裁剪、其实不生效」的宏比不留更糟:它不产生任何编译期效果,却让评审误信模块可裁剪;此前为了说明它,AGENTS 之外还得在 6 处文档各写一句「未接线占位,别当开关用」。同步改口径 **17 处**:`App/app/README.md`、`App/README.md`、根 `README.md`、`项目架构总览.md`、`项目部署环境要求.md`(§3.2 两行 + 配置表一行)、`产品需求设计文档.md`(B0 结论 + 配置表)、`基线与待确认.md`、`排期详述.md` C5、`登记簿.md` N-23 残余、`RAM使用分析与优化方案.md` 三处。
| | **顺带纠出另一个不存在的宏**:`RAM使用分析与优化方案.md` 把 `APP_CCM_ENABLE` 写成「加在 `App/app/app_cfg.h`」,实际从来没有落地(全库仅该文档提及)——已就地标注「未实现,重开本簇时一起落地」,避免下一个读者以为 CCM 有回退开关。
| | **S-2 第一步(实测纠偏)**:删掉 `gd5f2gq5ue.c:47`、`sd2506.c:20` 两处与 `Inc/spi.h`/`Inc/i2c.h` 重复的 `extern`,GD5F 改 `#include "spi.h"`(沿用 `ch395f.c:22` 的既有做法)。**镜像逐字节不变**:`Code=213,188 RO=18,580 RW=1,184 ZI=131,504` 与改动前完全相同,`@build` 0 错 0 警告 → 证明这两步是行为中性的。同时把 §0.4/§9 的旧口径换成实测值:**S-2 不是 4 处而是 25 处**(`App/task/default_task.c:52-69` 一次就有 18 行;`stm32f4xx_it.c` 的 `fault_entry_hard` 属 ARMCC `__asm` 合法例外,不该「修」),**S-1 不是语义错位而是真实反向依赖**(NETCFG include `App/cfg/cfg_file.h` 10 处 + UI 3 个文件)。**这两个旧数字是我 v3.0 重写时沿用未测,一并认错。** SPI 回调归属这条隐患(CH395F 替 GD5F 释放错误路径)目前只在本文 §0.4 留了痕,**尚未进登记簿**——要不要立项等你定。 |
| **2026-10-22** | **执行 §5.4:F-6 落地、F-4 判定不做、F-5 降级观察项**(登记簿 N-28 同步改写) | 动手前逐条对 `.map` 与源码核(本报告"建议栏不可照抄"总口径的又一次复现——三处误判全部出在**建议栏**,"发现"栏字节数全对)。**F-6 ✅**:`App/algo/prot_set.h` 两个 Q10 宏去掉显式 `(double)`、`1024.0`→`1024.0f` → `@build` 0 错 0 警、Code 213,520→**213,188(−332 B)**;`.map` 中 `dflti`、`d2f`、`f2d`、`dfixi`、`fepilogue` 共 300 B 消失,自研侧不再引用任何双精度 helper。**原报告"来自 `printf` 的 `%f`"是误判**:全库 0 处 `%f`,剩余 `dadd`+`dmul`+`ddiv`+`depilogue`+`dfixul` = 1,018 B 由 `mc_w.l(printfa.o)` 的 `_printf_core → _fp_digits` 无条件引用,MicroLIB 层面删不掉。**数值等价用穷举证明**(宏内 42 个字面量 + `int32` 全域 ÷1024 往返 4.49×10⁶ 例零差异;×1024 方向 2×10⁵ 例零差异);回归 = `prot_set` 90/90、`prot_elm` 47/47、`iec104` 97/97 主机单测全过。**F-4 ❌ 判定不做**:五项字节数逐字节仍准(合计 10,060 B)但**无一项有开关**,根因是 `lv_draw_sw.c` 的 `execute_drawing()` 无条件 switch 引用全部 task 类型;唯一总开关 `LV_DRAW_SW_COMPLEX` 被 `ui_deco.c` 的"浅 V"3 px 粗斜腿锁死(**2026-09-03 已实测失败并两端固化 =1**);**原"mask/grad 是文字必经路径"的理由同时证伪**(字形走 blend 层 `mask_buf`,不经 `lv_draw_sw_mask_*`)。**F-5 🟡 降级观察项**:uvprojx 实测 326 个 `.c` / LVGL 201 个 / `.map` 零产出 **127 个**,但增量构建实测 4~5 s、远程 CI 刻意不跑 `@build`,原"−40%"无基线记录。同步更正 §0.1 Flash 行、§0.4 Flash 行、注册表 uvprojx 行、§1 口径行、§5.1 快照注与要点行、§6.4 LVGL 占比分母、W4 波次行;台账受管区与内存快照已 `--write` 回填(`mem-budget` / `mem-numbers` 转绿)。**`@test` 台架 PASS**(固件戳 `fw build: Oct 22 2026 10:36:15 suite=NONE dstr=off`;无 `[ERR]`/`ERROR`/`FAIL`/Fault,708 ms 到 `net init: OK`,`protect task start`、`i104: listening on 2404`、`[STACK]` 三面水位齐;`adc`/`phasor`/`freq` 心跳持续) |
| **2026-10-22** | **执行 §5.4:F-6 落地、F-4 判定不做、F-5 降级观察项**(登记簿 N-28 同步改写) | 动手前逐条对 `.map` 与源码核(本报告"建议栏不可照抄"总口径的又一次复现——三处误判全部出在**建议栏**,"发现"栏字节数全对)。**F-6 ✅**:`App/algo/prot_set.h` 两个 Q10 宏去掉显式 `(double)`、`1024.0`→`1024.0f` → `@build` 0 错 0 警、Code 213,520→**213,188(−332 B)**;`.map` 中 `dflti`、`d2f`、`f2d`、`dfixi`、`fepilogue` 共 300 B 消失,自研侧不再引用任何双精度 helper。**原报告"来自 `printf` 的 `%f`"是误判**:全库 0 处 `%f`,剩余 `dadd`+`dmul`+`ddiv`+`depilogue`+`dfixul` = 1,018 B 由 `mc_w.l(printfa.o)` 的 `_printf_core → _fp_digits` 无条件引用,MicroLIB 层面删不掉。**数值等价用穷举证明**(宏内 42 个字面量 + `int32` 全域 ÷1024 往返 4.49×10⁶ 例零差异;×1024 方向 2×10⁵ 例零差异);回归 = `prot_set` 90/90、`prot_elm` 47/47、`iec104` 97/97 主机单测全过。**F-4 ❌ 判定不做**:五项字节数逐字节仍准(合计 10,060 B)但**无一项有开关**,根因是 `lv_draw_sw.c` 的 `execute_drawing()` 无条件 switch 引用全部 task 类型;唯一总开关 `LV_DRAW_SW_COMPLEX` 被 `ui_deco.c` 的"浅 V"3 px 粗斜腿锁死(**2026-09-03 已实测失败并两端固化 =1**);**原"mask/grad 是文字必经路径"的理由同时证伪**(字形走 blend 层 `mask_buf`,不经 `lv_draw_sw_mask_*`)。**F-5 🟡 降级观察项**:uvprojx 实测 326 个 `.c` / LVGL 201 个 / `.map` 零产出 **127 个**,但增量构建实测 4~5 s、远程 CI 刻意不跑 `@build`,原"−40%"无基线记录。同步更正 §0.1 Flash 行、§0.4 Flash 行、注册表 uvprojx 行、§1 口径行、§5.1 快照注与要点行、§6.4 LVGL 占比分母、「结构债」波次行;台账受管区与内存快照已 `--write` 回填(`mem-budget` / `mem-numbers` 转绿)。**`@test` 台架 PASS**(固件戳 `fw build: Oct 22 2026 10:36:15 suite=NONE dstr=off`;无 `[ERR]`/`ERROR`/`FAIL`/Fault,708 ms 到 `net init: OK`,`protect task start`、`i104: listening on 2404`、`[STACK]` 三面水位齐;`adc`/`phasor`/`freq` 心跳持续) |
| **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`) |
| **2026-10-23** | **N-15 由"待评估"改判"判定不做":补上页缓冲可合并性论证** | 报告此前把 N-15(`nand_ftl.o` 6,216 B、三块 2 KB 页缓冲)写成"与 R-3 同批评估",但**评估本身从来没写过**——`nand_ftl.c:300` 的注释直接引用了这份不存在的"报告 R-3"。本次补齐(论证落 `../内存管理/存储栈RAM优化调研.md` §5):① `.map` 实证 6,216 = RW 16 + ZI 6,200,三块缓冲 6,144 B 占 98.8%;② **不可合并**——`dhara_map_write()` 先 `auto_gc()`(`map.c:327`)再落数据,回收里的 `dhara_nand_copy()` 与"待写的 `s_cache_buf`""攒了 16 页的 checkpoint 元数据 `s_page_buf`"三方同时存活,任两块合并都是**静默错数据而非报错**;`s_page_buf` 也不能缩(元数据跨 0..1,999 偏移,编程的是整页);③ 唯一可动的是 `s_copy_buf`:分块 512 B(−1,536 B,代价是 4 次 CPU 轮询)或内部搬页 copy-back(−2,048 B,须实证手册"奇偶属性相同"限制、并先给主机侧假芯片补 internal-data-move 语义);④ **省下来也没用**:三块都在 `RW_IRAM1`(余 55,808 B),红线是 `RW_CCM`(余 7,904 B),做满也不减红线,搬进 CCM 反而吃掉其 78% → 暂缓不变、重开仍按 §5.3 三条条件。顺带订正 `nand_ftl.c:405` 一句错注释(原写 `s_page_buf` "仅装 132 B 走轮询",实际按整页 2,048 B 编程、同样走 DMA,会误导 P1-5② 迁 CCM)。**仅注释 + 文档,镜像零变化**(`@build` 0 错 0 警告,Code/RO/RW/ZI 逐项不变) |
@@ -690,7 +690,7 @@ USER CODE 区内只留「读 RCC_CSR → 写 RMVF 清除」两句、顺序约束
| §5.5 前三条(92% 门禁 / 趋势基线 / 预算台账,登记簿 N-27 前半) | `../内存管理/RAM预算台账.md`(阈值与配额的**唯一权威**)+ `scripts/ram_baseline.py`(`--gate/--update/--trend/--write`)+ `../代码规范/pre-commit使用说明.md`(`mem-budget`) |
| **F-4 判定不做 / F-6 已落地(2026-10-22,登记簿 N-28)** | 实测复核与"为什么关不掉"记在本报告 §5.4;`LV_DRAW_SW_COMPLEX` 必须为 1 的约束本身在 `../UI设计/UI_设计架构.md` §1.4 第 7 条与 `../UI设计/UI_界面制作流程.md` 陷阱表;宏改动与等价性论证在 `App/algo/prot_set.h` 的 Q10 注释;MicroLIB `snprintf` 拖入 `_fp_digits` 的取证方法(在 `.map` 的 Section Cross References 区反查 `refers to mf_w.l(d*.o)`)见 §5.4 F-6 行 |
| F-1 / F-2 / F-3(LVGL 死代码裁剪) | `../内存管理/RAM使用分析与优化方案.md` §2.6.4;`../UI设计/UI_设计架构.md` §1.4 第 10 条(**两份 `lv_conf.h` 必须同一特性子集**);`../UI设计/UI_自动化测试流程.md` 变更记录(池水位基线) |
| **R-9(`LV_MEM_SIZE` 40→16 KB,登记簿 N-27 原 W3 的第一步,2026-10-15 已执行;该簇其余部分同日整簇暂缓)** | 取值依据与再降 8 KB 的前置写在 `Lib/lv_conf.h` 与 `simulator/lv_conf.h` 的池注释;实测水位 → `../内存管理/RAM使用分析与优化方案.md` §2.6.2 与 §阶段 1.1(已执行);解锁链第 ① 步 ✅(后续步骤暂缓)→ `../内存管理/RAM预算台账.md` §3;池容量口径 → `../UI设计/UI_设计架构.md` §1.2、`../UI设计/UI_界面制作流程.md` C4 |
| **R-9(`LV_MEM_SIZE` 40→16 KB,登记簿 N-27 原「预算与内存」的第一步,2026-10-15 已执行;该簇其余部分同日整簇暂缓)** | 取值依据与再降 8 KB 的前置写在 `Lib/lv_conf.h` 与 `simulator/lv_conf.h` 的池注释;实测水位 → `../内存管理/RAM使用分析与优化方案.md` §2.6.2 与 §阶段 1.1(已执行);解锁链第 ① 步 ✅(后续步骤暂缓)→ `../内存管理/RAM预算台账.md` §3;池容量口径 → `../UI设计/UI_设计架构.md` §1.2、`../UI设计/UI_界面制作流程.md` C4 |
| **N-12 / N-13**(dhara 移植层 `is_free` 精度 + HAL 越界守卫,登记簿 **N-21**,2026-10-15 已销项) | `../架构设计/STM32F4-Base存储架构说明.md` §5.3(移植层两条硬约束:整页精确的原因链 + 错误码取舍与"为什么不会静默清卷")+ `Drivers/BSP/GD5F2GQ5UE/nand_ftl.c` 的 `ftl_page_in_range` / `ftl_block_in_range` / `dhara_nand_is_free` 注释 + 主机侧单测 `test/host/nand_port/`(含"旧算法只看页首 64 B"的对照用例,防止将来被改回去) |
| **N-16**(日志读写放大,登记簿 **N-24**,2026-10-15 已销项) | `../子系统设计/运行与自检记录设计说明.md` §4.4(写侧批量合并 + **掉电语义不变**的论证 + 失败回投不丢条目 + 容量轮转只在慢路径)与 §4.5(读侧 8 条窗口 + 写者代数失效 + API 不变)+ `App/log/sys_log_mcu.c` 的 `s_format_rec` / `s_append_rec` / `s_append_many` / `s_read_raw` 注释 |
| **§4.8 两处空白(①无覆盖率口径 ②无 `malloc(` 正则)+ §5.5 第 5 条整条(2026-10-23 全部销项)** | `../测试说明/主机单测覆盖率口径.md`(口径 / 工具链实测 / 统计面 / 门禁姿态 / **九条限制与盲区** / 未挂钩子的三条理由与待粘 YAML)+ `scripts/check_test_coverage.py`(`--list` / `--module` / `--update-baseline` / `--md` / `--json`)+ 基线台账 `scripts/test_coverage_baseline.json`(首登 2552/2893 行、未触及 125 文件)。
+7 -7
View File
@@ -627,22 +627,22 @@
{
"name": "WAVE",
"class": "W",
"title": "波次(§4.1 在册保留;裸形 W<n> 合法)",
"title": "波次(§4.1 **2026-10-25 废止**,改语义名;存量仅作历史指称)",
"pattern": "\\bW[0-9]+\\b",
"owner_docs": [
"docs/任务规划/README.md"
],
"scope": "global",
"frozen": false,
"frozen": true,
"cursor": "W8",
"cursor_owner_only": true,
"check_dangling": true,
"check_dangling": false,
"dangling_outside_owner": "warn",
"allow_missing_defs": [
"W8",
"W0"
],
"cursor_note": "游标 W8(§4.1);W2 已清空销项但槽位保留不复用(README §2.0 注)",
"cursor_note": "2026-10-25 用户裁定废止:波次号看着像执行顺序,实际 W8 排在 W3/W4 之前,读者必须先查表 → 改语义名(采集保护收尾 / 数据可信 / 预算与内存 / 结构债 / 验证常态 / UI 扩展 / 仓库决策),执行序 = README §2.0 表序。属主文档已不再定义任何 W 号,故 check_dangling 关闭;游标冻结 W8,存量引用仅作历史指称",
"adjacent_cues": [
"波次",
"规划"
@@ -710,7 +710,7 @@
{
"name": "C-WAVE",
"class": "C",
"title": "结构债排期条目 C1~C6(§4.2 目标 → WI;存量冻结)",
"title": "结构债排期条目 C1~C6(§4.1 **2026-10-25 废止**,改语义名;存量仅作历史指称)",
"pattern": "\\bC[1-9]\\b",
"owner_docs": [
"docs/任务规划/README.md",
@@ -722,7 +722,7 @@
"cursor_owner_only": true,
"check_dangling": false,
"dangling_outside_owner": "warn",
"cursor_note": "与元器件位号 C1~Cn、UI 约束清单 C5~C9 同形(§4.4)→ 只在属主登记处文档内判定",
"cursor_note": "2026-10-25 废止:与元器件位号 C1~Cn、UI 约束清单 C5~C9 同字母不同义(§4.4),属主文档已不再定义 C 号 → 条目改语义名",
"adjacent_cues": [
"结构债",
"波次"
@@ -732,7 +732,7 @@
{
"name": "D-WAVE",
"class": "D",
"title": "验证窗口排期条目 D2~D7(§4.2 目标 → WI;存量冻结)",
"title": "验证窗口排期条目 D2~D7(§4.1 **2026-10-25 废止**,改语义名;存量仅作历史指称)",
"pattern": "\\bD[1-9]\\b",
"owner_docs": [
"docs/任务规划/README.md",