freeRTOS源碼中提供了五種內(nèi)存管理的方案,可以說是很方便了。實際需要使用哪一種,可以根據(jù)自己項目的需要進(jìn)行選擇,都是可以的。
那這五種不同的內(nèi)存管理方式都有哪些差異呢?按照官方給出的說明,這五種內(nèi)存管理的特點分別如下:
1、內(nèi)存管理方式 1(heap_1.c)
heap_1 動態(tài)內(nèi)存管理方式是五種動態(tài)內(nèi)存管理方式中最簡單的,這種方式的動態(tài)內(nèi)存管理一旦申請 了相應(yīng)內(nèi)存后,是不允許被釋放的。
盡管如此,這種方式的動態(tài)內(nèi)存管理還是可以滿足許多的嵌入式項目的, 因為有些嵌入式產(chǎn)品在系統(tǒng)啟動階段就明確了任務(wù)創(chuàng)建、事件標(biāo)志組、信號量、消息隊列等資源的使用情況, 而且這些資源是整個運行過程中都要一直使用的,并不打算釋放或者丟棄,所以也就不需要釋放內(nèi)存。
FreeRTOS 的 動態(tài)內(nèi)存可以申請的大小范圍可以在 FreeRTOSConfig.h 文件中進(jìn)行了定義:
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30 * 1024 ) ) //單位字節(jié)
這個宏其實是規(guī)定了操作系統(tǒng)的堆棧空間的總大小,動態(tài)申請的內(nèi)存大小是不能操作這個這個值的。
我們可以通過函數(shù) xPortGetFreeHeapSize 就能獲得 FreeRTOS 動態(tài)內(nèi)存的剩余情況,進(jìn)而可以根據(jù)剩余情況優(yōu)化 動態(tài)內(nèi)存的大小。
heap_1 方式的動態(tài)內(nèi)存管理有以下特點:
1)項目不需要刪除任務(wù)、信號量、消息隊列等已經(jīng)創(chuàng)建的資源。
2)所申請的動態(tài)內(nèi)存的時間是固定的,并且不會產(chǎn)生內(nèi)存碎片。
3)是一種靜態(tài)內(nèi)存分配方案,因為申請的內(nèi)存是不會被釋放掉。
2、內(nèi)存管理方式 2(heap_2.c)
heap_2 動態(tài)內(nèi)存管理利用了自適應(yīng)算法,并且支持內(nèi)存釋放, 但是不支持內(nèi)存碎片整理。
FreeRTOS 的 動態(tài)內(nèi)存可以申請的大小范圍可以在 FreeRTOSConfig.h 文件中進(jìn)行了定義:
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30 * 1024 ) ) //單位字節(jié)
通過函數(shù) xPortGetFreeHeapSize 能獲得 FreeRTOS 動態(tài)內(nèi)存的剩余,可以根據(jù)剩余情況優(yōu)化動態(tài)內(nèi)存的大小。
heap_2 方 式的內(nèi)存管理有以下特點:
1)在不考慮內(nèi)存碎片的情況下,這種方式支持重復(fù)的任務(wù)、信號量、事件標(biāo)志組、軟件定時器等內(nèi)部資源 的創(chuàng)建和刪除。因為不使用的資源是支持釋放的,所以可以讓內(nèi)存資源得到反復(fù)的使用!
2)如果申請和釋放的動態(tài)內(nèi)存大小是隨機的,不建議采用這種動態(tài)內(nèi)存管理方式。
3)項目中需要重復(fù)的創(chuàng)建和刪除任務(wù),如果每次創(chuàng)建需要動態(tài)內(nèi)存大小相同,那么 heap_2 比 較適合,但每次創(chuàng)建需要動態(tài)內(nèi)存大小不同,那么方式 heap_2 就不合適了,因為容易產(chǎn)生內(nèi)存 碎片,內(nèi)存碎片過多的話會導(dǎo)致無法申請出一個大的內(nèi)存塊出來。
4)項目中需要重復(fù)的創(chuàng)建和刪除消息隊列,也會出現(xiàn)類似上面的情況。
5)直接的調(diào)用函數(shù) pvPortMalloc() 和 vPortFree() 也容易出現(xiàn)內(nèi)存碎片。如果按一定順序的申請和釋放,基本沒有內(nèi)存碎片的,而不按順序的隨機申請和釋放容易產(chǎn)生內(nèi)存碎片。
6)如果隨機的創(chuàng)建和刪除任務(wù)、消息隊列、事件標(biāo)志組、信號量等內(nèi)部資源也容易出現(xiàn)內(nèi)存碎片。
3、 內(nèi)存管理方式 3(heap_3.c)
這種方式實現(xiàn)的內(nèi)存管理是對編譯器提供的 malloc 和 free 函數(shù)進(jìn)行了封裝,保證是線程安全的。
FreeRTOS 的動態(tài)內(nèi)存大小在 FreeRTOSConfig.h 文件中進(jìn)行了定義:
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30 * 1024 ) ) //單位字節(jié)
heap_3 方式的內(nèi)存管理有以下特點:
1)需要編譯器提供 malloc 和 free 函數(shù)。
2)不具有時間確定性,即申請動態(tài)內(nèi)存的時間不是固定的。
3)增加 RTOS 內(nèi)核的代碼量。
另外要特別注意一點,這種方式的動態(tài)內(nèi)存申請和釋放不是用的 FreeRTOSConfig.h 文件中定義的heap空間大小,而是用的編譯器設(shè)置的heap空間大小。
4、內(nèi)存管理方式 4(heap_4.c)
heap_4 動態(tài)內(nèi)存管理利用了最適應(yīng)算法,且支持內(nèi)存碎片的回 收并將其整理為一個大的內(nèi)存塊。
FreeRTOS 的動態(tài)內(nèi)存大小在 FreeRTOSConfig.h 文件中進(jìn)行了定義:
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30 * 1024 ) ) //單位字節(jié)
heap_4 同時支持將動態(tài)內(nèi)存設(shè)置在指定的 RAM 空間位置。
通過函數(shù) xPortGetFreeHeapSize 就能獲得 FreeRTOS 動態(tài)內(nèi)存的剩余。
使用函數(shù) xPortGetMinimumEverFreeHeapSize 能夠獲取從系統(tǒng)啟 動到當(dāng)前時刻的動態(tài)內(nèi)存最小剩余。
heap_4 方式的 內(nèi)存管理有以下特點:
1)可以用于需要重復(fù)的創(chuàng)建和刪除任務(wù)、信號量、事件標(biāo)志組、軟件定時器等資源的項目中。
2)調(diào)用 pvPortMalloc() 和 vPortFree(),即使每次申請的內(nèi)存大小都不同,也不會產(chǎn) 生很多的內(nèi)存碎片。
3)申請動態(tài)內(nèi)存的時間不是確定的。
5、 內(nèi)存管理方式 5 (heap_5.c)
如果希望申請的空間可以采用不連續(xù)的內(nèi)存區(qū),比希望可以將內(nèi)存定義在內(nèi)部 SRAM 中的某一部分,或者外部 SRAM 的一部分,就可以采用 heap_5 動態(tài)內(nèi)存管理 方式。
heap_5 內(nèi)存管理通過函數(shù) vPortDefineHeapRegions 進(jìn)行初始化的,即在創(chuàng)建任 務(wù) FreeRTOS 的內(nèi)部資源前要優(yōu)先調(diào)用這個函數(shù) vPortDefineHeapRegions,否則是無法通過函數(shù) pvPortMalloc 申請到動態(tài)內(nèi)存的。
6、這五種內(nèi)存申請方式的比較
有關(guān)五種動態(tài)內(nèi)存管理方式簡單總結(jié)如下:
1)heap_1.c:五種方式里面最簡單的,但是申請的內(nèi)存不允許釋放。
2)heap_2.c:支持動態(tài)內(nèi)存的申請和釋放,但是不支持內(nèi)存碎片的處理,無法將碎片內(nèi)存合并成一個大的內(nèi)存塊。
3)heap_3.c:將編譯器自帶的 malloc 和 free 函數(shù)進(jìn)行簡單的封裝,以支持線程安全,即支持多任務(wù)調(diào) 用。
4)heap_4.c:支持動態(tài)內(nèi)存的申請和釋放,支持內(nèi)存碎片處理,支持將動態(tài)內(nèi)存設(shè)置在個固定的地址(內(nèi)部或者外部 RAM)。
5)heap_5.c:在 heap_4.c 的基礎(chǔ)上支持將動態(tài)內(nèi)存設(shè)置在不連續(xù)的區(qū)域上。
其實大多數(shù)項目中使用的都是 heap_4.c 這種內(nèi)存的管理方式,這種方式支持動態(tài)內(nèi)存的申請和釋放,支持內(nèi)存碎片處理,還支持將動態(tài)內(nèi)存設(shè)置在個固定的地址,對大多數(shù)的項目都有很高的滿足性,基本上都能夠適配上了!
五種方式不分優(yōu)劣吧,看自己的項目的需求,合適才是最好的!!!
-
源碼
+關(guān)注
關(guān)注
8文章
641瀏覽量
29208 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62173 -
內(nèi)存管理
+關(guān)注
關(guān)注
0文章
168瀏覽量
14138
發(fā)布評論請先 登錄
相關(guān)推薦
評論