阿九講學(十)——FreeRTOS堆內(nèi)存管理(二)

前面介紹了FreeRTOS堆內(nèi)存管理實現(xiàn),總共有5種實現(xiàn)分別在heap_1.c,heap_2.c,heap_3.c,heap_4.c和heap_5.c文件中,都存在于文件夾FreeRTOS/Source/portable/MemMang下。上一講講了第一個實現(xiàn)Heap_1。

我們再看一下第二個實現(xiàn)Heap_2:

為了向后兼容性,Heap_2保留在FreeRTOS發(fā)行版中,但是不推薦在新設(shè)計使用它??梢钥紤]使用heap_4,heap_4是heap_2增強版。

Heap_2.c還是通過configTOTAL_HEAP_SIZE來定義堆的大小,它使用最佳匹配算法來分配內(nèi)存,并且與heap_1不同,它允許釋放內(nèi)存。同樣,數(shù)組是靜態(tài)聲明的,因此會使應(yīng)用程序看起來消耗大量RAM,甚至在分配數(shù)組中的任何內(nèi)存之前也是如此。

最佳匹配算法確保pvPortMalloc()使用大小與請求字節(jié)數(shù)最接近的空閑內(nèi)存塊。例如,以下場景:

1. 堆分別包含3塊空閑內(nèi)存,分別是5個字節(jié)、25個字節(jié)和100個字節(jié);

2. 調(diào)用pvPortMalloc()請求20個字節(jié)的RAM。

所請求的字節(jié)數(shù)能夠容納的最小空閑RAM塊是25字節(jié)塊,因此pvPortMalloc()將25字節(jié)塊分割為一個20字節(jié)的塊和一個5 bytes的塊,然后返回一個指向20字節(jié)塊的指針。新的5字節(jié)塊仍然可以用于將來對pvPortMalloc()的調(diào)用。

與heap_4不同,Heap_2不會將相鄰的空閑塊合并為一個更大的塊,因此更容易出現(xiàn)碎片。然而,如果分配和隨后釋放的塊的大小總是相同,那么碎片就不是問題。Heap_2適用于重復創(chuàng)建和刪除任務(wù)的應(yīng)用程序,前提是分配給所創(chuàng)建任務(wù)的堆棧大小不變。

從上圖可以看到Heap_2在創(chuàng)建、刪除和再次創(chuàng)建任務(wù)時,最佳匹配算法如何工作的。

1.?A顯示創(chuàng)建了三個任務(wù)之后的數(shù)組。一個大的空閑塊保留在數(shù)組的頂部。

2.?B顯示刪除其中一個任務(wù)后的數(shù)組。數(shù)組頂部的大空閑塊仍然存在。現(xiàn)在還有兩個較小的空閑塊,是之前分配給已刪除任務(wù)的TCB和堆棧,現(xiàn)在被釋放出來了。

3.C顯示創(chuàng)建另一個任務(wù)后的情況。創(chuàng)建任務(wù)導致了對pvPortMalloc()的兩個調(diào)用,一個用于分配新的TCB,另一個用于分配任務(wù)堆棧。任務(wù)是使用xTaskCreate() API函數(shù)創(chuàng)建的,對pvPortMalloc()的調(diào)用發(fā)生在xTaskCreate()內(nèi)部。

每個TCB的大小都是完全相同的,因此最佳擬合算法確保以前分配給刪除任務(wù)的TCB的RAM塊被重用,以分配新任務(wù)的TCB。

堆棧的大小分配給新創(chuàng)建的任務(wù)是相同的,先前刪除任務(wù),分配給最適合的算法確保以前分配的內(nèi)存塊刪除任務(wù)的堆棧分配新任務(wù)的堆棧中重用。

數(shù)組頂部較大的未分配塊保持不變。

Heap_2不是確定的,但是它比malloc()和free()的大多數(shù)標準庫實現(xiàn)都要快。、



Heap_3.c

接下來我們再看Heap_3.c。

Heap_3.c使用標準庫malloc()和free()函數(shù),因此堆的大小由鏈接器配置定義,configTOTAL_HEAP_SIZE設(shè)置沒有影響。

Heap_3通過臨時掛起FreeRTOS調(diào)度程序,使malloc()和free()線程安全。線程安全和調(diào)度程序掛起在后面將會有討論。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容