IWDG 延后启动改走宏改名(L3→L2):生成调用变空操作,重生成后不再需要手工删

This commit is contained in:
2026-10-10 01:30:47 +08:00
parent 63ee090fd1
commit e2e1d0fd42
6 changed files with 71 additions and 50 deletions
+12 -12
View File
@@ -62,22 +62,22 @@ BASELINE = os.path.join(REPO, ".cubemx_survival_baseline.json")
CHECKS = [
# ---------------- P0:开机死循环防线 ----------------
# ⚠ 这一项是**生成区内的手工改动**(无 USER CODE 区可用):
# 需要改的是 `hiwdg.Init.*` 赋值与 `HAL_IWDG_Init()` 调用之间的位置,
# 而 CubeMX 只在该调用**之前**(IWDG_Init 0/1)和**之后**(IWDG_Init 2)
# 生成标记区——正中间没有。塞进 IWDG_Init 1 区也不能阻止区外那行被覆盖
# (另见 `usr init 1` 区的注释)。
# 故本项按"文件整体 + 特征串"检查,并靠一个稳定锚点注释定位。
# ✅ 2026-10-09 由 L3 升级为 L2:不再删生成区那句 `HAL_IWDG_Init(&hiwdg)`,
# 而是在 `USER CODE BEGIN 0` 里放一个空实现 + `#define HAL_IWDG_Init(a_h)
# iwdg_deferred_start(a_h)`,把本编译单元里那句生成调用改名到空实现。
# → 生成区保持原样、重生成**零 diff**,不必再手工删那一句。
# ⚠ "反初始化"不可行:IWDG 启动后无法停止(唯一手段是复位),故只能拦截启动本身。
# 判据用区内的代码符号(protected 项会剥掉注释再比对,锚点注释不能当断言)。
dict(
id="iwdg-defer-start",
kind="wholefile",
kind="protected",
path="Src/iwdg.c",
must_contain=["IWDG-DEFER-START-ANCHOR"], # 手工锚点注释,重生成后会消失
must_not_contain=["HAL_IWDG_Init(&hiwdg)"], # 真实调用不得存在
region="0",
must_contain=["iwdg_deferred_start", "#define HAL_IWDG_Init"],
severity="FAIL",
hint="MX_IWDG_Init() 不得调 HAL_IWDG_Init()(内部立即启动,"
"而它跑在 app_main_init 之前 → 开机必复位)。启动移交 task_wd_start()。"
"恢复后补回 `IWDG-DEFER-START-ANCHOR` 锚点注释。",
hint="MX_IWDG_Init() 不得真正启动 IWDG(HAL_IWDG_Init 内部立即启动,而它跑在 "
"app_main_init 之前 → 开机必复位)。现由 `USER CODE BEGIN 0` 的空实现 + 宏改名"
"拦截,启动移交 task_wd_start();丢了宏 = 启动段看门狗就跑起来 = 开机死循环。",
),
# ---------------- P1:崩溃可观测性 ----------------
# ⚠ 2026-09-29 重要变更:CubeMX 把本文件的中断函数模板**换了一代**——