1. 程式人生 > >第四節:FreeRTOS 記憶體管理

第四節:FreeRTOS 記憶體管理

目錄

記憶體管理的介紹

記憶體碎片

Heap_1-5記憶體分配的區別

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原理:

Heap1是5個記憶體管理中最簡單的,其策略即只能申請記憶體,當需要的時候就從記憶體堆裡分配一塊,這個記憶體是無法釋放的。對於大多數作業系統來說,特別是對於安全要求高的作業系統,比不需要動態的刪除任務、訊號量、佇列等。而是在初始化時候一次性的建立好,一直使用永不刪除。這個記憶體管理策略實現簡潔、安全可靠。

特點:適於一旦建立好記憶體,訊號量和佇列就不再刪除的任務。具有可確定性,不會導致記憶體碎片。適用於不需要記憶體分配的應用。換句話來說,雖然頂著記憶體分配名稱,但和定義靜態變數本質上沒什麼差異。

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