FreeRTOS 提供三种栈溢出检测机制,触发时机和开销各异。1) 编译时静态检查(configCHECK_FOR_STACK_OVERFLOW=0):不检测,仅依赖开发者估算栈大小,无运行时开销,但风险最高。2) 运行时检查方法1(=1):在任务切换时(即每次上下文切换前)检查当前任务的栈指针是否超出栈底(或栈顶),通过任务控制块中的栈起始地址和当前SP比较。触发时机为每次任务切换,检测及时,但仅检查SP,无法捕获栈内数据被破坏但SP未越界的情况。3) 运行时检查方法2(=2):在方法1基础上,额外在任务创建时向栈区域填充已知模式(如0xA5),并在任务切换时检查栈末尾的若干字节是否被覆盖。触发时机同样在任务切换,但能检测到栈溢出但SP未越界的情况,更可靠,但增加少量开销。实操建议:开发阶段使用方法2,发布版本可关闭或保留方法1,同时结合MPU(若硬件支持)实现硬件级保护。注意,方法2需确保栈大小足够容纳检查区域,且任务栈初始化时正确填充。
mcuku 阿沐 · 2026-08-27