FreeRTOS内存管理 | FreeRTOS十五

news2024/9/21 4:34:33

目录

说明:

一、FreeRTOS内存管理

1.1、动态分配与用户分配内存空间

1.2、标准C库动态分配内存缺点

1.3、FreeRTOS的五种内存管理算法优缺点

1.4、heap_1内存管理算法

1.5、heap_2内存管理算法

1.6、heap_3内存管理算法

1.7、heap_4内存管理算法

1.8、heap_5内存管理算法

二、FreeRTOS内存管理相关API函数

2.1、申请内存函数

2.2、释放内存函数

2.3、获取当前空闲内存的大小函数


说明:

    关于内容:

            1)以下内容多为概念了解与步骤分析

            2)暂无个人示例代码,使用的是FreeRTOS的官方示例代码

            3)若想移植代码测试的,请移步其它地方寻找,下文内容暂无个人示例代码供测试

    关于其它:

            1)操作系统:win 10

            2)平台:keil 5 mdk

            3)语言:c语言

            4)板子:STM32系列移植FreeRTOS

一、FreeRTOS内存管理

1.1、动态分配与用户分配内存空间

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

        1)动态方式创建:FreeRTOS管理的内存堆中申请创建对象所需的内存,并且在对象删除后,可以将内存释放回收到FreeRTOS所管理的内存中;

        2)静态方式创建,用户自己提供内存空间,并且使用静态方式占用的内存空间一般固定了,即使创建的任务队列被删除后,这些被占用的空间一般没有其他用途。

1.2、标准C库动态分配内存缺点

标准C库提供了函数malloc()和函数free()来动态地申请和释放内存。

那为什么不使用标准的C库自带内存管理算法呢?

        1)占用大量的代码空间,不适合用在资源紧缺的嵌入式系统中;

        2)没有线程安全的相关机制;

        3)运行具有不确定性,每次调用这些函数时花费的时间可能都不相同;

        4)内存碎片化-->内存空间会被分割成不同大小且不连续的区域。

关键是C库的内存管理算法不是为RTOS设计的,当然会出现各种问题啦,因此FreeRTOS提供了多种动态内存管理的算法,可针对不同的嵌入式系统。

1.3、FreeRTOS的五种内存管理算法优缺点

五种动态内存管理算法分别为:heap_1、heap_2、heap_3、heap_4、heap_5

名称,heap_1,优点:分配简单,时间确定,缺点:只允许申请内存,不允许释放内存

名称,heap_2,优点:允许申请和释放内存,缺点:不能合并相邻的空闲内存块会产生碎片、时间不定

名称,heap_3,优点:直接调用C库函数malloc()和free(),简单,缺点:速度慢、时间不定

名称,heap_4,优点:相邻空闲内存可合并,减少内存碎片的产生,缺点:时间不定

名称,heap_5,优点:能够管理多个非连续内存区域的heap_4,缺点:时间不定

1.4、heap_1内存管理算法

        heap_1只实现了pvPortMalloc,没有实现pvPortFree;也就是说,该算法只能申请内存,无法释放内存。


适用场景:

        创建的任务、队列、信号量等不需要删除。


实现原理:

        管理的内存是一个大数组(10K),在申请内存时,heap_1通过计算大小,从数组中分出合适大小的内存,内存堆数字定义如下图1:

 图1

1.5、heap_2内存管理算法

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

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


什么是最适应算法?

假设heap有3块空闲内存(按内存块大小由小到大排序) : 5字节、25字节、50字节
现在新创建一个任务需要申请20字节的内存
第一步:找出最小的、能满足pvPortMalloc的内存: 25字节
第二步:把它划分为20字节、5字节;)返回这20字节的地址,剩下的5字节仍然是空闲状态,留给后续的pvPortMalloc使用


什么是内存碎片?

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


内存碎片是怎么出现的?

如下图2:

图2


 适用场景:

        频繁的创建和删除任务,且所创建的任务堆栈都相同,此时不会出现碎片化的问题。

1.6、heap_3内存管理算法

        直接调用C库函数malloc()和free(),这里不做了解。

1.7、heap_4内存管理算法

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


什么是首次适应算法?

首次适应算法:
假设heap有3块空闲内存(按内存块地址由低到高排序) : 5字节、50字节、25字节
现在新创建一个任务需要申请20字节的内存
第一步:找出第一个能满足pvPortMalloc的内存: 50字节
第二步:把它划分为20字节、30字节;返回这20字节的地址,剩下30字节仍然是空闲状态,

留给后续的pvPortMalloc使用


