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

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

3天内不再提示

关于FreeRTOS内存分配多少才合适

黄工的嵌入式技术圈 来源:网站整理 2020-03-06 15:04 次阅读

一位朋友问:黄哥,我刚学FreeRTOS不久,我想问一下,创建一个任务,堆栈分配多少才合适呢?

1写在前面

这个关于FreeRTOS操作系统内存分配的问题,其实只要大概明白内存管理,以及资源分配的一些知识,相信就不会存在这种疑惑。

操作系统内存分配如果深入分析的话,知识蛮多的,本文只针对开篇的问题展开一些相关知识的讲解。

2

操作系统内存管理

FreeRTOS提供多种内存管理方式,在MemMang文件夹下有5个文件:heap_1到heap_5。

heap,其实是堆的意思,换句话说FrreRTOS系统的内存就是通过分配堆来实现的。(内存管理的知识较多,大家有空可以网上多了解一下,这里不讲述)

而目前FreeRTOS常用的就是heap_4这种内存管理方式:通过事先为系统资源分配一个堆(数组),如下图:

1.可配置在外部,或在heap_4中分配堆;

2.通过FreeRTOSConfig.h配置堆的大小,注意大小单位为字节。

提示:heap_1至heap_5其他管理方式其实还是有很大差别,这里不讲述(后面抽时间再讲述),具体可以参看:

https://www.freertos.org/a00111.html

3

系统资源内存分配

FreeRTOS中系统为各资源分配内存,使用heap_4内存管理方式就是在创建之初就分配一段内存。

而分配的这个资源就是从整个系统堆ucHeap划分了一块出来。我们创建一个任务,分配堆栈大小的原理,进一步查看代码:

提示:这个创建任务大小为我们填写数值x4字节。比如,填写128,其实分配的空间为512Byte.(很多人以为单位是字节,发现多创建几个任务,内存就分配失败了)

再比如,创建队列:

参数1:队列长度,也就是队列的数量;

参数2:队列大小,也就是一个队列有多少字节;

队列分配的内存大小就是:参数1x参数2 (单位Byte)。

这里就举上面两个例子,重点就是强调:分配内存的单位是字节(Byte),还是字(4Byte)。

4

哪些变量会占用任务内存

回到最开始的问题:一个任务需要分配多大内存?

任务堆栈就是用于存放该任务的变量数据(也就是程序在执行其他任务时,需要把该任务变量数据保存起来)。

那么,一个任务有哪些数据才算是“变量数据”呢?

一个是任务自身需要的内存空间,FreeROS任务自身(如TCB)需要的空间好像就七八十个字节(我之前计算过,记不得很清楚了)。

二是你自己应用程序临时变量(如下图),这个就是由你自己计算,或者估计大小。

许多朋友一上来直接分配堆栈的大小为256(x4字节),或512(x4字节),但自己应用程序临时变量并不多。

如果你应用程序就几个字节的临时变量,分配64(x4字节)都完全够你用。

提示:这个“临时变量”包含你应用程序调用的函数所分配的变量。

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

    关注

    8

    文章

    2852

    浏览量

    73320
  • 堆栈
    +关注

    关注

    0

    文章

    174

    浏览量

    19649
  • FreeRTOS
    +关注

    关注

    12

    文章

    476

    浏览量

    61627
收藏 人收藏

    评论

    相关推荐

    在tc397 +freertos+ lwip + cycloneDDS中分配内存失败了怎么解决?

    你好,我在tc397中使用tc397+ freertos+lwip的cyscloneDDS,因为cycloneDDS需要 分配较大的 内存: ddsi_rbufpool_new: rb
    发表于07-05 07:17

    ESP32S3+LVGL创建一个界面,请问能只在SPIRAM分配内存,IRAM不分配吗?

    各位前辈好。ESP32S3+LVGL的开发的过程中发现,创建一个界面,会同时在SPIRAM和IRAM 分配相同大小的 内存。请问能只在SPIRAM 分配 内存,IRAM不
    发表于06-06 07:45

    FreeRTOS如何在中断中调用内存分配函数?

    最近在玩 FreeRTOS,遇到一个问题,就是不知如何在中断中调用 内存 分配函数。pvPortMalloc函数中会调用xTaskResumeAll,而这个函数不能再中断调用,所以请问在中断中进行
    发表于05-08 08:25

    freertos任务创建,每一个任务分配内存是多大才好,怎么计算呢?

    小白刚刚接触 freertos,想问一下就创建任务而言,每一个任务 分配内存是多大才好,怎么计算呢? 另外,每个任务的执行周期怎么确定?在任务里面放延时函数吗?
    发表于04-23 06:39

    Linux内核内存管理之内核非连续物理内存分配

    我们已经知道,最好将虚拟地址映射到连续页帧,从而更好地利用缓存并实现更低的平均 内存访问时间。然而,如果对 内存区域的请求并不频繁,那么考虑基于通过连续线性地址访问非连续页帧的 分配方案是有意义的。该模式
    的头像 发表于02-23 09:44 669次阅读
    Linux内核<b class='flag-5'>内存</b>管理之内核非连续物理<b class='flag-5'>内存</b><b class='flag-5'>分配</b>

    Linux内核内存管理之ZONE内存分配

    内核中使用ZONE 分配器满足 内存 分配请求。该 分配器必须具有足够的空闲页帧,以便满足各种 内存大小请求。
    的头像 发表于02-21 09:29 692次阅读

    FreeRTOS内存机制详解

    FreeRTOS是一种实时操作系统,它提供了多种 内存 分配方式,包括动态 内存 分配和静态 内存
    的头像 发表于12-31 16:49 1868次阅读
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>内存</b>机制详解

    聊聊FreeRTOS内存管理方案及相关的优化措施

    FreeRTOS作为一个嵌入式实时操作系统,其运行的环境一般资源有限
    的头像 发表于11-13 11:28 787次阅读
    聊聊<b class='flag-5'>FreeRTOS</b><b class='flag-5'>内存</b>管理方案及相关的优化措施

    如何高效管理MCU内存? 多种分配算法对比?

    如何高效管理MCU 内存? 多种 分配算法对比?
    的头像 发表于10-17 18:21 951次阅读
    如何高效管理MCU<b class='flag-5'>内存</b>? 多种<b class='flag-5'>分配</b>算法对比?

    freertos怎么释放任务的内存空间?

    freertos怎么释放任务的 内存空间
    发表于10-12 07:20

    FreeRTOS内存管理实现

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

    反激变压器需要漏磁多少合适

    反激变压器需要漏磁多少 合适,这个漏磁量通过那些参数计算出来的,如果漏磁过大或者过小有什么影响
    发表于10-07 06:19

    C语言程序设计中动态内存分配如何实现

    C语言程序设计中,动态 内存 分配如何实现,需要注意哪些问题?
    发表于09-28 16:53 1069次阅读

    Linux内存方面的初始化和常见的内存分配方式

    | --- >mem_init linux4.14/init/main.c 在 mem_init 函数中会初始化伙伴系统和 slab 分配器。 先说两个概念: 外部碎片 :有一段小 内存,夹在两个大 内存中间,两个大
    的头像 发表于09-28 16:13 641次阅读
    Linux<b class='flag-5'>内存</b>方面的初始化和常见的<b class='flag-5'>内存</b><b class='flag-5'>分配</b>方式

    请问单片机运行时候内存是如何分配的?

    请问单片机运行时候 内存是如何 分配的? 是在链接脚本中人工定义?还是编译器根据某种算法自动 分配
    发表于09-27 08:16