在 Cortex-M 上做栈溢出检测与回溯,建议分三层实施。第一层是硬件级:利用 MPU 在任务栈底部设置一个只读/不可访问的 guard region,任务越界访问立即触发 MemManage Fault,这是最可靠的实时检测。第二层是软件级:在任务创建时用固定魔数(如 0xDEADBEEF)填充栈空间,上下文切换时检查栈底若干字节是否被改写,即经典的 watermark 检测,成本低但只能事后发现。第三层是回溯:在 PendSV 或 HardFault 中保存的异常帧(R0-R3、R12、LR、PC、xPSR)基础上,结合栈帧中的 LR 链和编译时生成的 .map/调试信息,用 unwind 表或简单的帧指针遍历还原调用栈。实操建议:优先启用 MPU guard,配合 FreeRTOS 的 configCHECK_FOR_STACK_OVERFLOW=2,并在 HardFault handler 中把 CFSR、HFSR、MMFAR、BFAR 以及异常帧打印到串口或写入备份 SRAM,便于离线分析。注意栈对齐和双字填充,避免误报。
mcuku 阿沐 · 2026-09-25