STM32 FreeRTOS內存管理簡介

在使用 FreeRTOS 創建任務、隊列、信號量等對象時,通常都有動態創建和靜態創建的方式。動態方式提供了更靈活的內存管理,而靜態方式則更注重內存的靜態分配和控制。

如果是的,那么標準 C 庫 malloc() 和 free() 函數有時可用于此目的,但是有以下缺點:

它們在嵌入式系統上并不總是可用。

它們占用了寶貴的代碼空間。

它們不是線程安全的。

它們不是確定性的 (執行函數所需時間將因調用而異)。

所以更多的時候需要的不是一個替代的內存分配實現。一個嵌入式/實時系統的 RAM 和定時要求可能與另一個非常不同,所以單一的 RAM 分配算法將永遠只適用于一個應用程序子集。為了避免此問題,FreeRTOS 將內存分配 API 保留在其可移植層,提供了五種內存管理算法:?

heap_1:最簡單,不允許釋放內存。

heap_2:允許釋放內存,但不會合并相鄰的空閑塊。

heap_3:簡單包裝了標準 malloc() 和 free(),以保證線程安全。

heap_4:合并相鄰的空閑塊以避免碎片化。包含絕對地址放置選項。

heap_5:如同 heap_4,能夠跨越多個不相鄰內存區域的堆。

FreeRTOS內存管理算法

heap_1算法

heap_1 是最簡單的實現方式。內存一經分配,它不允許內存再被釋放。盡管如此,heap_1.c 還是適用于大量嵌入式應用程序。這是因為許多小型和深度嵌入的應用程序在系統啟動時創建了所需的所有任務、隊列、信號量等,并在程序的生命周期內使用所有這些對象(直到應用程序再次關閉或重新啟動)。任何內容都不會被刪除

heap_2算法

heap_2 使用最佳適應算法,并且與方案 1 不同,它允許釋放先前分配的塊,它將相鄰的空閑塊組合成一個大塊。------空閑塊不會合并

heap_2.c 適用于許多必須動態創建對象的小型實時系統 。

1、如果動態地創建和刪除任務,且分配給正在創建任務的堆棧大小總是相同的,那么 heap2.c 可以在大多數情況下使用。

2、但是,如果分配給正在創建任務的堆棧的大小不是總相同,那么可用的空閑內存可能會被碎片化成許多小塊,最終導致分配失敗。

heap_2 使用最佳適應算法,該算法在空閑內存中選擇與請求的內存大小最接近的塊來分配內存。下面是一個簡單的例子來說明最佳適應算法:

假設有一個空閑內存,其中包含以下塊:

大小為 20 字節的空閑塊。

大小為 15 字節的空閑塊。

大小為 25 字節的空閑塊。

現在有一個任務請求分配 18 字節的內存。最佳適應算法將選擇大小為 20 字節的塊,因為它與請求的大小最接近。在選擇這個塊后,分配器可能會將該塊分割為兩部分,一部分大小為 18 字節,用于任務的內存,另一部分大小為 2 字節,留作未分配的塊。

heap_3算法

heap_3使用 C 庫的 malloc 和 free 函數來進行內存分配和釋放。它通過分配固定大小的來管理內存,這些塊的大小在配置 FreeRTOS 時進行定義,不會動態改變

假設我們使用 Heap_3 管理內存,其中塊的大小固定為 32 字節。初始時,整個內存被分割成大小為 32 字節的塊:

塊 1(32 字節)。

塊 2(32 字節)。

塊 3(32 字節)。

現在,有一個任務請求分配 20 字節的內存。Heap_3 算法將選擇塊 1,并將其分割成兩部分:

分配給任務的內存塊(20 字節)。

剩余未分配的塊(12 字節)。

再假設另一個任務請求分配 40 字節的內存。由于沒有足夠大的塊可供分配,heap_3 將返回分配失敗的狀態。

heap_3 的特點是塊大小固定,這樣可以簡化內存管理。然而,也因為塊大小不可變,可能導致內存碎片問題,即一些塊可能無法完全被利用,從而浪費了一些內存。

heap_4算法

heap_4使用第一適應算法,并且會將相鄰的空閑內存塊合并成大內存塊,減少內存碎片。

第一適應算法會在可用內存塊中選擇第一個足夠大的內存塊進行分配。

假設有一個內存塊鏈表,其中包含以下順序的內存塊:

大小為 40 字節的塊。

