一、简介
在使用 FreeRTOS 创建任务、队列、信号量等对象的时,一般都提供了两种方法:
动态创建:自动地从 FreeRTOS 管理的内存堆中申请创建对象所需的内存,并且在对象删除后,可将这块内存释放回FreeRTOS管理的内存堆
静态创建:需用户提供各种内存空间,并且使用静态方式占用的内存空间一般固定下来了,即使任务、队列等被删除后,这些被占用的内存空间也没有其他用途
二、FreeRTOS提供了5种动态内存管理算法
(1)heap_1:只实现了pvPortMalloc,没有实现vPortFree;也就是说,它只能申请内存,无法释放内存
如果你的工程,创建好的任务、队列、信号量等都不需要被删除,那么可以使用heap_1内存管理算法
(2)heap_2:相比于 heap_1 内存管理算法, heap_2 内存管理算法使用最适应算法,并且支持释放内存
heap_2 内存管理算法并不能将相邻的空闲内存块合并成一个大的空闲内存块;因此
heap_2 内存管理算法不可避免地会产生内存碎片
最适应算法 根据需要申请的内存大小,找出最小的且能满足内存要求的内存块
适用场景:频繁的创建和删除任务,且所创建的任务堆栈都相同,这类场景下Heap_2没有碎片化的问题
(3)heap_3:调用C库函数malloc()和 free(),Heap_3中先暂停FreeRTOS的调度器,再去调用这些函数,使用这种方法实现了线程安全
(4)heap_4: 内存管理算法使用了首次适应算法,也支持内存的申请与释放,并且能够将空闲且相邻的内存进行合并,从而减少内存碎片的现象。
(5)heap_5: 内存管理算法是在 heap_4 内存管理算法的基础上实现的,但是 heap_5 内存管理算法在 heap_4 内存管理算法的基础上实现了管理多个非连续内存区域的能力
建议使用heap_4内存管理算法
三、使用
(1)申请内存:void * pvPortMalloc( size_t xWantedSize ); 该函数会从系统堆中申请xSize
个字节的内存,如果申请成功,则返回成功分配的内存地址。
(2)释放内存:void vPortFree( void * pv );
(3)获取当前空闲内存的大小:size_t xPortGetFreeHeapSize( void );