FreeRTOS中的动态内存管理(heap_1、heap_2、heap_3、heap_4)

news2025/1/17 3:37:00

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.coloradmin.cn/o/1674742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

np.linalg.norm()

np.linalg.norm()是NumPy中用于计算向量或矩阵的范数的函数。它可以计算不同类型的范数,包括向量的L1范数、L2范数以及矩阵的Frobenius范数等。 基本用法如下, numpy.linalg.norm(x, ordNone, axisNone, keepdimsFalse) x:输入数组,可以是…

【linux系统学习教程 Day02】网络安全之Linux系统学习教程,管道,文件内容统计,过滤排序,去重,目录介绍

1-4 管道 管道符号: | ,可以将前面指令的执行结果,作为后面指令的操作内容。 ## 比如过滤ip地址 ip addr | tail -4 | head -1 解释一下就是先执行 ip addr ,得到的结果当做 tail -4 的输入,意思就是查看ip addr 结果的后四行内容…

高清模拟视频采集卡CVBS四合一信号采集设备解析

介绍一款新产品——LCC261高清视频采集与编解码一体化采集卡。这款高品质的产品拥有卓越的性能表现和丰富多样的功能特性,能够满足广大用户对于高清视频采集、处理以及传输的需求。 首先,让我们来了解一下LCC261的基本信息。它是一款基于灵卡技术研发的高…

linux学习:视频输入+V4L2

目录 V4L2 视频采集流程 代码例子 核心命令字和结构体 VIDIOC_ENUM_FMT VIDIOC_G_FMT / VIDIOC_S_FMT / VIDIOC_TRY_FM VIDIOC_REQBUFS VIDIOC_QUERYBUF VIDIOC_QBUF /VIDIOC_DQBUF VIDIOC_STREAMON / VIDIOC_STREAMOFF V4L2 是 Linux 处理视频的最新标准代码模块&…

苹果M4芯片:大模型本地运算的转折点

在人工智能和机器学习领域,大模型的兴起对硬件提出了前所未有的挑战。苹果公司最近推出的M4芯片,被视为其在这场竞赛中的“第一式”。本文将探讨M4芯片的特点,并与其他芯片进行比较。 M4芯片的亮点 Neural Engine算力:M4芯片的…

2024上半年软考准考证什么时候出?怎么打印?

2024上半年软考准考证打印时间: 北京:5月21日至5月24日 天津:5月21日9:00后 河北:5月20日起 山西:5月20日上午9:00至5月28日下午14:00 内蒙古:5月20日-5月25日 吉林:5月20日开始 辽宁&am…

批量剪辑与转码解析:一键实现MP4到FLV顺畅转换的技巧

在数字化多媒体日益盛行的今天,视频格式转换成为了我们日常生活和工作中不可或缺的一部分。尤其是当需要将MP4格式的视频转换为FLV格式时,批量剪辑与转码功能的出现,极大地提升了我们处理视频的效率。本文将为您详细解析云炫AI智剪如何一键实…

基于CLAHE算法的图像增强及评价

摘要: 本研究旨在探讨对比度限制自适应直方图均衡化(CLAHE)算法在数字图像处理中的应用。CLAHE算法通过在局部区域内进行直方图均衡化,有效地增强了图像的对比度,并在保持图像细节的同时避免了过度增强的问题。本文通过…

深入学习Linux内核之v4l2驱动框架(一)

一,概述 V4L2(Video for Linux 2)是Linux操作系统中用于支持摄像头和视频设备的框架。它提供了一组API和驱动程序接口,用于在Linux系统中进行视频采集、视频流处理和视频播放等操作。 V4L2的设计目标是支持多种设备,…

机器学习-KNN算法

机器学习-KNN算法 没有什么比顺其自然更有超凡的力量。没有什么比顺乎本性更具有迷人的魔力。 目录 机器学习-KNN算法 1.K近邻算法 2.KNN决策方式 1)KNN分类预测规则 1)KNN回归预测规则 3.KNN三要素 4.KNN算法实现方式 1)蛮力实现 2&a…

C++ C# 贝塞尔曲线

二阶贝塞尔曲线公式 三阶贝塞尔曲线公式 C 三维坐标点 二阶到N阶源码 //二阶公式: FVector BezierUtils::CalculateBezierPoint(float t, FVector startPoint, FVector controlPoint, FVector endPoint) {float t1 (1 - t) * (1 - t);float t2 2 * t * (1 - t);…

【JS红宝书学习笔记】第1、2章 初识JS

第1章 什么是JavaScript JavaScript 是一门用来与网页交互的脚本语言,包含以下三个组成部分。 ECMAScript:由 ECMA-262 定义并提供核心功能。文档对象模型(DOM):提供与网页内容交互的方法和接口。浏览器对象模型&…

Dubbo3.x 异步转同步源码

底层netty通信是异步的,那我们平时调用采取的同步是如何将底层的异步转为同步的呢? dubbo远程rpc协议和网络框架有多种,我们以默认的dubbo协议、网络框架netty作为切入点. 注意点:debug时将过期时间设置长一点: 调用…

【高阶数据结构】并查集 {并查集原理;并查集优化;并查集实现;并查集应用}

一、并查集原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类…

2024年Java程序员的职业发展路径

程序员的职业路径是非常清晰的,但是现实情况下,很多人卡在了高级开发就再也上不去,直到遇到职业发展的危机,比如: 35岁大龄程序员找工作难,国内很多大型互联网公司在招聘要求上,会限制35岁这个年…

记录Spring Boot 2.3.4.RELEASE版注解方式实现AOP和通知的执行顺序

1.advice 按照以下的顺序执行 输出结果:(正常和异常) 说明:Spring boot 2.3.4.RELEASE 版本使用的AOP是spring-aop-5.2.9.RELEASE,AOP的通知顺序不一样。 可以测试下Spring boot 2.1.1.RELEASE 版做对比,发现结果是不一样的。 2…

算法-卡尔曼滤波之卡尔曼滤波的第一个方程:状态更新方程

通过一个例子来引出卡尔曼滤波的状态更新方程; 这里系统状态是金条的重量; 为了估计系统的状态,我们可以多次测量金条的重量,然后求平均值; 其中估计值是所有测量值的平均值; 由于我们使用的是静态模型&am…

灵活的静态存储控制器 (FSMC)的介绍(STM32F4)

目录 概述 1 认识FSMC 1.1 应用介绍 1.2 FSMC的主要功能 1.2.1 FSMC用途 1.2.2 FSMC的功能 2 FSMC的框架结构 2.1 AHB 接口 2.1.1 AHB 接口的Fault 2.1.2 支持的存储器和事务 2.2 外部器件地址映射 3 地址映射 3.1 NOR/PSRAM地址映射 3.2 NAND/PC卡地址映射 概述…

思维导图软件哪个好?5个软件教你自己快速制作思维导图

思维导图软件哪个好?5个软件教你自己快速制作思维导图 思维导图软件在现代生活和工作中扮演着重要的角色,它们可以帮助人们整理思维、规划项目、记录笔记等。以下是五款值得推荐的思维导图软件,它们各有特色,可以帮助您快速制作思…

开发者体验官:参与华为云CodeArts开发实践,赢取千元好礼!

CodeArts携华为云其他六大上云实践项目, 一起给大家送福利啦! 这次我们准备了华为全套电子产品, 包括但不限于华为智能音箱、耳机、摄像头,最高价值1000元! 只要体验完产品,提出相关的产品优化建议即有…