FreeRTOS内存管理(1-20)

FreeRTOS内存管理简介

在使用FreeRTOS创建任务,队列,信号量等对象时,一般都提供两种方法

  • 1:动态创建任务(方法)自动地从FreeRTOS管理的内存堆中申请创建对象所需要的内存,并且在删除对象后可以将这块内存释放回FreeRTOS管理的内存堆。
  • 2:需要用户提供各种内存空间,并且使用静态方式占用内存空间一般是固定的,即使任务,队列等被删除后,这些被占用的内存空间一般没有其他用途。

注:

  • 1:动态方式管理内存相比于静态方式更为灵活
  • 2:除了FreeRTOS提供的动态内存管理方法,标准的C库也提供了函数malloc()和函数free()来实现动态地申请和释放内存。

使用c语言标准库动态内存管理的缺点

  • 1:占用大量的代码空间不适合用在资源紧缺的嵌入式系统中
  • 2:没有线程安全的相关机制
  • 3:运行有不确定性,每次调用这些函数时花费的时间可能都不相同
  • 4:内存碎片化

FreeRTOS提供多种动态内存管理算法,可以针对不同的嵌入式系统

FreeRTOS内存管理算法(熟悉)

FreeRTOS提供了5种动态内存管理算法,分别为: heap 1、heap 2、heap 3、heap 4、heap 5。

(主要使用的是heap_4内存管理算法)。

如下所示:

haep_1 内存管理算法

heap_1只实现了pvPortMalloc,没有实现vPortFree;也就是说,它只能申请内存,无法释放内存!如果你的工程,创建好的任务、队列、信号量等都不需要被删除,那么可以使用heap_1内存管理算法heap_l的实现最为简单,管理的内存堆是一个数组}在申请内存的时候,heap_1内存管理算法只是简单地从数组中分出合适大小的内存,内存堆数组的定义如下所示。

/*定义一个数组作为FreeRTOS管理的内存堆*/
static uint8_t ucHeap[configTOTAL_HEAP_SIZE];

heap_1内存管理算法的分配过程

heap_2 内存管理算法

相比于heap_l内存管理算法,heap_2内存管理算法使用最适应算法,并且支持释放内存;

heap_2内存管理算法并不能将相邻的空闲内存块合并成一个大的空闲内存块;因此 heap_2内存管理算法不可避免地会产生内存碎片;

最适应算法:

假设heap有3块空闲内存(按内存块大小由小到大排序)︰5字节、25字节、50字节

现在新创建一个任务需要申请20字节的内存

第一步:找出最小的、能满足pvPortMalloc的内存:25字节

第二步:把它划分的20字节、5字节;返回这20字节的地址,剩下的5字节仍然是空闲状态,留给后续的pvPortMalloc使用!

注:内存碎片是由于多次申请和释放内存,但释放的内存无法与相邻的空闲内存合并而产生的。

适用场景:频繁的创建和删除任务,且所创建的任务队都是相同的

heap_4内存管理算法

heap_4内存管理算法使用了首次适应算法,也支持内存的申请与释放,并且能够将空闲且相邻的内存进行合并,从而减少内存碎片的现象。

首次适应算法:

假设heap有3块空闲内存(按内存块地址由低到高排序)︰5字节、50字节、25字节

现在新创建一个任务需要申请20字节的内存

第一步:找出第一个能满足pvPortMalloc的内存:50字节

第二步∶把它划分为20字节、30字节;返回这20字节的地址,剩下30字节仍然是空闲状态,留给后续的pvPortMalloc使用!

适用场景,频繁的释放,分配不同大小的内存

heap_5内存管理算法

heap_5内存管理算法是在heap_4内存管理算法的基础上实现的,但是heap_5内存管理算法在 heap_4内存管理算法的基础上实现了管理多个非连续内存区域的能力

heap_5内存管理算法默认并没有定义内存堆,需要用户手动指定内存区域的信息,对其进行初始化。

内存管理算法5的结构体:

typedef struct HeapRegion{
     /*内存区域起始地址*/
     uint8_t *     putStartAddress; 
     /*内存区域的大小,单位:字节*/
     size_t        xSizeInBytes;

}HeapRegion_t;

Heap_5内存管理算法指定多块不连续的内存

Const HeapRegion_t xHeapRegions[] = {
           {(uint8_t*)0x80000000,0x10000} /*内存区域1*/
           {(uint8_t*)0x90000000,0x10000} /*内存区域2*/

};
vPortDefineHeapRegions(xHeapRegions);

FreeRTOS相关API函数解析

FreeRTOS内存管理实验

【后续会继续完善更新.....】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/595342.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

九州金榜|孩子沉迷于网络:家庭教育的挑战与对策

随着时代的进步,科技的发展,网络现在成为了我们日常生活不可分割的一部分。然而,随着网络的普及也出现了一些列的问题,其中孩子沉迷于网络就是当前家长最为关心的问题,对于这种情况的发生,家庭教育就显得尤…

Linux主机重启后报错:[FAILED] Failed to start Switch Root.

一、问题描述 某次云主机因计费问题,导致批量重启,重启后发现某台云主机竟进入紧急救援模式(emergency模式),如下所示: 二、原因及处理 1)原因:加载根分区失败,导致无…

Libcity笔记:原子文件

1 介绍 Libcity中的数据以原子文件的形式存在 2 原子文件类别 对于不同的交通预测任务,可能用到不同的原子文件,同一个数据集不一定包含全部六种原子文件 网格数据需要按照先行后列的顺序遍历OD数据需要按照先起点后终点的顺序遍历 2.1 geo 存储地理…

Netty 实现dubbo rpc

