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 的开源实时监控告警系统。 特点 集 监控告警通知 为一体,支持对应用服务,数据库,操作系统,中间件…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
