第四節:FreeRTOS 記憶體管理
目錄
Heap_1:適用於一旦建立好記憶體,就不刪除的任務。 (本質是分配的大陣列做記憶體堆.)
Heap_2:適用於重複分配和刪除具有相同堆疊空間任務。(本質是分配的大陣列做記憶體堆.)
Heap_3:為對記憶體空間的操作,簡單的封裝了malloc和free。具有執行緒保護,但無空閒記憶體合併。
Heap_4:內可將相鄰的空閒記憶體合併。儲存順序小地址在前(本質是分配的大陣列做記憶體堆.)
Heap_5:記憶體管理策略允許記憶體堆跨越多個非連續的記憶體,切需要初始化,其他和4相似。
記憶體管理的介紹
FreeRTOS建立任務、佇列、訊號量等的時候有兩種方法
——動態申請所需要的RAM。
——靜態方法自行建立“static”定義。
記憶體管理主要針對,FreeRTOS提供的5中記憶體管理策略討論的。
總的來說heap1最簡單,單隻能申請不能釋放。heap2提供了記憶體釋放函式,但存在記憶體碎片問題。
heap3是對malloc和free的簡單封裝,提供執行緒保護。heap4提供了記憶體合併。heap5支援不連續記憶體塊。
在使用中需要選取一種策略,使用者可以選擇其中某一種。路徑:FreeRTOS->Source->portable->MemMang.
記憶體碎片
記憶體碎片化是一個概念性的問題,指的是不合理的記憶體操作會導致記憶體碎片化,以至於最後有很多碎片化空間,
無法整塊的分配記憶體。
記憶體碎片化:記憶體經過多次的申請和釋放以後,會導致碎片化。
記憶體碎片化的危害:記憶體碎片化後,會導致雖然可用記憶體很多,但是可能導致連續的實體記憶體申請失敗,無法記憶體分配。
Heap_1-5記憶體分配的區別
如下介紹5中策略的差異,參考資料中有對原始碼的分析。
Heap_1:
Heap_1原理:
特點:適於一旦建立好記憶體,訊號量和佇列就不再刪除的任務。具有可確定性,不會導致記憶體碎片。適用於不需要記憶體分配的應用。換句話來說,雖然頂著記憶體分配名稱,但和定義靜態變數本質上沒什麼差異。
Heap_2:
Heap_2原理:Heap2相對於Heap1管理複雜。它使用最佳匹配演算法,允許釋放之前的記憶體塊,但是它不會把相鄰的空閒記憶體合併成為一個更大的塊(會造成記憶體碎片)。
特點: 這個記憶體管理策略用於重複的分配和刪除具有相同堆疊空間的任務.佇列.訊號量.互斥量等。並且不考慮記憶體碎片的應用程式,不適用於分配和釋放隨機位元組堆疊空間的應用程式!
Heap_3:
Heap_3原理:記憶體管理策略簡單的封裝了標準函式的malloc()和free()函式,採用的封裝方式是操作記憶體前掛起排程器、完成後再恢復排程器。封裝後的malloc和free具有執行緒保護。
特點: 第一種和第二種記憶體管理策略都是通過定義一個大陣列作為記憶體堆,陣列的大小由巨集configTOTAL_HEAP_SIZE指定。第三種記憶體管理策略與前兩種不同,它不再需要通過陣列定義記憶體堆,而是需要使用編譯器設定記憶體堆空間,一般在啟動程式碼中設定。因此巨集configTOTAL_HEAP_SIZE對這種記憶體管理策略是無效的。
Heap_4:
Heap_4原理:和第二種方式比較相似,只不過增加了一個和並演算法,將相鄰空閒記憶體合併為一個大記憶體,和方法一、二管理策略一樣,記憶體堆仍為一個大陣列。
特點: 第四種記憶體管理策略的空閒塊連結串列不是以記憶體塊大小為儲存順序,而是以記憶體塊起始地址大小為儲存順序,地址小的在前,地址大的在後。這也是為了適應合併演算法而作的改變。
Heap_5:
heap_5原理:第五種記憶體管理策略允許記憶體堆跨越多個非連續的記憶體區,並且需要顯示的初始化記憶體堆,除此之外其它操作都和第四種記憶體管理策略十分相似。
特點:首先它允許跨記憶體區定義多個記憶體堆,比如在片內RAM中定義一個記憶體堆,還可以在片外RAM再定義記憶體堆;其次,使用者需要指定每個記憶體堆區域的起始地址和記憶體堆大小、將它們放在一個HeapRegion_t結構體型別陣列中,並需要在使用任何記憶體分配和釋放操作前呼叫vPortDefineHeapRegions()函式初始化這些記憶體堆。
參考資料:
Heap_1原始碼分析:https://blog.csdn.net/ZenNaiHeQiao/article/details/82757329
Heap_2原始碼分析:https://blog.csdn.net/ZenNaiHeQiao/article/details/82769500
Heap_3原始碼分析:https://blog.csdn.net/ZenNaiHeQiao/article/details/82771467
Heap_4原始碼分析:https://blog.csdn.net/ZenNaiHeQiao/article/details/82772391
Heap_5原始碼分析:https://blog.csdn.net/ZenNaiHeQiao/article/details/82774239
https://blog.csdn.net/zhzht19861011/article/details/51606068