freeRTOS中文實用教程5 記憶體管理

2022-05-06 09:54:10 字數 2598 閱讀 6216

不同的嵌入式系統具有不同的記憶體配置和時間要求。所以單一的記憶體分配演算法只可能適合部分應用程式。

freertos 將記憶體分配作為可移植層面(相對於基本的核心**部分而言)。這使得不同的應用程式可以提供適合自身的具體實現。

本章期望讓讀者了解以下事情:

(1)當核心請求記憶體時,其呼叫pvportmalloc()而不是直接呼叫malloc();當釋放記憶體時,呼叫vportfree()而不是直接呼叫free()。

pvportmalloc()具有與malloc()相同的函式原型;vportfree()也具有與free()相同的函式原型。

(2)freertos 自帶有三種pvportmalloc()與vportfree()實現範例.freertos 的使用者可以選用其中一種,也可以採用自己的記憶體管理方式

這三個範例對應三個原始檔:heap_1.c,heap_2.c,heap_3.c——這三個檔案都放在目錄freertos\source\portable\memmang 中

(3)早期版本的freertos 所採用的原始記憶體池和記憶體塊分配方案已經被移除了,因為定義記憶體塊和記憶體池的大小需要較深入的努力和理解。

(4)選擇記憶體分配方案時不必考慮一些複雜的因素,比如確定性與記憶體碎片等,而只需要從效能上考慮,比如**大小和簡易性

在小型嵌入式系統中,通常是在啟動排程器之前建立任務,佇列和訊號量。

這種情況表明,動態分配記憶體只會出現在應用程式真正開始執行實時功能之前,而且記憶體一旦分配就不會再釋放

(1)heap_1.c 實現了乙個非常基本的pvportmalloc()版本,而且沒有實現vportfree()

如果應用程式不需要刪除任務,佇列或者訊號量,則具有使用heap_1 的潛質

(2)這種分配方案是將freertos 的記憶體堆空間看作乙個簡單的陣列。

當呼叫pvportmalloc()時,則將陣列又簡單地細分為更小的記憶體塊。

(3)陣列的總大小(位元組為單位)在freertosconfig.h 中由configtotal_heap_size定義。

以這種方式定義乙個巨型陣列會讓整個應用程式看起來耗費了許多記憶體——即使是在陣列沒有進行任何實際分配之前。

(4)需要為每個建立的任務在堆空間上分配乙個任務控制塊(tcb)和乙個棧空間

(1)a 表示陣列在沒有任何任務建立時的情形,這裡整個資料是空的。

(2)b 表示陣列在建立了乙個任務後的情形。

(3)c 表示陣列在建立了三個任務後的情形。

(1)heap_2.c 也是使用了乙個由configtotal_heap_size 定義大小的簡單陣列

(2)不同於heap_1 的是,heap_2 採用了乙個最佳匹配演算法來分配記憶體,並且支援記憶體釋放

(3)由於宣告了乙個靜態陣列,所以會讓整個應用程式看起來耗費了許多記憶體——即使是在陣列沒有進行任何實際分配之前

(4)最佳匹配演算法保證pvportmalloc()會使用最接近請求大小的空閒記憶體塊

舉例:堆空間中包含了三個空閒記憶體塊,分別為5 位元組,25 位元組和100 位元組大小。pvportmalloc()被呼叫以請求分配20 位元組大小的記憶體空間。

匹配請求位元組數的最小空閒記憶體塊是具有25位元組大小的記憶體塊——所以pvportmalloc()會將這個25 位元組塊再分為乙個20 位元組塊和乙個5 位元組塊3,然後返回乙個指向20 位元組塊的指標。

剩下的5 位元組塊則保留下來,留待以後呼叫pvportmalloc()時使用

(5)heap_2.c 並不會把相鄰的空閒塊合併成乙個更大的記憶體塊,所以會產生記憶體碎片——如果分配和釋放的總是相同大小的記憶體塊,則記憶體碎片就不會成為乙個問題

(6)heap_2.c 適合用於那些重複建立與刪除具有相同棧空間任務的應用程式

上圖展示了當任務建立,刪除以及再建立過程中,最佳匹配演算法是如何工作的

(1)a 表示陣列在建立了三個任務後的情形。陣列的頂部還剩餘乙個大空閒塊。

(2) b 表示陣列在刪除了乙個任務後的情形。頂部的大空閒塊保持不變,並多出了兩個小的空閒塊,分別是被刪除任務的tcb 和任務棧。

(3) c 表示陣列在又建立了乙個任務後的情形。建立乙個任務會產生兩次呼叫pvportmalloc(),一次是分配tcb,一次是分配任務棧

注:(1)呼叫pvportmalloc()發生在xtaskcreate() api 函式內部

(2)每個tcb 都具有相同大小,所以最佳匹配演算法可以確保之前被刪除的任務占用的tcb 空間被重新分配用作新任務的tcb 空間。

(3)新建任務的棧空間與之前被刪除任務的棧空間大小相同,所以最佳匹配演算法會保證之前被刪除任務占用的棧空間會被重新分配用作新任務的棧空間。陣列頂部的大空閒塊依然保持不變。

(4)heap_2.c 雖然不具備確定性,但是比大多數標準庫實現的malloc()與free()更有效率

(1)heap_3.c 簡單地呼叫了標準庫函式malloc()和free(),但是通過暫時掛起排程器使得函式呼叫具備執行緒安全特性

(2)記憶體堆空間大小不受configtotal_heap_size 影響,而是由鏈結器配置

[1]freertos中文實用教程

Axmath實用教程

縮放公式的大小 ctrl 滑鼠滾動 上述功能要確保在設定 語法與快捷鍵中開啟了啟用混合語法輸入 轉換符號介面 滑鼠滾動 符號面板 右鍵 可以設定外觀,為某個符號設定快捷鍵 latex編輯器 ctrl tab 第一項 帶歷史記錄的剪貼簿 第二項 磁貼 經常使用的東西 選中後拖動即可製作 第三項 參考書...

NPOI 實用教程

記錄一下,最近專案中使用這個第三方元件 感謝博主的分享 目錄1.認識npoi 2.使用npoi生成xls檔案 2.1 建立基本內容 2.2 單元格操作 2.3 使用excel公式 2.3.1 基本計算 2.3.2 sum函式 2.3.3 日期函式 2.3.4 字串相關函式 2.3.5 if函式 2....

CSS實用教程(二)

七 控制文字的樣式 控制文字的樣式包括文字大小寫 文字修飾兩個部分。1 文字大小寫 文字大小寫使網頁的設計者不用在輸入文字時就完成文字的大小寫,而可以在輸入完畢後,再根據需要對區域性的文字設定大小寫。基本格式如下 text transform 引數 引數取值範圍 uppercase 所有文字大寫顯示...