8a18e388c7
原状:HardFault 已有崩溃采集,但 MemManage / BusFault / UsageFault 仍是空
while(1) —— 这三类故障发生时日志完全静默,且因 SHCSR 默认未使能,实际会
被升级成 HardFault,报告出笼统的 "HARDFAULT"、看不出根因。
改动:
- Src/stm32f4xx_it.c:三个 Handler 升级为手工 __asm 版(取 MSP/PSP 帧指针)
-> B 到 per-fault C 入口 fault_entry_{mem,bus,usage} -> hard_fault_report()。
hard_fault_report 增加 tag 参数,日志统一为
"[ERR] <TAG> PC=.. LR=.. xPSR=.. R0-R3=.. CFSR=.. HFSR=..[/BFAR][/MMFAR]"。
生成实体经 #define X X_Gen 改名保留,链接器各移除 2 字节(.map 已验)。
三个各带独立锚点 MEMFAULT/BUSFAULT/USAGEFAULT-ANCHOR。
- 新增 fault_handler_enable()(USER CODE BEGIN 1 区):使能 SHCSR 的
MEMFAULTENA/BUSFAULTENA/USGFAULTENA。声明入 Inc/stm32f4xx_it.h,调用在
app_main_init() 第一行(纯寄存器写,不依赖日志/时钟)。
- 刻意不启用 CCR.UNALIGN_TRP / CCR.DIV_0_TRP:会把普通 bug 升级成死机,
对本项目弊大于利(说明写进函数注释)。
实现约束(本轮踩坑):ARMCC 的 __asm 块取不到 C 的数据符号(ADR r1, xxx_tag
报 A1516E: Bad symbol,去 static 也无效),也无法给 C 函数传字符串参数,
故故障名必须由 C 侧 per-fault 入口带上。
配套:
- check_cubemx_survival.py:新增 fault-handlers-3 / fault-handler-enable 两项,
UNPROTECTED_LEGACY 清掉三个 Fault(WARN 2->1),清单 16 -> 18 项。
- AGENTS.md:新增"4 个 Fault 全部采集"条目;ARMCC 汇编条目补 A1516E 第 3 坑;
校验标记补 [ERR](四个 Fault 日志都以它开头 -> 一律判 FAIL,刻意)。
- 看门狗设计说明.md:§6.1 补 4 条 Fault 标记与 @test 禁项关系;
§10.2 L3 清单与四个 Fault 采集小节;§11 结论表与变更记录。
- 待处理内容.md:新增 N-03d(已完成),N-03c 补第二次重生成结论。
验证:@build 0 错误 0 警告(Flash +156 B,RAM 无变化);pre-commit 13 钩子
全通过;审计 18 通过 / 1 警告 / 0 失败。
Inc/ — CubeMX 生成的头文件
⚠️ 本目录文件由 STM32CubeMX 生成(
.ioc重生成会覆盖),不是自研代码。 允许在USER CODE BEGIN/END标记区之间写自定义内容。
文件一览
| 文件 | 生成 | 作用 |
|---|---|---|
main.h |
CubeMX | 主头文件:引脚宏定义(xxx_Pin / xxx_GPIO_Port) |
FreeRTOSConfig.h |
CubeMX | FreeRTOS 内核配置(堆大小、tick、优先级位数等) |
stm32f4xx_hal_conf.h |
CubeMX | HAL 模块裁剪开关(启用/禁用各外设 HAL 模块) |
stm32f4xx_it.h |
CubeMX | 中断服务函数声明 |
gpio.h / dma.h / spi.h / i2c.h / usart.h |
CubeMX | 各外设初始化函数声明 |
⚠️ 修改约定
- 自定义内容只写
USER CODE BEGIN xxx/USER CODE END xxx标记区之间 - 引脚宏(如
CH395F_CS_Pin)在main.h中定义,改引脚须在 CubeMX 中改后重新生成
关键配置速查
| 配置 | 值 | 位置 |
|---|---|---|
| FreeRTOS 堆 | configTOTAL_HEAP_SIZE(已迁 CCM) |
FreeRTOSConfig.h |
| 栈溢出检查 | configCHECK_FOR_STACK_OVERFLOW = 2 |
FreeRTOSConfig.h |
| HAL 时基 | TIM7(HAL_TIMEBASE 覆盖) |
stm32f4xx_hal_conf.h + Src/ |
| NVIC 分组 | 4 位优先级 | CubeMX 配置 |
相关文档
- 内存/堆预算:
docs/内存管理/RAM使用分析与优化方案.md - 硬件引脚:根
README.md「外设接口」表