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.

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