FreeRTOS-内存管理
- 无论是创建任务、队列、信号量还是其他的东西,都需要为其分配一定空间,前面我们都是运用动态内存申请的方法来申请空间,并且我们所使用的的动态内存申请函数都是FreeRTOS自己提供的,而不是使用C标准库中的malloc()和free()这两个函数,主要是因为以下原因:
- 内存动态管理效率低
- 线程不安全
- 不确定性高,每次执行时间不同
- 导致内存碎片
- 使链接器配置变得复杂
- 所以FreeRTOS为我们提供了5种内存管理方法,这5中内存管理方法各有不同 ,分别存放在heap_1、heap_2、heap_3、heap_4、heap_5。在我看来,这五种方法更像是版本迭代,越往后功能越强,但功能强带来的问题就是效率变得比较低。在看这几种方法前我么先来看一下什么是内存碎片。
内存碎片
- 所谓内存碎片,就是在动态申请和释放过程中,内存变得碎片化。下图表示了内存碎片的生成过程。

- 从上面可见,(1)是没有使用过的内存,但是随着内存的多次申请和释放,(4)中产生了很多空间较小的内存,而剩下的大块内存很少,那些空间小的内存就是聂村碎片。
五中内存管理方法对比
- 这里仅就五种内存管理方法上做一个简单对比,不会对源码深入分析。
heap_1
- heap1适用于那些一旦创建好就再也不会删除的任务,heap_1实际上仅提供了内存申请函数,而没有提供内存释放函数,所以内存一旦申请完成就不允

本文介绍了FreeRTOS的内存管理机制,包括heap_1到heap_5五种不同的内存管理方法。heap_1只提供内存申请,避免碎片;heap_2增加了内存释放但不处理碎片;heap_3是对C库malloc/free的封装,线程安全但效率较低;heap_4能处理内存碎片,适合动态分配;heap_5则允许内存跨多个不连续段,扩展了内存使用范围。通过对比,展示了各种内存管理策略的适用场景和优缺点。
最低0.47元/天 解锁文章
1347

被折叠的 条评论
为什么被折叠?



