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也是没用的 事务失效情况…...
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
首先提前准备,压入如下依赖 <!-- 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,根据官网操作 2、如果之前安装过的nodejs,且安装的目录改变了,需重新配置系统环境 第一步:打开此电脑 > 右键属性 > 高级系统设置 > 环境变量 第二步: 在系统变量中选中…...
javaEE 初阶 — 传输层 TCP 协议中的异常情况与面向字节流的粘包问题
文章目录1 粘包问题1.1 什么是粘包问题1.2 如何解决粘包问题2 异常情况TCP 的十个特性:确认应答机制 超时重传机制 连接管理机制 滑动窗口 流量控制与拥塞控制 延迟应答与捎带应答 1 粘包问题 1.1 什么是粘包问题 面向字节流引入了一个比较麻烦的粘包问题。 …...
IP路由基础
——IP路由基础(IA)—— HCIA全套笔记已经上线(arpAAAvlanTrunk链路聚合vlan间通信ACL广域网技术以太网交换...........)_孤城286的博客-CSDN博客 目录 ——IP路由基础(IA)—— (1&#…...
12.centos7部署sonarqube9.6
12.centos7部署sonarqube9.6环境:sonarqube9.6Postgresql13JDK11sonarqube9.6下载地址:Postgresql13 rpm下载地址:JDK11下载地址:准备工作:修改文件句柄数(最大文件数)和用户最大进程数限制修改…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
