RTOS(10)内存管理

Freertos定义了一个很大的全局数组ucHeap[configTOTAL_HEAP_SIZE],从这个数组里分配内存;下图是创建三个任务的过程;

有五种内存管理机制;
heap_1.c:只分配不删除,只有pvPortMalloc,没有实现vPortFree;
heap_2.c:最佳匹配算法,但不会合并相邻的空闲内存,碎片化严重;
假设heap有3块空闲内存:5字节、25字节、100字节,pvPortMalloc想申请20字节,找出最小的、能满足pvPortMalloc的内存:25字节,把它划分为20字节、5字节;
A:创建了3个任务
B:删除了一个任务,空闲内存有
3部分:顶层的、被删除任务的TCB空间、被删除任务的Stack空间
C:创建了一个新任务,因为
TCB、栈大小跟前面被删除任务的TCB、栈大小一致,所以刚好分配 到原来的内存


heap_3.c:使用标准C库里的malloc、free函数,configTOTAL_HEAP_SIZE不再起作用;
注:C库里的malloc、free函数并非线程安全的,Heap_3中先暂停FreeRTOS的调度器,再去调用这些函数,使用这种方法实现了线程安全。
 

heap_4.c:首次适应算法,会把相邻空闲内存合并为一个大的空闲内存,可以较少内存的碎片化;
假设堆中有3块空闲内存:5字节、200字节、100字节,pvPortMalloc想申请20字节,找出第1个能满足pvPortMalloc的内存:200字节,把它划分为20字节、180字节
A:创建了3个任务
B:删除了一个任务,空闲内存有
2部分:顶层的被删除任务的TCB空间、被删除任务的Stack空间合并起来的
C:分配了一个
Queue,从第1个空闲块中分配空间
D:分配了一个
User数据,从Queue之后的空闲块中分配
E:释放的
QueueUser前后都有一块空闲内存
F:释放了
User数据,User前后的内存、User本身占据的内存,合并为一个大的空闲内存


 

heap_5.c:Heap_5分配内存、释放内存的算法跟Heap_4是一样的,不局限于管理一个大数组:它可以管理多块、分隔开的内存。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值