docs: 合并 4 份待办文档为统一登记簿 待处理内容.md

合并 docs/待处理内容.md(N/S/T-x)、审查记录/项目审计改进清单.md(P-x)、
审查记录/下一步任务规划.md(阶段与基线)、审查记录/测试与架构改进建议.md
(S1x/A-x)为单一《待处理内容(统一待办登记簿)》。

- 结构:编号空间与来源 / 未闭环一览 / 任务排序(阶段 A~D)/
  逐条详述 / 待验证与待确认 / 设计基线 / 诊断基线 / 内存预算 / 维护约定。
- 编号沿用且不回收;E-xx 仍由 错误码传播审计.md 独立维护。
- 删除 3 份被合并文档;重定向下游引用:README、AGENTS、审查报告、
  实机测试实施指南、Net 层架构、NET/cfg 模块 README、脚本注释。
- 同步订正计数:P1=2(+1 收尾) / P2=10 / P3=6。

pre-commit 17/17 Passed。
This commit is contained in:
2026-10-04 02:28:52 +08:00
parent 7f393956cc
commit f4fea70749
17 changed files with 420 additions and 481 deletions
+2 -5
View File
@@ -11,7 +11,7 @@
```
docs/
├── README.md 本索引(阅读顺序 + 全量清单)
├── 待处理内容.md 跨文档待办登记簿(高频入口,保留在顶层)
├── 待处理内容.md 统一待办登记簿(高频入口,保留在顶层)
├── 架构设计/ 全局架构与设计方法论
├── 子系统设计/ 各功能子系统的设计说明
├── 网络/ BSD Socket API 使用与内部实现
@@ -185,9 +185,6 @@ docs/
| 文档 | 内容 |
|---|---|
| [`项目审查与优化建议报告.md`](审查记录/项目审查与优化建议报告.md) | 项目全景审查:文档/代码/架构/可靠性问题清单(D-1~D-7、N-xx、Px-xx) |
| [`项目审计改进清单.md`](审查记录/项目审计改进清单.md) | 审计待办清单(P0~P3,带状态与日期) |
| [`下一步任务规划.md`](审查记录/下一步任务规划.md) | **下一步任务排序(阶段 A/B/C/D)+ 诊断基线**——只保留待办,完成即删;每轮迭代后更新 |
| [`测试与架构改进建议.md`](审查记录/测试与架构改进建议.md) | **测试充分性 + 架构改进专项待办**——只保留未闭环项(S12 断言宏、S1-c 可选单测、A-4 采集链路测试约束、A-5 残余 CI 体积门禁);已落地条目证据见各模块文档 |
### 8.2 环境与部署
@@ -199,7 +196,7 @@ docs/
| 位置 | 内容 |
|---|---|
| [`待处理内容.md`](待处理内容.md) | **跨文档待办登记簿**(台架/审计发现、暂不在修复范围的事项) |
| [`待处理内容.md`](待处理内容.md) | **统一待办登记簿**——审计缺陷(P-x)+ 台架/审计观察(N/S/T-x)+ 测试与架构专项(S1x/A-x)+ 任务排序(阶段 A/B/C/D)+ 诊断基线;只保留未闭环项,完成即删 |
| `硬件平台/` | 网表详细分析报告与语义图(V0.0 / V0.1) |
| `芯片手册/` | 外部芯片数据手册转录(CH395F / GD5F2GQ5UE / SD2506 / TPAFE5160 / RTL8305NBI 等) |
| `images/` | 文档技术配图(`.svg` 产物,由 `tools/arch_diagram/`、`tools/refgraph/` 生成) |
@@ -18,7 +18,7 @@
- F407 另有 **64KB CCM RAM**:**已于 2026-09-21 启用**并把 FreeRTOS 堆迁入(§1.2)
- 起步时没有任何运行时测量手段:不知道每个任务实际用了多少栈,改栈全靠拍脑袋
当前状态(**以 §2.1 受管快照为准**,由 `.map` 自动生成):RW_IRAM1 **84,960 / 131,072 B(64.8%)**、RW_CCM **49,184 / 65,280 B(75.3%)**。⚠️ **任务栈:2026-10-04 重采(产品构建 V5 30 min 负载)显示 `defaultTask` 峰值升至 3664B/4096(余量 432B ≈ 10%,已低于 30% 判据)**,详见 §2.3 注与 `../审查记录/下一步任务规划.md` §4(登记 `待处理内容.md` S-1)。
当前状态(**以 §2.1 受管快照为准**,由 `.map` 自动生成):RW_IRAM1 **84,960 / 131,072 B(64.8%)**、RW_CCM **49,184 / 65,280 B(75.3%)**。⚠️ **任务栈:2026-10-04 重采(产品构建 V5 30 min 负载)显示 `defaultTask` 峰值升至 3664B/4096(余量 432B ≈ 10%,已低于 30% 判据)**,详见 §2.3 注与 `../待处理内容.md` §6(登记 `待处理内容.md` S-1)。
本方案三个目标:
@@ -9,7 +9,7 @@
> **日期**:2026-09-29(2026-10-03 台架验收)
> **相关文档**:
> [`../审查记录/项目审查与优化建议报告.md`](../审查记录/项目审查与优化建议报告.md)(N-03 缺陷原始登记)、
> [`../审查记录/下一步任务规划.md`](../审查记录/下一步任务规划.md)(排期)、
> [`../待处理内容.md`](../待处理内容.md)(排期)、
> [`运行与自检记录设计说明.md`](运行与自检记录设计说明.md)(§5.3 上电/重启分类)、
> [`../架构设计/项目启动顺序管理.md`](../架构设计/项目启动顺序管理.md)(就此绪屏障)、
> [`../测试说明/ST-LINK_CLI_复位使用说明.md`](../测试说明/ST-LINK_CLI_复位使用说明.md)(复位语义)
-163
View File
@@ -1,163 +0,0 @@
# 下一步任务规划(2026-10-04)
> **用途**:给出**明确、可执行、有优先级**的下一步任务清单。
> **上游**:`docs/审查记录/项目审计改进清单.md`(审计待办全量)+ `docs/问题记录/错误码传播审计.md`
> + `docs/待处理内容.md`(登记簿)。**本文件不重复登记明细**——每项只给「做什么 / 为什么现在 /
> 入口在哪 / 完成判据」,细则一律指向上游文档对应条目,避免三处维护。
>
> **只保留待办**:**已完成项直接删除,不留变更记录**(历史见 `git log` 与各模块文档)。
---
## 1. 未闭环事项一览(按严重度)
| 级别 | 数量 | 关键项 |
|---|---|---|
| **P0** | 0 | — |
| **P1** | 2 | **P1-1 ADC 采样路径产品构建中死亡**;**P1-7 MAC 写入顺序**(待 CH395F 手册 §9.2.1) |
| **P2** | 见上游 | 以 `项目审计改进清单.md` P2 表 + `错误码传播审计.md` §3 为准 |
| **P3** | 11 | 卫生项,可顺手处理(P3-1~13,见上游清单) |
| 登记簿 | 10 | 网络:N-2(49s 日志静默,**低风险观察项**)、N-3(L5 基线重验)、N-4(pending 二期)、N-16(A2/A4 专项负向验证)、N-17(探针窗口心跳缺口);存储/日志:**S-1(defaultTask 栈余量 10%,需尽快处理)**、S-2(boot_log 存档)、S-3(USART1 TX-only 根治)、S-4(dhara 重试自旋)、S-5(可选全序列卷锁) |
### 1.1 结构性判断(排序依据)
1. **网络层已是全项目最成熟子系统**(pending 机制 + 四份 Trap 记录 + 量化基线 + 探针族)。
剩余网络工作都是"二期扩展/收口",**没有紧急项**。
2. **真正的产品功能缺口在 ADC 与 RS-485 采集链路**:`adc_task`/`rs485_task` 均为空桩,
DTU 的核心职责(数据采集与转发)**尚未实现**。这既是 P1-1 的根源,也是 E-59 那条
"休眠缺陷闸门"的另一面——不是缺陷难修,而是**功能没接**。
3. **验证债已基本还清,重心是"功能债" + 一项栈风险**:剩余验证债仅 **N-3(L5 基线重锁,
待 PC peer)** 与 **S-1(defaultTask 栈余量已跌至 10%,见 §4)**。
**当前最值得投入的是阶段 B(ADC/RS485 功能)**。
---
## 2. 下一步任务规划
排序原则:**先降风险(产品级故障)→ 再补功能(核心链路)→ 再清结构债 → 最后卫生**。
### 阶段 A 残余:立即执行(改动小、风险高)
| 序 | 任务 | 为什么现在 | 入口 | 完成判据 |
|---|---|---|---|---|
| **A5** | **P1-7 MAC 写入顺序** | 先确认 CH395F 手册 §9.2.1(INIT 是否锁存 MAC)再改;若锁存则 UI 配置 MAC 不生效、设备在线身份错误 | `Drivers/BSP/NET/net_socket.c` `net_init()` | 依手册结论调整顺序或文档化"无需调整" |
### 阶段 B:核心功能补齐(产品价值最高,需产品定义确认)
> 目标:让 DTU 真正采到数——这是当前**最大的功能空洞**,**当前最高优先级**。
> 一旦 B0 产品定义明确,即可与 B3(纪律门禁)并行启动。
| 序 | 任务 | 前置 | 说明 |
|---|---|---|---|
| **B0** | **产品定义确认**(阻塞项) | — | 需甲方明确:① 采集是否持续 ② 采样率/通道 ③ 转发目标(MODBUS RTU?上行 TCP?)④ `APP_ADC_ENABLE`/`APP_RS485_ENABLE` 语义。**B1/B2 的规模完全取决于此** |
| **B1** | **ADC 采集链路实现**(消化 P1-1、E-58) | B0 + **E-59 门禁** | 周期 CONVST 重触发 + `adc_task` 消费 `get_buf`;**先修 E-58**(原子快照 API,否则接入即撕裂);栈预算核算(两任务未入 `freertos.c` 栈表) |
| **B2** | **RS-485 采集链路实现**(消化 E-50、E-49) | B0 + **E-59 门禁** | 双缓冲 + 序号(防包撕裂)+ DE 收尾(超时路径等 TC)+ 协议状态机(`App/protocol/` 正是为此预留) |
| **B3** | **E-59 门禁固化入 `AGENTS.md`** | — | 把"接消费者前必须先修 E-36/E-44/E-45/E-58 + 栈预算"写成强制门禁,与"改栈前跑 `stack_report.py`"同级。**这是防止 B1/B2 带缺陷上线的关键** |
**建议**:B3 与 B0 并行推进(前者是纪律,后者问甲方);**E-58 修复应在 B1 动消费者之前完成**。
### 阶段 C:结构债清理(二期)+ 存储侧健壮性
| 序 | 任务 | 说明 | 出处 |
|---|---|---|---|
| **C1** | **pending 二期(ACCEPT + SEND)** | 沿一期机制扩展;同期消化 E-25(net_select 语义)、E-24/E-27/E-28(跨上下文收口);基线重锁 + 探针族扩充 + 看门狗接 selftest。**设计基线见下方 §3.1** | 第二档 #2 / N-4 |
| **C3** | **存储侧日志管线**(消化 N-2) | 丢弃可观测性**代码已具备**(`console_log.c` `s_con_drop`+`[ERR] CONSOLE dropped`、`sys_log_mcu.c` 队列满 `DBG_ERROR`、TX 僵尸通道自愈);V5 30 min 日志**未复现 49s 静默**(运行期 >10s 静默全为 ~28s、均在 `e02_probe` 窗口内=N-17)。剩余:与 S8(非阻塞日志)合并评估 + **S-3(USART1 TX-only 结构根治)** | N-2 / S-3 |
| **C4** ⚠️ | **defaultTask 栈余量**(S-1,**需尽快处理**) | **2026-10-04 实测 3664/4096(余量 432 B ≈ 10%,远低于 30% 判据)**。处置:栈 4096→4608(CCM 堆余量可覆盖 +512B)或 GC 链局部削减;**建议随阶段 B 之前先做** | S-1 |
| **C5** | 一档剩余 + P2 收口 | E-49(RS485 DE 收尾)、E-15(ringbuf 定去留——**已确认零调用者,倾向删除**)、E-61(SD2506 注释订正)、E-16(cfg_file 段名长度)、E-26(UDP 定案,倾向移除)、E-23、E-30 | 一档/二档 |
| **C6** | **USART1 TX-only 结构根治**(S-3) | 灭 ORE 僵尸机制根源:改 `.ioc` 令 USART1 不使能 RX / PA10 不复用为 `USART1_RX` → CubeMX 重生成 → 跑 `check_cubemx_survival.py`。属结构性改动,需单开一轮 + 复跑台架闭环 | S-3 |
### 阶段 D:验证与卫生(常态化)
| 序 | 任务 | 说明 |
|---|---|---|
| **D2** | N-3 L5 基线重锁 | 下次 Phase 13 窗口顺带做(低风险:阈值余量 >8×;**需 PC peer**) |
| **D3** | S-2 boot_log 快照存档流程 | 固化 `%TEMP%\opencode\boot_log_*.txt` 进 `docs/测试说明/` 存档目录 |
| **D4** | P3 卫生项 | P3-1~8/11/12/13(含 E-13 `test_parse_ip` 门控析取、P3-3 死代码 `app_main_run`)顺手清理 |
| **D5** | **N-16 专项负向台架窗口** | A2/A4 负向场景:PHY 拔线(需断 DTU 侧/关受管交换机端口)、A2 芯片级 `net_init` 失败(SPI 故障注入)、A4 短写压测 |
| **D6** | **N-17 探针窗口心跳缺口** | 定位 `time_sync` 监听重建为何阻塞 NET/FTP/UI(~1s 缺口,余量仅 ~0.7s);评估缩短重建重试或让掉线路径不阻塞其它任务 |
---
## 3. 建议执行顺序(一图)
```
【阶段 A 残余】 A5 P1-7(待 CH395F 手册 §9.2.1)
↓
【阶段 B 功能】 B0 产品定义确认 ─┬─ B3 E-59 门禁固化(并行)
(当前最高优先) └─ E-58 原子快照 → B1 ADC → B2 RS485
↓
【阶段 C 结构】 C1 pending 二期 ─ C3 日志管线(N-2/S-3) ─ C4 栈(S-1)
─ C5 收口 ─ C6 USART1 TX-only
↓
【阶段 D 常态】 D2 N-3 / D3 boot_log / D4 P3 / D5 N-16 负向 / D6 N-17 探针窗口
```
---
## 3.1 C1 设计基线(pending 二期:ACCEPT + SEND)
> **来源**:一期(RECV)架构现状见 `docs/网络/Net层阻塞模型架构设计.md`(含演进溯源附录);
> 本节仅保留**二期仍要用的设计基线**。
**一期已验证的机制骨架**(二期沿用,勿重新发明):独立静态 pending 表 + `net_pending_tick`
主循环节拍了结(五路:数据/到点/断连/同 fd 串行/重建取消必通知)+ 登记守卫(每 fd 至多一个、
不覆盖、拒绝 netTask 自等待)+ 1s 看门狗强结算。
**二期扩展点**:
| 项 | 目标 | 对应缺陷 |
|---|---|---|
| **ACCEPT pending** | accept 等待改为"登记 → CONNECT 事件完成",退役 100ms/200ms 轮询循环 | E-06(accept 轮询计时失真) |
| **SEND pending** | 发送续传改为"登记 → send_ready 完成",消除 1s/分片 stall 对队列的冻结 | E-02 残余(SEND 位置) |
**二期门禁**(一期门禁的加强版):
1. CH395F NET 层全套件(含一期未跑的 Phase 7 / Phase 10,视 RAM 预算);
2. L3/L5 基线重锁(一期已重锁 M3,二期须再锁);
3. `e02_probe.py` **探针族扩充**:close / reconfig / EOF / disconnect-during-pending 四专项;
4. `ftp_regression.py`(D20)+ E-06 假 425 场景**独立重跑**(一期是借 M3 压力档覆盖的);
5. UI 远端推流压力 + timeSync 三场景;
6. 产品 `@test` 闭环 + ST-LINK 全片回读;
7. `ram_report.py` / `stack_report.py` 前后对比(铁律);
8. 看门狗接 selftest 留痕 + 模拟器差距清单 +1(`net_socket_sim.c` 无法建模 pending)。
**已知代价(延续一期,需文档化)**:pending 完成判定随主循环节拍运行,被长操作占用时超时
顺延(~1ms 级);二期把 SEND 也 pending 化后,该顺延面反而**收窄**。
**改动量估算**:再 ~300-500 行,集中在 `net_socket.c`;公开 API 不变。风险评级**中**
(执行器核心 + D 系列前科)——**大的是验证,不是代码**。
---
## 4. 诊断基线(供后续对照)
> **2026-10-04 重采**:栈/堆 = **运行时高水位**(产品构建 `suite=NONE`,V5 30 min 真实负载,串口 `[STACK]`,
> 证据 `/tmp/v5_soak_serial_20261003.log`);静态区 = `.map` 受管快照。
> ⚠️ **栈水位较 2026-09-21 基线明显上升**(defaultTask 2136→**3664 B**、ftpTask 1184→**2516 B**),
> 系功能与加固陆续入链所致。**S-1 需尽快处理**,见 §2 C4。
| 项 | 当前值(2026-10-04) | 出处 |
|---|---|---|
| 产品构建 Flash (ER_IROM1) | 265,940 B / 1024 KB(25.4%);ROM 合计 **266,676 B** | `.map` 受管快照 |
| 产品构建 RW_IRAM1 | **84,960 / 131,072 B(64.8%)** | `.map` 受管快照(`RAM使用分析与优化方案.md` §2.1) |
| 产品构建 RW_CCM | 49,184 / 65,280 B(75.3%) | 同上 |
| 实测堆 | free=8,664 / **min_ever=4,728 B** | V5 串口 `[STACK] heap` |
| **defaultTask 栈峰值** | **3664 / 4096(余量 432 B ≈ 10%,⚠️ 低于 30% 判据)** | V5 串口 `[STACK]`(产品构建) |
| netTask 栈峰值 | 1228 / 4096(余量 70%) | 同上 |
| ftpTask 栈峰值 | 2516 / 4096(余量 38%) | 同上 |
| uiTask 栈峰值 | 4060 / 16384(余量 75%) | 同上 |
| timeSyncTask 栈峰值 | 792 / 2048(余量 61%) | 同上 |
| testTask 栈峰值(产品态空转) | 496 / 8192(余量 93%) | 同上 |
| 队列响应性(挂起客户端) | 92.5ms(pending 一期) | `e02_probe.py` |
| M3 压力档帧周期 | med 60.1 / p95 66.4 / max 69.3ms,零尖峰 | `链路延迟测试说明.md` |
---
## 5. 维护约定
- 本文件**只保留待办**——它是"盘点 + 排序",明细以 `项目审计改进清单.md` / `错误码传播审计.md` /
`待处理内容.md` 为权威。
- **任一项完成后直接删除**(先销上游登记,再删本文件对应条目);**不留变更记录**,历史见
`git log` 与各模块文档。
- 阶段 B 完成后重写 §1(届时 ADC/RS485 应从未闭环消失)。
- 新增发现按既有惯例:能立即修的进阶段 A/C5;需排期的进上游三文档;跨版本观察的进 `待处理内容.md`。
@@ -1,126 +0,0 @@
# 测试体系与架构改进建议(待办)
> **用途**:记录**尚未落地**的测试充分性与架构层面改进项,与 `下一步任务规划.md` 的分阶段
> 任务互补(后者管排序,本文件管**测试充分性 / 架构**这一专项的剩余项)。
> **上游**:`项目审查与优化建议报告.md`(P0~P3 全量池)、`项目审计改进清单.md`(待办)、
> `错误码传播审计.md`(E-xx)、`待处理内容.md`(登记簿)、`下一步任务规划.md`(排序)。
>
> **只保留待办**:**已完成条目直接删除,不留变更记录**(历史见 `git log`)。
> 已完成事项的**证据与结论沉淀在模块文档**,本文件不再重复——对应关系:
> `测试说明/系统时钟单元测试说明.md`(S1-a)、`测试说明/配置文件单元测试说明.md`(S1-b)、
> `测试说明/测试开发标准流程.md` §4.2.1(L0.5 适格台账)、`测试说明/模拟器差距清单.md`(S13)、
> `测试说明/实机测试实施指南.md`(S4/S5/S7/S9/S11)、`问题记录/GD5F2GQ5UE_Trap_Records.md`(S9)。
>
> **编号约定**:**S1~S14 / T-1~T-5 / A-1~A-7** 是 2026-10-02 版复审的**条目编号**——
> 编号**不随条目删除而回收**;其他文档若引用这些编号,其证据见上列模块文档与 `git log`。
---
## 1. 未闭环一览
| 编号 | 事项 | 状态 | 详述 |
|---|---|---|---|
| **S12** | 模块级轻量断言宏 | ⬜ 待做(第 4 波按需) | §2.1 |
| **S1-c** | `sys_log` / `time_sync` 主机侧单测 | ⬜ 可选(价值递减) | §2.2 |
| **A-4** | ADC / RS485 采集链路的**测试可验证性约束** | ⏸ 待 B1/B2 落地时执行 | §2.3 |
| **A-5 残余** | CI 体积门禁盲区(`mem-numbers` 在 CI 被跳过) | ⬜ 未消除 | §2.4 |
---
## 2. 待办详述
### 2.1 S12:模块级轻量断言宏 ⬜
**动机**:`configASSERT` 只覆盖 FreeRTOS 内部;自研代码的"不该发生"靠散落的 `if`。
**设计要点**(**必须零生产开销**):
```c
/* App/util/app_assert.h —— 示意,非最终实现 */
#ifdef APP_ASSERT_ENABLE
#define APP_ASSERT(cond) do { if (!(cond)) { \
DBG_ERROR("[ASSERT] %s:%d", __FILE__, __LINE__); vApplicationAssertFailed(__FILE__, __LINE__); } \
} while (0)
#else
#define APP_ASSERT(cond) ((void)0) /* 生产构建:编译期消失,零符号零开销 */
#endif
```
**⚠️ 关键纪律**:
- **不得**在中断 / 高频路径使用(`DBG_ERROR` 有代价);
- **不得**替代正常的错误返回(断言是"内部不变量",不是"外部输入校验");
- 生产构建 `APP_ASSERT_ENABLE` **关闭**——与 `ENABLE_DESTRUCTIVE_TESTS` 同级策略。
**建议先在 1~2 处试点**(如 `net_socket.c` 的状态机不变量),验证收益后再推广。
**完成判据**:宏存在 + 生产构建 `@build` 0/0 且 `.map` 无新增符号;试点处有实际使用。
### 2.2 S1-c(可选):`sys_log` / `time_sync` 主机侧单测 ⬜
**范围**:`App/log/sys_log_mcu.c`(定长 64B 记录编解码;落盘部分需桩)、
`App/sync/time_sync.c`(协议帧编解码;与网络耦合,需先判定可解耦面)。
**为何低优先**:两者边界密度低于 `sys_clock` / `cfg_file`,且已有真机路径覆盖
(`@test` 标记 / `time_sync_server.py`)。**按剩余收益评估后再决定是否做**,
范式完全复用 `看门狗单元测试说明.md`。
**完成判据**:`test/host/<模块>/run_unit_test.py` 退出码 0 + 挂 pre-commit 钩子。
### 2.3 A-4:ADC / RS485 采集链路的测试可验证性约束 ⏸
**背景**:`adc_task.c` / `rs485_task.c` 仍是空桩,`App/protocol/` 只有 README 与 `.gitkeep`。
本项不是"缺陷",而是**对上游 B1 / B2 的设计约束**——应在动手前明确,否则后续无法补测。
**约束**(建议纳入 B1 / B2 设计):
1. **协议解析必须与硬件 I/O 分离**——`App/protocol/` 的解析函数应接受
`(const uint8_t *buf, size_t len)` 并返回解析结果,使其成为 L0.5 的**天然适格对象**
(参考 `cfg_file` 的"核心 + 后端"模式);
2. **采集缓冲必须双缓冲 + 序号**(上游 E-49 / E-50)——否则消费者读到撕裂数据,
且**撕裂在单测里测不出来**(时序相关),必须在设计上消除;
3. **DE 收尾必须有超时路径覆盖**(RS485 半双工特有陷阱)。
**完成判据**:B1 / B2 设计文档体现上述三条;协议解析函数有对应 L0.5 单测。
### 2.4 A-5 残余:CI 体积门禁盲区 ⬜
**现状**:`mem-numbers` 钩子**在 CI 上被跳过**(CI 无 `.map`)→ **CI 不守体积门禁**。
S14 已在 workflow 显式提示"体积门禁未执行"(`::notice::`)并在 `CI配置指南.md` 声明,
但**盲区本身未消除**——看到 CI 全绿仍可能误以为体积也守住了。
**可选处置**:
- 让 runner 具备 Keil 后,在 CI 增 `@build` job(成本高,需授权与许可证);
- 或把"体积校验"固化为**提交前必跑的本地门禁**(`scripts/ci_local.py`,当前已是事实标准)。
**完成判据**:存在**强制的**体积校验路径(CI 侧或本地侧),且文档明确其边界。
> **注**:本项与上游 `下一步任务规划.md` §2 C4(**S-1:defaultTask 栈 3664/4096 ≈ 10%**,
> 需尽快处理)是同一话题的两面——S-1 是**具体风险**,本项是**门禁缺口**。
---
## 3. 沿用基线(供后续接入参考)
### 3.1 错误码通道四要素(CH395F 范式)
> **来源**:`错误码传播审计.md`。GD5F 错误通道统一(E-10 / E-42 / E-53 / E-54 / E-56 / E-57)
> 即按此骨架落地(2026-10-03,套件回归 16/16 PASS)。**后续任何驱动 / 子系统建立错误通道时应沿用。**
```
① 分类:区分「超时 / 真故障 / 参数错」——不得混为一个返回码
② 透传:底层错误码逐层上报,不吞不猜(禁 `(void)ret`)
③ 分级:可恢复(重试)/ 不可恢复(上报自检 + 降级)显式判定
④ 留痕:不可恢复项写 syslog selftest,可恢复项计数并在 UI / 日志可见
```
**关键纪律**(呼应 `AGENTS.md` 已有铁律):**自愈逻辑严禁把"名字 / 参数类错误码"
归入"卷损坏触发集"**——`.fschk` 无限重格式化事故即此类(2026-09-20)。
---
## 4. 维护约定
- 本文件**只保留未闭环项**——任一项完成后**直接删除**,**不留变更记录**(历史见 `git log`)。
- 已完成条目的**证据与结论沉淀到模块文档**,本文件不再重复。
- 新增发现按既有惯例分流:能立即做的就地登记;需排期的进 `项目审计改进清单.md` /
`待处理内容.md` / `下一步任务规划.md`。
@@ -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` 正向确认仍待执行。
@@ -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 → 代码,可追溯。
@@ -365,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/host/verify_log.py`(PowerShell 版 `test/verify_log.ps1:34-35` 已删除,2026-09-20 起为纯 Python)的 Forbidden 标记含 `FAIL`,而失败路径会打印 `read: malloc 4097B FAIL` / `template: malloc 5120B FAIL`,因此**一次 `@test` 即可判定**(若近期 `@test` 曾 PASS,需先确认当时是否真的进入了文件读取分支,例如 `/config.ini` 不存在或大小为 0)。**(2026-09-18 已按上述实施;修复后的真机 `@test` 正向确认——`load: OK` 出现且 `FAIL` 零命中——仍待执行。)**
@@ -760,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`。
@@ -1,136 +0,0 @@
# 项目审计改进清单(待办)
- **审计日期**:2026-09-15(**2026-09-18 补充**:《项目审查与优化建议报告》新增 P0-1,当日修复)
- **范围**:全部项目自有代码(App/、Drivers/BSP/、Src/ USER CODE、MDK-ARM/、test/、tools/、scripts/、.opencode/、docs/ 一致性);第三方库(Lib/、Middlewares/、CMSIS/HAL、lftpd 内部、LVGL)仅查项目侧误用
- **方法**:静态逐文件走读 + pre-commit 全库基线(cppcheck/规范/乱码,全绿)+ 三份 trap 文档交叉核对
- **严重度**:P0 = 确认功能 bug | P1 = 疑似 bug 或健壮性风险 | P2 = 改进 | P3 = 卫生
- **置信度**:high = 代码级确证 | medium = 依赖外部条件(手册/硬件/产品定义)
- **删改**:2026-09-21 —— 已完成条目删除,仅保留待办;已修项见文末「已完成(勿重复报)」;各保留条目均于 2026-09-21 对照源码复核现态
- **执行排序**:⚠️ 本清单是**全量池**,不表达优先级顺序;实际"先做哪个"见 [`下一步任务规划.md`](下一步任务规划.md)(阶段 A/B/C/D 排序 + 诊断基线)
## 结论总览
| 级别 | 剩余 | 说明 |
|---|---|---|
| P0 | 0 | P0-1 已修复(2026-09-18),仅剩真机 `@test` 验证(见「待验证」) |
| P1 | 4 | P1-1 ADC / P1-7 MAC 顺序 / P1-8 重建恢复 / P1-10 测试固件构建验证 |
| P2 | 13 | 健壮性/错误传播/文档失真:P2-1/2/3/4/5/7/8/9/10/11/12/13/15 |
| P3 | 11 | 卫生项:P3-1~8/11/12/13,可随其他修改顺手处理 |
**Top 3(建议优先)**:
1. **P1-1 ADC 采样数据路径在产品构建中死亡** —— 上电后仅采 1 次即永久停止,DTU 核心采集路径实际不工作(若产品定义为持续采集,应升 P0)。
2. **P1-8 网络重建失败无恢复** —— 一次 PHY/芯片抖动 → 网络永久不可用,运行日志无任何痕迹,现场无法定位。
3. **P1-10 CH395F 测试固件构建闭环** —— 预算基线已重建、测试缓冲已瘦身(产品镜像余量 4.4KB → ~49KB),剩 7 配置构建实测 + `@test`。
---
## P1
### P1-1 ADC 采样数据路径产品构建中死亡
- **位置**:`App/app/app_main.c:115`(`tpafe5160_start_conv_irq()` 仅启动时调用一次)+ `Drivers/BSP/TPAFE5160/tpafe5160.c`
- **证据**:启动序列调用一次 `tpafe5160_start_conv_irq()`;全仓库无周期性 CONVST 重触发;`data_ready` / `get_buf` 无任何消费者(`adc_task.c` 是空桩)。
- **影响**:上电后仅采集 1 个样本,此后数据永久陈旧;`APP_ADC_ENABLE` 开关又无人引用(见 P2-12),形成"看似启用实则失效"的假象。
- **修复建议**:周期 CONVST 重触发(定时器或任务)+ 数据消费任务;若基线版本有意不实现采集,应删除启动调用并以 `APP_ADC_ENABLE` 真实门控。
- **置信度**:high(代码级确证);P0/P1 定级取决于产品定义(需确认,见"待确认")。
### P1-7 MAC 写入顺序违反 trap 文档
- **位置**:`Drivers/BSP/NET/net_socket.c` `net_init()`:`ch395f_init()` → `ch395f_set_mac_addr()`
- **证据**:`docs/问题记录/CH395F_Trap_Records.md` 规定初始化顺序 SET_MAC → SET_IP → INIT_CH395 → SET_PHY;现码把 MAC 放在 INIT 之后。
- **影响**:若 INIT_CH395 锁存 MAC 寄存器,UI 配置的 MAC 不生效(回落芯片内置),设备在线身份错误、网口排查困难。
- **修复建议**:`set_mac_addr` 移到 `ch395f_init()` 之前;修改前对照 CH395F 手册 §9.2.1 确认 INIT 是否锁存(见"待确认")。
- **置信度**:medium。
### P1-8 网络重建失败无恢复
- **位置**:`App/task/net_task.c`
- **证据**:reconfig 路径 `net_stack_bring_up` 失败后无自检记录、无状态标志、无重试;首启路径失败后 `for(;;) osDelay(1000)` 自驻留,`SYS_EVT_NET_READY` 永不置位。
- **影响**:一次 PHY/芯片抖动 → 网络永久不可用,ftpTask/uiTask 永久阻塞在事件等待,运行日志无任何痕迹,现场无法定位。
- **修复建议**:失败写 syslog 自检记录 + LED 指示 + 周期重试(如 30s 一次),不得自驻留。
- **置信度**:high。
### P1-10 测试固件静态 RAM 预算溢出(基线已重建、测试缓冲已瘦身,剩构建实测闭环)
- **位置**:`MDK-ARM/STM32F407-Demo/STM32F407-Demo.sct`(`RW_IRAM1 0x20000000 0x00020000` = 128KB;芯片 192KB 的上部 64KB 有意未映射,克隆芯片兼容性考量)
- **历史**(2026-09-15 审计 / 09-16 复现):产品构建静态镜像曾 = 123.6KB/128KB(余量仅 4.4KB);HW 全阶段固件的 PHASE5 三缓冲(3×4093B)→ 超 8.7KB(`L6406E` 实测);NET 固件的 32KB `s_rx_buf` → 超约 28KB;`docs/内存管理/` 旧表数字与实际失真。
- **进展**(2026-09-21,已复核):① 预算基线重建(`docs/内存管理/RAM使用分析与优化方案.md` v1.2):FreeRTOS 堆迁 CCM(RW_CCM 49,184/65,536 B),任务栈(合计 38,912B)改由 CCM 堆分配、不再占主 SRAM;产品构建 RW_IRAM1 = **82,048/131,072 B(62.6%,余 ~49KB)**;② NET 层测试 32KB `s_rx_buf`/`s_tx_buf` 已移除,改小局部缓冲(`rx_buf[300]`/`rx_buf[64]`);③ STORAGE 套件固件 2026-09-20/21 实测可构建可运行(含 deep call chain、破坏性 GD5F 运行)。
- **剩余**:① CH395F 套件(`TEST_SUITE_CH395F`,HW 全阶段 / NET 层 7 配置)实际构建确认链接通过——PHASE5 三静态缓冲 3×4093B 仍在,理论余量足够但未实测;② `@test` 闭环;③ **不建议**扩 scatter 到 192KB(破坏既有克隆芯片兼容决策)。
- **置信度**:high(基线数据来自 2026-09-21 map;测试固件构建未复验)。
---
## P2
| # | 位置 | 问题 | 修复建议 | 置信度 |
|---|---|---|---|---|
| P2-1 | `App/cfg/cfg_file.c` | 受管键行 >127 字符时外科保存产生重复键行(值静默截断,旧行残留;Pass1 匹配仍受 `CFG_LINE_TEST_MAX=127` 限制) | 行长超限时拒绝保存并报错,或整卷重写 | high |
| P2-2 | `Drivers/BSP/CH395F/ch395f.c` | `ch395f_spi_dma_transfer` 为 void:DMA 超时/abort 后不向调用方传播错误(调用方当成功继续 → 静默数据损坏) | 超时路径置错误标志并经返回值/查询接口上报 | high |
| P2-3 | `Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c` `gd5f_bbt_save` | 丢弃 program_load/program_exec/wait_busy 返回值:编程失败仍推进 BBT 版本号并报成功 | 检查返回值,失败不推进版本 | high |
| P2-4 | `Drivers/BSP/GD5F2GQ5UE/nand_ftl.c` `dhara_nand_read` | 忽略 `gd5f_read_from_cache` 返回值(DMA 超时 → 返回成功 + 垃圾数据) | 检查返回值并向上报错 | high |
| P2-5 | `Drivers/BSP/SD2506/sd2506.c` | 负温度解码 `(int8_t)(val \| 0xF0)` → 所有负温读成错误值(符号-绝对值编码未取补码) | `-(int8_t)(val & 0x7F)` | high |
| P2-7 | `Drivers/BSP/NET/net_select.c` `check_socket_readable` | LISTENING 视为恒可读 → 单连接模式下对监听 socket select(readfds) 永久立即返回(当前无调用方,潜在地雷) | LISTENING 仅在写集合/异常集合计数可读,或明确文档化 | high |
| P2-8 | `App/sync/time_sync.c` + `Drivers/BSP/NET/net_config.h` | `NET_RECV_TIMEOUT_MS=30000`;且 `time_sync.c:84` 的 `net_recv` 现传 timeout=0(**无限等待**)——静默对端使同步任务永久卡死 | 同步收包单独用短超时(如 3s),与通用收发超时分离 | high |
| P2-9 | `App/log/sys_log_mcu.c` | 挂载时 mkdir 失败 → `s_fs_ready` 不置位,drain 永久 no-op 无重试(`syslog_mcu_mounted` 仅调用一次) | 周期重试挂载/建目录 | medium |
| P2-10 | `App/log/sys_log_mcu.c` | 容量满 unlink 与 UI 读记录(FA_READ)存在竞态窗口 | unlink 前等待读者释放,或双文件轮转 | medium |
| P2-11 | `App/task/net_task.c` | RECONFIG 事件用 `osEventFlagsGet`+Clear,非原子(检查与清除间可丢事件) | 改 `osEventFlagsWait` 原子获取 | high |
| P2-12 | `App/app/app_cfg.h` | `APP_NET_ENABLE`/`APP_ADC_ENABLE`/`APP_RS485_ENABLE` 全仓库无 .c 引用,纯装饰 | 真实接入模块门控,或从文档/注释中删除"开关"说法 | high |
| P2-13 | `Src/freertos.c:183` | testTask 无条件创建,产品构建空转占 2048 words(8KB,CCM 堆,2026-09-21 口径) | 按 `test_config.h` 门控创建 | high |
| P2-15 | `MDK-ARM/download.bat` | 调用 UV4 前不删旧 `download_log.txt`:陈旧 "Application running" 掩盖失败烧录 | 调用前先删旧日志 | high |
---
## P3
| # | 位置 | 问题 |
|---|---|---|
| P3-1 | `App/cfg/cfg_file.c` `s_encode` | STR 型 `len==0` 时 slen 计算回绕 |
| P3-2 | `App/cfg/cfg_file_store_mcu.c` | 临时文件名硬编码 `/config.TMP`,忽略 `p_path` 参数 |
| P3-3 | `App/app/app_main.c` | `app_main_run()` 定义后无任何调用(死代码) |
| P3-4 | `Drivers/BSP/RS485/rs485.c` | 文件头宣称 DWT µs 延时,实际用 `HAL_Delay(1)`(文档不一致) |
| P3-5 | `Drivers/BSP/GD5F2GQ5UE/nand_ftl.c` | 死宏 `FTL_NUM_BLOCKS` |
| P3-6 | `Drivers/BSP/CH395F/ch395f.c` `ch395f_get_socket_status` | `p_status` 无 NULL 检查 |
| P3-7 | `test/test.txt` | 0 字节空文件(删除或补内容) |
| P3-8 | `.opencode/command/build.md` | 退出码契约写 "2+ = 编译错误",`build.bat` 实际只有 0/1 两档(与 AGENTS.md 一致的是后者) |
| P3-11 | `App/task/adc_task.c` / `rs485_task.c` | 空桩无注释说明原因(建议注明"预留,未启用") |
| P3-12 | `App/sync/time_sync.c` | `len >= 8` 严格判定:TIME 包被 TCP 拆两段时拒绝处理(可容忍,增强为累积到 8 字节再判) |
| P3-13 | `test/board/ch395f_test_task.c` `test_parse_ip` | 门控为 `ENABLE_HW_LAYER_TESTS`,实际引用仅在 Phase 2/5 → 单选阶段(如仅 Phase 1)时 `#177-D` 未引用函数告警(门控应改为 `PHASE2/PHASE5` 析取) |
---
## 待验证
- **P0-1**(2026-09-18 修复:cfg_file C 库 `malloc` → `cfg_store_alloc/free/heap_free`,MCU 端 = FreeRTOS 堆,`CFG_HEAP_BUDGET=10,240B` 编译期预算 + 四条失败路径自检):真机 `@test` 一次,确认 `load: OK` 出现且 Forbidden `FAIL` 零命中(双端构建/`--cfgtest` 已绿;模拟器宿主堆照不出真机问题,真机正向确认是最后一道门)。
---
## 待确认(需手册/硬件/产品定义,暂不直接改码)
1. TPAFE5160 是否有自动扫描模式(决定 P1-1 定 P0 还是 P1)。
2. CH395F 手册 §9.2.1:`INIT_CH395` 是否锁存 MAC 寄存器(决定 P1-7 修复紧迫度)。
3. `APP_ADC_ENABLE` / `APP_RS485_ENABLE` 是否应在产品构建真实门控模块(关联 P1-1、P2-12、P3-11)。
4. RS-485 PD0 DE 的半双工方向语义需硬件实测确认(本次仅静态审查)。
## 内存预算(支撑 `待处理内容.md`)
现行权威数据 = `docs/内存管理/RAM使用分析与优化方案.md` v1.2(2026-09-21):任务栈在 CCM 堆(defaultTask 1024w / netTask 1024w / ftpTask 1024w / testTask 2048w / uiTask 4096w / timeSyncTask 512w);产品构建 RW_IRAM1 82,048/131,072 B(62.6%)+ RW_CCM 49,184/65,536 B(75.0%);实测堆 `free=8,784 / min_ever=4,848` B;台账工具 `scripts/ram_report.py` + `scripts/stack_report.py`。本清单旧栈表/旧余量数字作废,勿引用。
## 已完成(勿重复报)
- **P0-1**(2026-09-18):配置引擎堆分配走 `cfg_store_alloc`(MCU=FreeRTOS 堆),`malloc.o` 退出链接,静态区 126,584 → 126,064 B;真机 `@test` 见「待验证」。
- **P1-2**(2026-09-15):墙钟 49.7 天回绕 → 30 天惰性再基准化 + init 失败降级返回 -1(自检复活)+ 哨兵修正。
- **P1-3**(2026-09-15):cfg_file 跨任务竞态 → 引擎属主 = defaultTask,UI 保存跨任务交接(`SYS_EVT_CFG_SAVE`)。
- **P1-4**(2026-09-15):lftpd 写路径 `n <= 0` → -1,零进展超时判致命,ftpTask 不再空转。
- **P1-5**(2026-09-15):defaultTask 2s 周期 `cfg_file_poll`(FTP 改配置免重启重载)。
- **P1-6**(2026-09-15):netTask 基础线程唯一实例 + 硬件层测试入口自挂起守卫(testTask 独占 CH395F)。
- **P1-9**(2026-09-16):测试固件 `s_rx_buf`/`s_tx_buf` 声明前移 + Phase 9 方向门控补全(7 配置编译阶段复验通过)。
- **P2-6**:SD2506 上电后不写 CTR1(按手册确认写禁止默认态、删除无效 0x7B 写;ARST 位实位于 CTR3 D7),所有受保护寄存器写均在 WRTC 窗口内。
- **P2-14**:`build.bat` 调 UV4 前先删旧日志(UV4 未运行 → `BUILD_FAIL: no build log`)+ `error:` 诊断检查 + `0 Error(s), 0 Warning(s)` 成功标记。
- **P2-16**(2026-09-21):AGENTS.md 任务栈表已更新为 `freertos.c` 实际值(1024/1024/1024/2048/4096/512w)。
- **P3-9**(2026-09-21):`FTP_Test_Guide.md` 启动时序改写为事件屏障(含 `osFlagsNoClear` 教训 §8.6),旧 7s 魔法延时表述已删。
- **P3-10**(2026-09-15):`CH395F_Test_Guide.md` 改写为"netTask 自挂起(创建但不运行)",与 P1-6 守卫一致。
## 已核验无问题(勿重复报)
- `App/util/ringbuf.c`、`App/util/crc.c`、`App/task/ui_task.c`:结构正确。
- `Src/main.c` USER CODE:`app_main_init` 在 `osKernelStart` 前调用 ✓;TIM7 时基 ✓;所有外设 IRQ 优先级 ≥5(`configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY`)✓(dma.c 7/9、gpio.c EXTI 6、TIM7 按 CMSIS 配置)。
- `Drivers/BSP/UI/ui_net_sink.c`:代次号重建监听、逐字节失步重同步、`RM_MAX_RX_PAYLOAD` 长度防护齐全。
- FatFS 卷归属:产品构建单卷拥有者 = defaultTask 的 `f_mount` 实例,lftpd 复用不另 mount;`FF_FS_REENTRANT=1` ✓。
- CH395F trap 修复在位:Trap 01(listen 顺序)、Trap 10(xTaskNotify)、Trap 11(单连接 accept)、Trap 20(send 分块 `NET_SEND_CHUNK_MAX`)均核验存在。
- 宿主侧:`test/host/verify_log.py`、`test/host/run_boot_test.py`、`test/host/time_sync_server.py`(伪 epoch 与时区处理注释完备)、`tools/menu_gen/gen_menu.py`(自带校验:拒 Tab/缩进非整倍数/节点 >255)、`tools/serial_tool/`(近期已验证)均健康。
+398 -29
View File
@@ -1,39 +1,408 @@
# 待处理内容(登记簿)
# 待处理内容(统一待办登记簿)
> **用途**:跨文档的待办/观察项登记——台架与审计过程中发现、但**不属于当前修复范围**
> (或 A/B 归因为既有问题)的事项,在此留档防丢失。每项带发现日期、证据与出处。
> **消化即销项**:事项修复/关闭后,**直接从本表删除该行**(结论与证据应已沉淀进
> 对应模块文档/问题记录,此处不再保留),并同步清理其他文档对本编号的引用。
> **本表只保留未闭环项**——已闭环项不保留、不留变更记录(历史见 `git log` 与各模块文档)。
> **创建**:2026-09-22(L3 pending 台架收尾时建立,AGENTS.md 既有引用自此落文件)。
> **用途**:**全项目唯一的未闭环事项登记簿**——汇总"审计发现 / 台架观察 / 测试充分性与架构
> 专项 / 任务排序"四类待办。原 `审查记录/项目审计改进清单.md`(P-x)、`审查记录/下一步任务规划.md`
> (阶段与基线)、`审查记录/测试与架构改进建议.md`(S1x / A-x)、`docs/待处理内容.md`(N-x / S-x / T-x)
> 于 2026-10-04 合并入本文件,**编号一律沿用,不回收**。
>
> **只保留待办**:**已完成条目直接删除,不留变更记录**(历史见 `git log` 与各模块文档);
> 已闭环项的**结论与证据沉淀进对应模块文档/问题记录**,本文件不再重复。
> **消化即销项**:事项修复/关闭后,直接删除对应条目,并同步清理其它文档对本编号的引用。
>
> **不在本文件范围**:`错误码传播审计.md`(E-xx,问题记录/审计报告,非待办池)、
> `项目审查与优化建议报告.md`(体系层评审报告)、`测试说明/实机测试实施指南.md`(执行流程)。
>
> **创建**:2026-09-22(L3 pending 台架收尾);**合并重写**:2026-10-04。
## 网络(CH395F / net 层)
---
| # | 事项 | 发现 | 证据与现状 | 出处 |
|---|---|---|---|---|
| N-2 | **49s 全系统日志静默(defaultTask/NAND syslog 排空停滞)**——串口日志 49s 无行(testTask/netTask/[STACK] 行全缺),期间 net 栈照常处理外部连接 → 日志管线(defaultTask 排空 → NAND+UART)停滞,队列满后各任务日志行被丢;系统功能不受损 | 2026-09-22(L3 台架 F2 运行中,gen 181) | **A/B 归因:既有存储侧现象**(L3 不触碰 defaultTask/syslog 路径)。**2026-10-03 降级为低风险观察项**:① 丢弃可观测性**代码已具备**(`console_log.c` `s_con_drop` + `[ERR] CONSOLE dropped N lines`;`sys_log_mcu.c` 队列满 `DBG_ERROR`;UART TX 僵尸通道自愈)→"静默丢行"已不成立;② V5 30 min **未复现 49s**(运行期 >10s 静默全为 ~28s、均在 `e02_probe` 窗口内=N-17)。**残余待办**:与 S8(非阻塞日志)合并评估;若再现,借 `[ERR] CONSOLE dropped` 计数定位卡点 | `错误码传播审计.md` E-02 阶段二;`实机测试实施指南.md` §7.2 |
| N-3 | **L5 队列往返基线(1223/988µs)的 L3 后重验**——L5 测 DONTWAIT 队列全程;L3 对该路径逐位不变 → 机制上无影响,但基线数值属分片时代,严格重锁需跑一轮 Phase 13(需 PC peer) | 2026-09-22(L3 收尾留档) | 低风险:10ms/100ms 阈值余量 >8×;下次 Phase 13 窗口顺带重锁即可 | `链路延迟测试说明.md` §6.4 L5 注¹ |
## 0. 编号空间与来源
## 存储 / 日志管线
| # | 事项 | 发现 | 证据与现状 | 出处 |
|---|---|---|---|---|
| S-1 | defaultTask 静态最坏链余量贴线:`storage_bring_up → … → dhara GC → SPI` 链 | 2026-09-22(L3 产品构建栈报告);2026-10-04 重采升级 | **2026-10-04 重采(升级为需尽快处理)**:产品构建(`suite=NONE`)V5 30 min 真实负载实测 **3664B/4096(余量 432B = 10%)**,**已远低于 30% 判据**。处置方向二选一:栈 4096→4608(CCM 堆余量可覆盖 +512B)或 GC 链缓冲局部削减;建议**提前到阶段 B(ADC/RS485)之前**处理 | `/tmp/v5_soak_serial_20261003.log`;`下一步任务规划.md` §2 C4 / §4 |
| S-2 | N-2 消化后,台架 20MB 串口日志截头会丢早期 [STACK] 水位行——跨构建的"前后"栈水位对照建议固化 boot_log 快照(`%TEMP%\opencode\boot_log_*.txt`)进 `docs/测试说明/` 存档目录 | 2026-09-22(L3 收尾发现:切片时代水位行已被截头,A/B 只能定性) | 流程项,无代码改动 | 本文件 N-2 佐证 |
| S-3 | **USART1 TX-only 结构根治(灭 ORE 僵尸机制)**——ORE 锁存在外设软复位后毫秒级重锁(PA10 悬空 + RX 使能),是 2026-10-02 台架"背靠背 drain 拉长主循环 → 喂狗节奏饥饿 → IWDG 误复位"的**机制根源**。现仅有缓解(单次 drain 250ms 预算 + 发送故障后 300ms 冷却),**未根治** | 2026-10-02(台架 gen-288,见 `控制台单写者日志设计说明.md` §12) | **待办**:改 `.ioc` 令 USART1 为 TX-only(不使能 RX / PA10 不复用为 `USART1_RX`)→ CubeMX 重生成 → 跑 `scripts/check_cubemx_survival.py`。属结构性改动,需单开一轮并复跑台架闭环 | `子系统设计/控制台单写者日志设计说明.md` §12(含 O4) |
| S-4 | **dhara 重试自旋残留**——`try_recover()` 的 `DHARA_MAX_RETRIES`(8) 自旋在坏块密集时仍可能长时间占用 defaultTask(喂狗点) | 2026-10-02(round 7/8 取证期观察) | 低优先:现有 `vol_lock` + 喂狗节奏缓解;若台架再出"存储侧喂狗饥饿"再排期 | `Lib/dhara/map.c` |
| S-5 | **可选全序列卷锁**——现卷锁仅覆盖 `syslog` / `cfg` / `lftpd` 三条路径(`vol_lock_wait(0)` try 语义),其它潜在访问点(如 UI 读日志)未纳入 | 2026-10-02(卷锁落地时) | 待评估:先确认是否真有第二写者;无则关闭本项 | `App/fs/vol_lock.{c,h}` |
## 网络(二期排期,随第二档 #1)
| # | 事项 | 说明 | 出处 |
| 编号 | 含义 | 原出处 | 备注 |
|---|---|---|---|
| N-4 | **pending 机制二期:ACCEPT + SEND 阻塞路径 pending 化**——E-06(accept 轮询计时失真)、E-20(lftpd 控制通道 errno 分类/501)、E-21(timeSync errno 分级)剩余分量共用该机制扩展;届时 L3/L5 基线再重锁、探针族扩充(close/reconfig/EOF/disconnect-during-pending)、看门狗接 selftest 留痕、模拟器差距清单 +1 | 一期(RECV)已落地并入主线;架构现状见 `Net层阻塞模型架构设计.md`,二期设计基线与门禁见 `下一步任务规划.md` §3.1 | 同左 + `错误码传播审计.md` 第二档 #2 |
| N-16 | **A2/A4 专项场景台架验证待办**(正常路径已实测零回归):① PHY 拔线负向测试——断链需断 **DTU 侧**线缆或关**受管交换机端口**(拔交换机侧线缆链路仍 UP),断链后复位验证 `PHY: DISCONNECT` + 自检台账 `comms fault` 降级放行;② A2 芯片级 `net_init` 失败分支(需 SPI 故障注入,验证 `net init fail` 自检 + 30s 重试恢复);③ A4 短写压测(需远显客户端 + UI 推流压力,验证 `remo send short` 告警/阻断/重连恢复) | 2026-10-03(台架;台架拓扑 = CH395↔交换机,拔线操作受限) | `实机测试实施指南.md` §10 |
| N-17 | **`time_sync` 30s 挂起客户端掉线 + 监听重建期间,网络任务心跳缺口达 800ms~1s(声明 stall 但未复位)**——V5 长跑期间 44 次 `task stall: mask=0x00000001`,**100% 与 `e02_probe` 的 30s 挂起客户端触发 `time_sync: no TIME packet in 30s, drop conn` → 监听重建(约 4s)重合**;隔离实验(仅 FTP,120s)**0 次 stall** → 该停摆为**探针场景专属**。缺口(~1s)< IWDG 最坏超时(1701ms),余量仅 ~0.7s。**待办**:定位监听重建为何阻塞 NET/FTP/UI(疑 CH395F socket 释放 / `net_listen` 重试期间的队列头阻塞);评估缩短重建重试(5×2s)或让掉线路径不阻塞其它任务 | 2026-10-03(V5 台架;证据 `/tmp/v5_soak_serial_20261003.log`) | `实机测试实施指南.md` §4;`子系统设计/看门狗设计说明.md` |
| `P0-x` / `P1-x` / `P2-x` / `P3-x` | 审计缺陷/改进项 | `项目审计改进清单.md`(2026-09-15/09-21 审计) | P0=功能 bug、P1=疑似 bug/健壮性、P2=改进、P3=卫生 |
| `N-x` | 跨文档观察/登记项 | `待处理内容.md` 登记簿 | 台架/审计发现、暂不在修复范围 |
| `S-x` | 存储/日志管线待办 | 同上 | 存储侧健壮性 |
| `T-x` | 测试/验证基础设施待办 | 同上 | 工具链、CI |
| `S1~S14` / `A-1~A-7` | 测试充分性与架构改进专项 | `测试与架构改进建议.md`(2026-10-02 复审) | **编号不随条目删除而回收** |
| `E-xx` | 错误码传播审计发现 | `错误码传播审计.md` | **不并入本文件**,交叉引用 |
| 阶段 `A/B/C/D` + `B0~B3`/`C1~C6`/`D2~D6` | 任务排序分组 | `下一步任务规划.md` | 见 §2 |
## 测试与验证基础设施
**严重度定义**(沿用审计口径):P0 = 确认功能 bug|P1 = 疑似 bug 或健壮性风险|P2 = 改进|P3 = 卫生。
**置信度**:high = 代码级确证|medium = 依赖外部条件(手册/硬件/产品定义)。
---
## 1. 未闭环一览(按严重度)
| 级别 | 数量 | 关键项 |
|---|---|---|
| **P0** | 0 | P0-1 已修复(2026-09-18),仅剩真机 `@test` 验证(见 §4) |
| **P1** | 2 (+1 收尾) | **P1-1 ADC 采样路径产品构建中死亡**;**P1-7 MAC 写入顺序**(待 CH395F 手册 §9.2.1);P1-10 测试固件构建实测闭环(主体已闭环,见 §3.1) |
| **P2** | 10 | 健壮性/错误传播/文档失真:P2-1/2/7/8/9/10/11/12/13/15(详见 §3.2) |
| **P3** | 6 | 卫生项:P3-1/2/4/6/8/11(其余已销项),可随其他修改顺手处理 |
| 登记簿 | 10 | 网络:N-2(49s 日志静默,**低风险观察项**)、N-3(L5 基线重验)、N-4(pending 二期)、N-16(A2/A4 专项负向验证)、N-17(探针窗口心跳缺口);存储/日志:**S-1(defaultTask 栈余量 10%,需尽快处理)**、S-2(boot_log 存档)、S-3(USART1 TX-only 根治)、S-4(dhara 重试自旋)、S-5(可选全序列卷锁) |
| 测试/基础设施 | 5 | T-7(CI runner 未就绪)+ 测试架构专项 **S12**(断言宏)、**S1-c**(可选单测)、**A-4**(采集链路测试约束)、**A-5 残余**(CI 体积门禁盲区) |
> **网络侧另有 E-xx 未闭环项**(E-12/15/16/23/24/25/26/27/28/30/47/48/49/50/58/59/61,共 17 项)
> 与 1 项回归监督(E-62),详见 `问题记录/错误码传播审计.md` §3。本文件不重复登记。
### 1.1 结构性判断(排序依据)
1. **网络层已是全项目最成熟子系统**(pending 机制 + 四份 Trap 记录 + 量化基线 + 探针族)。
剩余网络工作都是"二期扩展/收口",**没有紧急项**。
2. **真正的产品功能缺口在 ADC 与 RS-485 采集链路**:`adc_task`/`rs485_task` 均为空桩,
DTU 的核心职责(数据采集与转发)**尚未实现**。这既是 P1-1 的根源,也是 E-59 那条
"休眠缺陷闸门"的另一面——不是缺陷难修,而是**功能没接**。
3. **验证债已基本还清,重心是"功能债" + 一项栈风险**:剩余验证债仅 **N-3(L5 基线重锁,
待 PC peer)** 与 **S-1(defaultTask 栈余量已跌至 10%,见 §6)**。
**当前最值得投入的是阶段 B(ADC/RS485 功能)**。
---
## 2. 任务排序(阶段 A/B/C/D)
> 排序原则:**先降风险(产品级故障)→ 再补功能(核心链路)→ 再清结构债 → 最后卫生**。
> 本节只给「做什么 / 为什么现在 / 入口在哪 / 完成判据」,明细指向 §3 对应条目。
### 2.1 阶段 A 残余:立即执行(改动小、风险高)
| 序 | 任务 | 为什么现在 | 入口 | 完成判据 |
|---|---|---|---|---|
| **A5** | **P1-7 MAC 写入顺序** | 先确认 CH395F 手册 §9.2.1(INIT 是否锁存 MAC)再改;若锁存则 UI 配置 MAC 不生效、设备在线身份错误 | `Drivers/BSP/NET/net_socket.c` `net_init()` | 依手册结论调整顺序或文档化"无需调整" |
### 2.2 阶段 B:核心功能补齐(产品价值最高,需产品定义确认)
> 目标:让 DTU 真正采到数——这是当前**最大的功能空洞**,**当前最高优先级**。
> 一旦 B0 产品定义明确,即可与 B3(纪律门禁)并行启动。
| 序 | 任务 | 前置 | 说明 |
|---|---|---|---|
| **B0** | **产品定义确认**(阻塞项) | — | 需甲方明确:① 采集是否持续 ② 采样率/通道 ③ 转发目标(MODBUS RTU?上行 TCP?)④ `APP_ADC_ENABLE`/`APP_RS485_ENABLE` 语义。**B1/B2 的规模完全取决于此** |
| **B1** | **ADC 采集链路实现**(消化 P1-1、E-58) | B0 + **E-59 门禁** | 周期 CONVST 重触发 + `adc_task` 消费 `get_buf`;**先修 E-58**(原子快照 API,否则接入即撕裂);栈预算核算(两任务未入 `freertos.c` 栈表) |
| **B2** | **RS-485 采集链路实现**(消化 E-50、E-49) | B0 + **E-59 门禁** | 双缓冲 + 序号(防包撕裂)+ DE 收尾(超时路径等 TC)+ 协议状态机(`App/protocol/` 正是为此预留) |
| **B3** | **E-59 门禁固化入 `AGENTS.md`** | — | 把"接消费者前必须先修 E-36/E-44/E-45/E-58 + 栈预算"写成强制门禁,与"改栈前跑 `stack_report.py`"同级。**这是防止 B1/B2 带缺陷上线的关键** |
**建议**:B3 与 B0 并行推进(前者是纪律,后者问甲方);**E-58 修复应在 B1 动消费者之前完成**。
### 2.3 阶段 C:结构债清理(二期)+ 存储侧健壮性
| 序 | 任务 | 说明 | 出处 |
|---|---|---|---|
| **C1** | **pending 二期(ACCEPT + SEND)** | 沿一期机制扩展;同期消化 E-25(net_select 语义)、E-24/E-27/E-28(跨上下文收口);基线重锁 + 探针族扩充 + 看门狗接 selftest。**设计基线见 §5.1** | 第二档 #2 / N-4 |
| **C3** | **存储侧日志管线**(消化 N-2) | 丢弃可观测性**代码已具备**(`console_log.c` `s_con_drop`+`[ERR] CONSOLE dropped`、`sys_log_mcu.c` 队列满 `DBG_ERROR`、TX 僵尸通道自愈);V5 30 min 日志**未复现 49s 静默**(运行期 >10s 静默全为 ~28s、均在 `e02_probe` 窗口内=N-17)。剩余:与 S8(非阻塞日志)合并评估 + **S-3(USART1 TX-only 结构根治)** | N-2 / S-3 |
| **C4** ⚠️ | **defaultTask 栈余量**(S-1,**需尽快处理**) | **2026-10-04 实测 3664/4096(余量 432 B ≈ 10%,远低于 30% 判据)**。处置:栈 4096→4608(CCM 堆余量可覆盖 +512B)或 GC 链局部削减;**建议随阶段 B 之前先做** | S-1 |
| **C5** | 一档剩余 + P2 收口 | E-49(RS485 DE 收尾)、E-15(ringbuf 定去留——**已确认零调用者,倾向删除**)、E-61(SD2506 注释订正)、E-16(cfg_file 段名长度)、E-26(UDP 定案,倾向移除)、E-23、E-30 + P2-1/2/7/8/9/10/11/12/13/15 | 一档/二档 |
| **C6** | **USART1 TX-only 结构根治**(S-3) | 灭 ORE 僵尸机制根源:改 `.ioc` 令 USART1 不使能 RX / PA10 不复用为 `USART1_RX` → CubeMX 重生成 → 跑 `check_cubemx_survival.py`。属结构性改动,需单开一轮 + 复跑台架闭环 | S-3 |
### 2.4 阶段 D:验证与卫生(常态化)
| 序 | 任务 | 说明 |
|---|---|---|
| **D2** | N-3 L5 基线重锁 | 下次 Phase 13 窗口顺带做(低风险:阈值余量 >8×;**需 PC peer**) |
| **D3** | S-2 boot_log 快照存档流程 | 固化 `%TEMP%\opencode\boot_log_*.txt` 进 `docs/测试说明/` 存档目录 |
| **D4** | P3 卫生项 | P3-1/2/4/6/8/11(含 E-13 `test_parse_ip` 门控析取)顺手清理 |
| **D5** | **N-16 专项负向台架窗口** | A2/A4 负向场景:PHY 拔线(需断 DTU 侧/关受管交换机端口)、A2 芯片级 `net_init` 失败(SPI 故障注入)、A4 短写压测 |
| **D6** | **N-17 探针窗口心跳缺口** | 定位 `time_sync` 监听重建为何阻塞 NET/FTP/UI(~1s 缺口,余量仅 ~0.7s);评估缩短重建重试或让掉线路径不阻塞其它任务 |
### 2.5 建议执行顺序(一图)
```
【阶段 A 残余】 A5 P1-7(待 CH395F 手册 §9.2.1)
↓
【阶段 B 功能】 B0 产品定义确认 ─┬─ B3 E-59 门禁固化(并行)
(当前最高优先) └─ E-58 原子快照 → B1 ADC → B2 RS485
↓
【阶段 C 结构】 C1 pending 二期 ─ C3 日志管线(N-2/S-3) ─ C4 栈(S-1)
─ C5 收口 ─ C6 USART1 TX-only
↓
【阶段 D 常态】 D2 N-3 / D3 boot_log / D4 P3 / D5 N-16 负向 / D6 N-17 探针窗口
```
---
## 3. 待办详述
### 3.1 P1(未闭环 2 项 + 1 项收尾)
#### P1-1 ADC 采样数据路径产品构建中死亡
- **位置**:`App/app/app_main.c`(`tpafe5160_start_conv_irq()` 仅启动时调用一次)+ `Drivers/BSP/TPAFE5160/tpafe5160.c`
- **证据**:启动序列调用一次 `tpafe5160_start_conv_irq()`;全仓库无周期性 CONVST 重触发;`data_ready` / `get_buf` 无任何消费者(`adc_task.c` 是空桩)。
- **影响**:上电后仅采集 1 个样本,此后数据永久陈旧;`APP_ADC_ENABLE` 开关又无人引用(见 P2-12),形成"看似启用实则失效"的假象。
- **修复建议**:周期 CONVST 重触发(定时器或任务)+ 数据消费任务;若基线版本有意不实现采集,应删除启动调用并以 `APP_ADC_ENABLE` 真实门控。
- **置信度**:high(代码级确证);P0/P1 定级取决于产品定义(见 §4 待确认)。
#### P1-7 MAC 写入顺序违反 trap 文档
- **位置**:`Drivers/BSP/NET/net_socket.c` `net_init()`:`ch395f_init()` → `ch395f_set_mac_addr()`
- **证据**:`docs/问题记录/CH395F_Trap_Records.md` 规定初始化顺序 SET_MAC → SET_IP → INIT_CH395 → SET_PHY;现码把 MAC 放在 INIT 之后。
- **影响**:若 INIT_CH395 锁存 MAC 寄存器,UI 配置的 MAC 不生效(回落芯片内置),设备在线身份错误、网口排查困难。
- **修复建议**:`set_mac_addr` 移到 `ch395f_init()` 之前;修改前对照 CH395F 手册 §9.2.1 确认 INIT 是否锁存(见 §4 待确认)。
- **置信度**:medium。
#### P1-8 网络重建失败无恢复 —— ✅ 已闭环(2026-10-02)
自检台账留痕 + 30s 周期重试(`net_task.c`);首启失败不再自驻留。证据见 `网络/Net层阻塞模型架构设计.md`。
#### P1-10 测试固件静态 RAM 预算(基线已重建、测试缓冲已瘦身,剩构建实测闭环)
- **位置**:`MDK-ARM/STM32F407-Demo/STM32F407-Demo.sct`(`RW_IRAM1 0x20000000 0x00020000` = 128KB;芯片 192KB 的上部 64KB 有意未映射,克隆芯片兼容性考量)
- **历史**(2026-09-15 审计 / 09-16 复现):产品构建静态镜像曾 = 123.6KB/128KB(余量仅 4.4KB);HW 全阶段固件的 PHASE5 三缓冲(3×4093B)→ 超 8.7KB(`L6406E` 实测);NET 固件的 32KB `s_rx_buf` → 超约 28KB。
- **进展**(2026-09-21,已复核):① 预算基线重建(`docs/内存管理/RAM使用分析与优化方案.md` v1.2):FreeRTOS 堆迁 CCM,任务栈改由 CCM 堆分配;产品构建 RW_IRAM1 余 ~49KB;② NET 层测试 32KB `s_rx_buf`/`s_tx_buf` 已移除,改小局部缓冲;③ STORAGE 套件固件 2026-09-20/21 实测可构建可运行。
- **剩余**:① CH395F 套件(`TEST_SUITE_CH395F`,HW 全阶段 / NET 层 7 配置)实际构建确认链接通过——PHASE5 三静态缓冲 3×4093B 仍在,理论余量足够但未实测;② `@test` 闭环;③ **不建议**扩 scatter 到 192KB(破坏既有克隆芯片兼容决策)。
- **置信度**:high(基线数据来自 2026-09-21 map;测试固件构建未复验)。
### 3.2 P2(未闭环 10 项)
| # | 位置 | 问题 | 修复建议 | 置信度 |
|---|---|---|---|---|
| P2-1 | `App/cfg/cfg_file.c` | 受管键行 >127 字符时外科保存产生重复键行(值静默截断,旧行残留;Pass1 匹配仍受 `CFG_LINE_TEST_MAX=127` 限制) | 行长超限时拒绝保存并报错,或整卷重写 | high |
| P2-2 | `Drivers/BSP/CH395F/ch395f.c` | `ch395f_spi_dma_transfer` 为 void:DMA 超时/abort 后不向调用方传播错误(调用方当成功继续 → 静默数据损坏) | 超时路径置错误标志并经返回值/查询接口上报 | high |
| P2-7 | `Drivers/BSP/NET/net_select.c` `check_socket_readable` | LISTENING 视为恒可读 → 单连接模式下对监听 socket select(readfds) 永久立即返回(当前无调用方,潜在地雷) | LISTENING 仅在写集合/异常集合计数可读,或明确文档化 | high |
| P2-8 | `App/sync/time_sync.c` + `Drivers/BSP/NET/net_config.h` | `NET_RECV_TIMEOUT_MS=30000`;且 `time_sync.c` 的 `net_recv` 现传 timeout=0(**无限等待**)——静默对端使同步任务永久卡死 | 同步收包单独用短超时(如 3s),与通用收发超时分离 | high |
| P2-9 | `App/log/sys_log_mcu.c` | 挂载时 mkdir 失败 → `s_fs_ready` 不置位,drain 永久 no-op 无重试(`syslog_mcu_mounted` 仅调用一次) | 周期重试挂载/建目录 | medium |
| P2-10 | `App/log/sys_log_mcu.c` | 容量满 unlink 与 UI 读记录(FA_READ)存在竞态窗口 | unlink 前等待读者释放,或双文件轮转 | medium |
| P2-11 | `App/task/net_task.c` | RECONFIG 事件用 `osEventFlagsGet`+Clear,非原子(检查与清除间可丢事件) | 改 `osEventFlagsWait` 原子获取 | high |
| P2-12 | `App/app/app_cfg.h` | `APP_NET_ENABLE`/`APP_ADC_ENABLE`/`APP_RS485_ENABLE` 全仓库无 .c 引用,纯装饰 | 真实接入模块门控,或从文档/注释中删除"开关"说法 | high |
| P2-13 | `Src/freertos.c` | testTask 无条件创建,产品构建空转占 2048 words(8KB,CCM 堆) | 按 `test_config.h` 门控创建 | high |
| P2-15 | `MDK-ARM/download.bat` | 调用 UV4 前不删旧 `download_log.txt`:陈旧 "Application running" 掩盖失败烧录 | 调用前先删旧日志 | high |
> **已销项 P2(勿重复报)**:P2-3(`gd5f_bbt_save` 返回值检查)、P2-4(`dhara_nand_read` 检查 `gd5f_read_from_cache`)、P2-5(`sd2506.c` 负温 `-(int8_t)(val & 0x7F)`)、P2-6(SD2506 CTR1 写禁止)、P2-14(`build.bat` 删旧日志)、P2-16(AGENTS.md 栈表)。
### 3.3 P3(未闭环 6 项)
| # | 位置 | 问题 |
|---|---|---|
| P3-1 | `App/cfg/cfg_file.c` `s_encode` | STR 型 `len==0` 时 slen 计算回绕(`if (slen >= p_key->len) slen = p_key->len - 1u;`) |
| P3-2 | `App/cfg/cfg_file_store_mcu.c` | 临时文件名硬编码 `/config.TMP`,忽略 `p_path` 参数 |
| P3-4 | `Drivers/BSP/RS485/rs485.c` | 文件头宣称 DWT µs 延时,实际用 `HAL_Delay(1)`(文档不一致) |
| P3-6 | `Drivers/BSP/CH395F/ch395f.c` `ch395f_get_socket_status` | `p_status` 无 NULL 检查 |
| P3-8 | `.opencode/command/build.md` | 退出码契约写 "2+ = 编译错误",`build.bat` 实际只有 0/1 两档(与 AGENTS.md 一致的是后者) |
| P3-11 | `App/task/adc_task.c` / `rs485_task.c` | 空桩无注释说明原因(建议注明"预留,未启用") |
> **已销项 P3(勿重复报)**:P3-3(`app_main_run` 死代码已删/已引用)、P3-5(死宏 `FTL_NUM_BLOCKS`)、P3-7(`test/test.txt` 已删除)、P3-9(FTP_Test_Guide 事件屏障改写)、P3-10(CH395F_Test_Guide 改写)、P3-12(`time_sync.c` 累积到 8 字节再判)、P3-13(`test_parse_ip` 门控析取已加)。
### 3.4 登记簿(N-x / S-x / T-x)
**网络(CH395F / net 层)**
| # | 事项 | 发现 | 证据与现状 | 出处 |
|---|---|---|---|---|
| N-2 | **49s 全系统日志静默(defaultTask/NAND syslog 排空停滞)**——串口日志 49s 无行,期间 net 栈照常处理外部连接 → 日志管线停滞,队列满后各任务日志行被丢;系统功能不受损 | 2026-09-22(L3 台架 F2,gen 181) | **A/B 归因:既有存储侧现象**。**2026-10-03 降级为低风险观察项**:① 丢弃可观测性**代码已具备**(`console_log.c` `s_con_drop` + `[ERR] CONSOLE dropped`;`sys_log_mcu.c` 队列满 `DBG_ERROR`;UART TX 僵尸通道自愈);② V5 30 min **未复现 49s**(>10s 静默全为 ~28s、均在 `e02_probe` 窗口内=N-17)。**残余待办**:与 S8(非阻塞日志)合并评估 | `错误码传播审计.md` E-02 阶段二 |
| N-3 | **L5 队列往返基线(1223/988µs)的 L3 后重验**——L5 测 DONTWAIT 队列全程;L3 对该路径逐位不变 → 机制上无影响,但基线数值属分片时代,严格重锁需跑一轮 Phase 13(需 PC peer) | 2026-09-22(L3 收尾留档) | 低风险:10ms/100ms 阈值余量 >8×;下次 Phase 13 窗口顺带重锁即可 | `链路延迟测试说明.md` §6.4 L5 注¹ |
| N-4 | **pending 机制二期:ACCEPT + SEND 阻塞路径 pending 化**——E-06、E-20、E-21 剩余分量共用该机制扩展;届时 L3/L5 基线再重锁、探针族扩充、看门狗接 selftest 留痕、模拟器差距清单 +1 | — | 一期(RECV)已落地并入主线;架构现状见 `Net层阻塞模型架构设计.md`,二期设计基线见 §5.1 | `错误码传播审计.md` 第二档 #2 |
| N-16 | **A2/A4 专项场景台架验证待办**(正常路径已实测零回归):① PHY 拔线负向测试——断链需断 **DTU 侧**线缆或关**受管交换机端口**;② A2 芯片级 `net_init` 失败分支(需 SPI 故障注入);③ A4 短写压测(需远显客户端 + UI 推流压力) | 2026-10-03(台架拓扑 = CH395↔交换机,拔线操作受限) | 待专项台架窗口 | `实机测试实施指南.md` §10 |
| N-17 | **`time_sync` 30s 挂起客户端掉线 + 监听重建期间,网络任务心跳缺口达 800ms~1s(声明 stall 但未复位)**——V5 长跑 44 次 `task stall: mask=0x00000001`,**100% 与 `e02_probe` 的 30s 挂起客户端触发 `time_sync: no TIME packet in 30s, drop conn` → 监听重建(约 4s)重合**;隔离实验(仅 FTP,120s)**0 次 stall** → 探针场景专属。缺口(~1s)< IWDG 最坏超时(1701ms),余量仅 ~0.7s。**待办**:定位监听重建为何阻塞 NET/FTP/UI;评估缩短重建重试(5×2s)或让掉线路径不阻塞其它任务 | 2026-10-03(V5 台架) | `实机测试实施指南.md` §4;`子系统设计/看门狗设计说明.md` |
**存储 / 日志管线**
| # | 事项 | 发现 | 证据与现状 | 出处 |
|---|---|---|---|---|
| S-1 | defaultTask 静态最坏链余量贴线:`storage_bring_up → … → dhara GC → SPI` 链 | 2026-09-22;2026-10-04 重采升级 | **2026-10-04 重采(升级为需尽快处理)**:产品构建(`suite=NONE`)V5 30 min 真实负载实测 **3664B/4096(余量 432B = 10%)**,**已远低于 30% 判据**。处置:栈 4096→4608(CCM 堆余量可覆盖 +512B)或 GC 链缓冲局部削减;建议**提前到阶段 B 之前**处理 | 本文件 §2.3 C4 / §6 |
| S-2 | N-2 消化后,台架 20MB 串口日志截头会丢早期 [STACK] 水位行——跨构建的"前后"栈水位对照建议固化 boot_log 快照(`%TEMP%\opencode\boot_log_*.txt`)进 `docs/测试说明/` 存档目录 | 2026-09-22 | 流程项,无代码改动 | 本文件 N-2 佐证 |
| S-3 | **USART1 TX-only 结构根治(灭 ORE 僵尸机制)**——ORE 锁存在外设软复位后毫秒级重锁(PA10 悬空 + RX 使能),是 2026-10-02 台架"背靠背 drain 拉长主循环 → 喂狗节奏饥饿 → IWDG 误复位"的**机制根源**。现仅有缓解(单次 drain 250ms 预算 + 发送故障后 300ms 冷却),**未根治** | 2026-10-02(台架 gen-288) | **待办**:改 `.ioc` 令 USART1 为 TX-only → CubeMX 重生成 → 跑 `scripts/check_cubemx_survival.py`。结构性改动,需单开一轮并复跑台架闭环 | `子系统设计/控制台单写者日志设计说明.md` §12(含 O4) |
| S-4 | **dhara 重试自旋残留**——`try_recover()` 的 `DHARA_MAX_RETRIES`(8) 自旋在坏块密集时仍可能长时间占用 defaultTask(喂狗点) | 2026-10-02 | 低优先:现有 `vol_lock` + 喂狗节奏缓解;若台架再出"存储侧喂狗饥饿"再排期 | `Lib/dhara/map.c` |
| S-5 | **可选全序列卷锁**——现卷锁仅覆盖 `syslog` / `cfg` / `lftpd` 三条路径(`vol_lock_wait(0)` try 语义),其它潜在访问点(如 UI 读日志)未纳入 | 2026-10-02 | 待评估:先确认是否真有第二写者;无则关闭本项 | `App/fs/vol_lock.{c,h}` |
**测试与验证基础设施**
| # | 事项 | 优先级 | 问题与证据 | 处置方向 | 出处 |
|---|---|---|---|---|---|
| T-7 | **CI runner 未就绪(部署前置)** | 中 | `.gitea/workflows/ci.yml` 已落地,但 CI 仅在 runner 就绪后才真正生效:① Gitea 实例 `[actions] ENABLED = true`;② 注册 Windows runner(labels 含 `windows`),装 Python 3.x / cppcheck / pre-commit / MSVC | runner 未就绪前,**提交前仍须在本地跑 `scripts/ci_local.py` 或 `pre-commit run --all-files` 自查**(L0 唯一保障,不能因"已配 CI"而放宽) | `.gitea/workflows/ci.yml`;`测试说明/测试开发标准流程.md` §9 |
### 3.5 测试与架构改进专项(S1x / A-x)
> **编号约定**:**S1~S14 / T-1~T-5 / A-1~A-7** 是 2026-10-02 版复审的**条目编号**——编号**不随条目删除而回收**;
> 其他文档若引用这些编号,其证据见对应模块文档与 `git log`。已完成事项的证据沉淀:
> `测试说明/系统时钟单元测试说明.md`(S1-a)、`测试说明/配置文件单元测试说明.md`(S1-b)、
> `测试说明/测试开发标准流程.md` §4.2.1(L0.5 适格台账)、`测试说明/模拟器差距清单.md`(S13)、
> `测试说明/实机测试实施指南.md`(S4/S5/S7/S9/S11)、`问题记录/GD5F2GQ5UE_Trap_Records.md`(S9)。
**未闭环一览**
| 编号 | 事项 | 状态 | 详述 |
|---|---|---|---|
| **S12** | 模块级轻量断言宏 | ⬜ 待做(第 4 波按需) | 3.5.1 |
| **S1-c** | `sys_log` / `time_sync` 主机侧单测 | ⬜ 可选(价值递减) | 3.5.2 |
| **A-4** | ADC / RS485 采集链路的**测试可验证性约束** | ⏸ 待 B1/B2 落地时执行 | 3.5.3 |
| **A-5 残余** | CI 体积门禁盲区(`mem-numbers` 在 CI 被跳过) | ⬜ 未消除 | 3.5.4 |
#### 3.5.1 S12:模块级轻量断言宏 ⬜
**动机**:`configASSERT` 只覆盖 FreeRTOS 内部;自研代码的"不该发生"靠散落的 `if`。
**设计要点**(**必须零生产开销**):
```c
/* App/util/app_assert.h —— 示意,非最终实现 */
#ifdef APP_ASSERT_ENABLE
#define APP_ASSERT(cond) do { if (!(cond)) { \
DBG_ERROR("[ASSERT] %s:%d", __FILE__, __LINE__); vApplicationAssertFailed(__FILE__, __LINE__); } \
} while (0)
#else
#define APP_ASSERT(cond) ((void)0) /* 生产构建:编译期消失,零符号零开销 */
#endif
```
**⚠️ 关键纪律**:
- **不得**在中断 / 高频路径使用(`DBG_ERROR` 有代价);
- **不得**替代正常的错误返回(断言是"内部不变量",不是"外部输入校验");
- 生产构建 `APP_ASSERT_ENABLE` **关闭**——与 `ENABLE_DESTRUCTIVE_TESTS` 同级策略。
**建议先在 1~2 处试点**(如 `net_socket.c` 的状态机不变量),验证收益后再推广。
**完成判据**:宏存在 + 生产构建 `@build` 0/0 且 `.map` 无新增符号;试点处有实际使用。
#### 3.5.2 S1-c(可选):`sys_log` / `time_sync` 主机侧单测 ⬜
**范围**:`App/log/sys_log_mcu.c`(定长 64B 记录编解码;落盘部分需桩)、
`App/sync/time_sync.c`(协议帧编解码;与网络耦合,需先判定可解耦面)。
**为何低优先**:两者边界密度低于 `sys_clock` / `cfg_file`,且已有真机路径覆盖
(`@test` 标记 / `time_sync_server.py`)。**按剩余收益评估后再决定是否做**,
范式完全复用 `看门狗单元测试说明.md`。
**完成判据**:`test/host/<模块>/run_unit_test.py` 退出码 0 + 挂 pre-commit 钩子。
#### 3.5.3 A-4:ADC / RS485 采集链路的测试可验证性约束 ⏸
**背景**:`adc_task.c` / `rs485_task.c` 仍是空桩,`App/protocol/` 只有 README 与 `.gitkeep`。
本项不是"缺陷",而是**对上游 B1 / B2 的设计约束**——应在动手前明确,否则后续无法补测。
**约束**(建议纳入 B1 / B2 设计):
1. **协议解析必须与硬件 I/O 分离**——`App/protocol/` 的解析函数应接受
`(const uint8_t *buf, size_t len)` 并返回解析结果,使其成为 L0.5 的**天然适格对象**
(参考 `cfg_file` 的"核心 + 后端"模式);
2. **采集缓冲必须双缓冲 + 序号**(上游 E-49 / E-50)——否则消费者读到撕裂数据,
且**撕裂在单测里测不出来**(时序相关),必须在设计上消除;
3. **DE 收尾必须有超时路径覆盖**(RS485 半双工特有陷阱)。
**完成判据**:B1 / B2 设计文档体现上述三条;协议解析函数有对应 L0.5 单测。
#### 3.5.4 A-5 残余:CI 体积门禁盲区 ⬜
**现状**:`mem-numbers` 钩子**在 CI 上被跳过**(CI 无 `.map`)→ **CI 不守体积门禁**。
S14 已在 workflow 显式提示"体积门禁未执行"(`::notice::`)并在 `CI配置指南.md` 声明,
但**盲区本身未消除**——看到 CI 全绿仍可能误以为体积也守住了。
**可选处置**:
- 让 runner 具备 Keil 后,在 CI 增 `@build` job(成本高,需授权与许可证);
- 或把"体积校验"固化为**提交前必跑的本地门禁**(`scripts/ci_local.py`,当前已是事实标准)。
**完成判据**:存在**强制的**体积校验路径(CI 侧或本地侧),且文档明确其边界。
> **注**:本项与 §2 C4(**S-1:defaultTask 栈 3664/4096 ≈ 10%**,需尽快处理)是同一话题的两面
> ——S-1 是**具体风险**,本项是**门禁缺口**。
---
## 4. 待验证与待确认
### 4.1 待验证
- **P0-1**(2026-09-18 修复:cfg_file C 库 `malloc` → `cfg_store_alloc/free/heap_free`,MCU 端 = FreeRTOS 堆,`CFG_HEAP_BUDGET=10,240B` 编译期预算 + 四条失败路径自检):真机 `@test` 一次,确认 `load: OK` 出现且 Forbidden `FAIL` 零命中(双端构建/`--cfgtest` 已绿;模拟器宿主堆照不出真机问题,真机正向确认是最后一道门)。
### 4.2 待确认(需手册/硬件/产品定义,暂不直接改码)
1. TPAFE5160 是否有自动扫描模式(决定 P1-1 定 P0 还是 P1)。
2. CH395F 手册 §9.2.1:`INIT_CH395` 是否锁存 MAC 寄存器(决定 P1-7 修复紧迫度)。
3. `APP_ADC_ENABLE` / `APP_RS485_ENABLE` 是否应在产品构建真实门控模块(关联 P1-1、P2-12、P3-11)。
4. RS-485 PD0 DE 的半双工方向语义需硬件实测确认(本次仅静态审查)。
---
## 5. 设计基线(供后续接入参考)
### 5.1 pending 二期设计基线(ACCEPT + SEND)
> **来源**:一期(RECV)架构现状见 `docs/网络/Net层阻塞模型架构设计.md`(含演进溯源附录);
> 本节仅保留**二期仍要用的设计基线**。
**一期已验证的机制骨架**(二期沿用,勿重新发明):独立静态 pending 表 + `net_pending_tick`
主循环节拍了结(五路:数据/到点/断连/同 fd 串行/重建取消必通知)+ 登记守卫(每 fd 至多一个、
不覆盖、拒绝 netTask 自等待)+ 1s 看门狗强结算。
**二期扩展点**:
| 项 | 目标 | 对应缺陷 |
|---|---|---|
| **ACCEPT pending** | accept 等待改为"登记 → CONNECT 事件完成",退役 100ms/200ms 轮询循环 | E-06(accept 轮询计时失真) |
| **SEND pending** | 发送续传改为"登记 → send_ready 完成",消除 1s/分片 stall 对队列的冻结 | E-02 残余(SEND 位置) |
**二期门禁**(一期门禁的加强版):
1. CH395F NET 层全套件(含一期未跑的 Phase 7 / Phase 10,视 RAM 预算);
2. L3/L5 基线重锁(一期已重锁 M3,二期须再锁);
3. `e02_probe.py` **探针族扩充**:close / reconfig / EOF / disconnect-during-pending 四专项;
4. `ftp_regression.py`(D20)+ E-06 假 425 场景**独立重跑**(一期是借 M3 压力档覆盖的);
5. UI 远端推流压力 + timeSync 三场景;
6. 产品 `@test` 闭环 + ST-LINK 全片回读;
7. `ram_report.py` / `stack_report.py` 前后对比(铁律);
8. 看门狗接 selftest 留痕 + 模拟器差距清单 +1(`net_socket_sim.c` 无法建模 pending)。
**已知代价(延续一期,需文档化)**:pending 完成判定随主循环节拍运行,被长操作占用时超时
顺延(~1ms 级);二期把 SEND 也 pending 化后,该顺延面反而**收窄**。
**改动量估算**:再 ~300-500 行,集中在 `net_socket.c`;公开 API 不变。风险评级**中**
(执行器核心 + D 系列前科)——**大的是验证,不是代码**。
### 5.2 错误码通道四要素(CH395F 范式)
> **来源**:`错误码传播审计.md`。GD5F 错误通道统一(E-10 / E-42 / E-53 / E-54 / E-56 / E-57)
> 即按此骨架落地(2026-10-03,套件回归 16/16 PASS)。**后续任何驱动 / 子系统建立错误通道时应沿用。**
```
① 分类:区分「超时 / 真故障 / 参数错」——不得混为一个返回码
② 透传:底层错误码逐层上报,不吞不猜(禁 `(void)ret`)
③ 分级:可恢复(重试)/ 不可恢复(上报自检 + 降级)显式判定
④ 留痕:不可恢复项写 syslog selftest,可恢复项计数并在 UI / 日志可见
```
**关键纪律**(呼应 `AGENTS.md` 已有铁律):**自愈逻辑严禁把"名字 / 参数类错误码"
归入"卷损坏触发集"**——`.fschk` 无限重格式化事故即此类(2026-09-20)。
---
## 6. 诊断基线(供后续对照)
> **2026-10-04 重采**:栈/堆 = **运行时高水位**(产品构建 `suite=NONE`,V5 30 min 真实负载,串口 `[STACK]`,
> 证据 `/tmp/v5_soak_serial_20261003.log`);静态区 = `.map` 受管快照。
> ⚠️ **栈水位较 2026-09-21 基线明显上升**(defaultTask 2136→**3664 B**、ftpTask 1184→**2516 B**),
> 系功能与加固陆续入链所致。**S-1 需尽快处理**,见 §2.3 C4。
| 项 | 当前值(2026-10-04) | 出处 |
|---|---|---|
| 产品构建 Flash (ER_IROM1) | 265,940 B / 1024 KB(25.4%);ROM 合计 **266,676 B** | `.map` 受管快照 |
| 产品构建 RW_IRAM1 | **84,960 / 131,072 B(64.8%)** | `.map` 受管快照(`RAM使用分析与优化方案.md` §2.1) |
| 产品构建 RW_CCM | 49,184 / 65,280 B(75.3%) | 同上 |
| 实测堆 | free=8,664 / **min_ever=4,728 B** | V5 串口 `[STACK] heap` |
| **defaultTask 栈峰值** | **3664 / 4096(余量 432 B ≈ 10%,⚠️ 低于 30% 判据)** | V5 串口 `[STACK]`(产品构建) |
| netTask 栈峰值 | 1228 / 4096(余量 70%) | 同上 |
| ftpTask 栈峰值 | 2516 / 4096(余量 38%) | 同上 |
| uiTask 栈峰值 | 4060 / 16384(余量 75%) | 同上 |
| timeSyncTask 栈峰值 | 792 / 2048(余量 61%) | 同上 |
| testTask 栈峰值(产品态空转) | 496 / 8192(余量 93%) | 同上 |
| 队列响应性(挂起客户端) | 92.5ms(pending 一期) | `e02_probe.py` |
| M3 压力档帧周期 | med 60.1 / p95 66.4 / max 69.3ms,零尖峰 | `链路延迟测试说明.md` |
---
## 7. 内存预算(支撑 §6 与定栈规则)
现行权威数据 = `docs/内存管理/RAM使用分析与优化方案.md` v1.2(2026-09-21,§2.1 受管快照):
任务栈在 CCM 堆(defaultTask 1024w / netTask 1024w / ftpTask 1024w / testTask 2048w / uiTask 4096w / timeSyncTask 512w);
产品构建 RW_IRAM1 84,960/131,072 B(64.8%)+ RW_CCM 49,184/65,280 B(75.3%);
实测堆 `free=8,664 / min_ever=4,728` B;台账工具 `scripts/ram_report.py` + `scripts/stack_report.py`。
**旧栈表/旧余量数字作废,勿引用。**
---
## 8. 维护约定
- 本文件是**全项目唯一的未闭环事项登记簿**——"盘点 + 排序 + 明细"三合一,明细不再分散到多份文件。
- **任一项完成后直接删除对应条目**(先销本文件条目,再清理其它文档对本编号的引用);
**不留变更记录**,历史见 `git log` 与各模块文档。
- 已闭环条目的**结论与证据沉淀进模块文档**,本文件不再重复。
- 编号一律**沿用且不回收**(P-x / N-x / S-x / T-x / S1x / A-x);`错误码传播审计.md` 的 E-xx 独立维护。
- 阶段 B 完成后重写 §1(届时 ADC/RS485 应从未闭环消失)。
- 新增发现按既有惯例分流:能立即修的进 §2 阶段 A/C5;需排期的进 §3 对应编号空间;跨版本观察的进 §3.4。
- 上游引用关系:`项目审查与优化建议报告.md`(体系层评审)、`错误码传播审计.md`(E-xx)、
`测试说明/实机测试实施指南.md`(执行流程)——三者均不在本文件合并范围。
@@ -5,8 +5,8 @@
> **已完成事项**(S7、A1~A4)的实施细节与证据**不在本文**,见对应模块文档(§10 状态与去向)。
> **前置铁律**:本文所有步骤**均在接上 MCU / 串口 / ST-LINK 之后**执行;
> 无实机时**只读本文,不执行任何烧录**。
> **上游**:`错误码传播审计.md`(E-xx)· `审查记录/测试与架构改进建议.md`(专项待办)·
> `审查记录/下一步任务规划.md`(任务排序)· `待处理内容.md`(登记簿)·
> **上游**:`错误码传播审计.md`(E-xx)· `待处理内容.md`(统一登记簿:P-x / N·S·T-x /
> S1x·A-x / 阶段排序 / 诊断基线)·
> `子系统设计/看门狗设计说明.md`(§10 台架步骤)。
> **约定**:本文事项完成后**先销上游登记**,再在文末变更记录留一行;
> 结论与证据沉淀进对应模块文档/问题记录(2026-10-02 台架窗口的完整取证链——
@@ -191,7 +191,7 @@ $cli = if ($env:DTU_STLINK_CLI) { $env:DTU_STLINK_CLI } else { (Get-Command ST-L
> **顺带修复(编排器缺陷,非本次代码引入)**:`run_all_suites.py` 原对所有套件统一 `--forbidden "HardFault;assert;[ERR]"`,而 GD5F 的 `TC-GD5F-704`(CCM 非 DMA 可达缓冲)会**预期**打出 `[ERR][NAND] RX DMA buffer not DMA-reachable ... fallback poll`(用例 PASS)→ GD5F 套件**永远被判 FAIL**(自 `2055de0` 起)。按 `verify_log.py` 的说明改为**按套件覆盖 `--forbidden`**(GD5F = `HardFault;assert`),修复后 PASS。
> **来源**:`错误码传播审计.md` 第二档 #1(E-10/E-42/E-53/E-54/E-56/E-57);
> `测试与架构改进建议.md` §3.1 四要素骨架(设计基线)。
> `待处理内容.md` §5.2 四要素骨架(设计基线)。
**现状证据**:`ch395f.c`(1330 行) 与 `gd5f2gq5ue.c`(1496 行) 是同代驱动,但**只有 CH395F**
形成了"分类 + 传播 + 审计"完整体系;GD5F 错误处理散落各函数,`Trap_Records` 仅 198 行。
@@ -437,7 +437,7 @@ CH395F / STORAGE / GD5F,未含 RTC;怀疑 RTC 构建下 `testTask` 不被创
| S11 堆告警 | —(原复审项,已闭环 2026-10-03) | `内存管理/RAM使用分析与优化方案.md`(基线更新) |
| S9 GD5F | `问题记录/错误码传播审计.md` 第二档 #1 | `问题记录/GD5F2GQ5UE_Trap_Records.md`、`测试说明/GD5F2GQ5UE_Test_Guide.md` |
| N-2 日志静默 | `待处理内容.md` N-2 | `问题记录/错误码传播审计.md` E-02 |
| P1-8 网络重建 | `审查记录/项目审计改进清单.md` P1-8 | `网络/Net层阻塞模型架构设计.md` |
| P1-8 网络重建 | `待处理内容.md` P1-8 | `网络/Net层阻塞模型架构设计.md` |
| S5/S4 | —(原复审项,已闭环 2026-10-03) | `测试说明/测试开发标准流程.md` |
| 模拟器差距 | `测试说明/模拟器差距清单.md` §3 决策规则 | 本文为"需回真机"项的执行面 |
+1 -1
View File
@@ -3,7 +3,7 @@
> **用途**:把散落在各子系统文档里的"模拟器无法建模 X"汇成**单一事实源**,回答一个关键问题——
> **模拟器回归通过 ≠ 真机通过,那么差在哪?差多少?哪些必须真机补测?**
> **性质**:**登记册**(living document)。新增模拟器后端差异时必须在此登记一行,不得只写在别处。
> **上游依据**:`审查记录/下一步任务规划.md` §3.1(N-4 二期门禁)。
> **上游依据**:`待处理内容.md` §5.1(N-4 二期门禁)。
> **相关**:`UI设计/LVGL模拟器部署与使用说明.md`(部署与使用)、`simulator/README.md`(目录与架构)、
> `测试说明/测试开发标准流程.md`(L3 门禁在测试分层中的位置)。
@@ -9,7 +9,7 @@
> `docs/网络/BSD_Socket_API_使用指南.md`(应用视角 API 语义)、
> `docs/网络/BSD_Socket_API_函数调用关系.md`(调用链与执行域)、
> `docs/测试说明/链路延迟测试说明.md`(延迟基线与故障对照)、
> `docs/审查记录/下一步任务规划.md` §3.1(二期 ACCEPT/SEND 扩展设计)
> `docs/待处理内容.md` §5.1(二期 ACCEPT/SEND 扩展设计)
---
@@ -147,7 +147,7 @@ CONNECT → ESTABLISHED 是合法迁移,推断取消会误杀正在建链的
| **模拟器不可建模** | `net_socket_sim.c` 单线程 Winsock 无法复现挂起模型 | 该路径在模拟器上零覆盖,只能硬件验证 |
**二期扩展设计**(ACCEPT / SEND 的挂起化、门禁清单、改动量)见
`docs/审查记录/下一步任务规划.md` §3.1。
`docs/待处理内容.md` §5.1。
---