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.rhkb.cn/news/406773.html

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

相关文章

Vue3开始

1.创建 Vue3 工程 1.基于 vue-cli创建 2.基于vite创建工程 Home | Vite中文网 (vitejs.cn) nodejs 环境可以 使用 nvm 来管理 nodejs 的版本 3.开始创建 4.目录结构 5.创建完 执行 安装依赖 npm i 6.运行项目 为什么命令是 dev 就是从这里配置的 npm run dev

大白话社融中M1和M2的学习笔记

一、背景 为什么我看社融数据呢?因为作为一个码农,我不清楚当前个人所处的样本情况是否真实。我所处的环境是在深圳南山,身边一些同事有不少找工作不怎么顺利,我所在的公司今年也没招大学生了,人员也只出不进为主&…

本地生活服务商系统如何利用本地推获得更多曝光?

随着本地生活赛道中的竞争愈演愈烈,越来越多的本地生活服务商和本地生活商家开始计划着通过在本地推等平台投放相关信息,以提高品牌店铺的曝光量和知名度。不过,就目前的情况来看,绝大多数人都陷入了一种“投入多,转化…

教育部-华为产学合作协同育人项目 | 仓颉编程语言专项

为响应《教育部高等教育司关于调整产学合作协同育人项目运行模式及征集2024年产学合作协同育人项目的通知》号召,华为公司2024年第二批70个项目已发布,其中仓颉编程语言领域共计10个项目,如下所示,通过新工科建设项目,…

U盘安装Ubuntu24.04,乌邦图,UltralISO

文章目录 前言通过UltraISO,制作启动U盘下载镜像制作工具UltraISO(软碟通)下载ubuntu镜像文件制作启动U盘 安装ubuntu设置root密码,并登陆root 前言 在Ubuntu作为主流的linux系统,有时候使用VMware安装使用,总归有一定的性能损耗…

力扣每日一题 数组最后一个元素的最小值 位运算

Problem: 3133. 数组最后一个元素的最小值 👨‍🏫 灵神题解 class Solution {public long minEnd(int n, int x) {n--; // 先把 n 减一,这样下面讨论的 n 就是原来的 n-1long ans x;int i 0;int j 0;while((n >> j) > 0){// …

springboot集成海康sdk,针对视频流获取某一点的实时温度

直接上代码吧: 前端页面专递点的x和y的坐标及其设备的ip @RequestMapping(value = "/getRealTemperatureByPoint") public float getRealTemperatureByPoint(HttpServletRequest request) {Map<String, Object> params = ParamUtil.getParams(request);Strin…

小区社区超市商城停车场管理系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

Linux 信号 signal,sigaction,sigqueue,kill,相关函数

驱动与应用的结合&#xff0c;参考我的这篇&#xff1a;https://blog.csdn.net/rjszcb/article/details/113573517 一、 什么是信号 信号是软中断,用于通知进程某个事件已经发生。进程可以选择如何响应信号:忽略、默认处理、自定义处理等。 常见信号有:SIGINT(键盘中断)、SIGK…

C语言程序设计-练习篇

华夏波澜壮阔&#xff0c;少年仍需前行。 十&#xff0c;实现一个函数&#xff0c;打印乘法口诀表&#xff0c;口诀表的行数和列数自己指定 #include <stdio.h> //实现一个函数&#xff0c;打印乘法口诀表&#xff0c;口诀表的行数和列数自己指定 void print_table(int …

启动docker镜像

1、运行容器 2、当前运行的进程 3、当前位置和启动时间 4、cat/etc/redhat-release查看版本 5.镜像是模版&#xff0c;容器是实例 6.容器中没有命令运 7.容器总是能轻易获取 8.配置yum 9.安装http 10.修改index⽂件 11.httpd -k start 12.访问 13.退出就没有服务了 14…

Redis配置及idea部分操作

配置Redis远程访问 修改访问IP地址 #跳转到redis安装目录 cd /usr/local/redis-6.2.1 #修改redis.conf配置文件 vi redis.conf #注释redis.conf第69行的配置项 #bind 127.0.0.1 设置登录密码 找到下面这一行并去除注释&#xff0c;并添加密…

【微服务】SpringCloud Alibaba 10-14章

10 SpringCloud Alibaba入门简介 10.1 是什么 诞生 2018.10.31&#xff0c;Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器&#xff0c;并在 Maven 中央库发布了第一个版本。 Spring Cloud Alibaba 介绍 10.2 能干嘛 https://github.com/alibaba/spring-cloud-al…

git常用操作合集

1 撤销 1.1 适用场景 如果在git上提交了commit&#xff0c;但是当前提交的代码有问题&#xff0c;需要回退到上个版本 1.2 操作命令 1、git log 查看历史提交记录及对应的commit id 找到需要回退的commit id 2、执行git reset回退到之前的状态 git reset --hard <commi…

基于Springboot和BS架构的宠物健康咨询系统pf

TOC springboot509基于Springboot和BS架构的宠物健康咨询系统pf 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#x…

day37动态规划+三.Github链接本地仓库

一.动态规划 474.一和零 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 思路:这道题更像是另一种的0-…

C++ 设计模式——外观模式

外观模式 C 设计模式——外观模式主要组成部分1. 外观类&#xff08;Facade&#xff09;2. 子系统类&#xff08;Subsystem&#xff09;3. 客户端&#xff08;Client&#xff09; 例一&#xff1a;工作流程示例1. 外观类&#xff08;Facade&#xff09;2. 子系统类&#xff08;…

假期作业--数据结构

1、顺序表实现学生管理系统&#xff08;参照顺序表技能&#xff09;写出菜单界面switch选择&#xff0c;功能1创建顺序表&#xff08;堆区&#xff09;&#xff0c;2录入学生信息&#xff0c;3插入一个学生信息&#xff0c;4删除一个学生信息&#xff0c;5按照位置修改一个学生…

Android.bp和Android.mk文件有的区别

文章目录 1. 构建系统2. 语法和格式3. 可维护性和扩展性4. 编译效率5. 未来趋势 在Android的构建系统中&#xff0c; Android.mk和 android.bp是用于定义如何编译项目文件的两种文件类型&#xff0c;它们有一些显著的区别。 1. 构建系统 Android.mk&#xff1a;使用于基于GN…

探索Facebook的区块链计划:未来社交网络的变革

随着区块链技术的迅速发展&#xff0c;社交网络领域正面临一场深刻的变革。Facebook&#xff0c;作为全球最大且最具影响力的社交平台之一&#xff0c;正在积极探索区块链技术的应用。本文将深入探讨Facebook的区块链计划&#xff0c;分析其潜在的变革性影响&#xff0c;并展望…