大小為 30 字節的塊。

大小為 15 字節的塊。

大小為 20 字節的塊。

如果一個任務需要申請 25 字節的內存,第一適應算法將選擇大小為 40 字節的塊,因為它是第一個足夠大以容納任務需求的內存塊。(如果是heap_2的最佳適應算法,會選擇30字節的塊)

heap_5算法

heap_5使用與 heap_4 相同的第一適應和內存合并算法,允許堆跨越多個不相鄰(非連續)內存區域。適用于內存地址不連續的復雜場景。

reeRTOS內存管理相關API函數介紹

內存管理相關函數如下:

函數

描述

void * pvPortMalloc( size_t ?xWantedSize );

申請內存

void ?vPortFree( void * pv );

釋放內存

size_t ?xPortGetFreeHeapSize( void );

獲取當前空閑內存的大小

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66457.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux系統編程】—— 深度解析進程等待與終止:系統高效運行的關鍵

文章目錄 進程創建再次認識fork()函數fork()函數返回值 寫時拷貝fork常規?法以及調用失敗的原因 進程終?進程終止對應的三種情況進程常?退出?法_exit函數exit函數return退出 進程等待進程等待的必要性進程等待的?法 進程創建 再次認識fork()函數 fork函數初識&#xff1…

國產編輯器EverEdit -重復行

1 重復行 1.1 應用場景 在代碼或文本編輯過程中, 經常需要快速復制當前行,比如,給對象的多個屬性進行賦值。傳統的做法是:選中行-> 復制-> 插入新行-> 粘貼,該操作有4個步驟,非常繁瑣。 那有沒…

基于VSCode+CMake+debootstrap搭建Ubuntu交叉編譯開發環境

基于VSCodeCMakedebootstrap搭建Ubuntu交叉編譯開發環境 1 基于debootstrap搭建目標系統環境1.1 安裝必要軟件包1.2 創建sysroot目錄1.3 運行debootstrap1.4 掛載必要的虛擬文件系統1.5 進入目標系統1.6 使用目標系統(以安裝zlog為例)1.7 清理和退出 2 基…

NiceFish(美人魚)

前端有 3 個版本: 瀏覽器環境移動端環境Electron 環境 服務端有 2 個版本: SpringBoot 版本(已實現基于 Apache Shiro 的 RBAC 權限控制)SpringCloud 版本 1.主要依賴 名稱版本描述Angular16.2.0Angular 核心庫。PrimeNG16.2…

華為ENSP:STP和鏈路聚合的管理與配置

這里將不再過度闡述STP和鏈路聚合的理論知識,不清楚的同學可以去觀看Cisco文章中的理論知識 理論知識https://blog.csdn.net/2301_76341691/article/details/145166547?fromshareblogdetail&sharetypeblogdetail&sharerId145166547&sharereferPC&…

【PyCharm】連接 Git

【PyCharm】相關鏈接 【PyCharm】連接 Git【PyCharm】連接Jupyter Notebook【PyCharm】快捷鍵使用【PyCharm】遠程連接Linux服務器【PyCharm】設置為中文界面 要在 PyCharm 中連接 Git,確保您的開發環境已經安裝了 Git,并且 PyCharm 能夠訪問它。 以下…

dl學習筆記:(4)簡單神經網絡

(1)單層正向回歸網絡 bx1x2z100-0.2110-0.05101-0.051110.1 接下來我們用代碼實現這組線性回歸數據 import torch x torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype torch.float32) z torch.tensor([-0.2, -0.05, -0.05, 0.1]) w torch.…

三、華為交換機 Hybrid

一、Hybrid功能 Hybrid口既可以連接普通終端的接入鏈路(類似于Access接口),又可以連接交換機間的干道鏈路(類似于Trunk接口)。它允許多個VLAN的幀通過,并可以在出接口方向將某些VLAN幀的標簽剝掉&#xff0…

Tensor 基本操作1 | PyTorch 深度學習實戰

目錄 創建 Tensor常用操作unsqueezesqueezeSoftmax代碼1代碼2代碼3 argmaxitem 創建 Tensor 使用 Torch 接口創建 Tensor import torch參考:https://pytorch.org/tutorials/beginner/basics/tensorqs_tutorial.html 常用操作 unsqueeze 將多維數組解套&#xf…

Grafana系列之面板接入Prometheus Alertmanager

