FreeRTOS(动态内存管理)
资料来源于硬件家园:资料汇总 - 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_4,heap_1与heap_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);}
输出内存信息:

相关文章:
FreeRTOS(动态内存管理)
资料来源于硬件家园:资料汇总 - 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、h…...
IntelliJ IDEA(简称Idea) 基本常用设置及Maven部署---详细介绍
一,Idea是什么? 前言: 众所周知,现在有许多编译工具,如eclipse,pathon, 今天所要学的Idea编译工具 Idea是JetBrains公司开发的一款强大的集成开发环境(IDE),主要用于Java…...
【LeetCode每日一题】——128.最长连续序列
文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 中等 三【题目编号】 128.最长连续序列 四【题目描述】 给定一个未…...
Redis_缓存1_缓存类型
14.redis缓存 14.1简介 穿透型缓存: 缓存与后端数据交互在一起,对服务端的调用隐藏细节。如果从缓存中可以读到数据,就直接返回,如果读不到,就到数据库中去读取,从数据库中读到数据,也是先更…...
模拟 枚举
分享牛客算法基础精选题单题目打卡!!! 目录 字符串的展开 多项式输出 机器翻译 : 铺地毯 : [NOIP2016]回文日期 字符串的展开 原题链接 : 字符串的展开 思路 : 模拟 代码 : #include<iostream> #include<cstring> #include<algorithm> using na…...
【实操】2023年npm组件库的创建发布流程
2022年的实践为基础,2023年我再建一个组件库【ZUI】。步骤回顾: 2022年的npm组件包的发布删除教程_npm i ant-design/pro-components 怎么删除_啥咕啦呛的博客-CSDN博客 1.在gitee上创建一个项目,相信你是会的 2.创建初始化项目,看吧&#…...
缓存设计的典型方案
缓存设计的典型方案 在使用缓存系统的时候,还需要考虑缓存设计的问题,重点在于缓存失效时的处理和如何更新缓存。 缓存失效是在使用缓存时不得不面对的问题。在业务开发中,缓存失效时由于找不到整个数据,一般会出于容错考虑&#…...
SQL笔记
最近的工作对SQL的应用程度较高,而且写的sql类型基本没怎么涉及过,把用到的几个关键字记录下。 使用环境:达梦数据库 达梦数据库有个特点,他有一个叫模式的说法,在图形化工具里直接点击创建查询窗口,不用像…...
UHPC的疲劳计算——兼论ModelCode2010的适用性
文章目录 0. 背景1、结论及概述2、MC10对于SN曲线的调整(囊括NC、HPC、UHPC)2.1 疲劳失效曲面的构建2.2 新模型的验证 3、MC10对于疲劳设计强度的调整及其背后的原因4. 结语 0. 背景 今年年初,有一位用UHPC做混凝土塔筒的同行告诉我…...
关于elementui的input的autocomplete的使用
项目中需要实现搜索框搜索时能自动提示可选项的功能,elementui的input组件有已经封装好的el-autocomplete可以使用,但是在使用中发现一些问题,记录一下 基础使用 // html部分 <el-autocompletev-model"name":fetch-suggestion…...
即然利用反射机制可以破坏单例模式,有什么方法避免呢?
私有构造方法中添加防止多次实例化的逻辑:在单例类的私有构造方法中,可以添加逻辑来检查是否已经存在实例,如果存在则抛出异常或返回已有的实例。这样即使通过反射创建了新的实例,也能在构造方法中进行拦截。 使用枚举实现单例&a…...
【IDEA问题】下载不了源代码
引出问题 最近不知道怎么打开 IDEA,本想查看源代码,然后点击下载源码,总是报找不到此对象的源代码。百度找了半天,GPT问了半天还是解决不了,直到遇到了这篇:idea中无法下载源码问题解决,终于得…...
代码随想录第四十八天
代码随想录第四十八天 Leetcode 198. 打家劫舍ILeetcode 213. 打家劫舍 IILeetcode 337. 打家劫舍 III Leetcode 198. 打家劫舍I 题目链接: 打家劫舍I 自己的思路:想不太出来递推公式!!!! 正确思路:这个题主要是看是否偷第下标为…...
书写自动智慧:探索Python文本分类器的开发与应用:支持二分类、多分类、多标签分类、多层级分类和Kmeans聚类
书写自动智慧:探索Python文本分类器的开发与应用:支持二分类、多分类、多标签分类、多层级分类和Kmeans聚类 文本分类器,提供多种文本分类和聚类算法,支持句子和文档级的文本分类任务,支持二分类、多分类、多标签分类…...
前端Webpack面试题
1.说说你对webpack的理解 开发时,我们会使用框架 (React、Vue) ,ES6 模块化语法,Less/Sass 等 CSS 预处理器等语法进行开发,这样的代码要想在浏览器运行必须经过编译成浏览器能识别的 JS、CSS语法才能运行。所以我们需要打包工…...
LabVIEW使用边缘检测技术实现彩色图像隐写术
LabVIEW使用边缘检测技术实现彩色图像隐写术 隐写术是隐藏信息的做法,以隐瞒通信的存在而闻名。该技术涉及在适当的载体(如图像,音频或视频)中插入秘密消息。在这些载体中,数字图像因其在互联网上的广泛使用而受到青睐…...
第一次参加计算机会议报告注意事项以及心得
计算机会议参会报告 注意事项参会前参会中参会后 参会心得 注意事项 接下来的会议注意事项分为:(1)参会前,(2)参会中,(3)参会后 参会前 参会前,一般被邀请…...
TypeScript教程(二)基础语法与基础类型
一、基础语法 TypeScript由以下几个部分组成 1.模块 2.函数 3.变量 4.语句和表达式 5.注释 示例: Runoob.ts 文件代码: const hello : string "Hello World!" console.log(hello) 以上代码首先通过 tsc 命令编译: tsc …...
问道管理:网上如何打新股?
随着资本市场的不断敞开,越来越多的人开始重视股票市场,并想经过网上打新股来取得更大的出资收益。但是,网上打新股的办法并不简略,怎样才能成功地打新股呢?本文将从多个角度剖析,协助广阔出资者处理这一问…...
重磅更新,HertzBeat 集群版发布,易用友好的开源实时监控系统!
什么是 HertzBeat? HertzBeat 赫兹跳动 是一个拥有强大自定义监控能力,高性能集群,无需 Agent 的开源实时监控告警系统。 特点 集 监控告警通知 为一体,支持对应用服务,数据库,操作系统,中间件…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
