FreeRTOS之内存分配策略与选择

包括heap1、heap2、heap3、heap4、heap5。

各heap的区别:

Heap1 Heap2 Heap3 Heap4 Heap5
分配 Malloc
回收 free
链接 按块大小升序链接 与平台相关 按地址升序链接 按地址升序链接
合并 与平台相关
内存 单堆区 单堆区 单堆区 单堆区 多堆区

各heap说明:
Heap1:

  • 只分配,不回收。
  • 适合不会执行删除任务、队列、信号量、互斥量等的程序。

Heap2:

  • 能分配,能回收。但是回收时不处理碎片。
  • 适合申请固定大小内存的工程。
  • 其工作原理:将内存块按块大小升序相连(块地址是混乱的),记录块信息的结构体空间会随着申请不断增加,并且不会得到释放,因为要通过这些块信息来链接。所以,如果没申请过,会有一个大内存;如果申请过,将会是小内存。当频繁申请了很多小内存之后,将会造成无法申请大内存。
  • 通过start和end结构体管理,它们都独立于堆区(不计在堆区之内)。

Heap3:

  • 使用库的malloc和free,故与平台实现相关。

Heap4:

  • 能分配,能回收。回收时尝试合并碎片。且比heap3高效,但是偶有碎片风险(碎片与碎片之间的内存一直不释放时)。相当于heap2的升级版。
  • 适合各种场合。
  • 其工作原理:将内存块按地址升序相连(即纯碎地将空间内存链接起来),回收时尝试合并相连的碎片,所以记录块信息的结构体空间可以得到释放,形成一个大碎片,依此进行。
  • 通过start和end结构体管理,start独立于堆区,但是end是堆区的最后一块内存。

Heap5:

  • 能分配,能回收。回收时尝试合并碎片。并且支持多堆区。相当于heap4的升级版。
  • 由于多堆区,所以初始化时需要用 vPortDefineHeapRegions ,而不是pvHeapInit。

以上使用时,采用统一接口 pvPortMallocvPortFree ,可以方便地通过更换heap文件来完成内存类型更换。

你可能感兴趣的:(sofeware,note)