FreeRTOS学习:内存管理

FreeRTOS内存管理简介

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

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

备注 :动态方式管理比静态方式更加灵活。

        标准的 C 库也提供了函数 malloc()和函数 free()来实现动态地申请和释放内存,但是标准 C 库的动态内存管理方法有如下几个缺点,

  • 占用大量的代码空间,不适合用在资源紧缺的嵌入式系统
  • 没有线程安全的相关机制。
  • 具有不确定性,体现在每次执行的时间不同。
  • 内存碎片化
     

FreeRTOS内存管理算法 

 FreeRTOS提供了5种动态内存管理算法,分别为heap_1、heap_2、heap_3、heap_4和heap_5,这 5 种动态内存管理算法各自的特点如下所示:

  • heap_1: 最简单,只允许申请内存,不允许释放内存。
  • heap_2: 允许申请和释放内存,但不能合并相邻的空闲内存块。
  • heap_3: 简单封装 C 库的函数 malloc()和函数 free(), 以确保线程安全。
  • heap_4: 允许申请和释放内存,并且能够合并相邻的空闲内存块,减少内存碎片的产生。
  • heap_5: 能够管理多个非连续内存区域的 heap_4。

 heap_1内存管理算法

heap_1只实现了pvPortMalloc,没有实现vPortFree,只能申请内存,无法释放。

如果工程创建好的任务、队列、信号量等都不需要被删除,可以使用heap_1。

heap_1 内存管理算法管理的内存堆是一个数组,在申请内存的时候, heap_1 内存管理算法只是简单地从数组中分出合适大小的内存。

heap_1内存管理算法分配过程如下,

可以看到heap_1内存管理算法就像切蛋糕,切掉了就没有了。

heap_2内存管理算法

  • 相比于 heap_1 内存管理算法, heap_2 内存管理算法使用了最适应算法,以支持释放先前申请的内存。
  • heap_2 内存管理算法并不能将相邻的空闲内存块合并成一个大的空闲内存块,因此 heap_2 内存管理算法不可避免地会产生内存碎片。

最适应算法:就是将空闲内存按照内存块大小排序,当你申请一个内存时,找到最小的,可以满足所申请的内存大小的的内存块,并将这个内存块分配出去,分配出去的内存块剩余大小任然是空闲状态。

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

heap_2内存管理算法分配过程如下,

heap_2适用于频繁的创建和删除任务,且所创建的任务堆栈都相同的场景。

heap_3内存管理算法

heap_3内存管理算法就是封装了C库的malloc和free函数,建议自行学习。

heap_4内存管理算法

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

首次适用算法:就是将空闲内存块按照地址由高到低进行排序,当你要申请一块内存时,先是根据地址由高到低找到可以满足所需内存的内存块,然后也是一样,内存块多余的内存仍然是空闲状态。

heap_4内存管理算法分配过程如下,

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

heap_5内存管理算法

heap_5 内存管理算法是在 heap_4 内存管理算法的基础上实现的,因为 heap_5 内存管理算法使用与 heap_4 内存管理算法相同的内存分配、释放和合并算法,但是 heap_5 内存管理算法在 heap_4 内存管理算法的基础上实现了管理多个非连续内存区域的能力。
 

heap_5内存管理算法默认并没有定义内存堆 ,需要用户手动调用函数进行分配,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);

heap_5适用于嵌入式系统中内存地址不连续的场景下使用。

内存管理函数

由于内存管理函数比较简单,下面介绍三个有关FreeRTOS内存管理的函数,

void* pvPortMalloc(size_t xWantedSize)

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

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

void vPortFree(void* pv)

*pv:指针指向一个要释放的内存 

size_t xPortGetFreeHeapSize(void)

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

备注:在一段内存没有被释放之前绝对不能在调用依次函数pvPortMalloc()为其再次分配内存,否则会导致内存泄漏。

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

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

相关文章

day33(mysql57主从从+mycat读写分离+java项目结合mycat数据库+lvs_dr轮询调用java项目)

