栈溢出机制(Stack Overflow)
描述HRTOS任务栈在运行过程中因空间不足导致的溢出行为及检测机制。
机制定义
Stack Overflow = 栈空间使用量 > 分配栈大小
产生原因
1. 递归调用过深
2. 局部变量占用过大
3. 中断嵌套过深
4. 任务栈分配不足
检测机制
栈水位检测
通过填充模式检测栈使用边界。
溢出标记检测
在栈尾设置保护字节(canary)进行校验。
运行时监控
系统周期性检查任务栈使用情况。
演示代码
#include
#define TASK_ID 0
/* 递归模拟栈压力 */
void recursive_test(int n)
{
int buffer[32]; // 栈占用
if(n <= 0) return;
recursive_test(n - 1);
}
void task_stack_test(void)
{
recursive_test(100); // 可能触发栈溢出
}
void system_init(void)
{
os_task((unsigned int)task_stack_test, TASK_ID, 2, 0);
}
void main(void)
{
system_init();
os_task_release(TASK_ID);
while(1)
{
os_nop();
}
}
相关 API
系统意义
栈溢出是RTOS系统中最隐蔽的错误类型之一,会导致不可预测行为甚至系统崩溃。