FreeRTOS Heap_1、Heap_2、Heap_3、Heap_4、Heap_5的区别

2023-05-16

FreeRTOS提供了五种内存管理的方式,下文将对以下五种内存分配进行说明:

1.Heap_1

Heap_1 堆大小通过FreeRTOSConfig.h中的configTOTAL_HEAP_SIZE定义设置,在源码通过数组的总大小configTOTAL_HEAP_SIZE(bytes)定义设置,允许使用pvPortMalloc(),但没有实现vPortFree()。

当调用pvPortMalloc()时,heap_1分配方案将一个简单数组细分为更小的块。这个数组被称为FreeRTOS堆。

每个创建的任务都需要从堆中分配一个任务控制块(TCB)和一个堆栈。下图演示了heap_1如何将简单数组细分为创建任务。

 如图可见,Heap_1不能删除栈区,随着不断申请内存,有栈溢出风险,在通常应用中不建议使用此种内存分配方法。

2.Heap_2

Heap_2 堆大小通过FreeRTOSConfig.h中的configTOTAL_HEAP_SIZE定义设置,在源码通过数组的总大小configTOTAL_HEAP_SIZE(bytes)定义设置,允许使用pvPortMalloc()和vPortFree(),但是Heap_2不会将相邻的块合并成一块,因此更容易碎片化。

每个创建的任务都需要从堆中分配一个任务控制块(TCB)和一个堆栈。下图演示了heap_2如何将简单数组细分为创建任务。如1中创建了三个Task;2中删除中间Task;2->3创建一个和删除task大小一样的task;2->4创建了一个比之前删除的task堆更大的task。

如果删除创建相同大小的,不存在内存碎片化风险,如果控制不了,则会产生较多的堆栈碎片

Heap_2比malloc()和free()的大多数标准库实现要快。

3.Heap_3

Heap_3.c使用标准库malloc()和free()函数,因此堆的大小是由连接器配置定义的,configTOTAL_HEAP_SIZE设置没有影响。

Heap_3通过临时挂起FreeRTOS调度器使malloc()和free()线程安全。

4.Heap_4

与heap_1和heap_2一样,heap_4的工作原理是将数组细分为更小的块。与前面一样,堆大小通过FreeRTOSConfig.h中的configTOTAL_HEAP_SIZE定义设置,在源码通过数组的总大小configTOTAL_HEAP_SIZE(bytes)定义设置,允许使用pvPortMalloc()和vPortFree(),

Heap_4使用第一适合算法来分配内存。与heap_2不同,heap_4将相邻的空闲内存块合并成一个更大的块,这将内存碎片的风险降到最低。

first fit算法确保pvPortMalloc()使用第一个足够容纳请求字节数的空闲内存块。

每个创建的任务都需要从堆中分配一个任务控制块(TCB)和一个堆栈。下图演示了heap_4如何将优化堆栈碎片。

通常建议使用heap_4作为内存管理方案。通常heap_4通常使用内部快速内存,而不是缓慢的外部内存。

默认情况,该堆的起始地址由自动连接,但是,如果configAPPLICATION_ALLOCATED_HEAP = 1,堆数组的起始地址可以由应用程序设置起始地址,且定义 uint8_t ucHeap[configTOTAL_HEAP_SIZE ]数组,数组的地址根据不同的编译器来决定写法。IAR编译器声明数组并将数组放置在绝对内存地址0x20000000所需的语法:

uint8_t ucHeap[ configTOTAL_HEAP_SIZE ] @ 0x20000000;

5.Heap_5

Heap_5与Heap_4分配和释放内存方法一样,与Heap_4不同的是heap_5并不局限于从一个静态声明的数组中分配内存;Heap_5可以从多个和分离的内存空间分配内存。heap_5对于FreeRTOS运行的系统提供的RAM在系统内存映射中不是一个连续的(没有空间)块时非常有用。

在编写时,heap_5是唯一提供的在调用pvPortMalloc()之前必须显式初始化的内存分配方案。使用vPortDefineHeapRegions() API函数初始化Heap_5。当使用heap_5时,必须在创建任何内核对象(任务、队列、信号量等)之前调用vPortDefineHeapRegions()。

 

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

