fix(WD): HW 测试模式掩码死分支复活——include 缺失自 7feeea6

结论先说:wd_required_mask() 里那条"硬件层测试构建剔除 netTask"的分支,自它被写进
仓库那天起**从未生效过**——不是逻辑错,是本编译单元根本看不见判据宏。台架一轮
(2026-10-25,boot log 20261025_050539)把它照出来了:
  - 468 条 [ERR][WD] task stall 里,**431 条是 mask=0x1F5 / req=0x1F7**;
  - 0x1F5 恰好等于那条死分支本该要求的集合(default|ftp|ui|timesync|adc|iec104|
    protect,NET 位不在内)——该动的任务全动了,只是"要求方"看不见自己的例外,
    于是按产品掩码 0x1F7 追 netTask 的心跳位;而 netTask 在 ENABLE_HW_LAYER_TESTS
    下按设计入口自挂起(CH395F 归 testTask 独占),永远追不到。
根因:ENABLE_HW_LAYER_TESTS 定义在 test/board/ch395f_test.h(经 test_config.h 拉入),
而本文件没有 include 任何一条通往它的路径 → #if defined(...) 在本 TU 恒为假 → 死代码。
同一个需求早有既有做法:App/task/net_task.c:39 就为这个宏 include 了 test_config.h,
注释还写着"产品构建全未定义,无作用"——本文件只是漏了这一步。

修法:补 #include "test_config.h",并把根因与 req/mask 证据写在包含点上方(同一事实
不另开文档;销项时 docs 引这里)。写域扩到 App/util 由 lead 背书(看板 task-9)。

零产品影响(实测,不是推演):
- 产品态(TEST_SUITE_* 全注释、宏未定义 → 走原分支)@build 0 错误 0 警告,
  Code/RO/RW/ZI = 214104 / 20388 / 1204 / 131852,与主干 2026-10-25 台账逐项相同。
- 测试态 hw_nopc 尺寸也与修复前逐项相同:改的只是"选哪个常量",没有新代码路径。
- 修复后净效果(下一轮台架复核):431 条 net 类 stall 消失,剩下的是 uiTask 间歇
  缺位的 37 条(0x1E7 / 0x1E5)——那是另一件事,不在本提交里掩盖。

顺手记两条**没在本提交改**的发现(判据语义,归 lead 裁):
1) 抽样判定是**精确匹配**(注释自述:"掩码必须恰等于会置位的任务集合")。而 netTask
   自挂起前会喂一次位 → 那一瞬间 mask=0x1F7 又不等于剔除后的 0x1F5 → 照样报 stall。
   即"从掩码里剔一位"与"精确匹配"天然打架;要不要放宽成"观测 ⊇ 要求即可"值得单定。
2) 本轮 miss 一路涨到 1971 而**没有停喂、没有复位**:说明"连续未达标即停喂"的阈值
   路径在 HW 层测试构建里未被触发(或 IWDG 尚未启动)。这条对产品侧更重要,值得单查。

随附 .cubemx_survival_baseline.json:本文件在存活审计里是 kind="generated" 的整文件
哈希项 watchdog-module("非 CubeMX 管辖,但须确认未被误删"),有意改动按脚本自述用
--write 重建基线。**先证明漂移 100% 来自本笔**:把我的 include 临时撤掉再跑
--check → rc=0(基线与 HEAD 逐项相符),因此不存在"别人早就改了没登记"的情况。
--write 顺带补出一条**基线里原本缺失**的条目 net-msgq-adopt(Src/freertos.c 的
RTOS_QUEUES 区,须含 net_msg_queue_adopt):它此前不在基线里 → --check 一直在静默
跳过这一项。本笔把它一并登记,属于意外收获,不是本笔的目的。

gate:cppcheck / coding-standard / bsp-err / id-check / no-mojibake /
trailing-whitespace / end-of-file-fixer / mem-numbers / mem-budget /
cubemx-survival(已 --write 重建基线)全 0;
未用 --no-verify。
This commit is contained in:
2026-10-25 05:32:24 +08:00
parent adabb6af12
commit a9ba8ec745
2 changed files with 12 additions and 1 deletions
+2 -1
View File
@@ -13,7 +13,8 @@
"stack-overflow-hook-impl": "a006edbd30d2c4d7",
"malloc-failed-hook-impl": "fcd7250e5cd6403b",
"stack-overflow-hook-helper": "cacd9fd028be9b5b",
"watchdog-module": "663f05caf22cf7d0",
"watchdog-module": "b3501b5ed1be1793",
"net-msgq-adopt": "a0f913e3f34c8e9e",
"reset-cause-latch": "983927d587cb9f48",
"iwdg-hal-driver": "4b902875a84554e9",
"hal-iwdg-enabled": "1a8ed6cff34f7ba6",
+10
View File
@@ -58,6 +58,16 @@
#include "lftpd.h" /* lftpd_task_wd_beat() 弱钩子声明(本文件提供强符号,见下方) */
#include "sys_log.h" /* SYSLOG_RUN(flush 诱导落盘)+ sys_log_evidence()(round 7 取证落盘) */
#include "console_log.h" /* dbg_console_tx_fault()(僵尸通道计数) */
/* 测试构建可见性(2026-10-25 台架实测缺陷):wd_required_mask() 里那条
* ENABLE_HW_LAYER_TESTS 分支要按"硬件层独占测试构建"剔除 netTask,而该宏定义在
* test/board/ch395f_test.h(由 test_config.h 拉入)。本文件此前没 include 它 →
* 宏在本 TU 永远不可见 → **那条分支自加入起就是死代码**,HW 层测试构建仍按产品
* 掩码 0x1F7 要求 netTask 供位,而 netTask 按设计自挂起 → 每 ~110ms 刷一条
* [ERR][WD] task stall(台架一轮刷出 468 条)。做法与 App/task/net_task.c 的
* #include "test_config.h" 一致;产品构建 TEST_SUITE_* 全注释、宏未定义,
* 走的仍是原分支(实测产品固件 Code/RO/RW/ZI 逐项不变)。
* 证据:boot log 20261025_050539(req=0x1F7 而 mask 最高只到 0x1F5)。 */
#include "test_config.h"
#endif
#define DBG_TAG "[WD]"