1.设置主从从mysql57服务器 (1)配置主数据库 [rootmsater_5 ~]# systemctl stop [rootmsater_5 ~]# setenforce 0 [rootmsater_5 ~]# systemctl disable Removed symlink /etc/systemd/system/multi-user.target.wants/# ls anaconda-ks.cfg mysql-5.7…

Qt实现圆型控件的三种方法之设置样式表

前言 最近在研究绘制各种形状的控件,这里专门挑出圆形的控件进行记录,其它形状的也大差不差,会了圆形的之后其它的也类似。 正文 这里我挑出Label来进行举例。 通过设置样式表 (QSS) 这种方法简单且适用于不需要自定义绘制的场景。就是要…

vue2项目 预渲染 Unable to prerender all routes 错误排查与解决方案

前言 今天在做我的Vue2项目的SEO优化时,我采用了prerender-spa-plugin与vue-meta-info的一套官网前端SEO预渲染方案。 但是,在打包时,报错Unable to prerender all routes。尝试了很多种网上方案,都没有成功,最后从源…

基于vue3和audio封装的简易音频播放器

样式如图所示 <template><div class"audio-player"><div class"player_top" flex-ac flex-justify-between ><div class"fileName genericTitle" fs-28 l-height-32 height-64 pr-42 flex-ac><span class"t…

维护和升级LabVIEW程序

在维护和升级LabVIEW程序时&#xff0c;需要全面考虑代码的现状和未来的需求。以下是各个方面的详细注意事项&#xff0c;以确保程序能够在稳定性和性能方面得到提升。 1. 理解现有代码: 深入代码分析: 仔细阅读现有的代码&#xff0c;了解其逻辑结构、数据流、和控制流程。关注…

中国大模型平台市场份额最新排名Top5!场景化应用昭示新蓝海

8月21日&#xff0c;IDC&#xff08;国际数据公司&#xff09;首次发布了《中国大模型平台市场份额&#xff0c;2023&#xff1a;大模型元年 —— 初局》。数据显示&#xff0c;2023年中国大模型平台及相关应用市场规模达17.65亿元人民币。 在过去的2023年&#xff0c;行业对于…

会话跟踪方案:Cookie Session Token

什么是会话技术&#xff1f; Cookie 以登录为例&#xff0c;用户在浏览器中将账号密码输入并勾选自动登录&#xff0c;浏览器发送请求&#xff0c;请求头中设置Cookie&#xff1a;userName:张三 ,password:1234aa &#xff0c;若登录成功&#xff0c;服务器将这个cookie保存…

「数组」数组双指针算法合集:二路合并|逆向合并|快慢去重|对撞指针 / LeetCode 88|26|11(C++)

目录 概述 1.二路合并 思路 复杂度 Code 2.逆向合并 思路 复杂度 Code 3.快慢去重 思路 复杂度 Code 4.对撞指针 思路 复杂度 Code 总结 概述 数组的线性枚举是我们学习编程时遇到的第一种枚举手段。但是它看起来有点愚蠢&#xff1a;只有一个索引i承担全部…

学生党蓝牙耳机哪个牌子性价比高?推荐四款内行精选百元耳机!

作为没有什么经济来源的学生党&#xff0c;唯一来钱的途径就是家里给的生活费。所以在选择一款蓝牙耳机时就很纠结&#xff0c;那么首先你得清楚学生党的购物习性&#xff0c;因为大部分学生党在买东西时因为经济能力问题&#xff0c;主要追求的还是性价比&#xff0c;可以在实…

IP-RDS-222、IP-PRZ-59-AM12、EG-TRZ-42-L、EG-TRZ-42-H比例减压阀放大器

IP-DAR-250、IP-DAR-43C-L、IP-DAR-43C-H、IP-RDS-222、IP-PRZ-59-AM12、EG-TRZ-42-L、EG-TRZ-42-H比例减压阀 EE-PRB、EE-PRD比例压力阀 EE-P2G、ET-P2S、EB-P2A、EE-P2A、ET-P2A、EE-P2H、EG-F2A、EU-F2A比例流量阀 EF-F3G、EU-F3G比例压力补偿流量阀 EQ-S4M、EG-S4M、EQ…

DVWA靶场通关(CSRF)

