a9ba8ec745
结论先说: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。
35 lines
1.4 KiB
JSON
35 lines
1.4 KiB
JSON
{
|
|
"snapshot": {
|
|
"iwdg-defer-start": "ca839ffc1cda439f",
|
|
"hardfault-handler": "f3afab8d2be18794",
|
|
"fault-handlers-3": "f3afab8d2be18794",
|
|
"fault-handler-enable": "be87fcd3a7926138",
|
|
"hardfault-report-impl": "f3afab8d2be18794",
|
|
"error-handler-degrade": "d02a92afda945c4b",
|
|
"stack-overflow-check": "d4735e3a265e16ee",
|
|
"malloc-failed-hook": "6b86b273ff34fce1",
|
|
"assert-not-deadloop": "d4a00718ab2bd071",
|
|
"assert-impl": "5d862ceb21c77a86",
|
|
"stack-overflow-hook-impl": "a006edbd30d2c4d7",
|
|
"malloc-failed-hook-impl": "fcd7250e5cd6403b",
|
|
"stack-overflow-hook-helper": "cacd9fd028be9b5b",
|
|
"watchdog-module": "b3501b5ed1be1793",
|
|
"net-msgq-adopt": "a0f913e3f34c8e9e",
|
|
"reset-cause-latch": "983927d587cb9f48",
|
|
"iwdg-hal-driver": "4b902875a84554e9",
|
|
"hal-iwdg-enabled": "1a8ed6cff34f7ba6",
|
|
"ioc-keepusercode": "b5bea41b6c623f7c",
|
|
"ioc-iwdg-present": "d3a6e667048c95db",
|
|
"ioc-task-stacks": "58ee94dd2a093177",
|
|
"adc1-hal-enabled": "1a8ed6cff34f7ba6",
|
|
"adc1-calibration-call": "8d5f4b40fb218913",
|
|
"adc1-calibration-impl": "d33bc4323e243248",
|
|
"adc-tick-tim3-branch": "39c3548c37f6c4ae",
|
|
"ioc-adc-trig-t3trgo": "a9939de260ee46f8",
|
|
"ioc-adc-dma-continuous": "189126670d85d80a",
|
|
"adc1-dma-link": "397fce92dca3b728",
|
|
"adc1-dma-irq-priority": "beff08e91333229b"
|
|
},
|
|
"_note": "CubeMX 存活审计基线;改动用 --write 重建"
|
|
}
|