018、栈溢出检测机制与调试技巧最近在调试一个基于FreeRTOS的传感器采集节点时,遇到了一个诡异的问题:设备运行几小时后,某个任务突然“失联”,不响应消息也不更新数据,但其他任务却正常运行。用调试器挂上去看,发现任务栈指针已经跑到堆内存区域去了——典型的栈溢出把任务上下文给冲垮了。这种问题在嵌入式开发中太常见了,今天我们就来聊聊FreeRTOS里怎么抓出这些“栈越狱”的元凶。栈溢出为什么危险每个FreeRTOS任务都有自己的栈空间,用来存放局部变量、函数调用记录和任务上下文。栈溢出发生时,多余的数据会写入相邻内存区域——可能是其他任务的栈,也可能是堆或全局变量区。结果轻则数据错乱,重则系统硬故障。更麻烦的是,溢出往往不会立刻触发异常,而是像慢性毒药一样慢慢腐蚀系统,等到发现问题时,现场早就被破坏了。FreeRTOS提供了两种实用的栈溢出检测机制,都在FreeRTOSConfig.h里配置。第一种是configCHECK_FOR_STACK_OVERFLOW设为1时的“水印检测法”。FreeRTOS会在任务栈的底部填充一个固定模式(通常是0xA5A5A5A5),任务切换时检查这些标记是否被修改。如果被覆盖了,说明栈曾经向下生长过头了,会触发vApplicationStackOverflowHook回调。// 在FreeRTOSConfig.h中开启