FreeRTOS heap 4 机制解析

2023-05-16

FreeRTOS提供了几个内存管理的方案,其中一个实现较好的方式是heap4。本篇就来形象讲述heap4的工作原理。

本文暂时只用作自己对heap4的工作机制的总结和记录,有空了再修改成教程吧,所以,很多临时的图片就直接往上贴了

 

基本原理:

ucHeap是一块由bss段分配的内存区域,heap4的核心内存管理特点是只监控空闲块(free block),不直接监控分配块。不管是空闲块还是分配块,其内存空间都由一个2-word的控制结构开头,第一个word是下一个空闲块的地址,第二个word用来标记内存大小。

空闲块由xStart开始,依次通过链表连接在一起组成free list。分配空间时,将会从头(xStart)开始找空间足够的空闲块。找到后,将空闲块原来的控制块进行修改,第一个word修改为0,表示该块已经不是空闲块。由于现在这个空闲块的一部分已经被分配,所以第二给我word将被修改为新分配的大小(注意,这里的新分配的大小不仅仅是malloc时候请求的size,而是要加上前面的控制块的大小并且进行对其处理。对于每一个内存控制块而言,其第二个word总是用于被描述其所管理的整个、也就是包含控制块自身的内存的大小),另外,由于该块已经被分配,将第二个word的最高位标记为1,用于分配标记(因此先前括号中我使用了“描述”这个词而不是“等于”)。那么从空闲块中分离出来剩下的那部分内存(如果还有多余的话)怎么办呢,答案是将这部分内存分离出来,成为一个新的空闲块,链接到原有的free list中(注意,这个链接过程最后得到的free list的链的方向一定是单向的)。然后将控制块偏移2个word的地址作为分配内存指针由返回值返回。

对于内存的释放,将申请得到的内存指针往前偏移2个word,然后根据释放后内存是否有可能连续的算法,尝试往前或者往后合并内存块,这个过程就这样带过,看源码的话基本上就能知道这个过程。

整个过程基本上就是这样,heap4的几个要点:

空闲块的第一个word指向下一个空闲块;
空闲块的第二个word等于这个空闲块的整个大小;
分配块的第一个word为NULL;
分配块的第一个word等于这个分配块的大小加上flag标记;
空闲块链表永远是单向链接;
分配内存时采用内存分裂算法,不断地从空闲块中申请内存;
释放内存时采用内存拼接算法,尝试拼接内存地址连续的空闲块;

 

cloud制作了一个在linux环境下分析内存的工具,用于从运行的系统中,将mcu全部内存dump出来,找出所有的分配块和空闲块。这个工具用于分析系统奔溃情况下FreeRTOS系统的内存管理是否出现异常,便于内存分析快速定位问题。地址如下:

