内存管理(RTOS)

     

目录

#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源码概述_哔哩哔哩

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot的工作绩效管理系统的设计与实现+文档

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

字节码编程javassist之定义各种属性

写在前面 源码 。 本文看下如何使用javassist来定义属性。 1:程序 package com.dahuyou.javassist.generateFieldAndMethod;import javassist.*;import java.lang.reflect.Method;public class JustDoIt111 {public static void main(String[] args) throws Exce…

【Python】已解决:NameError: name ‘reload’ is not defined

文章目录 二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:NameError: name ‘reload’ is not defined 一、分析问题背景 在使用Python进行开发时,有时我们可能需要重新加载某个已经导入的模块,以便应用模块中的最…

idm下载慢怎么回事 idm批量导入下载使用方法

IDM (Internet Download Manager)是一款兼容性大,支持多种语言的下载管理软件,它可以自动检测并下载网页上的内容,这正是这一优点,使得它受到了广大用户的喜爱。在日常使用互联网的过程中,快速下载文件对我们来说非常重…

排序(1)

接下来&#xff0c;我们就来到了排序的章节&#xff0c;嘿嘿&#xff01;加油&#xff01; 冒泡排序 void BubbleSort(int* a,int n) {for(int j0;j<n;i){for(int i1;i<n-j;i){if(arr[i-1]>arr[i]){swap(&arr[i-1],&arr[i]);}}}} 插入排序 时间复杂度&…

【网工】关于链路聚合、静态路由、单臂路由的一个小实验

最近刚考完期末放暑假&#xff0c;那几天没看csdn结果有个朋友发了这样一个实验&#xff1a; 虽然晚了点 也不知道这位朋友还需不需要 但还是弄了出来 分享给大家 一起学习 下面是一些关键配置代码参考

h5 video 标签播放经过 java 使用 ws.schild( jave、ffmpeg ) 压缩后的 mp4 视频只有声音无画面的问题排查记录

1. 引入 ws.schild MAVEN 依赖&#xff1a; <dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>3.5.0</version></dependency><dependency><groupId>ws.schild</grou…

你真的会ELISA加样吗?

在ELISA实验中&#xff0c;研究人员需要进行多次加样步骤完成实验操作。对于常规双抗体夹心法ELISA&#xff0c;一般有如下加样步聚&#xff0c;即加样本、加检测抗体、加酶结合物、加底物&#xff08;最后加终止液停止反应&#xff09;。 加样步骤基础知识 加样步骤中一般使用…

华为OD机试2024年最新题库 JAVA C卷+D卷

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…

解决npm与yarn痛点:幽灵依赖与依赖分身

前言 在现代前端开发流程中&#xff0c;包管理工具扮演着至关重要的角色&#xff0c;其中npm和yarn是两个非常流行的JavaScript包管理工具。虽然它们为开发者提供了极大的便利&#xff0c;但也存在一些痛点&#xff0c;特别是关于“幽灵依赖&#xff08;Phantom Dependencies&a…

开放式耳机哪个牌子好?五款畅销产品推荐,免交智商税!

作为开放式耳机的测评博主&#xff0c;在最近又淘到了几款比较不错的开放式耳机&#xff0c;所以今天这篇文章&#xff0c;我也给大家推荐五款开放式耳机&#xff0c;内附还有我自己总结的开放式耳机的指南&#xff0c;希望各位小伙伴也能够看的开心&#xff0c;挑选到自己比较…

taoCMS v3.0.2 文件上传漏洞(CVE-2022-23880)

前言 CVE-2022-23880是一个影响taoCMS v3.0.2的任意文件上传漏洞。攻击者可以利用此漏洞通过上传特制的PHP文件在受影响的系统上执行任意代码。 漏洞细节 描述: 在taoCMS v3.0.2的文件管理模块中存在任意文件上传漏洞。攻击者可以通过上传恶意的PHP文件来执行任意代码。 影响…

YUM——简介、安装(Ubuntu22.04)

1、简介 YUM&#xff08;Yellowdog Updater, Modified&#xff09;是一个开源的命令行软件包管理工具&#xff0c;主要用于基于 RPM 包管理系统的 Linux 发行版&#xff0c;如 CentOS、Red Hat Enterprise Linux (RHEL) 和 Fedora。YUM 使用户能够轻松地安装、更新、删除和管理…

识别 Spring Cloud 配置文件的规则:Nacos, Bootstrap, Application

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

vue3【提效】使用 VueUse 高效开发(工具库 @vueuse/core + 新增的组件库 @vueuse/components)

Vueuse 是一个功能强大的 Vue.js 生态系统工具库&#xff0c;提供了可重用的组件和函数&#xff0c;帮助开发者更轻松地构建复杂的应用程序。 官网 &#xff1a;https://vueuse.org/core/useWindowScroll/ 安装 VueUse npm i vueuse/core vueuse/components&#xff08;可选&a…

收银系统源码-ERP报损管理

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

揭秘!为何电路工程师都爱用在线化电路仿真软件?7大理由让你秒懂!

在科技日新月异的今天&#xff0c;电路设计与仿真技术已经成为电子工程领域不可或缺的一部分。随着在线化电路仿真软件的兴起&#xff0c;越来越多的工程师选择使用这种便捷、高效的工具来辅助他们的工作。那么&#xff0c;究竟是什么让在线化电路仿真软件如此受欢迎呢&#xf…

强烈建议!所有Python基础差的同学,死磕这本64页的背记手册!

Python背记手册是一份非常实用的学习资料&#xff0c;它涵盖了Python语言的基础知识、语法规则、常用函数和模块等内容&#xff0c;对于初学者和有一定基础的Python程序员来说都非常有用。通过背诵这份手册&#xff0c;可以加深对Python语言的理解和记忆&#xff0c;提高编程能…

Datadog Dash 2024 新功能解析

Datadog 2024 年的 Dash 刚刚落下帷幕&#xff0c;作为正在与 Datadog 开始竞争的观测云&#xff0c;我们认真仔细的分析了 Datadog 的每一个新功能&#xff0c;发现一些很有意思的事情&#xff0c;今天就给大家做一次全面的分析。&#xff08;所有 Datadog 的 Dash 的最新功能…

【解码现代 C++】:实现自己的智能 【String 类】

目录 1. 经典的String类问题 1.1 构造函数 小李的理解 1.2 析构函数 小李的理解 1.3 测试函数 小李的理解 1.4 需要记住的知识点 2. 浅拷贝 2.1 什么是浅拷贝 小李的理解 2.2 需要记住的知识点 3. 深拷贝 3.1 传统版写法的String类 3.1.1 拷贝构造函数 小李的理…