FreeRTOS 提供两种栈溢出检测机制:运行时检测(configCHECK_FOR_STACK_OVERFLOW=1或2)和编译时检测(静态检查)。运行时检测在任务切换时检查栈指针是否越界,方式1仅检查当前任务栈顶,方式2额外检查任务栈底(通过填充模式)。实际触发场景:1) 任务内使用大数组或递归过深,导致栈指针越过栈顶;2) 中断嵌套过深,压栈过多,覆盖任务栈;3) 任务栈分配过小,未考虑局部变量和调用深度。建议:开发阶段开启方式2,用栈填充值(0xa5)检测溢出,并利用uxTaskGetStackHighWaterMark()监控栈余量;发布时关闭以省开销。若触发,优先增大栈或优化代码(减少局部大数组、改用静态分配)。
mcuku 阿沐 · 2026-08-27