一、RPC 的基本介绍 RPC (Remote Procedure Call) 远程过程调用,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外的为这个交互编程。也就是说可以达到两个或者多个应用程序部署在不同的服务器上&…

OpenCV 入门(七)—— 身份证识别

OpenCV 入门系列: OpenCV 入门(一)—— OpenCV 基础 OpenCV 入门(二)—— 车牌定位 OpenCV 入门(三)—— 车牌筛选 OpenCV 入门(四)—— 车牌号识别 OpenCV 入门&#xf…

德国韦纳WENAROLL滚压刀,液压缸,滚光刀,挤压刀,滚轧刀

德国韦纳WENAROLL滚压刀,液压缸,滚光刀,挤压刀,滚轧刀(百度一下,西安尚融) 德国韦纳(WENAROLL)的滚压刀、液压缸、滚光刀、挤压刀和滚轧刀在工业领域享有很高的声誉,这些产品因其高…

SM618卡件SM480模块和利时

SM618卡件❗电:183-6998-1851❗SM480模块和利时。自动化程度的提高,I/O点数大幅增 加,传统单一配线的方式已经无法满足发展的需 要SM618卡件SM480模块和利时。.对简单、可靠的配线方式的需求日益强烈. 传统接线 - 以并联方式连 接…

C# WinForm —— 12 ListBox绑定数据

ListBox加载大量数据时,避免窗体闪烁的方法: 在加载语句的前后分别加上 BeginUpdate()方法 和 EndUpdate()方法 指定一个集合为绑定的数据源 1. 首先,右键项目,添加类 2. 在新建的类文件中添加属性值信息 3. 构建初始化的对象…

访问学者在外访学期间,是否可以中途回国?

在全球化的今天,访问学者制度已成为促进国际学术交流与合作的重要桥梁。然而,对于许多国外访问学者来说,一个常见的问题是:在访学期间,我是否可以中途回国?这个问题涉及到多个方面,包括政策法规…

7步教程从零开始搭建跨境电商平台开发

跨境电商平台开发一直是创业者们追逐的热门领域之一。本文将为您提供一个7步教程,帮助您从零开始搭建跨境电商平台,让您在这个充满机遇的领域中抢占先机。 步骤一:市场调研和定位 在开始搭建跨境电商平台之前,第一步是进行充分的…

大数据与会计专业主要学什么课程

大数据与会计专业是一个结合了传统会计知识与现代大数据技术的交叉学科,旨在培养既懂会计又熟悉大数据分析的复合型人才。该专业的学生将会学习以下主要课程内容: 会计基础课程:包括基础会计、财务会计、成本会计、管理会计等,这些…

我独自升级崛起下载教程 我独自升级崛起怎么一键下载

定于5月8日全球盛大发布的动作RPG力作《我独自升级崛起》,基于备受追捧的同名动画及网络漫画,誓为热情洋溢的游戏爱好者们呈献一场深度与广度兼具的冒险盛宴。这款游戏巧妙融合网络武侠元素,其创意十足的设计框架下,核心叙述聚焦于…

OSPF综合实验(超详细易懂)(HCIP)

1、拓扑信息 2、需求分析 3、IP规划 4、配置 5、测试 1、拓扑信息 2、需求分析 R4为ISP,其上只能配置I地址; R4与其他所有直连设备间均使用公有IP 公网中使用的是点到…

外贸大客户开发的三大困境

外贸大客户开发的三大困境,第一个是进不来,什么叫进不来呢?就是客户,大客户他不仅能够为企业带来大额的业绩,而且利润也高,那么也对于这种品牌也有一定的关联,还能为企业带来更多的一些资源&…

Python测试框架Pytest的参数化详解

上篇博文介绍过,Pytest是目前比较成熟功能齐全的测试框架,使用率肯定也不断攀升。 在实际工作中,许多测试用例都是类似的重复,一个个写最后代码会显得很冗余。这里,我们来了解一下pytest.mark.parametrize装饰器&…

karateclub,一个超酷的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个超酷的 Python 库 - karateclub。 Github地址:https://github.com/benedekrozemberczki/karateclub Python karateclub是一个用于图嵌入和图聚类的库&#xff…

git commit 提交报错pre-commit hook failed (add --no-verify to bypass) 解决方法,亲测有效

问题截图 今天在执行 git commit 命令时报错:pre-commit hook failed (add --no-verify to bypass) 解决 参考文章:git commit报错:pre-commit hook failed的解决方法 具体原理什么的就不解释了,可以看看上面的参考文章 解决方…

如何使用高德地图的 Loca 展示 gpx 文件的 3D 路径,Loca.LineLayer

如何使用高德地图的 Loca 展示 gpx 文件的 3D 路径,Loca.LineLayer 找寻了好久,终于将这个展示 3D 路径的功能实现了。 在线实例: http://kylebing.cn/tools/map/#/gpx/gpx-viewer-3d 这里是用于展示 gpx 路径,关于 gpx 的相关知…

Linux migrate_type进一步探索

文章接着上回Linux migrate_type初步探索 1、物理页面添加到buddy系统 我们都知道物理内存一开始是由memblock进行分配管理,后面会切换到buddy系统管理。那么接下来我们看一下,memblock管理的物理页面是怎么添加到buddy系统中的。 start_kernel() -&g…

液晶数显式液压万能试验机WES-300B

一、简介 主机为两立柱、两丝杠、油缸下置式,拉伸空间位于主机的上方,压缩、弯曲试验空间位于主机下横梁和工作台之间。测力仪表采用高清液晶显示屏,实验数据方便直观。 主要性能技术指标 最大试验力(kN) 300 试…