https://github.com/442534820/fh4ct.git

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS heap 4 机制解析 的相关文章

  • freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

    摘要 每个任务都有自己的堆栈 堆栈的总大小在创建任务的时候就确定了 此函数用于检查任务从创建好到现在的历史剩余最小值 这个值越小说明任务堆栈溢出的可能性就越大 FreeRTOS 把这个历史剩余最小值叫做 高水位线 此函数相对来说会多耗费一点
  • FreeRTOS临界段和开关中断

    http blog sina com cn s blog 98ee3a930102wg5u html 本章教程为大家讲解两个重要的概念 FreeRTOS的临界段和开关中断 本章教程配套的例子含Cortex M3内核的STM32F103和Co
  • freertos————互斥锁

    线程安全 多线程程序处于一个多变的环境 可访问的全局变量和堆数据随时可能被其他的线程改变 多个线程同时访问一个共享数据 可能造成严重的后果 出现问题的是之前移植了一个freemodbus的从站 多个任务访问全局变量保持寄存器区 导致最后读出
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • 基于STM32的FreeRTOS学习之中断测试实验(五)

    记录一下 方便以后翻阅 本章内容是接着上一章节进行的实际演练 1 实验目的 FreeRTOS可以屏蔽优先级低于configMAX SYSCALL INTERRUPT PRIORITY的中断 不会屏蔽高于其的中断 本次实验就是验证这个说法 本
  • Arduino IDE将FreeRTOS用于STM32

    介绍 适用于STM32F103C8的FreeRTOS STM32F103C是一种能够使用FreeRTOS的ARM Cortex M3处理器 我们直接在Arduino IDE中开始使用STM32F103C8的FreeRTOS 我们也可以使用K
  • freeRTOS出现任务卡死的情况。

    最近在做一个产品二代升级的项目 代码是上一任工程师留下的 很多BUG 而且融合了HAL库和LL库 以及github上下载的GSM源码 很不好用 我这边是将2G模块换成了4G 且添加了单独的BLE模块 因此只在源码的基础上 去除2G和BLE代
  • STM32 Freertos 添加 外部sram heap_5.c

    1 添加外部SRAM 初始化 2 添加heap 5 c 3 初始化heap 5 c 外部堆栈 Define the start address and size of the two RAM regions not used by the
  • FreeRTOS之系统配置

    1 FreeRTOS的系统配置文件为FreeRTOSConfig h 在此配置文件中可以完成FreeRTOS的裁剪和配置 在官方的demo中 每个工程都有一个该文件 2 先说一下 INCLUDE 开始的宏 使用 INCLUDE 开头的宏用来
  • java中整数数组的优先级队列

    我想按数组 0 30 5 10 15 20 的第二个元素进行比较 PriorityQueue
  • 在一本大书中找到 10 个最常用的单词 [重复]

    这个问题在这里已经有答案了 我知道这个问题已经在论坛上被问过几次了 我没有找到任何可以被认为是最合适的解决方案的 标记 答案 所以再次询问 我们从书中得到了一篇非常大的文本 所有这些文本都无法放入内存中 我们需要找到文本中出现频率最高的 1
  • 使用 GCC 编译器的 ARM 内核的堆栈回溯(当存在 MSP 到 PSP 切换时)

    核心 ARM Cortex M4 编译器 GCC 5 3 0 ARM EABI 操作系统 免费 RTOS 我正在使用 gcc 库函数 Unwind Reason Code Unwind Backtrace Unwind Trace Fn v
  • 根位于 arr[0] 的二叉堆有什么好处

    我正在数组上写一个二进制堆arr 除叶节点外 每个节点都有两个子节点 根可以位于arr 0 or arr 1 接受的答案在为什么在数组实现的堆中索引 0 未被使用 https stackoverflow com questions 2290
  • 使用容器/堆实现优先级队列

    从整体上看 我正在尝试使用优先级队列来实现 Dijkstra 算法 根据 golang nuts 成员的说法 在 Go 中执行此操作的惯用方法是使用具有自定义底层数据结构的堆接口 所以我创建了 Node go 和 PQueue go 如下所
  • python heapq 合并的内部工作。如何在不生成列表的情况下对列表进行排序

    如何heapq merge 即使不生成列表也可以对列表进行排序 不确定我说清楚了没有 所以 这是从leetcode 的超级丑数问题 https leetcode com problems super ugly number 和这个Pytho
  • 堆被视为抽象数据类型吗?

    我正在学习数据结构课程 并对什么被认为是 ADT 抽象数据类型 和什么不是 如果它不是 ADT 那么它一定是实现 感到有点困惑 具体来说 我说的是堆 我在维基百科上读到 堆是一种专门的基于树的数据结构 这是否意味着它是一个ADT 如果是这样
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free
  • 如何更新 Prim 算法堆中的元素优先级?

    我正在研究Prim算法 代码中有一部分穿过切割的下一个顶点将进入属于MST 在这样做的同时 我们还必须 更新另一组中与离开顶点相邻的所有顶点 这是来自的快照CLRS 有趣的部分在于第 1 行 11 但由于我们在这里使用堆 因此我们只能访问最
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https
  • 没有数组的 MinMax Heap 实现

    我发现了很多 MinMax Heap 实现 它们将数据存储在数组中 它真的很容易实现 这就是我正在寻找不同的东西的方式 我想仅使用堆的元素以及指向左孩子和右孩子的指针 当然还有一个要比较的键 来创建一个 MinMax 堆 因此 堆只有指向根

