FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-12:内存管理)

学习之路主要为FreeRTOS操作系统在STM32F103(STM32F103C8T6)上的运用,采用的是标准库编程的方式,使用的IDE为KEIL5。

注意!!!本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习,也可以通过Proteus仿真的方式进行学习。

后续文章会同时发表在个人博客(jason1016.club)、CSDN;

视频会发布在bilibili(UID:399951374)

一、概念

FreeRTOS 创建任务、队列、信号量等的时候有两种方法,一种是动态的申请所需的 RAM。一种是由用户自行定义所需的 RAM,这种方法也叫静态方法,使用静态方法的函数一般以“Static”结尾,比如任务创建函数 xTaskCreateStatic(),使用此函数创建任务的时候需要由用户定义任务堆栈。

使用动态内存管理的时候 FreeRTOS 内核在创建任务、队列、信号量的时候会动态的申请RAM。标准 C 库中的 malloc()和 free()也可以实现动态内存管理,但是如下原因限制了其使用:

● 在小型的嵌入式系统中效率不高。

● 会占用很多的代码空间。

● 它们不是线程安全的。

● 具有不确定性,每次执行的时间不同。

● 会导致内存碎片。

● 使链接器的配置变得复杂。

不同的嵌入式系统对于内存分配和时间要求不同,因此一个内存分配算法可以作为系统的可选选项。FreeRTOS 将内存分配作为移植层的一部分,这样 FreeRTOS 使用者就可以使用自己的合适的内存分配方法。

当内核需要 RAM 的时候可以使用 pvPortMalloc()来替代 malloc()申请内存,不使用内存的时候可以使用 vPortFree()函数来替代 free()函数释放内存。函数 pvPortMalloc()、vPortFree()与函数 malloc()、free()的函数原型类似。

二、内存碎片

(1)、此时内存堆还没有经过任何操作,为全新的。

(2)、此时经过第一次内存分配,一共分出去了 4 块内存块,大小分别为 80B、80B、10B 和100B。

(3)、有些应用使用完内存,进行了释放,从左往右第一个 80B 和后面的 10B 这两个内存块就是释放的内存。如果此时有个应用需要 50B 的内存,那么它可以从两个地方来获取到,一个是最前面的还没被分配过的剩余内存块,另一个就是刚刚释放出来的 80B 的内存块。但是很明显,刚刚释放出来的这个 10B 的内存块就没法用了,除非此时有另外一个应用所需要的内存小于 10B。

(4)、经过很多次的申请和释放以后,内存块被不断的分割、最终导致大量很小的内存块!也就是图中 80B 和 50B 这两个内存块之间的小内存块,这些内存块由于太小导致大多数应用无法使用,这些没法使用的内存块就沦为了内存碎片!

内存碎片是内存管理算法重点解决的一个问题,否则的话会导致实际可用的内存越来越少,最终应用程序因为分配不到合适的内存而奔溃!FreeRTOS 的 heap_4.c 就给我们提供了一个解决内存碎片的方法,那就是将内存碎片进行合并组成一个新的可用的大内存块。

三、heap_4内存分配方法

分配方法简介

heap_4 提供了一个最优的匹配算法,不像 heap_2,heap_4 会将内存碎片合并成一个大的可用内存块,它提供了内存块合并算法。内存堆为 ucHeap[],大小同样为 configTOTAL_HEAP_SIZE。可以通过函数 xPortGetFreeHeapSize()来获取剩余的内存大小。

heap_4 特性如下:1、可以用在那些需要重复创建和删除任务、队列、信号量和互斥信号量等的应用中。2、不会像 heap_2 那样产生严重的内存碎片,即使分配的内存大小是随机的。3、具有不确定性,但是远比 C 标准库中的 malloc()和 free()效率高。heap_4 非常适合于那些需要直接调用函数 pvPortMalloc()和 vPortFree()来申请和释放内存的应用,注意,我们移植 FreeRTOS 的时候就选择的 heap_4!heap_4 也使用链表结构来管理空闲内存块,链表结构体与 heap_2 一样。heap_4 也定义了两个局部静态变量 xStart 和 pxEnd 来表示链表头和尾,其中 pxEnd 是指向 BlockLink_t 的指针。

 

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

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

相关文章

MyBatis使用教程详解<下>

回顾上一篇博文,我们讲了如何使用注解/XML的方式来操作数据库,实际上,一个Mapper接口的实现,这两种方式是可以并存的. 上一篇博文中,我们演示的都是比较简单的SQL语句,没有设计到复杂的逻辑,本篇博文会讲解复杂SQL的实现及一些细节处理.话不多说,让我们开始吧. 一. #{}和${} …

CLion安装与配置教程

目录 一、下载并安装CLion1、下载1、官网:2、注意: 2、安装1、下载完成后,直接点击安装包安装,即可。2、开始安装,然后下一步3、可以在此处自定义地址,然后下一步4、根据系统版本选择,然后下一步…

智慧工地信息化管理系统源码带APP

需求痛点:建筑行业是一个安全事故多发的行业。目前,工程建设规模不断扩大,工艺流程纷繁复杂,如何搞好现场施工现场管理,控制事故发生频率,一直是施工企业、政府管理部门关注的焦点。利用现代科技&#xff0…

[Python程序打包: 使用PyInstaller制作单文件exe以及打包GUI程序详解]

文章目录 概要Python 程序打包—使用 Pyinstaller 打包 exePython程序打包—使用Pyinstaller打包GUI程序Python程序打包—使用 Pyinstaller 设置 exe 图标小结 概要 使用PyInstaller工具将Python程序打包成可执行(EXE)文件。将Python程序打包成EXE的好处…

