FreeRTOS 内存管理

目录

  • 一、简介
  • 二、Heap配置
  • 三、Heap实现方式
    • 1. Heap_1
    • 2. Heap_2
    • 3. Heap_3
    • 4. Heap_4
    • 5. Heap_5
  • 四、参考链接

一、简介

FreeRTOS提供5中Heap管理方式,分别在5个.c文件中实现

  • Heap_1.c
  • Heap_2.c
  • Heap_3.c
  • Heap_4.c
  • Heap_5.c
    五个源文件中,提供都提供Heap管理功能,接口相同,但是实现方式不同,特性也不同。下面将介绍5种内存管理的方式,以便根据不同需要选择。

二、Heap配置

移植FreeRTOS过程中,需要确定几项Heap相关的配置参数

  • 对齐方式 portBYTE_ALIGMENT
  • Heap空间 configTOTAL_HEAP_SIZE
  • 申请失败hook configUSE_MALLOC_FAILED_HOOK

三、Heap实现方式

1. Heap_1

源文件中注释说明了,Heap_1提供的方式仅支持alloct内存,不支持Free。由于汽车电子软件不允许动态申请释放内存,因此选择Heap_1
FreeRTOS 内存管理_第1张图片
实现方式:直接在Heap数组中往后移指定长度,然后将前面的空间返回

2. Heap_2

Heap提供了Free机制,支持申请的内存释放之后,重新申请。但是不支持收集碎片化的内存。
FreeRTOS 内存管理_第2张图片
Heap_2采用最佳匹配算法(best fit algorithm)实现,每次申请内存都会找到最小的block地址。Heap_2支持Free内存,但是不支持收集碎片化内存
FreeRTOS 内存管理_第3张图片

3. Heap_3

Heap_3的申请释放内存是利用malloc和free函数实现的,在这基础上增加了对申请失败的hook函数。
需要注意,由于malloc函数并不是从FreeRTOS指定的heap数据中申请的内存,而是从编译链接中定义的heap中获得。因此此种情况下不需要关注configTOAL_HEAP_SIEZ。
FreeRTOS 内存管理_第4张图片

4. Heap_4

Heap_4 采用快速匹配算法(first fit algorithm),对比Heap_2。能将碎片化的内存收集整理成一个单独的block。同时也增加了一个接口:

 void vPortGetHeapStats(HeapStats_t *pHeapStats)

FreeRTOS 内存管理_第5张图片

5. Heap_5

Heap_5也采用快速匹配算法(first fit algorithm)和内存合并算法,并且允许heap跨越多个不相邻的内存区域。
Heap_5 增加了一个接口:

void vPortDefineHeapRegions(const HeapRegion_t * const pxHeapRegions)

在申请内存之前,必须调用此接口。
FreeRTOS 内存管理_第6张图片
如图中所示,存在首地址为0x80000000UL 长度为 0x10000和首地址0x90000000UL 长度为0xa0000两段内存空间。
通过调用接口vPortDefineHeapRegions,来初始化内存

四、参考链接

链接: FreeRTOS官方说明.

你可能感兴趣的:(FreeRTOS)