FreeRTOS中的動態內存管理(heap_1、heap_2、heap_3、heap_4)

FreeRTOS 提供了多種動態內存分配方案,這些方案通過不同的內存管理器(heap managers)實現,主要位于 FreeRTOS/Source/portable/MemMang 目錄下。以下是幾種常見的動態內存分配方案:
在這里插入圖片描述

heap_1

特點:

  • 簡單性heap_1 是所有FreeRTOS內存管理方案中最簡單的一個。它的設計目標是在資源受限的嵌入式系統中提供基本的動態內存分配功能。
  • 不可釋放內存:與其他幾種內存管理方案不同,heap_1分配出去的內存空間一旦分配完成,就不支持再次釋放。這意味著一旦任務、信號量、消息隊列等分配了內存,這部分內存將永久占用,直到系統重啟。
  • 單塊分配:它維護一個連續的內存塊,當有內存分配請求時,直接從這個內存塊中切割出所需大小的空間。這種方式不涉及復雜的內存碎片管理。
  • 低開銷:因為其簡單的設計,heap_1 的運行時開銷相對較小,適合那些對內存管理開銷非常敏感的應用場景。

工作原理:

  • 初始化:在系統啟動時,heap_1 會初始化一個大的靜態內存數組(通常稱為 ucHeap[]),這個數組構成了整個可分配內存的池。
  • 分配過程:當任務需要內存時,heap_1 會檢查 ucHeap[] 中是否有足夠大的連續空間來滿足請求。如果有,它就從這片連續空間中分配出所需的內存,并更新剩余內存的記錄。
  • 無釋放操作:一旦分配,heap_1 不支持通過函數調用來釋放已分配的內存。這意呀著開發者必須謹慎地規劃內存的使用,避免不必要的分配,以免過早耗盡內存資源。

使用場景:

由于 heap_1 的特性,它最適合那些對內存管理要求不高、內存分配模式可預測、且不需要頻繁釋放內存的應用。例如,某些簡單的嵌入式系統、原型開發或對實時性要求極高而對內存靈活性要求較低的場合。

heap_2

特點:

  • 多尺寸管理heap_2引入了對不同尺寸內存塊的管理。它將可用內存分割成多個鏈表,每個鏈表負責管理特定大小的內存塊。這有助于減少內存碎片,提高內存分配和回收的效率。
  • 支持內存釋放:與 heap_1 不同,heap_2 支持動態地分配和釋放內存。當任務不再需要一塊內存時,可以通過調用釋放函數將內存歸還給相應的鏈表,使得這塊內存可以被后續的分配請求重復利用。
  • 減少碎片:通過將內存按大小分類管理,heap_2 可以更有效地復用內存塊,減少因頻繁分配和釋放不同大小內存而產生的碎片問題。

工作原理:

  • 初始化:初始化時,heap_2 會將整個內存池分割成多個預定義大小的內存塊,并將這些塊分別鏈接到對應的鏈表中。
  • 分配過程:當有內存分配請求時,heap_2 會遍歷鏈表,尋找第一個足夠大的內存塊。如果找到,該塊將從鏈表中移除并返回給請求者。如果找不到合適大小的塊,且系統配置允許,可能會從更大的塊中分割出所需大小的塊,然后將剩余部分放回相應鏈表。
  • 釋放過程:釋放內存時,該內存塊會根據其大小被放回到正確的鏈表中。這樣,相同大小的塊可以被高效復用。

使用場景:

heap_2 適用于那些需要動態分配和釋放內存、并且對內存使用效率有一定要求的嵌入式系統。它特別適合于存在多種不同大小內存需求的應用場景,通過減少內存碎片,提高了內存利用率,降低了內存分配失敗的風險。然而,相較于 heap_1heap_2 的管理邏輯更為復雜,可能帶來一定的運行時開銷。因此,在選擇是否使用 heap_2 時,需要權衡系統對內存管理靈活性和效率的需求與額外開銷之間的關系。

heap_3

特點:

  • 依賴宿主環境:與 FreeRTOS 內置的其他內存管理方案不同,heap_3 不直接管理內存,而是調用 C 標準庫的內存管理函數。這意味著它依賴于編譯器或宿主機操作系統提供的內存管理實現。
  • 簡單集成:由于直接利用現有的內存管理接口,heap_3 的集成相對簡單,無需深入了解復雜的內存分配算法或數據結構。
  • 功能全面:因為使用標準庫的 malloc()free(),理論上支持任意大小的內存塊分配和釋放,具有很高的靈活性。

使用考量:

  • 性能和開銷:雖然使用方便,但 heap_3 的性能和開銷取決于宿主環境的內存管理實現。在一些資源受限的嵌入式系統中,標準庫的內存管理可能不夠高效,引入額外的開銷或延遲。
  • 兼容性和移植性:由于依賴于外部內存管理函數,heap_3 的行為可能隨編譯器或平臺的不同而有所變化,影響系統的兼容性和移植性。
  • 實時性:標準庫的內存管理函數往往不是為硬實時系統設計的,可能無法保證嚴格的時序要求,這對于某些對時間敏感的嵌入式應用可能不適宜。

