diff --git a/docs/测试说明/主机单测覆盖率口径.md b/docs/测试说明/主机单测覆盖率口径.md index b72975e5..89bd2cad 100644 --- a/docs/测试说明/主机单测覆盖率口径.md +++ b/docs/测试说明/主机单测覆盖率口径.md @@ -77,7 +77,8 @@ 编译失败、XML 缺失)/ `3` 用法错误。全量实测约 **67 s**(33 套 × 编译 + 插桩运行; 2026-10-25 实测;16 套时约 25 s、28 套时约 45 s,套件数涨了耗时就涨,别拿旧数当预算)。 -中间产物(exe / PDB / Cobertura XML)一律落 `%TEMP%\dtu_test_cov\<模块>`,**不进仓库**, +中间产物(exe / PDB / Cobertura XML)一律落 `%TEMP%\dtu_host\<工作树哈希>\coverage\<模块>` +(与主机单测同根、按树分家,2026-10-25 起;改根用 `--work-dir` 或 `DTU_HOST_BUILD`),**不进仓库**, 所以本脚本不需要新增任何 `.gitignore` 规则。 ## 4. 统计面:进什么、不进什么 @@ -673,11 +674,13 @@ uint16_t ch395f_link_change_count(void); 既有三套的复位面与断言面一字不动、新状态也不会场景间残留。改完必跑存量回归(本批 net_listener 34/34、 net_events 34/34、net_pending 43/43、net_select 22/22;nand_port 149/149、lftpd_io 33/33、vol_lock 33/33、 soe 32/32、cfg_file 151/151)。 -12. **覆盖率中间产物根目录是固定共享的** `%TEMP%/dtu_test_cov/<模块名>`:并行期每人只跑 `--module <自己模块>` - (子目录互不冲突);**绝不加 `--clean`**(它 `rmtree` 整棵共享根,会把队友正在编译的目录连根删掉, - 表现为"莫名其妙的编译失败、重跑就好");**不带 `--module` 的全量闸只在收口时由 Lead 单跑**。 - 另注:逐套 `run_unit_test.py` 写的是固定 `tempfile/_obj` 与 `.exe`,所以**同一套件同一时刻 - 只能一人跑**(不同套件互不干扰)。 +12. **产物目录已按工作树分家(2026-10-25,adabb6a)**:主机单测与覆盖率的中间产物统一落 + `%TEMP%/dtu_host/<仓库根 sha1 前 10 位>/`,且**每次运行独占 `runs/-<纳秒>/` 子目录** + (obj+exe 在内,finally 删除;`DTU_HOST_BUILD` 改根、`DTU_HOST_BUILD_KEEP=1` 保留现场)。 + 并行期**不再需要**"每人只跑 `--module` 自己模块",同树并发跑同名套件也不再撞 obj/exe; + 旧固定共享名 `%TEMP%/dtu_test_cov/` 与固定 `_obj`/`.exe` 一并作废,`--clean` + 改为只清本工作树根。**判据正文** = `test/host/common/unit_test_harness.py` 顶部「产物目录归属」。 + ⚠ 加锁**不是**解法:这里没有真独占资源,只是名字撞——加锁等于把 L0.5 全局串行化。 **两处口径问答(免得下次重新推导)**:① 子集数不能和并集基线直接比 —— `soe_store` 单套对 `App/log/soe_rec.c` 只到 78/87(89.7%),而台账是全部 33 套的**并集** 81/87(93.1%);本批 diff --git a/docs/环境与部署/并行任务工作树方案.md b/docs/环境与部署/并行任务工作树方案.md index fd3dee0f..32ac06ef 100644 --- a/docs/环境与部署/并行任务工作树方案.md +++ b/docs/环境与部署/并行任务工作树方案.md @@ -121,6 +121,7 @@ D:/Code/DTU Code/ | ------ | -------------------------------------------- | ----------- | | `new` | 建分支 + 工作树 + junction + 台账 | 可并行 | | 编码 | 在新空间里改代码 | 可并行 | +| 单测产物 | `%TEMP%\dtu_host\<工作树哈希>\` 分家 + 每跑独占 `runs\-\` | **不需要锁,但必须按树分家**(旧固定共享名跨树互踩:A 树可能执行 B 树编出的同名 exe,summary 相同不可辨;build/bench 是真独占,继续用锁) | | 门禁 | `scripts/ci_local.py`(L0 + L0.5,纯软件) | **可并行** | | 构建 | `@build`(UV4 增量,需持 `build` 锁) | **必须串行** | | 台架 | `@test` / 板级套件(需先持台架锁,见 §7) | **必须串行** | diff --git a/docs/门禁说明/cubemx-survival.md b/docs/门禁说明/cubemx-survival.md index b84cd416..b9f8fcec 100644 --- a/docs/门禁说明/cubemx-survival.md +++ b/docs/门禁说明/cubemx-survival.md @@ -62,6 +62,12 @@ CubeMX 重生成存活审计.......Failed 5. 基线文件是 `.cubemx_survival_baseline.json`(仓库根):它若被顺手 `--write`,门禁当场失效且看不出来。 **`--write` 必须与"确认过的改动"写在同一个提交里并说明。** 6. 它不判断定制**是否仍然正确**,只判断"还在不在原来的位置"。 +7. **基线漏项 = 静默不检**(2026-10-25 实证):`--check` 只比对基线里已登记的条目——一条定制 + 若从未进过基线,检查面再全也不会报它。`docs/任务规划/测试与架构专项.md` P1-10 返工时 + `--write` 顺带补出了原本缺失的 + `net-msgq-adopt`(`Src/freertos.c` RTOS_QUEUES 区须含 `net_msg_queue_adopt`),该条目此前 + 处于"不存在于基线 → 永不检查"态。**新增标记区外定制时,登记必须与代码同提交**(同 §5 的 + `--write` 同提交纪律),收口时值得跑一次"`--write` 后看 diff 有没有**新增**条目"的抽查。 - 标记区**外**的存量只给 WARN(本仓现存:`Src/stm32f4xx_it.c` 的 3 个 Fault 处理函数、 `Src/freertos.c` 的栈注释)——CubeMX 不保护它们,只能人工盯。 diff --git a/docs/门禁说明/id-check.md b/docs/门禁说明/id-check.md index b51d5915..8defabbe 100644 --- a/docs/门禁说明/id-check.md +++ b/docs/门禁说明/id-check.md @@ -65,6 +65,10 @@ ## 5. 好处 +- **拦下过真事(2026-10-25 追加)**:`docs/任务规划/测试与架构专项.md` P1-10 的返工提交被 + **校验 6** 拦下 4 处——C 注释里裸写编号、未紧邻属主文档名;改成「条目属主 `docs/任务规划/测试与架构专项.md` P1-10」即过。 + 实证**紧邻写法在代码注释里同样是硬约束**,不是只约束 Markdown。 + - 把"编号卫生"从人脑记忆变成机器判定:销项只做一半、引用写错文档、自造号,都会在提交时被点名。 - 台账机制让存量不阻塞日常工作,同时"无台账外新账"这句话是可验证的承诺。 diff --git a/test/board/ch395f_test.h b/test/board/ch395f_test.h index 0891e01b..dd47dd71 100644 --- a/test/board/ch395f_test.h +++ b/test/board/ch395f_test.h @@ -113,6 +113,12 @@ extern "C" { * [WD] task stall 刷屏 468 条(**设计外**:HW 层构建的必需心跳掩码没生效, * 因为 App/util/task_watchdog.c 未 include test_config.h,看不到本文件的 * ENABLE_HW_LAYER_TESTS → 那段剔除 netTask 的分支自加入起就是死代码)。 + * 修复后复跑(同日 f3 镜像 05:51:31 戳,boot log 20261025_055725):VERDICT PASS—— + * 三段汇总 9/9、1/1、21/21,身份戳核对 + 烧后回读一致,六标签判据零命中; + * [WD] task stall 468→14:net 类 431→0(task_watchdog.c 补 include 后掩码复活实锤), + * 余 14 条 = 13 x mask=0x1F7(netTask 自挂起前喂那一次 vs 精确匹配判据的语义打架, + * 非缺喂)+ 1 x mask=0x1E5(uiTask 首个喂狗窗未到的瞬态),另有 1 条设计内 P2 留痕。 + * Lead 裁决不放宽超集判定:全部属测试固件态,产品判据 req=0x1F7 无死分支不误报。 * 该条目关心的 PHASE5 三块静态缓冲(3 x PHASE5_CHUNK_SIZE = 4093)确实进了链接: * hw_full 的 ch395f_test_task.o 数据段 = 12,285 B(3 x 4093 = 12,279 + 其余 6 B)。 * "理论余量足够"由未实测转为已实测:最坏态还余 29,634 B,不必把 .sct 扩到 192 KB