当前位置: 首页 > news >正文

FreeRTOS内存管理 | FreeRTOS十五

目录

说明:

一、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 );


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

相关文章:

FreeRTOS内存管理 | FreeRTOS十五

目录 说明: 一、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、hea…...

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

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

day45【代码随想录】动态规划之完全平方数、单词拆分、打家劫舍、打家劫舍 II

文章目录前言一、完全平方数(力扣279)二、单词拆分(力扣139)三、打家劫舍(力扣198)四、打家劫舍 II前言 1、完全平方数 2、单词拆分 3、打家劫舍 4、打家劫舍 II 一、完全平方数(力扣279&#…...

java程序,springboot程序 找不到主类,找不到符号解决思路

文章目录问题解决方案一.可以尝试clean掉maven依赖,然后重新启动二.右键工程,选择maven然后重新加载工程,接着再启动试试三.删掉工程中的services.iml文件,重新配置后接着再启动试试四. 终极方案清除idea缓存,重启idea…...

AntD-tree组件使用详析

目录 一、selectedKeys与onSelect 官方文档 代码演示 onSelect 注意事项 二、expandedKeys与onExpand 官方文档 代码演示 onExpand 注意事项 三、loadedKeys与onLoad和onExpand 官方文档 代码演示 onExpand与onLoad:​ 注意事项 四、loadData …...

spring的事务控制

1.调用这个方法的对象是否是spring的代理对象($CGLIB结尾的) 2.这个方法是否是加了Transactional注释 都符合才可以被事物控制 如果调用方法的对象没有被事物控制,那么被调用的方法即便是加了Transactional也是没用的 事务失效情况&#xf…...

4.如何靠IT逆袭大学?

学习的动力不止于此: IT逆袭 这两天利用工作空余时间读了贺利坚老师的《逆袭大学——传给 IT 学子的正能量》,感触很多,有些后悔没有好好利用大学时光。 不过人都是撞了南墙再回头的,吃一堑长一智。 这本书无论你是工作了还是…...

提供网络可测试的接口【公共Webservice】

提供网络可测试的接口 1、腾讯QQ在线状态 WEB 服务 Endpoint: qqOnlineWebService Web 服务 Disco: http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?disco WSDL: http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl 腾讯QQ在线状态 WEB 服…...

【深入理解计算机系统】库打桩 - 阅读笔记

文章目录库打桩机制1. 编译时打桩2. 链接时打桩3. 运行时打桩库打桩机制 Linux 链接器支持一个很强大的技术,称为库打桩 (library interpositioning),它允许你截获对共享库函数的调用,取而代之执行自己的代码。使用打桩机制,你可以…...

RocketMQ高性能原理分析

目录一、读队列与写队列1.概念介绍2.读写队列个数关系分析二、消息持久化1.持久化文件介绍2.持久化结构介绍:三、过期文件删除1.如何判断文件过期2.什么时候删除过期文件四、高效文件写1.零拷贝技术加速文件读写2.文件顺序写3.刷盘机制五、 消息主从复制六、负载均衡…...

前端面试当中CDN会问啥------CDN详细教程来啦

⼀、CDN 1. CDN的概念 CDN(Content Delivery Network,内容分发⽹络)是指⼀种通过互联⽹互相连接的电脑⽹络系统,利 ⽤最靠近每位⽤户的服务器,更快、更可靠地将⾳乐、图⽚、视频、应⽤程序及其他⽂件发送给⽤户&…...

刷题记录:牛客NC19429红球进黑洞 区间拆位异或+区间求和

传送门:牛客 题目描述: 区间求和区间异或k 输入: 10 10 8 5 8 9 3 9 8 3 3 6 2 1 4 1 1 2 6 2 9 10 8 1 1 7 2 4 7 8 2 8 8 6 2 2 3 0 1 1 2 2 9 10 4 1 2 3 输出: 33 50 13 13一道区间求和区间异或的题目,可以称得上是线段树的一道好题 首先对于异或运算来说,并不满足…...

信息数智化招采系统源码——信息数智化招采系统

​ ​ 信息数智化招采系统 服务框架:Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构:VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术:Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monit…...

20230217使AIO-3399J开发板上跑通Android11系统

20230217使AIO-3399J开发板上跑通Android11系统 2023/2/17 15:45 1、解压缩SDK:rk3399-android-11-r20211216.tar.xzrootrootrootroot-X99-Turbo:~$ tar xvf rk3399-android-11-r20211216.tar.xz 2、编译U-boot: rootrootrootroot-X99-Turbo:~/rk3399-a…...

Java 基础面试题——面向对象

目录1.面向对象和面向过程有什么区别?2.面向对象的有哪些特征?3.静态变量和实例变量有什么区别?4.Java 对象实例化顺序是怎样的?5.浅拷贝和深拷贝的区别是什么?5.1.浅拷贝5.2.深拷贝5.3.总结6.Java 中创建对象的方式有哪几种&…...

PDF文件替换内容(电子签章),依赖免费pdfbox

首先提前准备&#xff0c;压入如下依赖 <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId>…...

nvm 控制 node版本

nvm 官网 https://nvm.uihtm.com/ 1、卸掉nodejs&#xff0c;根据官网操作 2、如果之前安装过的nodejs,且安装的目录改变了&#xff0c;需重新配置系统环境 第一步&#xff1a;打开此电脑 > 右键属性 > 高级系统设置 > 环境变量 第二步&#xff1a; 在系统变量中选中…...

javaEE 初阶 — 传输层 TCP 协议中的异常情况与面向字节流的粘包问题

文章目录1 粘包问题1.1 什么是粘包问题1.2 如何解决粘包问题2 异常情况TCP 的十个特性&#xff1a;确认应答机制 超时重传机制 连接管理机制 滑动窗口 流量控制与拥塞控制 延迟应答与捎带应答 1 粘包问题 1.1 什么是粘包问题 面向字节流引入了一个比较麻烦的粘包问题。 …...

IP路由基础

——IP路由基础&#xff08;IA&#xff09;—— ​​​​​​​HCIA全套笔记已经上线&#xff08;arpAAAvlanTrunk链路聚合vlan间通信ACL广域网技术以太网交换...........)_孤城286的博客-CSDN博客 目录 ——IP路由基础&#xff08;IA&#xff09;—— &#xff08;1&#…...

12.centos7部署sonarqube9.6

12.centos7部署sonarqube9.6环境&#xff1a;sonarqube9.6Postgresql13JDK11sonarqube9.6下载地址&#xff1a;Postgresql13 rpm下载地址&#xff1a;JDK11下载地址&#xff1a;准备工作&#xff1a;修改文件句柄数&#xff08;最大文件数&#xff09;和用户最大进程数限制修改…...

大学四年自学Java编程,现在拿到28万年薪的offer,还是觉得挺值的

最近刚拿到美团的Java后端工程师的offer&#xff0c;&#xff08;底薪、奖金、补贴、年终奖、五险一金&#xff09;总包加在大概有28万的年薪&#xff0c;实际到手不会有这么多&#xff0c;但是我对于这个待遇还是非常满意的。说来还是非常的感慨&#xff0c;我属于那种从大一到…...

MySQL的日志详解

目录 一.介绍 日志分类 二.错误日志 三.二进制日志—binlog 概述 日志格式 操作 四.查询日志 五.慢查询日志 一.介绍 在任何一种数据库中&#xff0c;都会有各种各样的日志&#xff0c;记录着数据库工作的方方面面&#xff0c;以帮助数据库管理员追踪数据库曾经发生过的…...

输出该股票所有收盘比开盘上涨3%以上的日期

1&#xff1a;输出该股票所有收盘比开盘上涨3%以上的日期 #codingutf-8 import tushare as ts import pandas as pd import numpy as np#获取某支股票的历史行情数据 dfts.get_hist_data(code600519,start2001-01-01) #将互联网上的数据获取并且存储到本地 df.to_csv(./maotai…...

数值卡,让数据可视化玩出新花样丨三叠云

数值卡 路径 仪表盘 >> 仪表盘设计 功能简介 1. 数值卡增加「数值标题」、「图标」、「进度条」功能&#xff0c;使得应用场景更为广泛&#xff0c;实现数据可视化&#xff0c;让用户能够轻松地获取、处理信息。 2.「数据模型」支持0个维度1个指标、1个维度1个指标。…...

有这几个表现可能是认知障碍前兆

我国目前对于认知障碍的认知率、就诊率、诊断率很低&#xff0c;然而认知障碍如果能在早期发现&#xff0c;并及时治疗&#xff0c;生活质量会有效提高&#xff0c;缓解家属的精神和经济负担。所以&#xff0c;认知障碍的前兆一定要了解。1.记忆力减退&#xff0c;一周内的重要…...

java面试题-阿里真题详解

前言 大家好&#xff0c;我是局外人一枚&#xff0c;最近有不少粉丝去阿里巴巴面试了&#xff0c;回来之后总结不少难题给我&#xff0c;以下是面试的真题&#xff0c;跟大家一起来讨论怎么回答。 阿里一面 1、说⼀下ArrayList和LinkedList区别 ⾸先&#xff0c;他们的底层数…...

JSON格式解析关键词搜索API

为了进行此平台API的调用&#xff0c;首先我们需要做下面几件事情。 1、 获取一个KEY。 2、 参考API文档里的接入方式和示例。 3、查看测试工具是否有需要的接口&#xff0c;响应实例的返回字段是否符合参数要求。 4、利用平台的文档中心和API测试工具&#xff0c;对接口进…...

【Java基础】泛型(二)-泛型的难点:通配符

本文将尝试将通配符和泛型中的继承&#xff0c;多态一并讲解 关于泛型中继承的注意事项 因为Integer、Double继承了Number&#xff0c;根据多态性&#xff0c;以下语句是合法的 Number n new Integer(10); // OK, 父类引用变量可以指向子类对象 n 2.9 // OK&#xff0c;n实…...

黑马】后台管理-两个括号的坑

记录一下这两天的坑没想到后台管理系统上线这两天都没有搞明白1.首先第一个坑是使用node.js的express中间件框架创建一个微型服务器&#xff0c;然后将vue脚手架生成的dist文件夹的文件放入里面了 &#xff0c;把项目加载到web服务器之后运行node .\app.js&#xff0c;页面显示…...

05:进阶篇 - 使用 CTKWidgets

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 CTKWidgets 包含了一组 Qt 部件,用于生物医学成像应用程序。当然,即使你的程序与医学无关,很多部件也是很有参考意义的。 在 CTK 源码中,有很多选项开关,可以控制你想要编译的内容(详见:04:进阶篇 …...

网站开发需会的课程/青岛网站建设公司电话

4.1 开发完第一个鸿蒙应用后&#xff0c;下面在了解一下完整的鸿蒙应用打包发布后应该是什么样子&#xff1a;一个完整的打包后应用结构如下图所示&#xff0c;这里我们先了解结构&#xff0c;具体怎么打包很简单只要前提是要签名!1. HAP的分类HAP又可分为entry和feature两种模…...

做公司网站写什么信息/我想做网络推广

oracle的架构大概分为3部分&#xff0c; 客户端&#xff1a;用户端 oracle instance&#xff1a;叫做实例&#xff0c;由内存结构&#xff08;内存池或者叫SGA&#xff09;和后台进程组成。Oracle Instance是Oracle RDBMS的核心之一&#xff0c;负责RDBMS的管理功能。内存结构有…...

试述建设一个网站的具体步骤/竞价排名什么意思

好久没有面试了&#xff0c;最近打算换份工作&#xff1b;自从从事工作以来 没有太大的技术动力目标去实现技术上的突破&#xff0c;一直在原地踏步走&#xff0c;中间做过运营及其他和技术不相关工作&#xff0c;算是脱离过技术一段时间&#xff0c;然而在真正的找工作的时候 …...

青岛建设银行网站/如何做宣传推广营销

本文为我阅读了目录&#xff1a;一、List(列表)1、LPUSHRedis Lpush 命令将一个或多个值插入到列表头部。 如果 key 不存在&#xff0c;一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时&#xff0c;返回一个错误。(在Redis 2.4版本以前的 LPUSH 命令&#…...

成都网站建设:思乐科技/优化网站搜索

摘要摘要在机器翻译和作文自动评分领域已经有比较成熟的研究成果&#xff0c;但是在人工翻译评分领域的研究还不够深入。在同为主观题的作文评分中&#xff0c;采用多元线性回归方法建立文本特征和分数之间的方程。但是人工翻译评分选取的文本特征之间关系更为复杂&#xff0c;…...

网站模板在线演示怎么做/网站seo哪里做的好

前两天家里的网断断续续&#xff0c;发现有人在用arp欺骗&#xff0c;其实真正碰到有人在攻击的几率不大&#xff0c;大部分原因都是有人在用win下的诸如“P2P终结者”这样的软件导致的。再怎么bs那人也是没有用的&#xff0c;问题还是要解决&#xff0c;win下倒是好办&#xf…...