第四节:FreeRTOS 内存管理

目录

内存管理的介绍

内存碎片

Heap_1-5内存分配的区别

Heap_1:适用于一旦创建好内存,就不删除的任务。       (本质是分配的大数组做内存堆.)

Heap_2:适用于重复分配和删除具有相同堆栈空间任务。(本质是分配的大数组做内存堆.)

Heap_3:为对内存空间的操作,简单的封装了malloc和free。具有线程保护,但无空闲内存合并。

Heap_4:内可将相邻的空闲内存合并。存储顺序小地址在前(本质是分配的大数组做内存堆.)

Heap_5:内存管理策略允许内存堆跨越多个非连续的内存,切需要初始化,其他和4相似。


内存管理的介绍

FreeRTOS创建任务、队列、信号量等的时候有两种方法

——动态申请所需要的RAM。

——静态方法自行创建“static”定义。

内存管理主要针对,FreeRTOS提供的5中内存管理策略讨论的。

总的来说heap1最简单,单只能申请不能释放。heap2提供了内存释放函数,但存在内存碎片问题。

heap3是对malloc和free的简单封装,提供线程保护。heap4提供了内存合并。heap5支持不连续内存块。

在使用中需要选取一种策略,使用者可以选择其中某一种。路径:FreeRTOS->Source->portable->MemMang.

 

 

 

 

内存碎片

内存碎片化是一个概念性的问题,指的是不合理的内存操作会导致内存碎片化,以至于最后有很多碎片化空间,

无法整块的分配内存。

内存碎片化:内存经过多次的申请和释放以后,会导致碎片化。

内存碎片化的危害:内存碎片化后,会导致虽然可用内存很多,但是可能导致连续的物理内存申请失败,无法内存分配。

 

 

 

Heap_1-5内存分配的区别

如下介绍5中策略的差异,参考资料中有对源码的分析。

Heap_1:

Heap_1原理:Heap1是5个内存管理中最简单的,其策略即只能申请内存,当需要的时候就从内存堆里分配一块,这个内存是无法释放的。对于大多数操作系统来说,特别是对于安全要求高的操作系统,比不需要动态的删除任务、信号量、队列等。而是在初始化时候一次性的创建好,一直使用永不删除。这个内存管理策略实现简洁、安全可靠。

特点:适于一旦创建好内存,信号量和队列就不再删除的任务。具有可确定性,不会导致内存碎片。适用于不需要内存分配的应用。换句话来说,虽然顶着内存分配名称,但和定义静态变量本质上没什么差异。

Heap_2:

Heap_2原理:Heap2相对于Heap1管理复杂。它使用最佳匹配算法,允许释放之前的内存块,但是它不会把相邻的空闲内存合并成为一个更大的块(会造成内存碎片)。

特点: 这个内存管理策略用于重复的分配和删除具有相同堆栈空间的任务.队列.信号量.互斥量等。并且不考虑内存碎片的应用程序,不适用于分配和释放随机字节堆栈空间的应用程序!

Heap_3:

Heap_3原理:内存管理策略简单的封装了标准函数的malloc()和free()函数,采用的封装方式是操作内存前挂起调度器、完成后再恢复调度器。封装后的malloc和free具有线程保护。

特点: 第一种和第二种内存管理策略都是通过定义一个大数组作为内存堆,数组的大小由宏configTOTAL_HEAP_SIZE指定。第三种内存管理策略与前两种不同,它不再需要通过数组定义内存堆,而是需要使用编译器设置内存堆空间,一般在启动代码中设置。因此宏configTOTAL_HEAP_SIZE对这种内存管理策略是无效的。

Heap_4:

Heap_4原理:和第二种方式比较相似,只不过增加了一个和并算法,将相邻空闲内存合并为一个大内存,和方法一、二管理策略一样,内存堆仍为一个大数组。

特点: 第四种内存管理策略的空闲块链表不是以内存块大小为存储顺序,而是以内存块起始地址大小为存储顺序,地址小的在前,地址大的在后。这也是为了适应合并算法而作的改变。

Heap_5:

heap_5原理:第五种内存管理策略允许内存堆跨越多个非连续的内存区,并且需要显示的初始化内存堆,除此之外其它操作都和第四种内存管理策略十分相似。

特点:首先它允许跨内存区定义多个内存堆,比如在片内RAM中定义一个内存堆,还可以在片外RAM再定义内存堆;其次,用户需要指定每个内存堆区域的起始地址和内存堆大小、将它们放在一个HeapRegion_t结构体类型数组中,并需要在使用任何内存分配和释放操作前调用vPortDefineHeapRegions()函数初始化这些内存堆。

 

参考资料:

Heap_1源码分析:https://blog.csdn.net/ZenNaiHeQiao/article/details/82757329

Heap_2源码分析:https://blog.csdn.net/ZenNaiHeQiao/article/details/82769500

Heap_3源码分析:https://blog.csdn.net/ZenNaiHeQiao/article/details/82771467

Heap_4源码分析:https://blog.csdn.net/ZenNaiHeQiao/article/details/82772391

Heap_5源码分析:https://blog.csdn.net/ZenNaiHeQiao/article/details/82774239

https://blog.csdn.net/zhzht19861011/article/details/51606068

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值