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

相关推荐
minglie113 小时前
vivado中视频ip相关接口
学习
zcmodeltech14 小时前
垃圾发电厂沙盘模型控制系统设计与实现:多设备协同联动方案
java·大数据·数据库·人工智能·stm32·嵌入式硬件·制造
上海心泾国际物流有限公司14 小时前
去年秋天,我在闵行区为一批冷链货找仓库
经验分享·笔记·健康医疗·交通物流
STQY燊桐启元(深圳)电子科技14 小时前
大功率储能PCS散热升级,ST-PCM180氮化铝相变陶瓷适配高密度热管理
经验分享·笔记·pcm
_Narcissus_14 小时前
单调栈笔记及例题详解
数据结构·c++·笔记·算法·力扣·单调栈·洛谷
m4Rk_14 小时前
【论文阅读】Agent 记忆机制(53):Experience-Following——为什么错误经验会在记忆中不断传播
论文阅读·人工智能·学习·开源·github
额,不知道写啥。15 小时前
从区间加一次函数到区间加多次函数最值-----区间数据结构与函数的一些东西(《浅谈函数最值的动态维护》的学习笔记)
数据结构·笔记·学习
LuminousCPP15 小时前
数据结构-二叉树(五):查找、销毁与前序序列建树
c语言·数据结构·笔记·二叉树
艾莉丝努力练剑16 小时前
【AI大模型接入SDK】Provider分析与实现
c++·人工智能·学习·面试·大模型·llm
Nontee1 天前
MySQL 插入冲突了怎么办?两种处理方式入门笔记
数据库·笔记·mysql