FreeRTOS 中任务栈溢出检测主要有两种官方方式:运行时检测(configCHECK_FOR_STACK_OVERFLOW=1)和编译时检测(=2)。运行时检测在任务切换时检查栈指针是否越界,触发场景通常是任务使用了过大的局部变量或深层递归,导致栈指针超出任务栈顶。编译时检测则利用任务栈末尾的“水印”模式(如0xA5),在任务切换时检查该模式是否被破坏,触发场景是栈溢出发生在两次切换之间,且未触及栈指针边界。实际中,建议开启=2,并配合栈高水位标记(uxTaskGetStackHighWaterMark)在任务运行后检查剩余栈空间,以提前发现潜在溢出。触发场景还包括中断嵌套过深(若中断使用任务栈)或任务优先级反转导致栈使用激增。实操建议:为每个任务分配至少比预期多20%的栈空间,并在调试阶段周期性打印高水位值。
mcuku 阿沐 · 2026-08-27