查证 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:
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user