随机推荐

  • Everything官网下载

    基于名称快速定位文件和文件夹Everything官方下载 简单说明地址 简单说明 Everything是voidtools开发的一款文件搜索工具 xff0c 官网描述为 基于名称实时定位文件和目录 xff08 Locate files an
  • Android SDK Installed Packages

    1 1 解压Android SKD 1 2 执行如上目录下的文件 xff1a SDK Setup exe xff0c xff08 机器人图标的哪个 xff09 注意 xff1a 一般的话会出现 Failed to fetch URL htt
  • linux下启动tomcat报错APR/native library which is not available的解决方案

    在linux上使用tomcat8配置支持http2 0的时候 xff0c server xml的配置文件里面有这么一段配置 xff1a lt Connector port 61 34 45501 34 protocol 61 34 org
  • 美国出台最严技术出口管制!14项前沿科技面临封锁

    关注ITValue xff0c 查看企业级市场最新鲜 最具价值的报道 xff01 xff08 本文转载自量子位公众号 xff0c ID xff1a QbitAI xff0c 作者 xff1a 乾明 夏乙 问耕 xff09 美国又打出一套七伤
  • Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-135-generic x86_64) 裸机配置静态IP

    1 xff0c os装好后默认有以下文件 xff1a etc netplan 00 installer config yaml 2 xff0c 配置该文件 xff1a sudo vi etc netplan 00 installer con
  • linux nvidia-smi 执行速度很慢问题解决

    老办法 sudo nvidia smi pm 1 比较科学的方法 sudo nvidia persistenced persistence mode 一般四卡会出现上面问题 xff0c 双路主板差多个显卡的时候容易出现
  • 【机器学习】信用卡欺诈检测 (下采样、SMOTE过采样、集成学习、Pytorch)

    2022 4 17 补充 视频 xff1a 参考 xff1a 6 01 信用卡交易欺诈数据检测 哔哩哔哩 bilibili 参考 xff1a 机器学习 Kaggle 信用卡欺诈检测 Tommy 数据不平衡 ipynb myaijarvis
  • ubuntu下makeinfo/texinfo 安装的解决办法

    环境 ubuntu 16 04 sudo apt get install makeinfo 提示找不到包 搜了一圈资料 xff0c 发现makeinfo其实就是texinfo sudo apt get install texinfo 还是找
  • 自平衡机器人DIY(一)

    看到一篇DIY自平衡机器人的文章 xff0c 感觉特别有意思 xff01 正好趁着寒假的工夫 xff0c 也来做一做 参考过程 xff1a 自平衡机器人 蛋黄物语 原理 原理 就是应用负反馈控制 xff0c 由测量到的角度和自身平衡时的自然
  • Go 与 Java 生成grpc代码

    1 背景 xff1a 由于公司的日志系统使用的是plumelog xff0c 最近生产环境老是报 jedis连接池不够 xff0c 导致丢失日志 xff0c 而且服务老是重启 xff0c 怀疑跟日志系统有关 xff0c 于是自己改造plum
  • Ubuntu开机自动挂载Windows分区(NTFS FAT32)教程

    这是我总结网上相关教程 xff0c 结合我的实际操作总结的 在开始实际的操作之前 xff0c 我们必须要了解linux系统下的挂载概念 在linux操作系统中 xff0c 挂载是一个非常重要的功能 xff0c 使用非常频繁 它指将一个设备
  • 第六章 Java FutureTask 示例

    在本教程中 xff0c 我们将看到有关 Java FutureTask 的示例 FutureTask 类已在 JDK 5 中与 Executor Framework 一起引入 FutureTask类是Future对象的具体实现 xff0c
  • ORB-SLAM2系统的实时点云地图构建

    ORB SLAM2系统的实时点云地图构建 这篇博客点云地图构建的流程代码介绍点云地图构建类对象小调整获取关键帧点云地图构建与叠加在地图中设置当前相机位置点云地图到Octomap的转换 地图效果结尾 这篇博客 xff08 PS 修改于2020
  • 查理·芒格:让自己配得上想要的东西

    巴菲特说他一生遇人无数 xff0c 从来没有遇到过像查理这样的人 94岁的查理 芒格毕业于哈佛大学法学院 xff0c 是沃伦 巴菲特的黄金搭档 xff0c 伯克夏 哈撒韦公司的副主席 xff0c 芒格的头脑是原创性的 xff0c 从来不受任
  • react路由传参的几种方式

    params传参 支持多个动态参数 state 61 id 88 name Jack 路由页面 xff1a 路由跳转并传递参数 xff1a 链接方式 xff1a lt Link to 61 pathname code demo this s
  • 对极几何、三角测量、PnP、ICP问题描述

    对极几何 三角测量 PnP ICP问题描述 文章目录 对极几何 三角测量 PnP ICP问题描述前言2D 2D xff1a 对极几何三角测量1 求解空间点深度2 求解空间点坐标 3D 2D xff1a PnP1 直接线性变换 xff08 D
  • springsecurity 登录后依然无法访问页面

    springsecurity 登录后依然无法访问页面 登录成功 点击左侧功能列表报错 org springframework security access AccessDeniedException Access is denied at
  • 前端---vscode插件推荐及GIT一些问题操作说明(持续更新)

    以前都是用sublime xff0c 最近开始使用vscode xff08 v1 50 0 xff09 xff0c 写一些心得记录一下 先安利一些自己使用的插件 TabNine这个插件 xff0c 如果电脑配置ok xff0c 可以装一下
  • http协议之digest(摘要)认证

    参考网址 xff1a RFC 2617 HTTP Authentication Basic and Digest Access Authenti RFC2617 RFC 1321 The MD5 Message Digest Algorit
  • FreeRTOS heap 4 机制解析

    FreeRTOS提供了几个内存管理的方案 xff0c 其中一个实现较好的方式是heap4 本篇就来形象讲述heap4的工作原理 本文暂时只用作自己对heap4的工作机制的总结和记录 xff0c 有空了再修改成教程吧 xff0c 所以 xff