任务栈的深度由三个因素决定:函数调用关系,局部变量,保存现场的寄存器
一、原理
1.函数调用关系
以cortex-M3为例,每层调用关系都会用到8个被调用者保存寄存器(R4-R11)以及链接寄存器(LR)共9个寄存器,也就是每层36个字节。
2.局部变量
同条调用关系内的所有局部变量的字节大小。
3.保存cpu寄存器
至多保存cpu16个寄存器,也就是16*4个字节。
二、例子
假设有任务A,含有8字节的局部变量,以及调用了函数a1和函数a2;
函数a1含有4字节的局部变量,以及调用了函数b,
函数b含有12字节的局部变量,以及调用了函数c,
函数c含有4字节的局部变量;
函数a2含有400字节的局部变量;
那么a1调用关系的栈大小大致为:abc三层调用关系(36*3)+ 局部变量(8+4+12+4)+保存现场(64)= 200字节
a2调用关系的栈大小大致为:a一层调用关系(36)+局部变量(8+400)+ 保存现场(64)= 508字节
那么任务A应该选择比508字节大的栈深度。
以上均为估算,与实际有较大偏差,大致参考即可。