待处理内容(登记簿):删除已闭环项,只保留未闭环项

按用户要求(与 下一步任务规划.md 同一要求),登记簿只保留未闭环项:
- 删 S-6(dhara resume 回滚,✅ 已修)。
- 删「可靠性与自恢复」整节(N-03/N-03a/c/d/e 均 ✅;N-03b 为已接受的显式代价,非待办)。
- 删「测试与验证基础设施」的「已销项 T-1~T-6」块与空表。
- N-2 行精简(去掉验证叙事,保留结论 + 残余待办)。
- 新增 T-7:CI runner 未就绪(部署前置,原为区块内提示,改登记为正式待办)。
- 抬头补一句「本表只保留未闭环项,已闭环项不保留、不留变更记录」。

按登记簿「同步清理其他文档对本编号的引用」约定,修正悬空指针:
- 看门狗设计说明.md:抬头状态(原「待台架验证」已过时 → ✅ 已闭环,去掉 N-03 指针);
  §后续项去掉 N-03 指针。
- 实机测试实施指南.md:§4 来源去掉 N-03;§10 V2/V4/V5 下游改为设计说明变更记录。
- 看门狗单元测试说明.md:分工表两处「⏳ 待台架(N-03 V2/V4/V5)」→ ✅ 已台架验收。
(历史变更记录中「T-6/T-1 销项」等属当时记录,保留不改。)

