基于STM32瑞士军刀--【FreeRTOS开发】学习笔记(二)|| 堆 / 栈

堆和栈

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······

c 复制代码
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函数,但是调用关系、局部变量、"保存现场"不同,所以不同的任务都要有自己的栈来分别保存。

相关推荐
乱世军军4 分钟前
AI 三大学习类型(监督/无监督/强化)的分类图
人工智能·学习
xixixi777775 分钟前
讲一下卫星移动通信网络(系统架构、核心技术与协议挑战及应用场景和战略价值)
网络·学习·安全·信息与通信·通信·卫星通信
名字不相符6 分钟前
[NCTF 2018]flask真香(个人记录,思路分析,学习知识,相关工具)
python·学习·flask·ctf
一字白首6 分钟前
Node.js+Vue 联动,Vue 快速上手:基础学习
vue.js·学习·node.js
从零点6 分钟前
STM32的CAN笔记
笔记
jifengzhiling6 分钟前
STM32 ADC规则与注入通道全解析
stm32·mcu·工业自动化·电流环·外设驱动
_Twink1e11 分钟前
【HCIA-AIV4.0】2025题库+解析(三)
人工智能·笔记·华为·开源
●VON12 分钟前
《从零到企业级:基于 DevUI 的 B 端云控制台实战搭建指南》
学习·华为·openharmony·devui·企业级项目
孙严Pay14 分钟前
快捷支付和网关支付到底哪个更安全呢?
笔记·科技·计算机网络·其他·微信
(●—●)橘子……15 分钟前
力扣344.反转字符串 练习理解
python·学习·算法·leetcode·职场和发展