freertos提供了内存分配的API
pvPortMalloc(),替代C中的malloc(),
vPortFree(),替代C中的free(),
xPortGetFreeHeadSize(),获取当前未分配的堆的大小
freertos提供了5种heap的分配方法。
static uint8_t ucHeap[configTOTAL_HEAP_SIZE];
可以看出,全局堆的大小,由配置宏来确定。
1)heap_1.c
内存从静态的ucHeap中分配,使用于那些不太需要频繁的动态内存分配的应用。它只申请,不释放,适用于大多数场合。
2)heap_2.c
内存从静态的ucHeap中分配,它能够释放,但是它不会把释放的内存进行合并,所以会产生碎片。实质上,它使用的BLOCKLINK来管理内存块的。
如果分配和释放的内存大小是随机的,就不能使用heap2,而要用heap4.
3)heap_3.c
简单封装了标准C中的malloc()和free()。
内存堆不再是ucHeap这个数组,而是改为由编译器和链接器提供。
4)heap_4.c
内存从静态的ucHeap中分配,它能够释放,但是它会把释放的内存进行合并,所以不会产生碎片。实质上,它使用的BLOCKLINK来管理内存块的。
5)heap_5.c
它允许存在多个内存堆,所以它允许内存堆跨越多个不连续的内存段。有些CPU,内部RAM很小,外挂了SDRAM,这时候就需要使用到heap5.
如果使用heap5,就必须在初始化时,使用
void vPortDefineHeapRegions(HeapRegion_t*)
进行堆的初始化定义。
typedef struct HeapRegion{
uint8_t* pucStartAddress;
size_t xSizeInBytes;
}HeapRegion_t;
HeapRegion_t xHeapRegions[] = {
{(uint8_t *)0x20000000UL, 0x30000},
{(uint8_t *)0xC0000000UL, 0x2000000},
{NULL, 0},
};
注意,内存块必须按地址升序排列。
数组中的最后一个成员,是一个约定的特殊值。它是一个无效内存地址。
通常移植freertos时,选择heap4.