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

相关推荐
努力小周3 分钟前
STM32智能安防系统
c语言·stm32·单片机·嵌入式硬件·物联网·计算机网络·pcb工艺
袁小皮皮不皮25 分钟前
1.HCIP BFD 学习笔记(优化版)
服务器·网络·笔记·网络协议·学习·智能路由器·ip
装不满的克莱因瓶1 小时前
【自动驾驶领域】学习 Cityscapes 数据集——城市街景语义理解的标准基准
人工智能·pytorch·python·深度学习·学习·机器学习·自动驾驶
清辞8532 小时前
产品经理需求推进流程
大数据·深度学习·学习·产品经理
华科大胡子2 小时前
在STM32上跑通TinyML
stm32·单片机·嵌入式硬件
YM52e2 小时前
鸿蒙PC ArkTS 声明合并问题深度解析与最佳实践
学习·华为·harmonyos·鸿蒙·鸿蒙系统
海兰3 小时前
【实用程序】电商销售分析仪表盘 — 从零搭建一个AI参与的全栈数据洞察系统
人工智能·学习·算法
iCxhust3 小时前
C#进程管理程序
开发语言·汇编·stm32·单片机·c#·微机原理
ken22323 小时前
在 Libreoffice Calc中输入自定义表情字符时,需要保存之后,才能正常显示
学习
zwenqiyu4 小时前
P5283 [十二省联考 2019] 异或粽子题解
c++·学习·算法