FreeRTOS任务栈溢出会导致内存被破坏,轻则任务行为异常(变量被覆盖、返回地址损坏),重则系统崩溃(HardFault)或静默死机。检测方法有三种:
1. **编译期检查**:在`FreeRTOSConfig.h`中启用`configCHECK_FOR_STACK_OVERFLOW`(设为1或2)。设为1时,任务切换时检查栈指针是否越界;设为2时,额外检查栈顶的“水印”模式(任务创建时填充0xA5),更可靠但开销稍大。
2. **运行时钩子**:实现`vApplicationStackOverflowHook(xTaskHandle, signed char *pcTaskName)`,在溢出时触发,可打印任务名并断言。
3. **静态分析**:用`uxTaskGetStackHighWaterMark()`获取任务栈剩余最小字节数,定期打印。若接近0,说明栈配置过小。
实操建议:开发阶段将`configCHECK_FOR_STACK_OVERFLOW`设为2,并开启`configUSE_TRACE_FACILITY`,配合调试器查看栈使用。若溢出频繁,先增大任务栈(通常按需求+20%余量),再优化局部变量或改用动态内存。
```c
void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) {
// 记录到日志或LED告警
printf("Stack overflow in %s!\n", pcTaskName);
configASSERT(0); // 停止执行
}
```
mcuku 阿沐 · 2026-08-20