適用場景:

  • 對于快速原型開發或評估階段,開發者可能優先考慮使用 heap_3,因為它簡化了內存管理的實現,便于快速測試其他系統功能。
  • 當項目運行在擁有高效內存管理機制的宿主環境,且實時性要求不高時,heap_3 也是一個可行的選擇。
  • 對于需要與宿主系統(如桌面操作系統上的模擬器或測試環境)緊密集成的開發場景,使用 heap_3 可以減少自定義內存管理代碼的工作量。
    Heap_4 是 FreeRTOS 提供的動態內存分配方案之一。FreeRTOS 支持多種內存分配策略,以適應不同應用場景的需求, Heap_4 是這些策略中的一種實現。下面簡要介紹 Heap_4 的特點和工作原理:

Heap_4

特點:

  1. 簡單高效:Heap_4 實現相對簡單,它通過維護一個或多個內存塊鏈表來管理可用的內存空間。這些內存塊按照大小排序,當有新的內存分配請求時,它會從鏈表中尋找最合適的塊進行分配。

  2. 固定塊大小分配:與 Heap_1、Heap_2 和 Heap_3 不同,Heap_4 并不直接支持任意大小的內存分配請求。它更適合于那些內存需求較為固定、或者可以預先確定幾種常見大小的情況。開發者需要預先定義好幾種不同大小的內存塊池,每個池維護一個鏈表。

  3. 減少碎片:通過限制分配的內存塊大小種類,Heap_4 有助于減少內存碎片問題。特別是在那些頻繁分配和釋放固定大小對象的應用場景中,能夠更有效地復用內存塊,避免小碎片積累導致的大塊內存無法分配的問題。

  4. 配置靈活性:用戶可以根據應用的具體需求,配置不同的內存塊大小和數量,以達到最佳的內存使用效率和性能平衡。

工作原理:

  • 初始化:在系統啟動時,Heap_4 會被初始化,此時會根據配置好的內存塊大小劃分整個可用的內存區域,為每個大小創建一個或多個內存塊鏈表。
  • 分配內存:當任務需要分配內存時,Heap_4 會在對應大小的鏈表中查找是否有空閑的內存塊。如果有,則從中取出一個分配給請求者;如果沒有足夠大的塊,且配置允許,可能會嘗試分裂大塊以滿足請求,但這通常不在 Heap_4 的直接功能范圍內,更多依賴于如何預先配置內存池。
  • 釋放內存:釋放內存時,該內存塊會被重新鏈接到對應大小的鏈表中,等待下一次分配使用。
  • 在這里插入圖片描述

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

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

相關文章

大數據可視化實驗(四):Excel數據可視化

目錄 一、實驗目的... 1 二、實驗環境... 1 三、實驗內容... 1 1)excel函數應用.. 1 2)數據透視圖繪制... 3 四、總結與心得體會... 5 一、實驗目的 1)掌握函數和公式的原理 2)掌握在單元格或編輯欄中直接輸入帶函數的公式…

kafka學習筆記04(小滴課堂)

Kafka的producer生產者發送到Broker分區策略講解 Kafka核心API模塊-producer API講解實戰 代碼: ProducerRecord介紹和key的作用 Kafka核心API模塊-producerAPI回調函數實戰 producer生產者發送指定分區實戰 我們設置5個分區。 我們指定分區。 重新指定一個分區&am…

業務上云--從Container+BuildKitd打鏡像到在Kubernetes上部署LNMP

一、背景 在基于kubeasz部署kubernetes高可用集群-CSDN博客文章部署的kubernetes集群上部署LNMP 1.1、Kubernetes環境 1.2、Harbor環境 【docker基礎】使用Harbor搭建私有倉庫-docker-compose使用示例--第二周作業_harbor docker-compose-CSDN博客 Harbor環境升級&#xff…

第 5 篇 : 多節點Netty服務端(可擴展)

說明 前面消息互發以及廣播都是單機就可以完成測試, 但實際場景中客戶端的連接數量很大, 那就需要有一定數量的服務端去支撐, 所以準備虛擬機測試。 1. 虛擬機準備 1.1 準備1個1核1G的虛擬機(160), 配置java環境, 安裝redis和minio 1.2 準備6個1核1G的空虛擬機(161到166), …

Elasticsearch的使用

Elasticsearch 1、認識和安裝 Elasticsearch的官方網站如下: https://www.elastic.co/cn/elasticsearch Elasticsearch是由elastic公司開發的一套搜索引擎技術,它是elastic技術棧中的一部分。完整的技術棧包括: Elasticsearch&#xff1…

MySQL變量的定義與使用(二)

一、通過變量進行實際的操作 set cityNameRotterdam; SELECT * from city where Name cityName; 二、變量只能處理字符,并不能代替符號或者關鍵字進行使用 set cityName1Rotterdam; set cityName2Zaanstad; set cityName3Zwolle; SELECT * from city where Name…

