內存管理
- freertos支持動態分配內存和靜態分配內存
- Freertos的內存分配是在portable層中實現,與內核實現分開。目錄:Source/Portable/MemMang
靜態內存管理
特點
- 對象可以分配在特定的內存地址處;
- 最大內存佔用可以在鏈接時確定,而不是運行時;
- 用戶不需要關心內存分配失敗的處理方式;
- 允許在不使用動態內存分配的地方使用RTOS。
定義宏 configSUPPORT_STATIC_ALLOCATION = 1
使用靜態內存分配。既可以使用以下函數,裏面使用的內存分配是靜態內存分配方式。
動態內存管理
大多數使用freertos的場合,還是使用的動態內存分配。freertos提供了五種動態內存分配方法。如第一張圖所示。
動態分配RTOS對象的特點:
- 最大可能減少系統使用的最大RAM;
- 當創建object時需要更少的函數參數;
- 內存再RTOS的API函數函數中自動分配;
- 應用程序不需要關心內存分配本身;
- RTOS內存分配API函數,會返回heap的使用信息,使得用戶可以優化heap的使用;
- 內存分配的方法有多種方式,可以適應於不同的應用場合。
內核對象內存分配,分配的內存來自:special freertos heap。即ucHeap[ configTOTAL_HEAP_SIZE ]
也就是說,freertos運行起來後,裏面動態分配的內存都是在ucheap
中分配。棧也是從ucheap
分配的 。
五種動態內存分配方法
- Heap1:適用於一旦創建好,就不需要刪除的應用。(區別於靜態分配)(自從freertos支持靜態內存分配後,heap1分配方法很少被使用)
- Heap2:分配內存採用best fit算法;內存可以釋放,但是不會被合併。
- Heap3:封裝C標準的malloc函數和free函數,實現線程安全。使用條件:需要linker建立堆,編譯器庫實現malloc和free;不是確定性的;會增加RTOS內核的體積。
- Heap4:分配內存採用first fit策略(即選擇第一個滿足分配要求的內存塊),釋放內存後,相鄰內存會被合併。所有內存塊被按照地址從低到高保存在鏈表中,相鄰內存塊如果地址連續,則可以合併。
- Heap5:分配和釋放策略類似於heap4。heap5同時允許使用多個非連續的內存區塊作爲系統的內存。
使用vPortDefineHeapRegions()函數初始化;創建任何對象都會調用pvPortMalloc(0函數,在此之前必須調用vPortDefineHeapRegions()函數初始化初始化。vPortDefineHeapRegions()函數參數是一個HeapRegion結構體的數組,
const HeapRegion_t xHeapRegions[] =
{
{ ( uint8_t * ) 0x80000000UL, 0x10000 },
{ ( uint8_t * ) 0x90000000UL, 0xa0000 },
{ NULL, 0 } /* Terminates the array. */
};//各地址片段必須按順序放置在數組中
The xPortGetFreeHeapSize()可以返回剩餘的heap空間大小;但是不能提供碎片信息。
公衆號:嵌入式軟件和硬件