0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

freeRTOS源码中内存管理的方案

汽车电子技术 来源:嵌入式之入坑笔记 作者: 嵌入式之入坑笔记 2023-02-10 11:11 次阅读

freeRTOS源码中提供了五种内存管理的方案,可以说是很方便了。实际需要使用哪一种,可以根据自己项目的需要进行选择,都是可以的。

那这五种不同的内存管理方式都有哪些差异呢?按照官方给出的说明,这五种内存管理的特点分别如下:

1、内存管理方式 1(heap_1.c)

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

尽管如此,这种方式的动态内存管理还是可以满足许多的嵌入式项目的, 因为有些嵌入式产品在系统启动阶段就明确了任务创建、事件标志组、信号量、消息队列等资源的使用情况, 而且这些资源是整个运行过程中都要一直使用的,并不打算释放或者丢弃,所以也就不需要释放内存。

FreeRTOS 的 动态内存可以申请的大小范围可以在 FreeRTOSConfig.h 文件中进行了定义:

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

这个宏其实是规定了操作系统的堆栈空间的总大小,动态申请的内存大小是不能操作这个这个值的。

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

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

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

2)所申请的动态内存的时间是固定的,并且不会产生内存碎片。

3)是一种静态内存分配方案,因为申请的内存是不会被释放掉。

2、内存管理方式 2(heap_2.c)

heap_2 动态内存管理利用了自适应算法,并且支持内存释放, 但是不支持内存碎片整理。

FreeRTOS 的 动态内存可以申请的大小范围可以在 FreeRTOSConfig.h 文件中进行了定义:

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

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

heap_2 方 式的内存管理有以下特点:

1)在不考虑内存碎片的情况下,这种方式支持重复的任务、信号量、事件标志组、软件定时器等内部资源 的创建和删除。因为不使用的资源是支持释放的,所以可以让内存资源得到反复的使用!

2)如果申请和释放的动态内存大小是随机的,不建议采用这种动态内存管理方式。

3)项目中需要重复的创建和删除任务,如果每次创建需要动态内存大小相同,那么 heap_2 比 较适合,但每次创建需要动态内存大小不同,那么方式 heap_2 就不合适了,因为容易产生内存 碎片,内存碎片过多的话会导致无法申请出一个大的内存块出来。

4)项目中需要重复的创建和删除消息队列,也会出现类似上面的情况。

5)直接的调用函数 pvPortMalloc() 和 vPortFree() 也容易出现内存碎片。如果按一定顺序的申请和释放,基本没有内存碎片的,而不按顺序的随机申请和释放容易产生内存碎片。

6)如果随机的创建和删除任务、消息队列、事件标志组、信号量等内部资源也容易出现内存碎片。

3、 内存管理方式 3(heap_3.c)

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

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

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

heap_3 方式的内存管理有以下特点:

1)需要编译器提供 malloc 和 free 函数。

2)不具有时间确定性,即申请动态内存的时间不是固定的。

3)增加 RTOS 内核的代码量。

另外要特别注意一点,这种方式的动态内存申请和释放不是用的 FreeRTOSConfig.h 文件中定义的heap空间大小,而是用的编译器设置的heap空间大小。

4、内存管理方式 4(heap_4.c)

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

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

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

heap_4 同时支持将动态内存设置在指定的 RAM 空间位置。

通过函数 xPortGetFreeHeapSize 就能获得 FreeRTOS 动态内存的剩余。

使用函数 xPortGetMinimumEverFreeHeapSize 能够获取从系统启 动到当前时刻的动态内存最小剩余。

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

1)可以用于需要重复的创建和删除任务、信号量、事件标志组、软件定时器等资源的项目中。

2)调用 pvPortMalloc() 和 vPortFree(),即使每次申请的内存大小都不同,也不会产 生很多的内存碎片。

3)申请动态内存的时间不是确定的。

5、 内存管理方式 5 (heap_5.c)

如果希望申请的空间可以采用不连续的内存区,比希望可以将内存定义在内部 SRAM 中的某一部分,或者外部 SRAM 的一部分,就可以采用 heap_5 动态内存管理 方式。

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

6、这五种内存申请方式的比较

有关五种动态内存管理方式简单总结如下:

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

2)heap_2.c:支持动态内存的申请和释放,但是不支持内存碎片的处理,无法将碎片内存合并成一个大的内存块。

3)heap_3.c:将编译器自带的 malloc 和 free 函数进行简单的封装,以支持线程安全,即支持多任务调 用。

4)heap_4.c:支持动态内存的申请和释放,支持内存碎片处理,支持将动态内存设置在个固定的地址(内部或者外部 RAM)。

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

其实大多数项目中使用的都是 heap_4.c 这种内存的管理方式,这种方式支持动态内存的申请和释放,支持内存碎片处理,还支持将动态内存设置在个固定的地址,对大多数的项目都有很高的满足性,基本上都能够适配上了!

