嵌入式面试——FreeRTOS篇(九) 内存管理

news2024/11/24 16:36:19

本篇为:FreeRTOS 内存管理篇

一、FreeRTOS内存管理简介

1、FreeRTOS内存管理介绍

答:

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

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

总结:

        动态方式管理内存相比与静态方式,更加灵活。

        除了 FreeRTOS 提供的动态内存管理方法,标准的C库也提供了函数 malloc()和函数 free()来实现动态地申请和释放内存。

        那么问题就来了!

2、为什么不用标准的C库自带的内存管理算法

答:

        因为标准 C 库的动态内存管理方法有如下几个缺点:

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

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

二、FreeRTOS内存管理算法

1、FreeRTOS内存管理算法种类

答:

        FreeRTOS提供了5种动态内存管理算法,分别为: heap1、heap2、heap_3、heap4、heap5 。其实是5个.C 文件,这5个文件就是这5中算法的实现。

如图所示:

        在我们FreeRTOS例程中,使用的均为heap_4内存管理算法。

2、heap_1内存管理算法

答:

heap_1的特点:

        heap1只实现了pvPortMalloc,没有实现vPortFree;也就是说,它只能申请内存,无法释放内存!

        如果你的工程,创建好的任务、队列、信号量等都不需要被删除,那么可以使用heap1内存管理算法。

        heap1的实现最为简单,管理的内存堆是一个数组,在申请内存的时候, heap1 内存管理算法只是简单地从数组中分出合适大小的内存,内存堆数组的定义如下所示 :

/* 定义一个大数组作为 FreeRTOS 管理的内存堆 */

static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];

heap_1内存管理算法的分配过程如下图所示:

注意

        heap_1内存管理算法,只能申请无法释放!

3、heap_2内存管理算法

答:

heap_2的特点:

  • 相比于 heap1 内存管理算法, heap2 内存管理算法使用最适应算法,并且支持释放内存
  • heap2 内存管理算法并不能将相邻的空闲内存块合并成一个大的空闲内存块;因此 heap2 内存管理算法不可避免地会产生内存碎片;

最适应算法:

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

heap_2内存管理算法的分配过程:

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

适用场景:

        频繁的创建和删除任务,且所创建的任务堆栈都相同,这类场景下Heap_2没有碎片化的问题。

Heap_3用的是C库实现的,所以跳过。

4、heap_4内存管理算法

答:

heap_4的特点:

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

首次适应算法:

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

heap_4内存管理算法的分配过程:

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

适用于这种场景:

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

5、heap_5内存管理算法

答:

heap_5的特点:

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

        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函数

1、FreeRTOS内存管理相关函数

答:

void * pvPortMalloc( size_t xWantedSize );

void vPortFree( void * pv );

size_t xPortGetFreeHeapSize( void );

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

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

相关文章

【AI绘画教程】StableDiffusion出图颜色偏白发灰?用好VAE立马解决!(附VAE模型下载)

大家好,我是画画的小强 之前已经给大家推荐过不少AI绘画中 Stable Diffusion WebUI 的大模型,今天为大家介绍一下 WebUI 中“外挂VAE”的相关内容,可以解决我们在用大模型出图过程中出现的图像颜色发灰、发白的问题,一起来看看吧…

话说你们维保到期通知都是谁通知的

离谱了,公司有个客户维保到期了 过了2个月才发现。 白干了两个月, 客户也不愿意给这两个月钱。 现在商务和运维在扯皮, 商务说运维部门应该到期给客户发通知, 运维说商务到期要续签, 就应该商务去通知。 然后老…

ppt怎么做出高级感?找对高级ppt模板,轻松一键替换

想问问大家国庆节后的工作忙吗?小编的大厂朋友们都忙疯了! 都在忙着做各种项目的执行总结PPT报告,和接下来的工作计划展望!做出来的PPT还会被领导嫌弃排版没创意、不高级...... 这不,还来找小编,问有没有什…

水库抽样算法(大数据算法作业)

时隔一个多月,终于想起来写大数据算法基础的实验报告,主要是快截止了,hh 这两天加急把这个报告写完了~ 接下来,写一写证明过程(参考书籍:高等教育出版社《数据科学与工程算法基础》)主要代码以…

MODBUS协议介绍,通过MODBUS协议控制伺服电机工作

1.前言 modbus协议本身的介绍,请大家自行查阅资料。本文简单介绍一下如何通过MODBUS协议组装控制指令。 最近搞了一个项目,要驱动伺服电机工作。通过下位机STM32 407 100封脚 给伺服电机发控制指令。电机和下位机之前的通信采用RS485串口通信&#xff…

seaCMS v12.9代码审计学习(下半)

