在FreeRTOS中,任务栈溢出检测有三种实现方式:1) 编译时静态检查(configCHECK_FOR_STACK_OVERFLOW=1),通过检查任务栈末尾的哨兵值(0xa5a5a5a5)是否被破坏来触发;2) 运行时动态检查(configCHECK_FOR_STACK_OVERFLOW=2),在任务切换时比较栈指针与栈顶/栈底边界,更精确但开销稍大;3) 使用钩子函数vApplicationStackOverflowHook(),在检测到溢出时调用,用于记录错误或复位系统。实际触发场景包括:递归调用过深、局部数组过大、中断嵌套导致栈压入过多、任务优先级反转时上下文切换频繁。建议:生产环境开启configCHECK_FOR_STACK_OVERFLOW=2,并配合栈高水位标记(如uxTaskGetStackHighWaterMark)定期监控,避免溢出后才被动处理。
mcuku 阿沐 · 2026-08-27