内存管理(RTOS)

news2024/11/27 10:34:43

     

目录

#RTOS内存管理介绍

#堆定义

#栈定义

#RTOS四种堆分配方案

#Heap_1.c

#Heap_2.c

#Heap_3.c

#Heap_4.c

#Heap_5.c

#stm32cublemx对堆的配置

#配置堆相关函数

#申请内存函数

#钩子函数


          前言:本课程参考韦东山老师视频,连接放在最后。

#RTOS内存管理介绍

        后续的RTOS学习中,通常会使用这些对象   任务(task)    队列(queue)  多线程(semaphores)   事件( event group),这些对象定义地时候在内存中通常是,动态分配内存(使用分配,不用释放),也就是通过堆,来申请内存或者释放内存,这样做有一个好处,简化了程序设计。

        动态分配内存是C语言中的知识,但是与RTOS联系紧密,相关函数有 mallc(申请内存) free(释放内存),但是这些函数在RTOS系统里面并不适用,原因是,嵌入式系统资源紧缺,函数定义实现过于复杂,代码占用空间太大。

        因为上述的缺点,在RTOS中并不使用mallc free对堆进行分配和释放,而是通过 pvPortMalloc vPortFree 这两个函数进行内存的分配与释放,pvPortMalloc对堆的内存进行分配 vPortFree 进行释放堆的内存。

        pvPortMalloc对应着C语言中的mallc vPortFree对应着C语言中的free函数,也就是平替。

                 

#堆定义

        heap    堆   

         解释:空闲的内存,通过函数占用或者释放

        mallc :从堆里面申请一个内存给程序进行使用

        free :将已经分配给程序的堆,进行释放,释放过后的堆可用于在此使用。

#栈定义

        stack

        解释:调用函数的局部变量LR寄存器,还有切换函数保存的环境也是在栈中

        关联:从堆里面分配一块内存空间可以当做栈使用

                

#RTOS四种堆分配方案

        RTOS里面对应堆的管理有5种文件,每种文件分别对应着不同的内存管理方法,有着不同的效果。

#Heap_1.c

        相关介绍:heap_1.c 这个文件只实现了,pvPortMalloc 没有实现 vPortFree 也就是只实现了分配堆内存,没有实现释放堆内存

         如果程序不需要删除,堆内存对象可以使用这个文件,对堆内存进行管理,如果在一些严格的系统里面,如果不允许使用动态内存(就是不允许分配内存,使用过后回收内存),就可以使用这个函数,进行分配内存,因为这个文件不回收内存。

                    

        A在创建任务之前整个Heap都是空着的,B是分配一个任务之后heap的使用情况,C是3个任务之后heap的使用情况,这个时候如果有任务结束,这些空间是不会被收回的。

#Heap_2.c

        相关介绍:heap_2.c使用最佳匹配算法(best fit)进行分配内存空间,支持释放内存空间也就是vPortFree  heap_2.c被保留是为了兼容以前的代码,新设计中建议使用heap_4来代替heap_2来使用。

        最佳匹配算法:当任务需要30个字节的heap,算法会寻找,容量相同的内存空间如果没有,找到差值最小的内存空间进行分配,而二者的差值,会被重新使用分配。

        heap_2.c:释放内存空间:在任务结束之后,所占用的内存空间会被释放,因为heap_2.c支持

vPortFree  也就能释放内存空间。

           

        A阶段创建了3个任务,B阶段释放了一个任务的内存空间,C阶段将释放掉的内存空间重新进行分配,但是空闲空间大小不会被合并。也有事当堆释放时,会有严重的碎片问题。
 

#Heap_3.c

        相关介绍:heap_3.c使用标准库里面的  mallc free 函数 这里堆的大小由连接器配置,配置选项 configTOTAL_HEAP_SIZE(stm32cubleMX选项) 不在起到作用,heap_3.c 支持 释放 分配堆内存。

        C库里面的 malloc free 函数并非线程安全的,heap_3中首先暂停RTOS的任务调度器,再去调用这些函数,使用这些方法实现了线程安全。

#Heap_4.c

        相关介绍:heap_4.c 和heap_1.c   heap_2.c 堆管理文件一样,都是靠着大数组来分配内存,heap_4.c使用首次适应算法(first fit)来分配内存,同时会把相邻空间分配为更大的空间,有效减少内存碎片的问题。

        首次适应算法:如果pvPortMalloc需要申请A大小的内存空间,算法会寻找现有内存空间,从中划分出A大小的空间进行分配,剩下的仍然给 pvPortMalloc 进行分配。

        heap_4.c想对于heap_2.c,当对于堆释放内存的时候,前者可以合并已经释放的内存空间,合并为更大的内存空间