文章目录 admin/admin_safe.php任意文件下载CSRF 添加管理员账户CSRF配合XSS弹cookie admin/admin_safe.php任意文件下载 在admin_safe.php文件下有着这么一段代码,他的作用时检查action的值是否为download,如果为download那么将你传入的文件直接打印给…

LeetCode题练习与总结:二叉树的序列化与反序列化--297

一、题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与…

校园网环境下基于OpenWRT的路由器选型与解决方案

校园网环境下基于OpenWRT的路由器选型与解决方案 网页认证(锐捷认证)解除校园网设备限制,路由器选型和解决方案 openwrt 我们学校校园网一个账号只能登录两台设备,多了直接就退出联网状态,然后校园网是基于锐捷认证进行认证的,然后通过ment…

基于逻辑回归实现乳腺癌预测

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

使用IDEA生成API文档

1. 在IDEA中,Tools->Generate JavaDoc Scope 2.Output Directory里面放,生成的目录。 Other command line arguments:-encoding utf-8 -charset utf-8(解决乱码) 3.点击ok,生成的效果图

构建数字文化产业链,拓展文化产业发展空间

在当今全球化和数字化的双重浪潮下,文化产业正以前所未有的速度进行变革和升级。作为文化与科技深度融合的产物,数字文化产业链正以其独特的魅力和无限的潜力,引领文化产业向更高层次、更广领域迈进。 数字文化产业链的构建,不仅…

特斯拉智驾路线影响国内OEM组织架构变革,Robotaxi重塑汽车定位搅动风云

智驾研发组织面向端到端进行调整,车企内部研发资源聚焦,智驾方案选择将快速收敛 特斯拉在智驾领域的技术方向被国内车企当作学习的范本,而技术路线的切换往往伴随组织架构的调整。特斯拉 FSD 团队人员规模在数百人,但数据积累和训练算力领先。智驾研发迈向端到端使得车企研…

QD1-P13 HTML 表单标签(form)

本节学习 HTML 表单标签:form ‍ 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p13 ‍ 知识点1:form标签的用途 ​form​ 标签在HTML中用于创建一个表单,它允许用户输入数据,然后可以将这些数据发送到服务器进行处理。以下…

JS 运算符

目录 1. 赋值运算符 2. 一元运算符 2.1 自增 2.1.1 前置自增 2.1.2 后置自增 2.1.3 前置与后置自增对比 3. 比较运算符 3.1 字符串比较 4. 逻辑运算符 4.1 案例 5. 运算符优先级 1. 赋值运算符 2. 一元运算符 2.1 自增 2.1.1 前置自增 2.1.2 后置自增 2.1.3 前置与后…

户外防火值守:太阳能语音监控杆的参数及技术特点

随着假期旅游的热潮日渐高涨,我们游览各大景区、公园或森林区域时,经常会与各种智能设备不期而遇。这些高科技产品不仅提升了旅游体验,更在无形中保障了游客的安全与景区的环境保护。在我最近的旅行经历中,尤其是在深圳大鹏旅游景…

推荐几款适合跨境电商外贸的爬虫软件

在当今数据驱动的时代,自动化爬虫工具和软件成为了许多企业和个人获取数据的重要手段,特别是跨境电商、外贸等业务,对数据的需求非常大,比如对amazon、tiktok、shopee等网站数据的监测和获取。 这里会介绍6款功能强大、操作简便的…

回溯法与迭代法详解:如何从手机数字键盘生成字母组合

在这篇文章中,我们将详细介绍如何基于手机数字键盘的映射,给定一个仅包含数字 2-9 的字符串,输出它能够表示的所有字母组合。这是一个经典的回溯算法问题,适合初学者理解和掌握。 问题描述 给定一个数字字符串,比如 …

vue3+FullCalendar+Element-plus修改的日程安排表

实现效果 安装Fullcalendar相关插件 npm install fullcalendar/core fullcalendar/daygrid fullcalendar/timegrid fullcalendar/list fullcalendar/interaction --save代码中使用到了时间转换和element-plus,安装dayjs和element-plus npm install element-plus e…

03 django管理系统 - 部门管理 - 部门列表

部门管理 首先我们需要在models里定义Dept类 # 创建部门表 class Dept(models.Model):name models.CharField(max_length100)head models.CharField(max_length100)phone models.CharField(max_length15)email models.EmailField()address models.CharField(max_length2…

MySql的binlog与数据的恢复

目录 什么是binlogbinlog的作用binlog的三种模式binlog的开启数据的恢复与回滚binlog日志的删除 什么是binlog binlog我们一般叫做归档日志,他是mysql服务器层的日志,跟存储引擎无关,他记录的是所有DDL和DML的语句,不包含查询语句…