查证 SHCSR 的 Fault 使能位无法在 CubeMX 配置,补入文档与审计提示

用户问 fault_handler_enable() 能否通过 CubeMX 配置。查 CubeMX 安装目录的
模板源码后确认:不能。三重证据:

1. tpl_main_c.ftl 的 MX_NVIC_Init() 用 [#if vector.systemHandler=="false"]
   才生成 HAL_NVIC_EnableIRQ;而 NVIC-STM32F417_Modes.xml 里
   MemoryManagement/BusFault/UsageFault_IRQn 都标 Y(=systemHandler),
   故 CubeMX 对这三个永不生成使能代码(只生成优先级,且仅当优先级 != 0)。
2. 全部模板中 SHCSR 只出现 1 次(tpl_main_c.ftl:2269),且是 MPU 清理时的
   SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk(禁用),无任何 |= 置位。
3. MPU 路径也堵死:.ioc 的 Mcu.IP 列表无 MPU,且 HAL_MPU_Enable 只置
   MEMFAULTENA 一位,BUSFAULTENA/USGFAULTENA 仍拿不到。

实测印证:Src/stm32f4xx_hal_msp.c 的 HAL_MspInit() 里只有
HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0),三个 Fault 一行代码都没生成。

结论:只能手工写。但函数体在 USER CODE BEGIN 1 区(L2),重生成不会丢,
另有审计项 fault-handler-enable 兜底 -- 故这不是风险,只是无法享受 L1。

顺带记录一个易踩的误解:.ioc 里 NVIC.MemoryManagement_IRQn=true 的第 1 段
只是"向量在 NVIC 表里可见/已配优先级",与 SHCSR 使能位无关,
不要以为勾了 NVIC 面板的 Enabled 就等于使能了故障。

改动:

- 看门狗设计说明.md:§10.2 新增"为什么 fault_handler_enable() 写不进 .ioc"
  (三路径对照表 + 实测印证 + 结论);四个 Fault 采集小节加警示;
  L1 表格补该行;变更记录新增 2026-10-01 条。
- AGENTS.md:新增"SHCSR 的 Fault 使能位无法在 CubeMX 配置"铁律条目。
- scripts/check_cubemx_survival.py:fault-handler-enable 的 hint 补上
  "无法 CubeMX 配置"及其原因,便于日后重生成后看提示就能回忆。

验证:pre-commit 13 钩子全通过;审计 18 通过 / 1 警告 / 0 失败。本次仅改
文档与脚本注释,未动代码,无需重编译。
This commit is contained in:
2026-10-01 06:20:50 +08:00
parent 8a18e388c7
commit 2d414f8aa9
3 changed files with 37 additions and 1 deletions
+3
View File
@@ -133,6 +133,9 @@ CHECKS = [
must_contain=["fault_handler_enable", "SCB_SHCSR_MEMFAULTENA_Msk"],
hint="MemManage/BusFault/UsageFault 默认**禁用**,须在 SHCSR 置使能位才会独立触发;"
"否则它们被升级成 HardFault、日志只显示 HARDFAULT。"
"⚠ 这三位**无法在 CubeMX 配置**(2026-10-01 查模板源码证实:System Exception "
"只生成优先级、从不生成使能代码;.ioc 里的 NVIC.xxx=true 只是'向量可见',"
"不代表已使能)→ 只能手工写,故必须在本审计清单里兜底。"
),
dict(
id="hardfault-report-impl",