在量产固件中,最可靠的栈溢出检测方式是硬件MPU(内存保护单元)配合FreeRTOS的栈溢出钩子函数。MPU能在任务访问越界时立即触发异常,提供硬件级防护,且对运行时性能影响极小。具体实操:在FreeRTOSConfig.h中启用configUSE_MPU_WRAPPERS和configCHECK_FOR_STACK_OVERFLOW,并实现vApplicationStackOverflowHook()记录错误日志。若硬件不支持MPU,则推荐使用方法2(栈填充检查),即在任务创建时用已知模式填充栈,在上下文切换时检查末尾若干字节是否被改写,配合钩子函数定位任务名。方法1(编译时静态检查)和方法3(运行时寄存器检查)不适合量产,前者无法捕获动态溢出,后者依赖特定架构且开销大。建议量产固件同时启用MPU和栈填充检查,双保险,并定期在测试中故意压栈验证检测有效性。
mcuku 阿沐 · 2026-08-27