FreeRTOS Heap_1、Heap_2、Heap_3、Heap_4、Heap_5的区别 的相关文章

  • Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o).

    我用的是F103ZET6的板子 移植成功后 编译出现两个错误是关于stm32f10x it c 里 void SVC Handler void void PendSV Handler void 两个函数的占用问题 随后编译出现以下两个问题
  • 基于HAL库的FREERTOS-----------三.队列

    一 队列简介 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式 但是如果在使用操作系统的应用中用
  • java堆,栈,常量池最通俗易懂的图文解释

    转自 http www iteye com topic 634530 1 寄存器 最快的存储区 由编译器根据需求进行分配 我们在程序中无法控制 2 栈 stack 存放基本类型的变量数据和对象的引用 但对象本身不存放在栈中 而是存放在堆 n
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • 单片机通信数据延迟问题排查

    1 问题说明 笔者在最近的项目中 发现系统的响应延迟较高 经过排查 排除了单片机运行卡死的问题 2 原因分析 具体排查过程这里就不细致说明了 直接给出排查后原因 任务执行周期规划不合理 导致freertos队列发送接收到的命令有延迟 为了便
  • FreeRTOS临界段

    1 临界段 在访问共享资源时不希望被其他任务或者中断打断的代码 这段要执行的代码称为临界段代码 2 设置临界段的目的 保护共享资源 例如 全局变量 公共函数 不可重入函数 函数里面使用 了一些静态全局变量 malloc 等 保护外设的实时性
  • FreeRTOS实时操作系统(三)任务挂起与恢复

    系列文章 FreeRTOS实时操作系统 一 RTOS的基本概念 FreeRTOS实时操作系统 二 任务创建与任务删除 HAL库 FreeRTOS实时操作系统 三 任务挂起与恢复 FreeRTOS实时操作系统 四 中断任务管理 FreeRTO
  • 数据结构——堆(带图详解)

    目录 堆 堆的概念 堆的性质 堆的创建 1 堆向下调整 2 堆的创建 3 建堆的时间复杂度 堆的插入和删除 1 堆的插入 2 堆的删除 堆的应用 1 优先级队列的实现 2 堆排序 3 Top k问题 堆 Heap 堆的概念 前面介绍的优先级
  • FreeRTOSConfig.h 配置优化及深入

    本篇目标 基于上一篇的移植freertos stm32f4 freertos 上 修改 FreeRTOSConfig h 文件的相关配置来优化辅助 FreeRtos 的使用 并且建立一些基本功能 信号量 消息地列等 的简单应用位于 stm3
  • 查找未排序数组的中位数

    为了找到未排序数组的中位数 我们可以在 O nlogn 时间内为 n 个元素创建一个最小堆 然后我们可以逐个提取 n 2 个元素以获得中位数 但这种方法需要 O nlogn 时间 我们可以通过某种方法在 O n 时间内完成同样的事情吗 如果
  • 堆插入的 O(1) 平均情况复杂度的论证

    索赔要求二进制堆的维基百科页面插入是 O logn 在最坏的情况下 但平均 O 1 所需的操作数量仅取决于新元素必须上升到满足堆性质的层数 因此插入操作的最坏情况时间复杂度为 O logn 但平均情况复杂度为 O 1 The 链接页面试图证
  • 我们可以用二叉搜索树来模拟堆操作吗?

    我想知道我们是否可以使用二叉搜索树来模拟堆操作 插入 查找最小值 删除最小值 即使用 BST 来完成相同的工作 这样做有什么好处吗 我们当然可以 但具有平衡的 BST 最小值是最左边的元素 最大值是最右边的元素 找到这些元素是O logn
  • 如何在java中获取比较器的倒数

    在一种方法中 我收到一个通用的object E extends Comparable
  • 防止GCC LTO删除函数

    我使用 GCC ARM Embedded 和 FreeRTOS FreeRTOS具有的功能vTaskSwitchContext 仅在某些情况下使用 内联汇编代码 问题是 当我使用LTO时 GCC不考虑内联汇编代码并认为该函数没有被使用 因此
  • python heapq 合并的内部工作。如何在不生成列表的情况下对列表进行排序

    如何heapq merge 即使不生成列表也可以对列表进行排序 不确定我说清楚了没有 所以 这是从leetcode 的超级丑数问题 https leetcode com problems super ugly number 和这个Pytho
  • FreeRTOS 匈牙利表示法 [重复]

    这个问题在这里已经有答案了 我是 RTOS 和 C 编程的新手 而且我仍在习惯 C 的良好实践 因此 我打开了一个使用 FreeRTOS 的项目 我注意到操作系统文件使用匈牙利表示法 我知道一点符号 但面临一些新的 标准 FreeRTOS
  • .Net中的优先级队列[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找优先级队列或堆数据结构的 NET 实现 优先级队列是比简单排序提供更多灵活性的数据结构 因为
  • python 中的最小堆

    我想通过定义自定义比较函数将一组对象存储在最小堆中 我看到有一个 heapq 模块作为 python 发行版的一部分可用 有没有办法在此模块中使用自定义比较器 如果没有 其他人是否构建了自定义最小堆 两个选择 除了 Devin Jeanpi
  • 具有查找功能的优先级队列 - 最快的实现

    我正在考虑实现一个带有附加要求的优先级队列 一个查找 搜索功能 它将告诉一个项目是否在队列中的任何位置 所以函数将是 insert del min 和 find 我不确定是否应该使用堆或自平衡二叉搜索树 看来 PQ 通常是用堆实现的 但我想
  • 在现实生活中,您会使用 heapq Python 模块做什么?

    读完吉多的书后使用 Python 对 2MB RAM 中的一百万个 32 位整数进行排序 http neopythonic blogspot com 2008 10 sorting million 32 bit integers in 2m

随机推荐