【产品设计】SaaS产品数据分析之指标与标签

数据分析能够应用到各个领域和岗位,那么在SaaS产品中的应用会是如何?本文将探索SaaS产品在数据分析中的应用,并对其指标与标签的设计进行总结分析,一起来看看吧。 数据分析是业务开展过程中,收集记录各种行为产生的数据…

Linux 进程(二)

1.当前工作目录 Linux 下使用 ls /proc 查看程序中的进程,其中这些蓝色的数字代表的就是进程。 其中cwd(current working directory)就是当前工作目录,那么为什么cwd 和 exe 是在同一级目录下呢因为 进程需要依赖可执行程序,可执行程序需要依…

jmeter多个接口测试

针对接口文档,进行对应接口设计,多个接口设计用例需要使用事物控制器。 1.通过登录接口提取sign值 发送一个登录请求,然后通过正则表达式提取该sign值 正则表达式的使用,我稍后会在下一个博文中详细说明,这边就不多说…

如何用SWIG封装c++接口给java使用?

SWIG是什么? SWIG(Simplified Wrapper and Interface Generator)是一个将C/C接口转换为其他语言接口的工具,从而可以讲C/C的库集成到其他语言的系统中。目前SWIG已经可以支持Python, Java, C#,Ruby,PHP,R语言等十多种语言。 官方网址&…

Android项目实战开发-----期末总结2

项目三:网络层和数据模型的封装 任务一:网络请求和数据解析 1,网络请求 (1)Android中的网络存储主要是使用HTTP/HTTPS协议访问服务器,与服务器发生数据交互。 (2)Android提供两种…

python -- python安装

1、python的诞生和发展: python语言是一种解释型、面向对象型、动态数据类型的高级程序设计语言。 2、python的安装: 1、安装解析器: 在安装的过程中需要注意的是: 在安装pycharm的时候也是同样的道理,需要指定安装…

【长文干货】Python可视化教程

文章目录 数据介绍Matplotlib散点图折线图柱形图直方图 Seaborn散点图折线图柱形图直方图 Bokeh散点图折线条形图交互式 Plotly基本组合优化:定制化下拉菜单 总结 数据介绍 在这个小费数据集中,我们记录了20世纪90年代初期餐厅顾客在两个半月内给出的小…

【机器学习 | 可视化】回归可视化方案

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

LESS的叶绿素荧光模拟实现——任意波段荧光模拟

目录 前言一、任意波段荧光模拟的实现二、需要注意的输入参数 前言 此专栏默认您对LESS (LargE-Scale remote sensing data and image Simulation framework) 模型和叶绿素荧光(Sun-Induced chlorophyll Fluorescence, SIF)有一定的了解。当然,您也可以在这里下载中…

Kubernetes

Kubernetes Docker的安装Docker安装:安装docker依赖环境配置国内docker-ce的yum源(这里采用的是阿里云)安装docker。插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自…

C++基础 -17-继承中 基类与派生构造和析构调用顺序

首先声明 定义了派生类会同时调用基类和派生的构造函数 定义了派生类会同时调用基类和派生的析构函数 那么顺序如何如下图 构造由上往下顺序执行 析构则完全相反 #include "iostream"using namespace std;class base {public:base(){cout << "base-bui…

orvibo旗下的VS30ZW网关分析之二:版本回退方法

概述 上接第一篇: orvibo旗下的VS30ZW网关分析之一-CSDN博客 此产品VS30ZW支持openwrt的页面,可以版本回退进行刷机。 openwrt固件下载: 固件名称:openwrt-VS30ZW-mt7628.bin 链接地址:https://download.csdn.net/download/leekwen/88579427 版本回退方法: 1、同…

多模态大模型总结2(主要2023年)

LLaVA-V1&#xff08;2023/04&#xff09; 论文&#xff1a;Visual Instruction Tuning 网络结构 如下图 所示为 LLaVA-v1 的模型结构&#xff0c;可以看出其简化了很多&#xff0c;但整体来说还是由三个组件构成&#xff1a; Vision Encoder&#xff1a;和 Flamingo 模型的 V…

微信小程序获取手机号上限,怎么处理比较省钱

微信新规 微信2023年改了规则&#xff0c;原本免费的小程序获取手机号&#xff0c;现在如果要获取要1分钱一条。 有些小程序的用户非常恐怖&#xff0c; 比如一些工具类的&#xff0c; 群发类的。如果进入小程序就必须要获取小程序&#xff0c;就像是无底洞&#xff0c;让运营…

【古月居《ros入门21讲》学习笔记】14_参数的使用与编程方法

目录 说明&#xff1a; 1. 参数模型&#xff08;全局字典&#xff09; 2. 实现过程&#xff08;C&#xff09; 创建功能包 参数命令行的使用 YAML参数文件 rosparam命令 使用示例 编程方法&#xff08;C&#xff09; 配置代码编译规则 编译并运行 编译 运行 3. 实…

【C++笔记】红黑树的简易实现

【C笔记】红黑树的简易实现 一、什么是红黑树以及红黑树好在哪里1.1、什么是红黑树1.2、红黑树比AVL树好在哪里&#xff1f; 二、红黑树的模拟实现2.1、红黑树的插入2.2、仅变色调整2.3、变色单旋调整2.4、变色双旋调整 一、什么是红黑树以及红黑树好在哪里 1.1、什么是红黑树…