一、简介
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
实现方式:直接在Heap数组中往后移指定长度,然后将前面的空间返回
2. Heap_2
Heap提供了Free机制,支持申请的内存释放之后,重新申请。但是不支持收集碎片化的内存。
Heap_2采用最佳匹配算法(best fit algorithm)实现,每次申请内存都会找到最小的block地址。Heap_2支持Free内存,但是不支持收集碎片化内存
3. Heap_3
Heap_3的申请释放内存是利用malloc和free函数实现的,在这基础上增加了对申请失败的hook函数。
需要注意,由于malloc函数并不是从FreeRTOS指定的heap数据中申请的内存,而是从编译链接中定义的heap中获得。因此此种情况下不需要关注configTOAL_HEAP_SIEZ。
4. Heap_4
Heap_4 采用快速匹配算法(first fit algorithm),对比Heap_2。能将碎片化的内存收集整理成一个单独的block。同时也增加了一个接口:
void vPortGetHeapStats(HeapStats_t *pHeapStats)
5. Heap_5
Heap_5也采用快速匹配算法(first fit algorithm)和内存合并算法,并且允许heap跨越多个不相邻的内存区域。
Heap_5 增加了一个接口:
void vPortDefineHeapRegions(const HeapRegion_t * const pxHeapRegions)
在申请内存之前,必须调用此接口。
如图中所示,存在首地址为0x80000000UL 长度为 0x10000和首地址0x90000000UL 长度为0xa0000两段内存空间。
通过调用接口vPortDefineHeapRegions,来初始化内存
四、参考链接
链接: FreeRTOS官方说明.