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

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

3天内不再提示

heap_1内存分配方法

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-30 10:33 次阅读

heap_1 内存分配方法

动 态 内 存 分 配 需 要 一 个 内 存 堆 , FreeRTOS 中 的 内 存 堆 为 ucHeap[] , 大 小 为configTOTAL_HEAP_SIZE,这个前面讲 FreeRTOS 配置的时候就讲过了。不管是哪种内存分配方法,它们的内存堆都为 ucHeap[],而且大小都是 configTOTAL_HEAP_SIZE。内存堆在文件heap_x.c(x 为 1~5)中定义的,比如 heap_1.c 文件就有如下定义:

#if(configAPPLICATION_ALLOCATED_HEAP==1)

extern

uint8_t

ucHeap[configTOTAL_HEAP_SIZE];

//需要用户自行定义内存堆

#else

static

uint8_t

ucHeap[configTOTAL_HEAP_SIZE];

//编译器决定

#endif

当宏 configAPPLICATION_ALLOCATED_HEAP 为 1 的时候需要用户自行定义内存堆,否则的话由编译器来决定,默认都是由编译器来决定的。如果自己定义的话就可以将内存堆定义到外部 SRAM 或者 SDRAM 中。

heap_1 实现起来就是当需要 RAM 的时候就从一个大数组(内存堆)中分一小块出来,大数组(内存堆)的容量为 configTOTAL_HEAP_SIZE。使用函数 xPortGetFreeHeapSize() 可以获取内存堆中剩余内存大小。

heap_1 特性如下:

1、适用于那些一旦创建好任务、信号量和队列就再也不会删除的应用,实际上大多数的 FreeRTOS 应用都是这样的。

2、具有可确定性(执行所花费的时间大多数都是一样的),而且不会导致内存碎片。

3、代码实现和内存分配过程都非常简单,内存是从一个静态数组中分配到的,也就是适合于那些不需要动态内存分配的应用。

如果使用 heap_1,一旦申请内存成功就不允许释放!但是 heap_1 的内存分配过程简单,如此看来 heap_1 似乎毫无任何使用价值啊。千万不能这么想,有很多小型的应用在系统一开始就创建好任务、信号量或队列等,在程序运行的整个过程这些任务和内核对象都不会删除,那么这个时候使用 heap_1 就很合适的。

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

    关注

    4982

    文章

    18281

    浏览量

    288430
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72764
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61347
收藏 人收藏

    评论

    相关推荐

    C语言知识总结:动态内存分配

    动态内存分配就 是指在程序执行的过程中动态地分配或者回收存储空间的分配内存方法。动态
    发表于 10-24 15:52 654次阅读

    请问cmd中heap默认是在哪个段分配呢,动态分配段名是什么?

    我cmd文件分配如下,请问:1 stack分配是根据在子函数中用到的最大的局部变量,比如数组大小来分配的么?而heap
    发表于 07-30 07:55

    请问cmd中heap默认是在哪个段分配呢?

    我cmd文件分配如下,请问:1 stack分配是根据在子函数中用到的最大的局部变量,比如数组大小来分配的么?而heap
    发表于 10-25 09:53

    基于FreeRTOS内存管理Heap_4.c的实现方法

    Heap_4.c,发现它的实现方法还挺简单的,而且比较实用,不过为了要像原子哥的内存管理那样管理三个内存池,还需要稍稍修改一下,我已经修改好了,测试了一下没发现问题,上传上来给大家瞧瞧
    发表于 07-15 21:46

    嵌入式系统内存分配方式是怎样的

    一篇讲透嵌入式系统内存分配方
    发表于 12-17 07:40

    一种嵌入式系统的内存分配方

    嵌入式系统中对实时性的保证,要求内存分配过程要尽可能地快。因此在嵌入式系统中,不可能采用通用操作系统中复杂而完善的内存分配策略,一般都采用简单、快速的
    发表于 05-24 14:30 2029次阅读

    基于费用最优的功率变换器可靠性分配方法_杜贵平

    基于费用最优的功率变换器可靠性分配方法_杜贵平
    发表于 12-31 14:44 0次下载

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

    _1.c只是简单地实现了pvPortMalloc()这一个函数,这个堆的实现方案并不允许已分配内存再次被释放。(The simplest possible implementation of pvPortMalloc(). Note that this implemen
    发表于 02-09 05:25 765次阅读
    FreeRTOS代码剖析之1:<b class='flag-5'>内存</b>管理<b class='flag-5'>Heap</b>

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

    在FreeRTOS8.0.1这个版本中,一共有四个内存堆模型。这一次讲的就是第二个模型Heap_2.c。从一开始就可以看到注释中对Heap_2的模型解释:这是对pvPortMalloc
    发表于 02-09 05:28 629次阅读
    FreeRTOS代码剖析之2:<b class='flag-5'>内存</b>管理<b class='flag-5'>Heap</b>

    浅谈内存分配方式 避免内存浪费问题

    说到内存分配方式,就不得不提连续分配方式。这种方式是指为一个用户程序分配一个连续的内存空间,它曾被广泛的用于20世纪60~70年代的OS中
    发表于 03-03 11:22 1273次阅读

    什么是堆内存?堆内存是如何分配的?

    在一般的编译系统中,堆内存分配方向和栈内存是相反的。当栈内存从高地址向低地址增长的时候,堆内存从低地址向高地址
    的头像 发表于 07-05 17:58 9518次阅读

    heap_2内存的特性与分配方法

    heap_2 内存分配方法 heap_2 提供了一个更好的分配算法,不像 heap_1那样,
    的头像 发表于 07-30 10:36 368次阅读

    FreeRTOS heap_3内存分配方法

    heap_3 内存分配方法 这个分配方法是对标准 C 中的函数 malloc()和 free()的简单封装,FreeRTOS 对这两个函数做了线程保护。
    的头像 发表于 07-30 10:40 411次阅读
    FreeRTOS <b class='flag-5'>heap</b>_3<b class='flag-5'>内存</b><b class='flag-5'>分配方法</b>

    heap_4内存分配方法介绍

    heap_4 内存分配方法 heap_4 提供了一个最优的匹配算法,不像 heap_2,heap
    的头像 发表于 07-30 10:42 500次阅读

    FreeRTOS heap_5内存分配方法介绍

    heap_5 内存分配方法 heap_5 使用了和 heap_4 相同的合并算法,内存管理实现起
    的头像 发表于 07-30 10:47 573次阅读