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…

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 …