freertos(第四课, mem, alloc)

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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章