堆和栈
1. 堆
堆就是空闲的一块内存,可以通过malloc申请一小块内存,用完之后使用再free释放回去。管理堆需要用到链表操作。
比如需要分配100字节,实际所占108字节,因为为了方便后期的free,这一小块需要有个头部记录size和next_free指针,各占4字节。
若果再想分配内存,可以找到空闲内存的第一个块,如果第一个块不够。就可以继续找下一块,例如使用已经被释放了的块。如果还是不够,那就申请失败。
2. 栈
也是一块内存空间,CPU的SP寄存器指向它,它可以用于函数调用、局部变量、多任务系统里保存现场。
通过反汇编代码能更好的理解栈。
函数调用
C函数入口处,先划分自己的栈,再保存LR进内存的栈里,保存局部变量。例如,下图中的a_func中R0就是局部变量
局部变量
每个RTOS任务都有自己的栈
对于两个任务A、B,A运行一阵子,切换到B运行;再切换到A,再切换到B······
Task_A(){
int cnt=0;
while(1){
cnt=b_func(cnt);
}
}
Task_B(){
int cnt=100;
while(1){
cnt=b_func(cnt);
}
}
切换Task_A
在被切换出去时保存所有寄存器
Task_A的栈
Task_B和Task_A的切换和恢复过程相同。
恢复Task_A
找到A的结构体,得到A的SP,从保存现场里先恢复寄存器,再恢复PC。
每个任务都使用到b_func函数,但是调用关系、局部变量、“保存现场”不同,所以不同的任务都要有自己的栈来分别保存。