五种方式不分优劣吧,看自己的项目的需求,合适才是最好的!!!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 源码
    +关注

    关注

    8

    文章

    574

    浏览量

    28589
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61351
  • 内存管理
    +关注

    关注

    0

    文章

    163

    浏览量

    14057
收藏 人收藏

    评论

    相关推荐

    freeRTOS 源码

    FreeRTOS是一个迷你操作系统内核的小型嵌入式系统。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理
    发表于 01-07 16:38

    第28章 FreeRTOS动态内存管理

    28.4 实验例程说明28.5总结28.1动态内存管理介绍 FreeRTOS支持5种动态内存管理方案
    发表于 09-11 07:15

    FreeRTOS内存管理的算法解析?

    关于FreeRTOS内存管理,有人测试过它给定的算法么?会不会有内存碎片的出现,如果产品一直运行,会不会出现内存崩溃的情况。求证啊。目前用h
    发表于 07-30 11:39

    FreeRTOS内存管理例子,用了malloc和heap4两套动态内存管理,是否可以统一?

    看到原子的FreeRTOS内存管理例子,用了malloc和heap4两套动态内存管理,是否可以
    发表于 08-03 22:51

    阐述FreeRTOS系统的机制及在应用的优缺点

    FreeRTOS是一个源码公开的免费的嵌入式实时操作系统,通过研究其内核可以更好地理解嵌入式操作系统的实现原理.本文主要阐述FreeRTOS系统的任务调度机制、时间
    发表于 12-20 06:34

    阐述FreeRTOS系统机制的实现原理

    2--嵌入式操作系统FreeRTOS的原理与实现摘自::FreeRTOS是一个源码公开的免费的嵌入式实时操作系统,通过研究其内核可以更好地理解嵌入式操作系统的实现原理.本文主要阐述FreeRT
    发表于 12-22 07:15

    Freertos关于堆内存管理的相关资料分享

    内存管理Malloc、Free防止内存碎片Freertos
    发表于 12-27 08:12

    FreeRTOS源码介绍

    。而且一些常用的功能,队列,内存管理,信号量之类的,都有,基本上彻底弄懂一个,对以后理解别的也有帮助。1. FreeRTOS介绍FreeRTOS其实不用再多介绍了,现在太火了,主要是免
    发表于 02-14 07:42

    FreeRTOS代码剖析之1:内存管理Heap

    内存管理是一个操作系统的重要组成部分之一,所有应用程序都离不开操作系统的内存管理。因此,在剖析FreeRTOS的内核代码之前,前对
    发表于 02-09 05:25 769次阅读
    <b class='flag-5'>FreeRTOS</b>代码剖析之1:<b class='flag-5'>内存</b><b class='flag-5'>管理</b>Heap

    嵌入式操作系统FreeRTOS内存如何管理和堆

    嵌入式操作系统FreeRTOS内存管理和堆
    的头像 发表于 01-10 15:17 4337次阅读
    嵌入式操作系统<b class='flag-5'>FreeRTOS</b><b class='flag-5'>内存</b>如何<b class='flag-5'>管理</b>和堆

    FreeRTOS高级篇7---FreeRTOS内存管理分析

    FreeRTOS操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理函数原型,而不关心这些
    发表于 01-26 17:36 7次下载
    <b class='flag-5'>FreeRTOS</b>高级篇7---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>内存</b><b class='flag-5'>管理</b>分析

    FreeRTOS系列第8篇---FreeRTOS内存管理

    本文介绍内存管理的基础知识,详细源码分析见《 FreeRTOS高级篇7---FreeRTOS内存
    发表于 01-26 17:56 17次下载
    <b class='flag-5'>FreeRTOS</b>系列第8篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>内存</b><b class='flag-5'>管理</b>

    FreeRTOS源码下载

    内存管理文件在FreeRTOS\portable\MemMang文件夹下,FreeRTOS提供了五种内存
    的头像 发表于 02-10 11:00 1863次阅读
    <b class='flag-5'>FreeRTOS</b>的<b class='flag-5'>源码</b>下载

    FreeRTOS内存管理简介

    ,比如任务创建函数 xTaskCreateStatic(),使用此函数创建任务的时候需要由用户定义任务堆栈,我们不讨论这种静态方法。 使用动态内存管理的时候 FreeRTOS 内核在创建任务、队列、信号量的时候会动态的申请 RA
    的头像 发表于 07-30 10:26 413次阅读

    FreeRTOS内存管理实现

    FreeRTOS是一个为嵌入式系统设计的开源实时操作系统。它提供了一个多任务内核和一系列功能,适合在资源受限的设备上管理实时任务和应用程序。FreeRTOS内存
    的头像 发表于 10-10 16:17 509次阅读
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>内存</b><b class='flag-5'>管理</b>实现