FreeRTOS 任务栈溢出检测主要有两种官方实现:一是运行时检测(configCHECK_FOR_STACK_OVERFLOW=1),在每个任务切换时检查当前任务栈指针是否越界,但只能捕获明显溢出;二是编译时检测(=2),在任务创建时填充栈尾标记(0xa5),任务切换时检查最后16字节是否被破坏,能捕获更隐蔽的溢出。此外,可自定义钩子函数 vApplicationStackOverflowHook 处理溢出事件。误报排查方法:1) 检查栈大小是否过小,尤其任务含大局部数组或递归;2) 确认中断嵌套是否占用任务栈(中断应使用独立栈);3) 检查是否误用栈指针(如汇编或第三方库);4) 使用 uxTaskGetStackHighWaterMark 获取实际使用峰值,动态调整栈大小。实操建议:先用方法2定位,再结合高水位标记优化。
mcuku 阿沐 · 2026-08-27