FreeRTOS 1 記憶體管理

2021-08-30 02:07:25 字數 1189 閱讀 7330

freertos提供的記憶體分配方案分別位於不同的原始檔(heap_1.c、heap_2.c、heap_3.c、heap_4.c、heap_5.c)之中;

所有實現中最簡單的乙個。一旦分配記憶體之後,不允許釋放分配的記憶體。

當需要分配ram時,這個記憶體分配方案只是簡單的將乙個大陣列細分出乙個子集來。大陣列的容量大小通過freertosconfig.h檔案中的configtotal_heap_size巨集來設定。

api函式xportgetfreeheapsize()返回未分配的堆疊空間總大小,可以通過這個函式返回值對configtotal_heap_size進行合理的設定。

使用乙個最佳匹配演算法,它允許釋放之前分配的記憶體塊。它不會把相鄰的空閒塊合成乙個更大的塊(這會造成記憶體碎片)。

可以用於重複的分配和刪除具有相同堆疊空間的任務、佇列、訊號量、互斥量等等,並且不考慮記憶體碎片的應用程式。

不能用在分配和釋放隨機位元組堆疊空間的應用程式

如果乙個應用程式動態的建立和刪除任務,並且分配給任務的堆疊空間總是同樣大小,那麼大多數情況下heap_2.c是可以使用的。但是,如果分配給任務的堆疊不總是相等,那麼釋放的有效記憶體可能碎片化,形成很多小的記憶體塊。最後會因為沒有足夠大的連續堆疊空間而造成記憶體分配失敗。在這種情況下,heap_4.c是乙個很好的選擇。

如果乙個應用程式動態的建立和刪除佇列,並且在每種情況下佇列儲存區域(佇列儲存區域指佇列項數目乘以每個佇列長度)都是同樣的,那麼大多數情況下heap_2.c可以使用。但是,如果佇列儲存區在每種情況下並不總是相等,那麼釋放的有效記憶體可能碎片化,形成很多小的記憶體塊。最後會因為沒有足夠大的連續堆疊空間而造成記憶體分配失敗。在這種情況下,heap_4.c是乙個很好的選擇。

應用程式直接呼叫pvportmalloc() 和 vportfree()函式,而不僅是通過freertos api間接呼叫。

如果你的應用程式中的佇列、任務、訊號量、互斥量等等處在乙個不可預料的順序,則可能會導致記憶體碎片問題,雖然這是小概率事件,但必須牢記。

不具有確定性,但是它比標準庫中的malloc函式具有高得多的效率

簡單的包裝了標準庫中的malloc()和free()函式,包裝後的malloc()和free()函式具備執行緒保護。

使用乙個最佳匹配演算法,但不像方案2那樣。它會將相鄰的空閒記憶體塊合併成乙個更大的塊(包含乙個合併演算法)。

實現了heap_4.c中的合併演算法,並且允許堆疊跨越多個非連續的記憶體區。

FreeRtos 1 任務建立與管理

freertos實時作業系統移植 以上是歷史freertos部落格。freertos系列我會堅持更下去。任務的建立函式 basetype t xtaskcreate taskfunction t pxtaskcode,const char const pcname,const configstack...

從0開始的FreeRTOS(1)

這個系列的教程的主要目的是帶大家了解實時系統 real time operating system 的基本概念,熟悉freertos的api使用方法,具備基本的使用rtos進行工程開發的能力 系列計畫分幾期錄完,內容分別為 本教程的開發環境 我們這節課主要解決兩個問題 什麼是rtos?為什麼要用rt...

FreeRTOS 記憶體管理

1.標準malloc 和 free 庫函式的缺陷 1 在小型的嵌入式系統中,可能不可用。2 具體實現相對較大,占用較多寶貴的 空間。3 通常不具備執行緒安全性。4 具有不確定性,每次呼叫的時間開銷可能不同。5 會產生記憶體碎片。6 會使得鏈結器 配置的複雜。2.記憶體分配方案範例。1 heap 1....