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

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

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

    关注

    9

    文章

    3173

    浏览量

    76113
  • 堆栈
    +关注

    关注

    0

    文章

    183

    浏览量

    20420
  • FreeRTOS
    +关注

    关注

    14

    文章

    497

    浏览量

    66351
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FreeRTOS和uC/OS-II的功能特性

    /事件标志替代)。 内存管理: 提供多种内存分配方案(heap_1 到 heap_5)供选择,开发者也可以轻松集成自己的内存分配器。 Tic
    发表于 11-17 08:17

    FreeRTOS与uC/OS-II如何选择?

    是巨大优势)。 你使用的 MCU 厂商默认推荐或深度集成了 FreeRTOS。 你需要支持多核处理器 (SMP)。 你需要极大的灵活性(如自定义内存分配)。 项目需要快速启动和开发。 选择 uC
    发表于 11-13 07:15

    如何挑选合适的频标分配

    电子元器件分配仪器仪表
    西安同步电子科技有限公司
    发布于 :2025年10月14日 19:15:41

    FAQ_MA35_Family M4 RAM如何调整M4的内存分配

    FAQ_MA35_Family M4 RAM如何调整M4的内存分配
    发表于 09-02 06:07

    RTOS怎么实现共享内存

    K230的RTOS支持POSIX标准的共享内存吗 我尝试使用却失败 还是说需要源码部分配置的开启可以使用 求教大佬
    发表于 08-04 08:06

    【RA4L1-SENSOR】电压检测器第一个程序增加 FreeRTOS显示量程0-3300 mV和量程0-15000mV]

    ,Stack Size为256,优先级2,内存分配为Dynamic。展开内存分配可以修改Total Heap Size堆大小为30720 在线程配置上方是
    发表于 07-11 10:53

    超级电容阻值多少合适

    本文主要介绍了超级电容的核心参数——等效串联电阻(ESR),并讨论了如何在高功率脉冲设备和储能系统中找到合适的ESR值。此外,还提到了温度、电压和材料工艺对ESR的影响,并探讨了如何优化阻值的工程路径。
    的头像 发表于 07-03 09:36 772次阅读
    超级电容阻值多少<b class='flag-5'>才</b><b class='flag-5'>合适</b>?

    【RA4L1-SENSOR】04 用FreeRTOS重构工程

    内存块中分配内存,这对于系统内存不是连续块的情况非常有用。` 这里我选择Heap 4算法。 点击HAL/Common -- New Stack -- RTOS --
    发表于 06-16 22:28

    【RA-Eco-RA4M2开发板评测】RA-Eco-RA4M2 移植FreeRTOS

    Configuration->New Thread”即可新建一个任务。 Figure 2‑7 配置任务 Common是关于FreeRTOS的配置,Thread是新建线程的配置参数
    发表于 05-03 23:24

    如何使用LAX_CODEGEN启用动态内存分配

    我目前正在探索NXP_MBDToolbox_LAX。lax_codegen 生成的代码基于静态分配。我想管理大型向量,如何使用 LAX_CODEGEN 启用动态内存分配
    发表于 04-10 08:09

    如何查看S32DS中S32平台的内存分配

    大家好,我正在使用 s32DS for s32 平台,我想查看我的项目的内存分配。我想知道分配给对象的内存以及它们被分配到哪里,例如 SRA
    发表于 04-09 07:30

    golang内存分配

    作者:钱文 Go 的分配采用了类似 tcmalloc 的结构.特点: 使用一小块一小块的连续内存页, 进行分配某个范围大小的内存需求. 比如某个连续 8KB 专门用于
    的头像 发表于 03-31 15:00 383次阅读
    golang<b class='flag-5'>内存</b><b class='flag-5'>分配</b>

    嵌入式开发避坑指南|FreeRTOS的5个\"反直觉\"小技巧

    技巧1:堆内存配置不是越大越好! 进阶原理: FreeRTOS内存分配存在\"碎片黑洞\"现象,即使总内存充足,碎片化仍可能导致
    发表于 03-20 13:57

    stm32F407平台上使用freertos,使用pvPortMalloc申请内存,发现内存中的数据总被修改,怎么解决?

    如题,我现在在stm32F407平台上打开FREERTOS,然后使用pvPortMalloc动态申请内存的时候,发现这块内存中的数据总是变化,后面改为malloc申请,内存中的数据就符
    发表于 03-07 09:03

    【RA-Eco-RA4E2-64PIN-V1.0开发板试用】05、FreeRTOS

    于系统内存不是连续块的情况非常有用。` 这里我选择Heap 4算法。 点击LED1 -- New Stack -- RTOS -- FreeRTOS Heap4 接下来可能会报错,要开启动态内存
    发表于 12-17 11:53