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.rhkb.cn/news/391850.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑添加虚拟网卡与ensp互联,互访

一、按照过程 1、打开设备管理器 2、点击网络适配器,点击左上角操作,点击“添加过时硬件” 3、下一页 4、选择“安装我手动从列表选择的硬件”,下一页 5、下拉,选择“网络适配器”,下一页 6、厂商选择“Microsoft”&…

内网穿透--LCX+portmap转发实验

实验背景 通过公司带有防火墙功能的路由器接入互联网,然后由于私网IP的缘故,公网 无法直接访问内部web服务器主机,通过内网其它主机做代理,穿透访问内网web 服务器主机 实验设备 1. 路由器、交换机各一台 2. 外网 kali 一台&…

设计测试用例的具体方法

一.等价类 等价类分为: 1.有效等价类 [6~15] 2.无效等价类 :小于6位,大于15位(不在数据范围内) 组合规则: 有效等价类组合的时候,尽可能一条测试用例尽可能多的覆盖有效等价类 无效等价类组合的时候,一条测试点,之恶能覆盖一个无效等价类 二.边界值 1.上点,离点,内点 上…

Shader入门精要总结(二)矩阵

1. 矩阵乘法 一个rn的矩阵A和一个nc的矩阵B相乘,它们的结果AB将会是一个rc大小的矩阵,不满足此规则不能相乘 矩阵乘法满足一些性质 矩阵乘法不满足交换律 即AB≠BA矩阵乘法满足结合律 (AB)CA(BC) 2. 特殊矩阵 方块矩阵 指行和列数目相等的矩阵&#x…

谷粒商城实战笔记-103~104-全文检索-ElasticSearch-Docker安装ES和Kibana

文章目录 一,103-全文检索-ElasticSearch-Docker安装ES1,下载镜像文件2,Elasticsearch安装3,验证 二,104-全文检索-ElasticSearch-Docker安装Kibana1,下载镜像文件2,kibana的安装3,验…

繁简之争:为什么手机芯片都是 ARM

RISC 和 CISC 指令集 之前的文章《揭秘 CPU 是如何执行计算机指令的》中说到,如果从软件的角度来讲,CPU 就是一个执行各种计算机指令(Instruction Code)的逻辑机器。 计算机指令集是计算机指令的集合,包括各种类型的…

【Android Studio】彻底卸载

文章目录 卸载程序控制面板卸载安全软件卸载 删除文件重启计算机 我们在Android开发时涉及重装时,如果卸载不干净,再次安装是不会正常运行项目的,接下来就让我教你如何删除干净吧。 卸载程序 控制面板卸载 control控制面板一>程序一>…

wxPython中wx.adv.DatePickerCtrl用法

wx.adv.DatePickerCtrl是一个日期选择组件,支持键盘手工录入日期和弹出日历窗口选择日期两种方式。 一、组件样式 wx.adv.DP_SPIN : 只允许键盘手工录入和组件右侧上下箭头调整日期。 wx.adv.DP_DROPDOWN : 只允许健盘手工录入和组件右侧打开…

一天攻克一个知识点 —— 设计模式之动态代理

一、设计模式之代理设计 代理设计是在Java开发中使用较多的一种设计模式,所谓的代理设计模式就是指一个代理主体操作真实主体,真实主体操作具体业务,代理主体负责给具体业务添砖加瓦。 就好比在生活中你有一套房子想要出租(你真实主体)&…

安卓控件RecyclerVieW

文章目录 导入依赖简单使用实现横向滚动瀑布式 RecyclerView是官方在5.0之后新添加的控件,推出用来替代ListView和GridView的列表控件。为了保证RecyclerView在所有Android系统版本上都能使用。Google将RecyclerView控件定义在了AndroidX中,只需要在项目…

完美平替navicat的数据库软件DBeaver,免费开源,功能强大,使用简单

DBeaver Community 是一个免费的跨平台数据库工具,适用于开发人员、数据库管理员、分析师和所有与数据打交道的人。它支持所有流行的 SQL 数据库,如 MySQL、MariaDB、PostgreSQL、SQLite、Apache Family 等 1.到官网下载win版本直接安装 https://dbeav…

苹芯科技发布新AI模型,引领全球轻量级AI应用革命

苹芯科技,一家在全球AI技术领域中不断创新的公司,于2月28日宣布推出其最新研发的轻量级AI模型。这款新模型旨在为开发者和企业提供更高效、更易访问的人工智能工具,尤其强调在数据敏感和计算资源受限的环境下的应用潜力。 在谷歌刚刚推出Gemm…

Python使用cProfile进行性能分析使用详解

概要 在Python开发中,代码性能分析是优化和调试的重要环节。通过性能分析,可以找出程序中性能瓶颈,进而进行优化。cProfile是Python内置的性能分析工具,它可以详细地分析代码的执行时间和函数调用情况。本文将详细介绍如何使用cProfile进行代码性能分析,涵盖安装、基本用…

代码随想录第29天|贪心

134.加油站 代码随想录 代码随想录 索引01234gas12345cost34512 计算每个加油站的剩余油量&#xff0c;累计sum&#xff0c;一旦<0就从下一个重新计数。 我还没理解为什么我们不需要计算环路的sum&#xff0c;而是只需要遍历一次。 因为使用了两个变量&#xff1a;curSu…

力扣-46.全排列

刷力扣热题–第二十六天:46.全排列 新手第二十六天 奋战敲代码&#xff0c;持之以恒&#xff0c;见证成长 1.题目简介 2.题目解答 这道题目想了会,思路比较好想,但一直没调试成功,所以就参考了力扣官网的代码,积累一下回溯算法的实现和基本实现思路,即先试探后回溯,结果在下面…

加密软件通常使用哪些算法

加密软件通常使用多种算法来确保数据的安全性&#xff0c;这些算法主要分为对称加密算法、非对称加密算法和哈希算法三大类。 一、对称加密算法 对称加密算法&#xff0c;也称为共享密钥加密算法&#xff0c;是加密和解密都使用相同密钥的算法。这类算法的特点是加密和解密速…

24/8/4算法笔记 梯度下降

通过迭代地调整参数&#xff0c;沿着目标函数梯度的反方向&#xff08;即最陡峭的下降方向&#xff09;进行搜索&#xff0c;从而找到函数的局部最小值。 导入库 import matplotlib.pyplot as plt import numpy as np 构建方程和导数 #构建方程 f lambda x:(x-3.5)**2-4.…

使用Docker+ollama部署大模型

Docker的安装----在 Ubuntu 系统上安装 Docker 一&#xff1a;配置系统的 APT 软件包管理器 首先添加 Docker 的官方 GPG 密钥 # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/ke…

RabbitMQ未授权访问漏洞

RabbitMQ是目前非常热门的一款消息中间件&#xff0c;基于AMQP协议的&#xff0c;可以在发布者和使用者之间交换异步消息。消息可以是人类可读的JSON&#xff0c;简单字符串或可以转换为JSON字符串的值列表。 漏洞复现 使用以下Fofa语法对RabbitMQ产品进行搜索 port"15…

OpenCSG首发中文Chinese Mistral Large 2!

前沿科技速递&#x1f680; &#x1f389; 震撼发布&#xff01;OpenCSG再次微调发布CSG-Wukong-Chinese-Mistral-Large2-123B模型&#xff01; &#x1f50d; 本次工作基于mistral-large-instruct-2407进行微调&#xff0c;采用了尖端的训练技术和优化策略&#xff0c;确保模型…