FreeRTOS(动态内存管理)

news2024/11/26 14:31:47

资料来源于硬件家园:资料汇总 - FreeRTOS实时操作系统课程(多任务管理)

目录

一、动态内存管理介绍

1、heap_1

2、heap_2

3、heap_3

4、heap_4

5、heap_5

二、动态内存总结与应用

1、heap_1

2、heap_4

3、heap_5

三、内存管理编程测试

1、heap_4

2、heap_1

3、heap_5

一、动态内存管理介绍

动态内存管理是 FreeRTOS 非常重要的一项功能,前面章节讲解的任务创建、信号量、消息队列、事件标志组、互斥信号量、软件定时器组等需要的 RAM 空间都是通过动态内存管理从 FreeRTOSConfig.h 文件定义的 heap 空间中申请的。

FreeRTOS 支持 5 种动态内存管理方案,分别通过文件 heap_1,heap_2,heap_3,heap_4 和 heap_5实现。

1、heap_1

heap_1 动态内存管理方式是五种动态内存管理方式中最简单的,这种方式的动态内存管理一旦申请了相应内存后,是不允许被释放的。

尽管如此,这种方式的动态内存管理还是满足大部分嵌入式应用的,因为这种嵌入式应用在系统启动阶段就完成了任务创建、事件标志组、信号量、消息队列等资源的创建,而且这些资源是整个嵌入式应用过程中一直要使用的,所以也就不需要删除,不需要释放内存。

2、heap_2

与 heap_1 动态内存管理方式不同,heap_2 动态内存管理利用了最适应算法,并且支持内存释放。但是 heap_2 不支持内存碎片整理,动态内存管理方式heap_4 支持内存碎片整理。

3、heap_3

这种方式实现的动态内存管理是对编译器提供的 malloc 和 free 函数进行了封装,保证是线程安全的。

4、heap_4

与 heap_2 动态内存管理方式不同,heap_4 动态内存管理利用了最适应算法,且支持内存碎片的回收并将其整理为一个大的内存块。

5、heap_5

有时候我们希望 FreeRTOSConfig.h 文件中定义的 heap 空间可以采用不连续的内存区,比如我们希望可以将其定义在内部 SRAM 一部分,外部 SRAM 一部分,此时我们就可以采用 heap_5 动态内存管理方式。另外,heap_5 动态内存管理是在 heap_4 的基础上实现的。

二、动态内存总结与应用

五种动态内存管理方式简单总结如下,实际项目中,用户根据需要选择合适的:

heap_1:五种方式里面最简单的,但是申请的内存不允许释放

heap_2:支持动态内存的申请和释放,但是不支持内存碎片的处理

heap_3:将编译器自带的 malloc 和 free 函数进行简单的封装

heap_4:支持动态内存的申请和释放,支持内存碎片处理

heap_5:在 heap_4 的基础上支持将动态内存设置在不连续的区域上

1、heap_1

FreeRTOS 的动态内存大小在 FreeRTOSConfig.h 文件中进行了定义:

#define configTOTAL_HEAP_SIZE  ( ( size_t ) ( 17 * 1024 ) ) //单位字节

用户通过函数 xPortGetFreeHeapSize 就能获得 FreeRTOS 动态内存的剩余,进而可以根据剩余情况优化动态内存的大小。

heap_1 方式的动态内存管理有以下特点:

① 项目应用不需要删除任务、信号量、消息队列等已经创建的资源。

② 具有时间确定性,即申请动态内存的时间是固定的并且不会产生内存碎片。

③ 确切的说这是一种静态内存分配,因为申请的内存是不允许被释放掉的。

2、heap_4

FreeRTOS 的动态内存大小在 FreeRTOSConfig.h 文件中进行了定义:

#define configTOTAL_HEAP_SIZE  ( ( size_t ) ( 17 * 1024 ) ) //单位字节

用户通过函数 xPortGetFreeHeapSize 就能获得 FreeRTOS 动态内存的剩余,但是不提供动态内存是如何被分配成各个小内存块的信息。使用函数 xPortGetMinimumEverFreeHeapSize 能够获取从系统启动到当前时刻的动态内存最小剩余,从而用户就可以根据剩余情况优化动态内存的大小。

heap_4 方式的动态内存管理有以下特点:

① 可以用于需要重复的创建和删任务、信号量、事件标志组、软件定时器等内部资源的场合。

② 随机的调用 pvPortMalloc() 和 vPortFree(),且每次申请的大小都不同,也不会像 heap_2 那样产生很多的内存碎片。

③ 不具有时间确定性,即申请动态内存的时间不是确定的

3、heap_5

heap_5 动态内存管理是通过函数 vPortDefineHeapRegions 进行初始化的,也就是说用户在创建任务 FreeRTOS 的内部资源前要优先级调用这个函数 vPortDefineHeapRegions,否则是无法通过函数pvPortMalloc 申请到动态内存的。

