From a9ba8ec745774852625e72a8ec9c00268d36fbdc Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Sun, 25 Oct 2026 05:32:24 +0800 Subject: [PATCH] =?UTF-8?q?fix(WD):=20HW=20=E6=B5=8B=E8=AF=95=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E6=8E=A9=E7=A0=81=E6=AD=BB=E5=88=86=E6=94=AF=E5=A4=8D?= =?UTF-8?q?=E6=B4=BB=E2=80=94=E2=80=94include=20=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=E8=87=AA=207feeea6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 结论先说: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。 --- .cubemx_survival_baseline.json | 3 ++- App/util/task_watchdog.c | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.cubemx_survival_baseline.json b/.cubemx_survival_baseline.json index 23d9efbb..d1cc17c6 100644 --- a/.cubemx_survival_baseline.json +++ b/.cubemx_survival_baseline.json @@ -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", diff --git a/App/util/task_watchdog.c b/App/util/task_watchdog.c index 28c5739c..5b61b5e8 100644 --- a/App/util/task_watchdog.c +++ b/App/util/task_watchdog.c @@ -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]"