2d414f8aa9
用户问 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 失败。本次仅改 文档与脚本注释,未动代码,无需重编译。
scripts/ — 开发脚本(提交门禁 + 报告生成)
本目录是 pre-commit 门禁脚本与报告生成脚本的存放处。 与
tools/(面向开发者的功能工具)区别:本目录服务于质量门禁与工程度量。
文件一览
提交门禁(接入 .pre-commit-config.yaml)
| 脚本 | 钩子名 | 作用 |
|---|---|---|
check_coding_standard.py |
C coding standard |
C 代码规范机械检查(命名前缀/常量右置/头文件保护宏等) |
check_mojibake.py |
Forbid U+FFFD mojibake |
扫描 U+FFFD 乱码(EF BF BD 字节) |
check_doc_links.py |
doc-links |
文档链接存在性 + 命名规范(D-3/D-7) |
gen_task_table.py |
task-table |
FreeRTOS 任务表以 Src/freertos.c 为唯一事实源生成/校验(D-2/D-7) |
check_mem_numbers.py |
mem-numbers |
内存/Flash 数字以 .map 为唯一事实源校验(D-7 体积档) |
报告生成(非门禁)
| 脚本 | 作用 |
|---|---|
ram_report.py |
从 .map 生成静态 RAM/Flash 占用报告(→ docs/内存管理/data/) |
stack_report.py |
从 Keil 静态调用图 + 串口 [STACK] 水位生成每任务最坏链报告 |
使用方式
# 全库跑门禁
& 'C:\ProgramData\anaconda3\python.exe' -m pre_commit run --all-files
# 单个脚本
& '.venv\Scripts\python.exe' scripts/check_doc_links.py --all
& '.venv\Scripts\python.exe' scripts/gen_task_table.py --check # 或 --write / --diff
& '.venv\Scripts\python.exe' scripts/check_mem_numbers.py --check
& '.venv\Scripts\python.exe' scripts/ram_report.py
& '.venv\Scripts\python.exe' scripts/stack_report.py -s tools\serial_tool\state\serial.log
⚠️ 脚本编写约定
- 保真回写:改文件前先探测原换行符(LF/CRLF)与 BOM,按原样回写(本仓库各文件换行混杂)
- 受管区锚点:改文档中的数值/表格时用
<!-- XXX:BEGIN/END -->锚点,只替换锚点内内容 - 脚本输出文件绝不能落在自身扫描范围内(否则会"自我污染",见
docs-tree-reorgskill) - 生成器与校验器共用同一套正则/口径,避免两处数字打架
相关文档
docs/代码规范/pre-commit使用说明.md— 门禁完整说明与排除项docs/代码规范/cppcheck使用说明.mddocs/文档规范.md— 文档门禁三档docs/内存管理/RAM使用分析与优化方案.md— RAM/栈报告口径