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.mzph.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…

2024CCPC全国邀请赛(郑州)暨河南省赛

2024CCPC全国邀请赛(郑州站)暨河南省赛 一铜一银,虽不是线下第一次参赛但是第一次拿xcpc奖牌,还有个国赛奖真是不戳。感谢学长,感谢队友! 虽然遗憾没有冲到省赛金,不过还有icpc商丘&#xff08…

Milvus Cloud:打造向量数据库的Airtable级体验

向量数据库Milvus Cloud是一种用于处理和存储向量数据的数据库,它通常用于机器学习、图像和视频检索、自然语言处理等领域。要将其升级为类似Airtable那样易用且一体化的系统,需要考虑以下几个关键方面: 1. 用户界面(UI)设计 Airtable之所以用户友好,很大程度上归功于其直…

类图及类的关系

类图(Class Diagram)是UML(Unified Modeling Language,统一建模语言)中的一种图,用于描述系统中类的静态结构,包括类的属性、方法以及类之间的关系。 一、类 类(Class)…

海外仓混合订单拣货策略:人工与海外仓系统的最佳搭配模式

根据订单高效拣货是任何海外仓都要面对的问题。只有当订单可以被高效,准确的拣货之后,才能继续走下面的物流流程,所以尽可能的缩短拣货时间,提升拣货精准度,才是提升订单交付率的最佳方法。 海外仓企业都在不断寻找&am…

Android动态布局framelayout

功能说明 最近碰到一个需求,要求在网页端拖控件,动态配置app控件的模块,大小和位置,显示不同的功能,然后在app大屏展示。 技术难点: 1.动态控件位置和大小难调,会出现布局混乱,位置错…

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

242. 有效的字母异位词 - 力扣(LeetCode) 题目描述 代码解决以及思路 这个方法的时间复杂度为O(N),其中N是字符串的长度,空间复杂度为O(1)(因为辅助数组的大小是固定的26)。 class Solution { public:bo…

初识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 …

[数据结构1.0]快速排序

最近学习了快速排序,鼠鼠俺来做笔记了! 本篇博客用排升序为例介绍快速排序! 1.快速排序 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值&#x…

Java面试八股之一个char类型变量能不能存储一个中文字符

Java中一个char类型变量能不能存储一个中文字符?为什么? Java中一个char类型变量可以存储一个中文字符。原因如下: Unicode编码支持:Java语言采用Unicode字符集作为其内建字符编码方式。Unicode是一种广泛接受的字符编码标准&am…

两小时看完花书(深度学习入门篇)

1.深度学习花书前言 机器学习早期的时候十分依赖于已有的知识库和人为的逻辑规则,需要人们花大量的时间去制定合理的逻辑判定,可以说是有多少人工,就有多少智能。后来逐渐发展出一些简单的机器学习方法例如logistic regression、naive bayes等…

什么是CCRC?做什么用的?

CCRC(中国网络安全审查认证和市场监管大数据中心)原名为中国网络安全审查技术与认证中心,也被称为中国信息安全认证中心(ISCCC)。 该中心是经中央机构编制委员会办公室批准成立的,其主要职责是依据国家法律…

超级简单的地图操作工具开发可疑应急,地图画点,画线,画区域,获取地图经纬度等

使用echars的地图画点,画线,画区域,获取地图经纬度等 解压密码:10086007 地图也是用临时的bmap.js和china.js纯离线二选一 一共就这么多文件 画点,画线,画区域 点击地图获取经纬度-打印到控制台,这样就能渲染航迹,多变形,结合其他算法算圆等等操作 下载资源:https://download…

代码随想录训练营Day28:贪心算法06

1.738单调递增的数字 贪心策略&#xff1a;如果strNum[i]<strNum[i-1]那么strNum[i] 9,strNum[i-1]--;//比如87对应的最大的单调递增的就是79. 具体实现&#xff1a; 对于遇到小于的情况&#xff1a;如果strNum[i]<strNum[i-1]那么strNum[i] 9,strNum[i-1]--;遍历顺…

linux phpstudy 重启命令

[rootLinuxWeb phpstudy]# ./system/phpstudyctl restart 查看命令 1) phpstudy -start 启动小皮面板 2) phpstudy -stop 停止小皮面板 3) phpstudy -restart 重启小皮面板 4) phpstudy -status 查询面板状态 5) phpstudy -in…

OFDM802.11a的FPGA实现(十五)短训练序列:STS(含Matlab和verilog代码)

原文链接&#xff08;相关文章合集&#xff09;&#xff1a;OFDM 802.11a的xilinx FPGA实现 1.前言 在之前已经完成了data域数据的处理&#xff0c;在构建整个802.11a OFDM数据帧的时候&#xff0c;还剩下前导码和signal域的数据帧&#xff0c;这两部分的内容。 PLCP的前导部分…