CSRF 是跨站请求伪造&#xff0c;是指利用受害者尚未失效的身份认证信息&#xff08;cookie、会话等&#xff09;&#xff0c;诱骗其点击恶意链接或者访问包含攻击代码的页面&#xff0c;在受害人不知情的情况下以受害者的身份向&#xff08;身份认证信息所对应的&#xff09;服…

eNSP 华为ACL配置

华为ACL配置 需求&#xff1a; 公司保证财务部数据安全&#xff0c;禁止研发部门和互联网访问财务服务器&#xff0c;但总裁办不受影响 R1&#xff1a; <Huawei>sys [Huawei]sys Router1 [Router1]undo info-center enable [Router1]int g1/0/0 [Router1-GigabitEth…

开放式耳机为什么性价比高?四款开放式蓝牙耳机排行榜前十名推荐

如果说需要高性价比的蓝牙耳机推荐的话&#xff0c;我会比较推荐开放式耳机&#xff0c;因为这类的耳机产品价格普遍都不会太高&#xff0c;但配置却都很好。那除了性价比高&#xff0c;开放式耳机还有其他好的地方吗&#xff1f;那当然是有的&#xff0c;对于蓝牙耳机来说&…

HTML+JS谁是卧底游戏

先说一句&#xff1a;一段时间没发文章&#xff0c;好多僵尸粉关注我&#xff0c;这CSDN&#x1f620; 主要功能 玩家设置&#xff1a;在游戏开始前&#xff0c;输入总人数、卧底人数和白板人数。系统会自动计算出剩下的平民人数&#xff0c;并随机分配身份。 身份查看&#…

DHCP协议-CSP认证

文章目录 DHCP协议 DHCP协议 stringstream的用法 应用实践 #include<bits/stdc.h>using namespace std;signed main() {string s"wo shi wwl, also wlw";stringstream ss;ss<<s;while(ss>>s){if(s[s.size()-1],) s[s.size()-1] ;cout<<s<…

授权cleanmymac访问全部磁盘 Mac授权访问权限 cleanmymac缺少权限

CleanMyMac是Mac系统下的一款专业的苹果电脑清理软件&#xff0c;同时也是一款优秀的电脑系统管理软件。它能有效清理系统垃圾&#xff0c;快速释放磁盘内存&#xff0c;缓解卡顿现象&#xff0c;保障系统顺畅地运行。 全磁盘访问权限&#xff0c;就好比机场内进行的安全检查。…

【AD9361 数字基带】多片基带内FPGA补偿 I/Q Rotation

I/Q 旋转 Rotation 在许多多通道射频系统中&#xff0c;如 AD-FMCOMMS5&#xff0c;甚至在 AD-FMCOMMS2、AD-FMCOMMS3 上&#xff0c;都需要测量或校正两个复数 &#xff08;I/Q&#xff09; RF 信号之间的相位差。 从纯粹的数学描述来看&#xff0c;单个正弦波没有相位&…

Godot《躲避小兵》实战之游戏开始界面制作

我们的游戏还需要用户可操作的界面&#xff0c;比如开始游戏&#xff0c;退出以及显示分数等UI界面。 创建新场景&#xff0c;点击“其他节点”按钮&#xff0c;然后添加一个 CanvasLayer 节点并命名为 HUD。“HUD”是“heads-up display”&#xff08;游戏信息显示&#xff0…

计算机网络——运输层(进程之间的通信、运输层端口,UDP与TCP、TCP详解)

运输层协议概述 进程之间的通信 运输层向它上面的应用层提供通信服务。 当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时&#xff0c;都要使用协议栈中的运输层&#xff1b;而网络核心部分中的路由器在转发分组时只用到下三层的功能。 Q1&#xff1a;我们…

最全Java集合分片处理!!! Java 中 List 分片的 7种方法

文章目录 Java 中 List 分片的 7种方法业务需求背景实现方法方法一&#xff1a;最基本的 for 循环实现方法二&#xff1a;利用 List 的 subList() 方法方法三&#xff1a;stream 流操作 filter 方法过滤方法四&#xff1a;使用 Google Guava 的 Lists.partition 方法方法五&…