函数 vPortDefineHeapRegions 定义不同段的内存空间采用了下面这种结构体:

定义的时候要注意两个问题,一个是内存段结束时要定义 NULL。另一个是内存段的地址是从低地址到高地址排列。

用户通过函数 xPortGetFreeHeapSize 就能获得 FreeRTOS 动态内存的剩余,但是不提供动态内存是如何被分配成各个小内存块的信息。使用函数 xPortGetMinimumEverFreeHeapSize 能够获取从系统启动到当前时刻的动态内存最小剩余,从而用户就可以根据剩余情况优化动态内存的大小。

三、内存管理编程测试

分别测试heap_4heap_1heap_5

1、heap_4

	  if(KeyCode==KEY0)
	  {
		sprintf(buff,"当前剩余动态内存大小 %u Bytes\r\n",xPortGetFreeHeapSize());
		HAL_UART_Transmit(&huart2, (uint8_t*)buff,strlen(buff), HAL_MAX_DELAY);

		sprintf(buff,"系统启动至当前时刻的动态内存最小剩余 %u Bytes\r\n",xPortGetMinimumEverFreeHeapSize());
		HAL_UART_Transmit(&huart2, (uint8_t*)buff,strlen(buff), HAL_MAX_DELAY);
	  }

输出内存信息:

2、heap_1

	  if(KeyCode==KEY0)
	  {
		sprintf(buff,"当前剩余动态内存大小 %u Bytes\r\n",xPortGetFreeHeapSize());
		HAL_UART_Transmit(&huart2, (uint8_t*)buff,strlen(buff), HAL_MAX_DELAY);

		//sprintf(buff,"系统启动至当前时刻的动态内存最小剩余 %u Bytes\r\n",xPortGetMinimumEverFreeHeapSize());
		//HAL_UART_Transmit(&huart2, (uint8_t*)buff,strlen(buff), HAL_MAX_DELAY);
	  }

 

如果调用vPortFree()函数释放内存,系统会死机,heap_1内存管理方案不支持内存释放,导致死机,

3、heap_5

定义内存区域:

  /* USER CODE BEGIN Init */
	HeapRegion_t xHeapRegions[]=
	{
		{(uint8_t*)0x2000B000UL,0x1400},//5K
		{(uint8_t*)0x2000D800UL,0x2800},//10K
		{NULL,0}
	};
	vPortDefineHeapRegions(xHeapRegions);
  /* USER CODE END Init */
	  if(KeyCode==KEY0)
	  {
		sprintf(buff,"当前剩余动态内存大小 %u Bytes\r\n",xPortGetFreeHeapSize());
		HAL_UART_Transmit(&huart2, (uint8_t*)buff,strlen(buff), HAL_MAX_DELAY);

		sprintf(buff,"系统启动至当前时刻的动态内存最小剩余 %u Bytes\r\n",xPortGetMinimumEverFreeHeapSize());
		HAL_UART_Transmit(&huart2, (uint8_t*)buff,strlen(buff), HAL_MAX_DELAY);
	  }

输出内存信息:

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

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

相关文章

变形金刚:从零开始【01/2】

一、说明 在我们的日常生活中,无论你是否是数据科学家,你都在单向地使用变压器模型。例如。如果您使用的是 ChatGPT 或 GPT-4 或任何 GPT,那么在为您回答问题的框中是变压器的一部分。如果您是数据科学家或数据分析师,则可能正在使…

【Linux】IO多路转接——select接口

目录 I/O多路转接之select select初识 select函数 socket就绪条件 select基本工作流程 select服务器 select的优点 select的缺点 select的适用场景 I/O多路转接之select select初识 select是系统提供的一个多路转接接口。 select系统调用可以让我们的程序同时监视多…

vmagent获取node-exporter配置

vmagent 使用以下命令添加图表 helm 存储库: helm repo add vm https://victoriametrics.github.io/helm-charts/helm repo update 列出vm/victoria-metrics-agent可供安装的图表版本: helm search repo vm/victoria-metrics-agent -l victoria-met…

iObit Uninstaller 最新版13 Pro更新了什么?

iObit Uninstaller 专业且易用的 Windows 卸载程序,它可以轻松删除不需要的程序,插件和 Windows 应用程序,还可以对电脑旧的应用一键更新。 功能和特点 安装监视器 安装监视器会检测并记录安装中的所有系统更改,以确保在将来彻底…

基于Mysqlrouter+MHA+keepalived实现高可用半同步 MySQL Cluster项目

目录 项目名称: 基于Mysqlrouter MHA keepalived实现半同步主从复制MySQL Cluster MySQL Cluster: 项目架构图: 项目环境: 项目环境安装包: 项目描述: 项目IP地址规划: 项目步骤: 一…

java不支持发行版本5

