FreeRTOS提供了五种内存管理的方式,下文将对以下五种内存分配进行说明:
1.Heap_1
Heap_1 堆大小通过FreeRTOSConfig.h中的configTOTAL_HEAP_SIZE定义设置,在源码通过数组的总大小configTOTAL_HEAP_SIZE(bytes)定义设置,允许使用pvPortMalloc(),但没有实现vPortFree()。
当调用pvPortMalloc()时,heap_1分配方案将一个简单数组细分为更小的块。这个数组被称为FreeRTOS堆。
每个创建的任务都需要从堆中分配一个任务控制块(TCB)和一个堆栈。下图演示了heap_1如何将简单数组细分为创建任务。
如图可见,Heap_1不能删除栈区,随着不断申请内存,有栈溢出风险,在通常应用中不建议使用此种内存分配方法。
2.Heap_2
Heap_2 堆大小通过FreeRTOSConfig.h中的configTOTAL_HEAP_SIZE定义设置,在源码通过数组的总大小configTOTAL_HEAP_SIZE(bytes)定义设置,允许使用pvPortMalloc()和vPortFree(),但是Heap_2不会将相邻的块合并成一块,因此更容易碎片化。
每个创建的任务都需要从堆中分配一个任务控制块(TCB)和一个堆栈。下图演示了heap_2如何将简单数组细分为创建任务。如1中创建了三个Task;2中删除中间Task;2->3创建一个和删除task大小一样的task;2->4创建了一个比之前删除的task堆更大的task。