2024CCPC全國邀請賽(鄭州)暨河南省賽

2024CCPC全國邀請賽(鄭州站)暨河南省賽 一銅一銀,雖不是線下第一次參賽但是第一次拿xcpc獎牌,還有個國賽獎真是不戳。感謝學長,感謝隊友! 雖然遺憾沒有沖到省賽金,不過還有icpc商丘&#xff08…

SpringBoot項目中使用Redis,Mybatis和JWT

在Spring Boot項目中,結合Redis,MyBatis和JWT的使用可以提供以下功能: Redis的作用: 1.緩存:Redis可以用作緩存存儲,提高應用程序的性能和響應速度。特別是對于頻繁讀取但不經常更新的數據,如配…

Milvus Cloud:打造向量數據庫的Airtable級體驗

向量數據庫Milvus Cloud是一種用于處理和存儲向量數據的數據庫,它通常用于機器學習、圖像和視頻檢索、自然語言處理等領域。要將其升級為類似Airtable那樣易用且一體化的系統,需要考慮以下幾個關鍵方面: 1. 用戶界面(UI)設計 Airtable之所以用戶友好,很大程度上歸功于其直…

整型進制轉換

整型常量的不同進制表示 計算機中只能存儲二進制數,即0和1,而在對應的物理硬件上則是高,低電平。為了更方便地觀察內存中的二進制情況,除我們正常使用的十進制數外,計算機還提供了十六進制數和八進制數。 下面介紹不…

類圖及類的關系

類圖(Class Diagram)是UML(Unified Modeling Language,統一建模語言)中的一種圖,用于描述系統中類的靜態結構,包括類的屬性、方法以及類之間的關系。 一、類 類(Class)…

海外倉混合訂單揀貨策略:人工與海外倉系統的最佳搭配模式

根據訂單高效揀貨是任何海外倉都要面對的問題。只有當訂單可以被高效,準確的揀貨之后,才能繼續走下面的物流流程,所以盡可能的縮短揀貨時間,提升揀貨精準度,才是提升訂單交付率的最佳方法。 海外倉企業都在不斷尋找&am…

Vue如何引入公用方法

文章目錄 1. 在全局范圍內引入2. 在單文件組件中引入3. 使用Vuex或Vue Composition API4. 使用mixins5. 使用插件 1. 在全局范圍內引入 在你的main.js或main.ts文件中引入并注冊你的公用方法,使得它們可以在整個Vue應用中使用。 // 引入你的公用方法文件 import {…

Android動態布局framelayout

功能說明 最近碰到一個需求,要求在網頁端拖控件,動態配置app控件的模塊,大小和位置,顯示不同的功能,然后在app大屏展示。 技術難點: 1.動態控件位置和大小難調,會出現布局混亂,位置錯…

129.哈希表:有效的字母異位詞(力扣)

242. 有效的字母異位詞 - 力扣(LeetCode) 題目描述 代碼解決以及思路 這個方法的時間復雜度為O(N),其中N是字符串的長度,空間復雜度為O(1)(因為輔助數組的大小是固定的26)。 class Solution { public:bo…

python通過ctypes調用C/C++ SDK,當SDK異常時,同時打印C/C++/Python的棧信息

python通過ctypes調用C/C SDK,當SDK異常時,同時打印C/C/Python的棧信息 一.復現步驟二.輸出 本文演示了python通過ctypes調用C/C SDK,當SDK異常時,同時打印C/C/Python的棧信息.基于traceback、addr2line、PyErr_SetString、backtrace_symbols 一.復現步驟 cat > print_bac…

自媒體的發展趨勢:從個人表達到全球話語權

一、引言隨著數字技術的快速發展,信息傳播的方式和格局也在不斷變化。自媒體,作為其中的一股重要力量,正在以它的獨特方式改變著全球的信息傳播和社會發展。本文將從自媒體的定義及發展歷程入手,深入探討自媒體未來的發展趨勢&…

感知局部規劃--似然場局部規劃

系列文章目錄 提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 TODO:寫完再整理 文章目錄 系列文章目錄前言感知導航感知似然場局部規劃(很像DWA但是不依賴地圖,完全依賴感知) 前言 認知有限&#x…

Uniapp開發入門:構建跨平臺應用的全面指南

引言 什么是Uniapp Uniapp是一款由DCloud公司推出的基于Vue.js的跨平臺應用開發框架。它的核心理念是“一套代碼,多端運行”,開發者只需編寫一份代碼,即可生成包括iOS、Android、H5、微信小程序、支付寶小程序、百度小程序等多平臺的應用。…

初識C++ · string的使用(2)

目錄 1 Modifiers部分 1.1 assign的使用 1.2 insert的使用 1.3 erase的使用 1.4 replace的使用 2 capacity部分 2.1 max_size的使用 2.2 capacity的使用 2.3 reserve的使用 2.4 shrink_to_fit簡介 2.5 resize的使用 2.6 clear的使用 3 String operations部分 3.1 …