#Heap_5.c

        相关介绍:支持  pvPortMalloc  vPortFree 分配内存释放内存,可以管理多块分隔开的内存,如果内存的地址不连续,可以使用 heap_5.c 如果内存是分开的不连续的,在使用 pvPortMalloc 进行分配之前就需要初始化,确定内存块在哪里,多大。

        内存初始化函数:vPortfineHeapRegions 来指定信息

typedef struct HeapRegion
{
 uint8_t * pucStartAddress; // 起始地址
 size_t xSizeInBytes; // 大小
} HeapRegion_t;

                结构体类型定义:这个结构体,有两个成员变量,分别是起始地址,还有地址大小,如果要定义多块内存,就需要使用 HeapRegion_t 去声明一个数组进行使用

HeapRegion_t xHeapRegions[] =
{
 { ( uint8_t * ) 0x80000000UL, 0x10000 }, // 起始地址0x80000000,大小0x10000
 { ( uint8_t * ) 0x90000000UL, 0xa0000 }, // 起始地址0x90000000,大小0xa0000
 { NULL, 0 } // 表示数组结束

        这里定义数组,表示多块内存,定义格式需要注意。

#stm32cublemx对堆的配置

        这里下图是堆的配置,heap的大小在3072个字节,使用heap_4进行分配。

#配置堆相关函数
#申请内存函数
size_t xPortGetMinimumEvenFreeHeapSize(void);

        这个函数返回值,是运行程序所剩内存空间的最小值,只有heap_4.c   heap_4.c支持这个函数。如果调用函数返回值很小,也就是堆内存分配出去很多,可以适当的将,内存空间调大。

#钩子函数
void *pvPortMalloc(size_t xWantedSize)vPortDefineHeapRegions
{
    #if(configUSE_MALLOC_FAILED_HOOK == 1)
    {
        if(pvReturn == NULL)
        {
        extern void vAPPlicationMallocFailedHook(void);
        vAPPlicationMallocFailedHook();
        }
    }
}

       pvPortMalloc这个函数如果申请内存失败,在内部可以定义申请一个钩子函数,返回一些信息,这个失败调用的函数可以自己定义使用。

                                欢迎指正,希望对你有所帮助!!!

[4-1]_FreeRTOS源码概述_哔哩哔哩

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

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

相关文章

打包技术 水库生态流量监控调度方法和计算方法

网盘 https://pan.baidu.com/s/1k0sx3rSkoOqQVIS50iwPzA?pwd9vej 一种兼顾蓄水期导流隧洞生态流量泄放和永久堵头完工后隧洞充水排气的方法.pdf 产漂流性卵鱼类自然繁殖的河流生态流量计算方法.pdf 促进鱼类产卵的梯级水库生态调度方法.pdf 反推水库入库流量过程的优化修正方…

从0开始搭建Spring-Cloud微服务项目

文章目录 1. 安装Java开发环境配置环境变量 2. MySQL安装与配置环境变量配置配置MySQLNavicat配置Idea配置 1. 安装Java开发环境 安装Java开发环境主要涉及下载Java开发工具包(JDK)并配置环境变量,以便在系统中正确运行Java程序。 下载JDK …

APP逆向 day12 JNI开发

一.前言 今天和大家讲讲jni开发,为什么要和大家介绍呢,因为jni开发是安卓开发中经常使用的,其作用就是java调用c代码,或者c调用java代码。一般一些难一点的app都是采用这个方式,采用这个方式的好处就是更难逆向&#…

2024机器遗忘(Machine Unlearning)技术分类-思维导图

1 介绍 机器遗忘(Machine Unlearning)是指从机器学习模型中安全地移除或"遗忘"特定的数据点或信息。这个概念源于数据隐私保护的需求,尤其是在欧盟通用数据保护条例(GDPR)等法规中提出的"被遗忘的权利…

6月30日功能测试Day10

3.4.4拼团购测试点 功能位置:营销-----拼团购 后台优惠促销列表管理可以添加拼团,查看拼团活动,启动活动,编辑活动,删除活动。 可以查看拼团活动中已下单的订单以状态 需求分析 功能和添加拼团 商品拼团活动页 3…

【简历】郑州某二本学院:JAVA实习简历指导,基本没有面试机会

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 这份简历是一个25届二本同学找JAVA实习的简历,从整体来看,简历版式没有问题,非常清晰。 但是内容特…

【并发编程JUC】AQS详解

定义理解 AQS,全称为AbstractQueuedSynchronizer,是Java并发包(java.util.concurrent)中的一个框架级别的工具类,用于构建锁和同步器。它是许多同步类的基础,如ReentrantLock、Semaphore、CountDownLatch等…

【网络安全】Host碰撞漏洞原理+工具+脚本

文章目录 漏洞原理虚拟主机配置Host头部字段Host碰撞漏洞漏洞场景工具漏洞原理 Host 碰撞漏洞,也称为主机名冲突漏洞,是一种网络攻击手段。常见危害有:绕过访问控制,通过公网访问一些未经授权的资源等。 虚拟主机配置 在Web服务器(如Nginx或Apache)上,多个网站可以共…

YOLOv8改进 添加CVPR2024 PKINet中注意力机制CAAttention

一、PKINet论文 论文地址:2403.06258 (arxiv.org) 二、CAAttention结构 CAA(Context Anchor Attention)注意力模块是一种用于捕捉长距离上下文信息的并行模块。 在计算机视觉领域中,上下文信息是指与目标物体或任务相关的周围环境和语境信息。上下文信息可以帮助我们更好…

【UE5.1 角色练习】13-枪械射击——拿出与收起武器

目录 效果 步骤 一、安装射击武器 二、拿武器和收武器 效果 步骤 一、安装射击武器 1. 在虚幻商城中将“FPS Weapon Bundle”添加到工程中,由于我们使用的是5.1版本,我们可以先将该资产放入UE4工程中,然后迁移到5.1版本的工程 2. 打开角…

threejs基础入门案例研究——三维立体物体沿指定曲线逐渐增长变长

效果 threejs按照指定曲线效果逐渐增长 全部代码 主要思路是先创建指定曲线路径,并将其分为1000个点,然后按照自定义路线拉伸三维物体,从头遍历点的位置,然后放入物体拉伸路径中,实现缓慢增长效果 全部代码如下: <template><div class="threejs">…

工作助手VB开发笔记(2)

今天继续讲功能 2.功能 2.9开机自启 设置程序随windows系统启动&#xff0c;其实就是就是将程序加载到注册表 Public Sub StartRunRegHKLM()REM HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ Microsoft \ Windows \ CurrentVersion \ RunDim strName As String Applicat…

高效任务分配的常见7步法

高效的任务分配有助于优化资源配置&#xff0c;提升开发效率与质量&#xff0c;降低成本和项目风险&#xff0c;最终提高客户满意度。如果任务分配不合理&#xff0c;可能导致资源浪费&#xff0c;造成项目延期和成本超支&#xff0c;影响工作质量&#xff0c;增加项目风险。 因…

内核错误定位

内核打印出如下&#xff1a; 在代码目录输入&#xff1a; ./prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gdb kernel/vmlinux 进入gdb 命令模式 输入 l *(rk628_csi_probe0xf0) 能定位到出现问题地方。 最后就…

Netty学习(Netty入门)

概述 Netty是什么 Netty的地位 Netty的优势 HelloWorld public class HelloClient {public static void main(String[] args) throws InterruptedException {// 1. 启动类new Bootstrap()// 2. 添加 EventLoop.group(new NioEventLoopGroup())// 3. 选择客户端 channel 实现.…

lua入门(1) - 基本语法

本文参考自&#xff1a; Lua 基本语法 | 菜鸟教程 (runoob.com) 需要更加详细了解的还请参看lua 上方链接 交互式编程 Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。 Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用&#xff1a; 如下图: 按…

【车载开发系列】J-Link/JFlash 简介与驱动安装方法

【车载开发系列】J-Link/JFlash 简介与驱动安装方法 【车载开发系列】J-Link/JFlash 简介与驱动安装方法 【车载开发系列】J-Link/JFlash 简介与驱动安装方法一. 软件介绍二. 下载安装包二. 开始安装三. 确认安装四. J-Flash的使用 一. 软件介绍 J-Link是SEGGER公司为支持仿真…

springboot校园安全通事件报告小程序-计算机毕业设计源码02445

Springboot 校园安全通事件报告小程序系统 摘 要 随着中国经济的飞速增长&#xff0c;消费者的智能化水平不断提高&#xff0c;许多智能手机和相关的软件正在得到更多的关注和支持。其中&#xff0c;校园安全通事件报告小程序系统更是深得消费者的喜爱&#xff0c;它的出现极大…

Debug-017-elementUI-el-cascader组件首次选择选项不触发表单的自定义校验

前情提要&#xff1a; 今天维护一个表单校验的时候发现一件事情&#xff0c;就是在表单中使用了 el-cascader组件&#xff0c;希望根据接口返回数据去动态校验一下这里面的选项&#xff0c;符合逻辑就通过自定义的表单校验&#xff0c;不符合就在这一项的下面标红提示。做的时候…

Mean teacher are better role models-论文笔记

论文笔记 资料 1.代码地址 2.论文地址 https://arxiv.org/pdf/1703.01780 3.数据集地址 CIFAR-10 https://www.cs.utoronto.ca/~kriz/cifar.html 论文摘要的翻译 最近提出的Temporal Ensembling方法在几个半监督学习基准中取得了最先进的结果。它维护每个训练样本的标签…