如何合并相邻空闲内存块?

        heap_4内存管理算法会把相邻的空闲内存合并为一个更大的空闲内存,这有助于减少内存的碎片问题。如下图3:

图3


适用场景:

        频繁地分配、释放不同大小的内存。

1.8、heap_5内存管理算法

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

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


问题:怎么指定一块内存?
使用如下结构体:
typedef struct HeapRegion
{
        uint8_t*          pucStartAddress;   /*内存区域的起始地址*/
        size_t                xSizeInBytes;         /* 内存区域的大小,单位:字节*/
} HeapRegion_t;


怎么指定多块且不连续的内存?
Const HeapRegion_t xHeapRegions[] =
{
        { (uint8_ _t *)0x80000000, 0x10000},        /*内存区域1 */
        { (uint8_ _t*)0x90000000, 0xA0000 },        /*内存区域2*/
        {NULL, 0}                                                   /*数组终止标志*/

};
vPortDefineHeapRegions(xHeapRegions);


适用场景:

        在嵌入式系统中,那些内存的地址并不连续的场景。


二、FreeRTOS内存管理相关API函数

2.1、申请内存函数

void * pvPortMalloc( size_t xWantedSize );


xWantedSize: 申请的内存大小,以字节为单位;

假设申请内存为30,实际上内存减少不止30,因为会带上申请内存的结构体大小。


返回值:返回一个指针,指向已分配大小的内存。如果申请内存失败,则返回NULL。

2.2、释放内存函数

void vPortFree( void * pv );


pv:指针指向一个要释放内存的内存块(首地址放进来);

申请多次内存,都在一个同缓存区间,则以最后一次申请的地址为准,进行释放。

2.3、获取当前空闲内存的大小函数

size_t xPortGetFreeHeapSize( void );


返回值:返回当前剩余的空闲内存大小

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

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

相关文章

节能降耗方案-医院能源管理系统平台的研究与应用分析

摘要:综合性医院作为大型公共机构,能耗高的问题日益突出,构建能耗监控平台对医院能耗量化管理以及效果评估已经成为迫切需要。建立智能能耗监控平台,对采集的能耗数据进行分析,实现对医院能耗平台监控,为医…

Server端的Actor,分工非常的明确,但是只将Actor作为一部手机来用,真的合适吗?

这是一篇介绍PowerJob,Server端Actor的文章,如果感兴趣可以请点个关注,大家互相交流一下吧。 server端一共有两个Actor,一个是处理worker传过来的信息,一个是server之间的信息传递。 处理Worker的Actor叫做WorkerRequ…

5、HAL库驱动W25Qxx

一、 SPI通信驱动W25Qxx 1、使用驱动文件快速配置工程代码驱动W25Qxx (此驱动文件只适合W25Qxx 16M及以下型号,因为访问地址位数不同) 注:本次使用SPI的方式进行访问W25Qxx Flash进行数据读写,关于W25Qxx芯片不会做…

10大主流压力测试工具各有所长,怎么选适合自己的?

