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字节)都完全够你用。

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

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

    关注

    8

    文章

    2767

    浏览量

    72774
  • 堆栈
    +关注

    关注

    0

    文章

    171

    浏览量

    19530
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61351
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

    FreeRTOS内存机制详解

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

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

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

    FreeRTOS内存管理实现

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

    FreeRTOS heap_5内存分配方法介绍

    heap_5 内存分配方法 heap_5 使用了和 heap_4 相同的合并算法,内存管理实现起来基本相同,但是 heap_5 允许内存堆跨越多个不连续的
    的头像 发表于 07-30 10:47 575次阅读

    heap_4内存分配方法介绍

    heap_4 内存分配方法 heap_4 提供了一个最优的匹配算法,不像 heap_2,heap_4 会将内存碎片合并成一个大的可用内存块,它提供了
    的头像 发表于 07-30 10:42 503次阅读

    FreeRTOS heap_3内存分配方法

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

    heap_2内存的特性与分配方法

    heap_2 内存分配方法 heap_2 提供了一个更好的分配算法,不像 heap_1那样,heap_2 提供了内存释放函数。heap_2 不会把释放的
    的头像 发表于 07-30 10:36 375次阅读

    heap_1内存分配方法

    heap_1 内存分配方法 动 态 内 存 分 配 需 要 一 个 内 存 堆 , FreeRTOS 中 的 内 存 堆 为 ucHeap
    的头像 发表于 07-30 10:33 378次阅读

    FreeRTOS内存碎片是怎么来的

    内存碎片 在看 FreeRTOS内存分配方法之前我们先来看一下什么叫做内存碎片,看名字就知道是小块的、碎片化的
    的头像 发表于 07-30 10:29 555次阅读
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>内存</b>碎片是怎么来的

    FreeRTOS内存管理简介

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

    S32K342控制器为什么只有27kB被分配为默认内存

    这是关于 S32K342 系列控制器的链接器脚本, 根据数据表的内存部分如下: a) PFLASH:2MB,DFlash:128kB b) SRAM:256 kB,包括 192 kB 的 TCM
    发表于 05-19 06:46

    S32G274A - FreeRTOS内存分配出现构建错误怎么解决?

    如果我尝试选择“支持动态分配”设置,则会出现构建错误。 能否帮忙确认下FreeRTOS支持动态分配选择? 以下是我的程序。 构建目标
    发表于 05-05 12:49