關于Grafana的儀表板Dashboard,以及面板Panel,參考Grafana系列之Dashboard。可以直接在面板上創建Alert,即所謂的Grafana Alert,參考Grafana系列之Grafana Alert。除了Grafana Alert外,面板也可接入Prometheus Alertma…

Windows 上安裝 MongoDB 的 zip 包

博主介紹: 大家好,我是想成為Super的Yuperman,互聯網宇宙廠經驗,17年醫療健康行業的碼拉松奔跑者,曾擔任技術專家、架構師、研發總監負責和主導多個應用架構。 近期專注: RPA應用研究,主流廠商產…

LeetCode 2266.統計打字方案數:排列組合

【LetMeFly】2266.統計打字方案數:排列組合 力扣題目鏈接:https://leetcode.cn/problems/count-number-of-texts/ Alice 在給 Bob 用手機打字。數字到字母的 對應 如下圖所示。 為了 打出 一個字母,Alice 需要 按 對應字母 i 次&#xff0c…

PTA乙級1001~1005【c++】

首先講解一下PTA乙級在哪里。PTA乙級題其實就是PAT (Basic Level) Practice &#xff08;中文&#xff09; 1001 害死人不償命的(3n1)猜想 #include<iostream> using namespace std;int main() {int cnt 0;int n;cin >> n;while(n ! 1){cnt ;if (n & 1){n …

滲透筆記1

第一天 工具&#xff1a;cs cobalt strike 4.9 / msf kali &#xff08;自帶 Ubuntu&#xff09; cs cobalt strike 4.9&#xff1a;server-client server部署在云服務器上&#xff0c;client分別在各地&#xff0c;與server相連接&#xff1b;連接上后就可以共享上線主機。…

用Python實現SVM搭建金融反詐模型(含調試運行)

1.概述 信用卡盜刷一般發生在持卡人信息被不法分子竊取后&#xff0c;復制卡片進行消費或信用卡被他人冒領后激活并消費等情況下。一旦發生信用卡盜刷&#xff0c;持卡人和銀行都會遭受一定的經濟損失。本節要運用支持向量機分類算法搭建一個金融反欺詐模型。 2.數據集 使用…

HunyuanVideo 文生視頻模型實踐

HunyuanVideo 文生視頻模型實踐 flyfish 運行 HunyuanVideo 模型使用文本生成視頻的推薦配置&#xff08;batch size 1&#xff09;&#xff1a; 模型分辨率(height/width/frame)峰值顯存HunyuanVideo720px1280px129f60GHunyuanVideo544px960px129f45G 本項目適用于使用 N…

第6章 ThreadGroup詳細講解(Java高并發編程詳解:多線程與系統設計)

1.ThreadGroup 與 Thread 在Java程序中&#xff0c; 默認情況下&#xff0c; 新的線程都會被加入到main線程所在的group中&#xff0c; main線程的group名字同線程名。如同線程存在父子關系一樣&#xff0c; Thread Group同樣也存在父子關系。圖6-1就很好地說明了父子thread、父…

nginx常用配置 (含負載均衡、反向代理、限流、Gzip壓縮、圖片防盜鏈 等示例)

nginx的配置文件通常在 /etc/nginx/nginx.conf , /etc/nginx/conf.d/*.conf 中&#xff0c; 一般直接 改 conf.d目錄下的 default.conf文件&#xff0c; 然后 先檢測配置文件是否有錯誤 nginx -t 再重新加載配置文件 或 重啟nginx&#xff0c;命令如下 nginx -s reload 或…

Python編程與在線醫療平臺數據挖掘與數據應用交互性研究

一、引言 1.1 研究背景與意義 在互聯網技術飛速發展的當下,在線醫療平臺如雨后春筍般涌現,為人們的就醫方式帶來了重大變革。這些平臺打破了傳統醫療服務在時間和空間上的限制,使患者能夠更加便捷地獲取醫療資源。據相關報告顯示,中國基于互聯網的醫療保健行業已進入新的…

Linux網絡_套接字_UDP網絡_TCP網絡

一.UDP網絡 1.socket()創建套接字 #include<sys/socket.h> int socket(int domain, int type, int protocol);domain (地址族): AF_INET網絡 AF_UNIX本地 AF_INET&#xff1a;IPv4 地址族&#xff0c;適用于 IPv4 協議。用于網絡通信AF_INET6&#xff1a;IPv6 地址族&a…