freertos源碼解析-2內存管理

內存管理

  • freertos支持動態分配內存和靜態分配內存
  • Freertos的內存分配是在portable層中實現,與內核實現分開。目錄:Source/Portable/MemMang
    在這裏插入圖片描述

靜態內存管理

特點

  1. 對象可以分配在特定的內存地址處;
  2. 最大內存佔用可以在鏈接時確定,而不是運行時;
  3. 用戶不需要關心內存分配失敗的處理方式;
  4. 允許在不使用動態內存分配的地方使用RTOS。

定義宏 configSUPPORT_STATIC_ALLOCATION = 1 使用靜態內存分配。既可以使用以下函數,裏面使用的內存分配是靜態內存分配方式。
在這裏插入圖片描述

動態內存管理

大多數使用freertos的場合,還是使用的動態內存分配。freertos提供了五種動態內存分配方法。如第一張圖所示。
動態分配RTOS對象的特點:

  1. 最大可能減少系統使用的最大RAM;
  2. 當創建object時需要更少的函數參數;
  3. 內存再RTOS的API函數函數中自動分配;
  4. 應用程序不需要關心內存分配本身;
  5. RTOS內存分配API函數,會返回heap的使用信息,使得用戶可以優化heap的使用;
  6. 內存分配的方法有多種方式,可以適應於不同的應用場合。

內核對象內存分配,分配的內存來自: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空間大小;但是不能提供碎片信息。

公衆號:嵌入式軟件和硬件
在這裏插入圖片描述

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