一.FreeRTOS 之五種內存分配方案
Heap_1:
(1).在此方案中,實現了基礎版本的pcPortMalloc ,而沒有實現vPortFree(),因此它適用於從來不會刪除任務的應用
( 2) 動態分配的內存總是確定的 ,不會產生內存碎片
Heap_2:
該方案不同於方案1,它可以進行任務的刪除,對空間進行釋放,但是,它不能將相鄰的兩塊相對小的空間進行合併,有可能造成內存碎片的問題,該方案在官方的文檔中不推薦使用,它被Heap_4所代替
在圖中,可以看出將任務釋放之後,會有兩塊不一樣大的空間,這是若創建隊列,將可能佔據原先的棧空間或TCB空間,再將隊列刪除之後就有可能將空間再變小,之後若刪除隊列,那麼再次創建任務的時候就不能在原來那裏開闢空間了,因此造成了內存碎片
所以該方案只適合於頻繁刪除,創建相同任務的應用
Heap_3:
在此方案中,pcPortMalloc(),vPortFree() 和原先的Malloc(),free()的區別是,前者保證了是線程安全的
Heap_4:
該方案是Heap_2的增強版,可以對可以合併兩塊相鄰的內存空間,使之變大。
在圖中我們可以看到在任務空間釋放之後,又創建了隊列,隨之又創建了用戶數據,之後,將隊列,用戶數據刪除之後,又是還原回一塊大的內存空間,因此該方案被推薦代替Heap_2
Heap_5:
該方案是對Heap_4,進行再次的增強,將不相鄰的代碼內存空間進行鏈接使用,變成更大的內存空間。
ref:
161204_Mastering_the_FreeRTOS_Real_Time_Kernel-A_Hands-On_Tutorial_Guide