市面上流行的压力/负载/性能测试工具多是来自国外,近年来国内的性能测试工具也如雨后春笋崛起。同时由于开发的目的和侧重点不同,其功能也有很大差异,下面就为您简单介绍10款目前最常见的测试产品。 1、kylinTOP测试与监控平台(商…

实现一个比ant功能更丰富的Modal组件

普通的modal组件如下&#xff1a; 我们写的modal额外支持&#xff0c;后面没有蒙版&#xff0c;并且Modal框能够拖拽 还支持渲染在文档流里&#xff0c;上面的都是fixed布局&#xff0c;我们这个正常渲染到文档下面&#xff1a; render部分 <RenderDialog{...restState}visi…

Lesson5.2---Python 之 NumPy 切片索引和广播机制

一、切片和索引 ndarray 对象的内容可以通过索引或切片来访问和修改&#xff08;&#xff09;&#xff0c;与 Python 中 list 的切片操作一样。ndarray 数组可以基于 0 - n 的下标进行索引&#xff08;先行后列&#xff0c;都是从 0 开始&#xff09;。 区别在于&#xff1a;数…

代码随想录算法训练营第三十二天 | 122.买卖股票的最佳时机II,55. 跳跃游戏,45.跳跃游戏II

一、参考资料买卖股票的最佳时机IIhttps://programmercarl.com/0122.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAII.html 跳跃游戏https://programmercarl.com/0055.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8F.html 跳跃游戏 IIhttps://pr…

金三银四必备软件测试必问面试题

初级软件测试必问面试题1、你的测试职业发展是什么&#xff1f;测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前 3 年积累测试经验&#xff0c;按如何做好测试工程…

【数据结构期末例题】

前言 本文是博主自己在准备学校数据结构考试时的总结&#xff0c;各个知识点都贴有对应的详细讲解文章以供大家参考&#xff1b;当然文中还有许许多多的截图&#xff0c;这些是博主对主要内容的摘取&#xff0c;对于那些基础较好的同学可以直接看截图&#xff0c;减少跳转对应文…

声呐学习笔记之波束成形

目录什么是波束什么是波束成形线阵数学推导(均匀排布)什么是波束 和光束一样&#xff0c;当所有波的传播方向都一致时&#xff0c;即形成了波束。工程师利用波束已经有相当久的历史。在二战中&#xff0c;工程师已经将波束利用在雷达中&#xff0c;雷达通过扫描波束方向来探测…

力扣-分数排名

大家好&#xff0c;我是空空star&#xff0c;本篇带你了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;178. 分数排名二、解题1.错误示范①提交SQL运行结果2.错误示范②提交SQL运行结果3.正确示范①提交SQL运行结果4.正确示范②提交SQL运行结果5.正确示范③提交…

全流程GMS地下水数值模拟技能培养及溶质运移反应问题深度解析实践技术

本次综合前期多次学习的效果及重点关注环节&#xff0c;系统性呈现地下水数值模拟软件GMS建模方法同时&#xff0c;建立与实践项目过程中的重点问题相融合&#xff0c;在教学中不仅强调学习三维地质结构建模、水文地质模型概化、边界条件设定、参数反演和模型校核等关键环节&am…

套娃式工具!用 AI 识别 AI ?#AI classifier

2022年以来&#xff0c;市面上就出现了不少 AI 生成文本的工具&#xff0c;尤其是 OpenAI 推出的 ChatGPT &#xff0c;不仅能够协助完成撰写邮件、视频脚本、文案、翻译、代码等任务&#xff0c;还能通过学习和理解人类的语言来进行对话&#xff0c;并根据聊天的上下文进行互动…

AI技术网关如何用于安全生产监测?有什么优势?

现代工业生产和运营的规模越来越庞大、系统和结构越来越复杂&#xff0c;现场的风险点多面广&#xff0c;给作业一线的安全监管带来极大的挑战。 针对工地、煤矿、危化品、加油站、烟花爆竹、电力等行业的安全生产监管场景&#xff0c;可以借助AI智能与物联网技术&#xff0c;…

4.1 Filter-policy

1. 实验目的 熟悉Filter-policy的应用场景掌握Filter-policy的配置方法2. 实验拓扑 Filter-policy实验拓扑如图4-5所示: 图4-5:Filter-policy 3. 实验步骤 (1) 网络连通性 R1的配置 <Huawei>system-vi…

点成分享|对于粘性液体该如何精准移液?

之前文章介绍移液器原理及分类时有说到&#xff0c;从移液器的使用原理来进行移液器的分类&#xff0c;大致就可分为空气置换式移液器和正向置换移液器&#xff08;即外置活塞式移液器&#xff09;。 对于粘性液体&#xff0c;特别是高粘度液体的移液操作&#xff0c;最好的方…

Vulnhub 渗透练习(四)—— Acid

环境搭建 环境下载 kail 和 靶机网络适配调成 Nat 模式&#xff0c;实在不行直接把网络适配还原默认值&#xff0c;再重试。 信息收集 主机扫描 没扫到&#xff0c;那可能端口很靠后&#xff0c;把所有端口全扫一遍。 发现 33447 端口。 扫描目录&#xff0c;没什么有用的…

代码随想录算法训练营第三十天 | 332.重新安排行程,51. N皇后,37. 解数独,总结

Day29 休息~一、参考资料重点&#xff01;&#xff01; 回溯算法总结篇https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E6%80%BB%E7%BB%93.html 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合排列问题&#xff1a;N个数按一定规则全排列&#xff0c;有几种排列方式…

【数字电路】数字电路的学习核心

文章目录前言一、电子电路知识体系二、数电的学习目标三、数字电路分析例子四、数字电路设计例子总结前言 用数字信号完成对数字量进行算术运算和逻辑运算的电路称为数字电路&#xff0c;或数字系统。由于它具有逻辑运算和逻辑处理功能&#xff0c;所以又称数字逻辑电路。现代…

2023美赛E题思路代码分析

2023美赛数学建模E题思路分析&#xff0c;更多的可以文末 E题&#xff1a;光污染 问题一&#xff1a;制定一个广泛适用的指标来确定一个地点的光污染风险水平。 首先我们要知道光污染以两种形式存在&#xff1a; 天空辉光&#xff08;也称为人造天空辉光、光穹或逃逸光&…