验证:pre-commit --all-files 17/17 Passed。
This commit is contained in:
2026-10-04 01:48:50 +08:00
parent e7442cc73f
commit 7531eb9b89
4 changed files with 22 additions and 56 deletions
@@ -1,11 +1,12 @@
# 看门狗设计说明
> **模块名称**:独立看门狗(IWDG)+ 任务心跳位图
> **文档定位**:**实施中**——记录选型依据、在既有平台上落地的约束、实现现状与
> 待台架验证项。**代码骨架已落地并编译通过**(§10 第 0~6 步);第 7~10 步
> (故障注入 / 长跑 / 本文档转为"现状设计说明")待台架。
> **状态**:🚧 代码已落地(`@build` 0/0),**待台架故障注入与长跑验证**;登记于 [`../待处理内容.md`](../待处理内容.md) N-03
> **日期**:2026-09-29
> **文档定位**:**现状设计说明**——记录选型依据、在既有平台上落地的约束、实现现状与
> 台架验证结论。**代码已落地并编译通过**(§10 第 0~6 步);**第 7~10 步(故障注入 / 长跑 /
> 本文档转为"现状设计说明")已于 2026-10-03 台架闭环**(见 §10 与文末变更记录)。
> **状态**:✅ **台架验证已闭环(2026-10-03)**——V2 任务饿死声明 stall 后 ≤2.5s IWDG 复位、
> V4 关中断死循环每 ~4.9s 稳定复位、V5 30 min 真实负载 120/120 FTP PASS 零复位。
> **日期**:2026-09-29(2026-10-03 台架验收)
> **相关文档**:
> [`../审查记录/项目审查与优化建议报告.md`](../审查记录/项目审查与优化建议报告.md)(N-03 缺陷原始登记)、
> [`../审查记录/下一步任务规划.md`](../审查记录/下一步任务规划.md)(排期)、
@@ -668,7 +669,7 @@ void task_wd_poll(void)
1. 串口标记已经能支撑 `@test` 判定与人工归因,`run.log` 的价值在于**长期累计**;
2. 写 `run.log` 涉及 UI 字符集("看门狗"三字是否在位)与既有 600 s 时间窗分类逻辑,
改动面比串口上报大,**留作二期**(`待处理内容.md` N-03 后续项)。
改动面比串口上报大,**留作二期**(本模块后续项,暂未登记)。
**二期计划**(复位原因映射表,优先级见 §4.8):
+9 -44
View File
@@ -4,71 +4,36 @@
> (或 A/B 归因为既有问题)的事项,在此留档防丢失。每项带发现日期、证据与出处。
> **消化即销项**:事项修复/关闭后,**直接从本表删除该行**(结论与证据应已沉淀进
> 对应模块文档/问题记录,此处不再保留),并同步清理其他文档对本编号的引用。
> **本表只保留未闭环项**——已闭环项不保留、不留变更记录(历史见 `git log` 与各模块文档)。
> **创建**:2026-09-22(L3 pending 台架收尾时建立,AGENTS.md 既有引用自此落文件)。
## 网络(CH395F / net 层)
| # | 事项 | 发现 | 证据与现状 | 出处 |
|---|---|---|---|---|
| N-2 | **49s 全系统日志静默(defaultTask/NAND syslog 排空停滞)**——串口日志 49s 无行(testTask 10s 周期行/netTask 事件行/[STACK] 行全缺),期间 net 栈照常处理外部连接(FTP banner 92ms)→ 日志管线(defaultTask 排空 → NAND+UART)停滞,队列满后各任务日志行被丢;系统功能不受损 | 2026-09-22 17:23:52~17:24:41(L3 台架 F2 运行中,gen 181) | **A/B 归因:L3 不触碰 defaultTask/syslog 路径 → 既有存储侧现象**。**2026-10-03 V5 核实(降级为低风险观察项)**:① 丢弃可观测性**代码已有**——`console_log.c` 的 `s_con_drop` 计数 + 排空末尾 `[ERR] CONSOLE dropped N lines` + `dbg_console_dropped()`;`sys_log_mcu.c` 队列满/preboot 满分别 `DBG_ERROR("queue full/preboot full, drop: …")`;UART TX 卡滞由**僵尸通道自愈**覆盖(`con_uart_reinit` + `s_con_tx_fault`)→ "现静默丢行、排障不可见"**已不成立**;② V5 30 min 日志间隔分析**未复现 49s**(最大静默 41s 且在**开机/烧录边界**;运行期 24 处 >10s 静默**全为 ~28s、均在 `e02_probe` 的 time_sync 30s 窗口内**= N-17 同源)。残余:③ 与 S8(非阻塞日志)合并评估;若再现,借 `[ERR] CONSOLE dropped` 计数定位卡点 | `错误码传播审计.md` E-02 阶段二"台架新发现②";`链路延迟测试说明.md` §6.7 注;`实机测试实施指南.md` §7.2 |
| N-3 | **L5 队列往返基线(1223/988µs)的 L3 后重验**——L5 测 DONTWAIT 队列全程;L3 对该路径逐位不变、pending tick 无 pending 时为 µs 级指针读 → 机制上无影响,但基线数值属分片时代,严格重锁需跑一轮 Phase 13(需 PC peer) | 2026-09-22(L3 收尾留档) | 低风险:10ms/100ms 阈值余量 >8×;下次 Phase 13 窗口顺带重锁即可 | `链路延迟测试说明.md` §6.4 L5 注¹ |
| 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 注¹ |
## 存储 / 日志管线
| # | 事项 | 发现 | 证据与现状 | 出处 |
|---|---|---|---|---|
| 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%)**——较 09-21 基线 2136B / 09-22 的 2872B 持续上升(A2/A3/A4 + IWDG + 卷锁 + 堆告警陆续入链),**已远低于 30% 判据**。处置方向二选一:栈 4096→4608(CCM 堆余量可覆盖 +512B)或 GC 链缓冲局部削减;建议**提前到阶段 B(ADC/RS485)之前**处理 | `/tmp/v5_soak_serial_20261003.log`(`[STACK] default peak_used=3664/4096`);`下一步任务规划.md` §2 C4 / §4 |
| 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 误复位"的**机制根源**。现仅有缓解(round-3 单次 drain 250ms 预算 + round-6 发送故障后 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);`App/log/console_log.c` 2026-10-02 修改记录 |
| 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}` |
| S-6 | ~~**dhara resume 回滚:复位后所有写入全部丢失**~~ | 2026-10-02(round 9 取证) | ✅ **已修**:`dhara_journal_resume()` 的 epoch 锚点改为比较两个候选 epoch(回绕后锚"低地址=最新")。详见 `架构设计/STM32F4-Base存储架构说明.md` §5.4.1。判定手法已固化为开机日志 `Map head=… tail=… epoch=…` | `Lib/dhara/journal.c` 2026-10-02 本地修复注释 |
## 网络(二期排期,随第二档 #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)已落地并入主线:`a45c0cb`(+文档闭环 `7ff2958`);架构现状见 `Net层阻塞模型架构设计.md`,二期设计基线与门禁见 `下一步任务规划.md` §3.1 | 同左 + `错误码传播审计.md` 第二档 #2 |
| N-16 | **A2/A4 专项场景台架验证待办**(正常路径已实测零回归,2026-10-03):① PHY 拔线负向测试——断链需断 **DTU 侧**线缆或关**受管交换机端口**(拔交换机侧线缆链路仍 UP,CH395 对交换机拓扑),断链后复位验证 `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 但未复位)**——2026-10-03 V5 长跑(FTP+e02_probe,30 min)期间 44 次 `task stall: mask=0x00000001`(NET/FTP/UI/TIMESYNC 四位同时缺席 ≥800ms),**100% 与 `e02_probe` 的 30s 挂起客户端触发 `time_sync: no TIME packet in 30s, drop conn` → 监听重建(`time_sync: listen FAIL`×2,约 4s)重合**;隔离实验(仅 FTP、无探针,120s)**0 次 stall** → 该停摆为**探针场景专属**。缺口(~1s)< IWDG 最坏超时(1701ms)故未复位,但余量仅 ~0.7s。**待办**:定位监听重建为何阻塞 NET/FTP/UI(疑 CH395F socket 释放 / `net_listen` 重试期间的队列头阻塞,与 E-02 同源);评估缩短重建重试(5×2s)或让掉线路径不阻塞其它任务 | 2026-10-03(V5 台架;证据 `/tmp/v5_soak_serial_20261003.log`) | `实机测试实施指南.md` §4;`子系统设计/看门狗设计说明.md` 2026-10-03 变更记录 |
## 可靠性与自恢复
| # | 事项 | 说明 | 出处 |
|---|---|---|---|
| N-03 | **引入独立看门狗(IWDG)+ 任务心跳位图**——现状全库无看门狗(HAL 驱动源码也不在仓库),任何形态死机不可自恢复;另 `configASSERT` 为关中断死循环(连日志都不打)。**代码已落地并编译通过(2026-09-29)**:CubeMX 生成 IWDG(Prescaler=64/Reload=1249)+ `App/util/task_watchdog.{c,h}` 心跳位图 + 6 任务埋点 + `RCC_CSR` 复位原因锁存 + `configASSERT` 改造 | ✅ **台架验证已完成(2026-10-03)**:V2(任务饿死)声明 stall 后 ≤2.5s `reset cause: IWDG`;V4(关中断死循环)每 ~4.9s 稳定 IWDG 复位(独立于中断);V5(30 min 真实负载)120/120 次 FTP PASS、零复位。文档 §10 第 7~10 步已闭环 | **见 [`子系统设计/看门狗设计说明.md`](子系统设计/看门狗设计说明.md)**(§10 有实施状态表) | `审查记录/项目审查与优化建议报告.md` N-03a/b/c |
| N-03a | `configASSERT(x)` = `taskDISABLE_INTERRUPTS(); for(;;);`(`Inc/FreeRTOSConfig.h`)→ 断言时无任何输出 | ✅ **已修(2026-09-29)**:改为 `vApplicationAssertFailed(__FILE__, __LINE__)`,打印文件名+行号后主动复位(`Src/freertos.c`);宏已迁入 `USER CODE BEGIN 1` 区防重生成丢失 | 同上 N-03b |
| N-03b | 启动段(`app_main_init` + `defaultTask` bring-up)在新方案下**无看门狗保护** | 显式代价(未变):`看门狗设计说明.md` §4.5 决策 C + §9 R1;该段死机表现为"无输出 + LED 不闪" | 同上 N-03c |
| N-03c | **CubeMX 重生成会覆盖 `USER CODE` 标记区之外的定制** | ⚠️ **2026-09-29 两次重生成实测确认**:首次覆盖 4 处、第二次覆盖 5 处(P0 `Src/iwdg.c` 自动启动、P1 `HardFault_Handler` 打回空死循环、P1 `FreeRTOSConfig.h` 两个加固宏被删、P2 `freertos.c` 中文注释)。✅ **已建立自动检出**:`scripts/check_cubemx_survival.py`(18 项清单 + 哈希基线,已挂 pre-commit)——第二次实测**准确检出全部 5 处**。⚠️ 关键发现:CubeMX **换了一代中断模板**,"生成区外的自造标记区"同样不被保留(详见设计文档 §10.1)。**今后每次重生成后跑一次该脚本即可** | 本次实施记录 |
| N-03e | 判定状态机**缺主机侧纯逻辑回归**(改动后只能靠真机/模拟器才发现回归) | ✅ **已落地(2026-10-01)**:硬件访问收敛到薄平台层(`App/util/task_watchdog.h` 末段声明 3 个 `__weak` 钩子),新建 `test/host/watchdog/` 单元测试(39 用例,`#include` 生产源码 + 强符号覆盖钩子),挂 pre-commit `watchdog-unit-test` 钩子。MCU 端行为零变化(`@build` 0/0)。新增测试分层 **L0.5** | 见 [`测试说明/看门狗单元测试说明.md`](测试说明/看门狗单元测试说明.md) |
| N-03d | 3 个次要 Fault(`MemManage`/`BusFault`/`UsageFault`)为空 `while(1)`,死机静默 | ✅ **已修(2026-09-29)**:升级为与 `HardFault` 同一套崩溃采集(手工 `__asm` Handler → per-fault C 入口 → `hard_fault_report(tag, frame)`,日志打 `[ERR] MEMFAULT/BUSFAULT/USAGEFAULT + 全量现场`);新增 `fault_handler_enable()` 使能 `SHCSR` 后三者(默认只开 HardFault,否则故障被升级、看不出根因),在 `app_main_init()` 第一行调用。**刻意不启用** `UNALIGN_TRP`/`DIV_0_TRP`(避免把普通 bug 升级成死机)。`@build` 0/0;审计 18 通过 / 1 警告 / 0 失败 | 见 [`子系统设计/看门狗设计说明.md`](子系统设计/看门狗设计说明.md) §10.2 |
| 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` |
## 测试与验证基础设施
> **来源**:2026-10-01 测试架构评审(L0.5 主机侧单测落地后的复审)。
> P0/P1 属闭环缺口(会漏检真实故障),P2 属工程效率(减重复、降误提交概率)。
> 实施依据见 [`测试说明/测试开发标准流程.md`](测试说明/测试开发标准流程.md);消化即销项。
>
> **已销项(2026-10-01,同日实施)**:
> - **T-1(P0)**:`scripts/check_test_suite.py` + pre-commit 钩子 `test-suite-switch`
> ——默认要求产品构建,跑套件回归用 `--allow-test-build` 显式放行。
> **顺带修复**:`test/board/test_config.h` 长期开启的 `TEST_SUITE_CH395F` 已注释(现为产品构建)。
> - **T-2(P1)**:`verify_log.py` / `run_boot_test.py` 新增 `--require-suite-summary`
> ——要求 `=== <名称>: N/M PASSED (failed=0) ===` 且 `N>0`。
> - **T-3(P1)**:通用 harness `test/host/common/unit_test_harness.py`;
> 看门狗运行器 170 行 → 55 行声明式。
> - **T-4(P2)**:`test/board/test_common.h` 集中断言内核,4 套件绑定自身统计变量。
> - **T-5(P2)**:`test/run_all_suites.py` 多套件编排(`try/finally` 无条件还原开关)。
> - **T-6(P3)**:**Gitea Actions CI 落地(补办,2026-10-01)**。远程为 Gitea 1.25.4(`gitea.bitnasdaq.vip/wandering1/STM32F4-Base.git`),已启用 Actions →
> 新增 `.gitea/workflows/ci.yml`:**两个 Windows job**,`l0-gates`(`pre-commit run --all-files`,检测不到 Keil `.map` 时自适应跳过 `mem-numbers`)+
> `l05-host-unit-tests`(遍历 `test/host/**/run_unit_test.py`,缺 MSVC 则打 WARNING 降级跳过)。**刻意不跑 `@build`**(需 Keil 授权)。
> 另新增 **`scripts/ci_local.py`**(本地跑与 CI 等价的门禁,自动选用装了 pre-commit 的解释器;退出码 0/1/2 与 CI 对齐)。
> 登记依据见 [`测试说明/测试开发标准流程.md`](测试说明/测试开发标准流程.md) §9;覆盖边界与"刻意不含项"见该节与 `../.gitea/workflows/ci.yml` 文件头。
> ⚠️ **部署前置(未完成,需人工确认)**:CI 仅在 runner 就绪后才真正生效——
> ① Gitea 实例 `[actions] ENABLED = true`;② 注册一个 **Windows runner(labels 含 `windows`)**,装 Python 3.x / cppcheck / pre-commit / MSVC(VS C++ 工具链 + Windows SDK)。
> runner 未就绪前,**提交前仍须在本地跑 `scripts/ci_local.py` 或 `pre-commit run --all-files` 自查**(这是 L0 的唯一保障,不能因"已配 CI"而放宽)。
| # | 事项 | 优先级 | 问题与证据 | 处置方向 | 出处 |
|---|---|---|---|---|---|
| (暂无待办) | — | — | — | — | — |
| 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 |
@@ -103,9 +103,9 @@
> V2/V4/V5 三用例全部通过——V2(任务饿死)声明 stall 后 ≤2.5s `reset cause: IWDG`;V4(关中断死循环)每 ~4.9s 稳定 IWDG 复位(IWDG 独立于中断);V5(30 min 真实负载)**120/120 次 FTP 传输全 PASS、零 IWDG 复位**。
> **遗留观察**:V5 期间 44 次 stall 声明 100% 与 `e02_probe` 探针的 time_sync 30s 掉线+监听重建重合;隔离实验(仅 FTP 120s)**0 次 stall** → 探针场景专属,非一般负载误杀(已登记 `待处理内容.md`)。
> 来源:`子系统设计/看门狗设计说明.md` §10 步骤 7~10;`待处理内容.md` N-03。
> 来源:`子系统设计/看门狗设计说明.md` §10 步骤 7~10。
> 判定状态机与 IWDG 配置(PR/RLR 按设计值写入)已落地并经真机验证(2026-10-02,`930215f`,
> 见设计说明 2026-10-02 变更记录);缺的是下述**故障注入 + 长跑**验收。
> 见设计说明 2026-10-02 变更记录);故障注入 + 长跑验收结论见上文 2026-10-03 段落。
### 4.1 三个验收用例
@@ -433,7 +433,7 @@ CH395F / STORAGE / GD5F,未含 RTC;怀疑 RTC 构建下 `testTask` 不被创
| 本文项 | 上游文档 | 下游落地文档 |
|---|---|---|
| S7 自检判定 | `审查记录/测试与架构改进建议.md` §3.7 | `测试说明/自动化测试流程.md`(参数已落地,`4a4cd29`) |
| V2/V4/V5 | `子系统设计/看门狗设计说明.md` §10 | `待处理内容.md` N-03(销项) |
| V2/V4/V5 | `子系统设计/看门狗设计说明.md` §10 | `子系统设计/看门狗设计说明.md` 变更记录(2026-10-03) |
| S11 堆告警 | `测试与架构改进建议.md` §4.4 | `内存管理/RAM使用分析与优化方案.md`(基线更新) |
| S9 GD5F | `问题记录/错误码传播审计.md` 第二档 #1 | `问题记录/GD5F2GQ5UE_Trap_Records.md`、`测试说明/GD5F2GQ5UE_Test_Guide.md` |
| N-2 日志静默 | `待处理内容.md` N-2 | `问题记录/错误码传播审计.md` E-02 |
@@ -93,7 +93,7 @@ test/host/watchdog/watchdog_test.c
| **门禁层级** | **L0.5 层**(介于 L0 静态门禁与 L1 板端套件之间):主机侧、秒级、纯逻辑,比板端套件便宜、比静态检查更强 |
| **pre-commit 钩子** | `watchdog-unit-test`(本地钩子,`.pre-commit-config.yaml` §7) |
| **汇总行** | `=== Task Watchdog Tests: N/N PASSED (failed=0) ===` |
| **与板端测试的关系** | 互补:本单测保证**判定逻辑**正确;板端 `@test` 故障注入(`docs/待处理内容.md` N-03 V2/V4)保证**真机复位链路**正确 |
| **与板端测试的关系** | 互补:本单测保证**判定逻辑**正确;板端 `@test` 故障注入(V2/V4,见 `子系统设计/看门狗设计说明.md` §10)保证**真机复位链路**正确 |
---
@@ -168,8 +168,8 @@ if (s_miss_streak >= WD_MISS_TOLERANCE) { DBG_ERROR("[WD] task stall: ..."); }
| 层 | 覆盖 | 状态 |
|---|---|---|
| **本单测(L0.5)** | 判定状态机全部逻辑分支与边界 | ✅ 已落地 |
| 板端故障注入(L1/L2) | 真机:单任务卡死 → 停喂 → IWDG 真复位 → `RCC_CSR` 记 `IWDGRSTF` | ⏳ 待台架(`docs/待处理内容.md` N-03 V2/V4) |
| 长跑(L2) | ≥30 min 无假复位(`miss_count` 稳定) | ⏳ 待台架(N-03 V5) |
| 板端故障注入(L1/L2) | 真机:单任务卡死 → 停喂 → IWDG 真复位 → `RCC_CSR` 记 `IWDGRSTF` | ✅ 已台架验收(V2/V4,2026-10-03) |
| 长跑(L2) | ≥30 min 无假复位(`miss_count` 稳定) | ✅ 已台架验收(V5,30 min / 120×FTP 零复位,2026-10-03) |
> 本单测**不能**替代板端验证:IWDG 实际溢出时间、LSI 频率漂移、`SHCSR`/复位原因
> 寄存器的真机行为,仍需 `@test` 台架闭环确认。