这篇文章主要给大家介绍了关于如何解决java错误:不支持发行版本5的相关资料,发行版本5是Java5,已经是十多年前的版本了,现在已经不再被支持,需要的朋友可以参考下 − 目录 问题描述:解决方法:永久解决方法:总结 问题描述: 在i…

小红书内容+直播数据分析,品牌打开秋天的正确方式

秋天的第一杯奶茶,你喝了吗?不知不觉,秋日以至。季节轮转,随之而来的还有变化的消费需求。目前,各大社媒已逐渐开启关于秋天的讨论,新的季节,品牌要如何布局内容呢?本期,…

点成案例丨比浊仪用于乳酸菌抑菌活性测定

乳酸菌概述 自1929年英国科学家弗莱明发现青霉素以来,抗生素为人类医学的进步做出了巨大贡献。然而,抗生素在临床上广泛且持续的使用导致病原微生物产生了耐药性。目前,病原微生物对抗生素的耐药性正在威胁人们的健康,寻找具有抑…

Scratch 之 制作超丝滑 FNF 推条

这个教程是不用画笔的,所以不用担心推条是最后一层了! 导入素材 你以为真是这样吗?NO,NO,NO,其实是这样的 没错,中间是空的!中间是空的!中间是空的!&#xf…

【Gazebo安装教程】2023年最新安装全流程详解!

安装 实验环境:ubuntu22.04LTS 安装 Gazebo 首先我们需要安装必须的工具 sudo apt-get update sudo apt-get install lsb-release wget gnupg之后修改源,并 update 一下来更新 sudo wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/shar…

实现无限创建敌人。(Unity)

首先我们创建一个空物体GameObject产怪点改名为Enemypoint,这个点是敌人出现的位置。我们首先在空物体里面的transform组件中重置这个点的位置为0,并且给这个点设置一个颜色,方便找到这个点。如果给这个点设置一个位置,修改它的tr…

移动硬盘只显示盘符不显示容量怎么办

在使用移动硬盘时,有时候可能会遇到移动硬盘只显示盘符而不显示容量的困扰。这种情况可能会引起数据无法读取或无法保存的问题,给用户带来不便。本文将详细解释这个问题的原因,并提供一些解决方法,让您能够轻松恢复移动硬盘的容量…

高忆管理:真金白银落到实处 27家沪市公司更新回购增持“进度条”

或抛出方案,或更新进展,一大批沪市公司及其股东正加速跑在回购增持的路上。仅8月14日晚,沪市便有27家上市公司会集发表回购增持类公告,以真金白银持续提振商场决心。 据上海证券报记者计算,到现在,在回购方…

网络基础--ARP协议介绍

1、ARP作用 ARP( Address Resolution Protocol,地址解析协议)是将 IP 地址解析为以太网 MAC 地址(或称物理地址)的协议。在局域网中,当主机或其它网络设备有数据要发送给另一个主机或设备时,它必…

云上社群学习系统部分接口设计详解

目录 一、项目简介 二、技术选型 三、数据库设计 四、接口设计及思考 回复帖子部分 4.1 回复帖子 4.1.1.1 实现逻辑 4.1.1.2创建Service接⼝ 4.1.1.3 实现Service接⼝ 4.1.1.4 实现Controller 4.1.1.5 测试接口 4.1.1.6 实现前端页面 4.2 点赞帖子 4.2.1.1 参数要求…

MySQL 根据多字段查询重复数据

MySQL 根据多字段查询重复数据 在实际的数据库应用中,我们经常需要根据多个字段来查询重复的数据。MySQL 提供了一些方法来实现这个功能,让我们能够快速准确地找到和处理重复数据。本文将介绍如何使用 MySQL 来根据多字段查询重复数据,并提供…

LeetCode 38题:外观数列

题目 给定一个正整数 n ,输出外观数列的第 n 项。 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列: countAndSay(1) "1"countAnd…

【【verilog典型电路设计之复数乘法器】】

verilog典型电路设计之复数乘法器 典型电路设计之复数乘法器 复数乘法的算法是: 设复数xabi ; ycdi; 则复数乘法结果 x.y(abi)(cdi)(ac-bd) i(adbc) 复数乘法器 我们可以将复数x y 的实部与虚部相乘,减去 x与y的虚部相乘 得到输出结果的实部 就是ac-bd…

DC电源模块减小输入电源与输出负载之间的能量损失

BOSHIDA DC电源模块减小输入电源与输出负载之间的能量损失 随着电子产品的普及,DC电源模块已成为现代电子设备中不可或缺的组成部分。DC电源模块可以将交流电转化为直流电,并根据需要,以适当的电压和电流提供给输出负载。然而,在输…

css3-flex布局:基础使用 / Flexbox布局

一、理解flex 二、理解Flex布局(又称Flexbox布局) Flex布局(又称Flexbox布局)是一种基于Web的CSS3布局模式,其目的是为了更加灵活和自适应地布置各种各样的网页元素。Flex布局通过将一个父容器分割为一个或多个弹性项…