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