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

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

3天内不再提示

FreeRTOS内存是动态分配吗?

strongerHuang 来源:嵌入式专栏 作者:嵌入式专栏 2023-03-24 09:55 次阅读

你可能会好奇:FreeRTOS可以创建任务,也可以删除任务,它是动态分配的内存吗?

xTaskCreate(LED_Task, "LED_Task", 128, NULL, 6, NULL);

这个问题如果要细说,牵涉到的知识点比较多,下面挑几个重要相关的内容来解答这个问题。

内存静态和动态分配

内存分配一般分为:静态和动态分配。

1.静态分配内存

什么叫静态分配内存?

简单来说,就是在编译的时候就分配的内存。你可以理解为芯片上电,指定的某区域(地址)内存就被占用了。

一般有几种情况,比如:

启动分配堆栈:

Stack_Size    EQU     0x400

定义一个静态变量,这个就是最好理解的一个例子:

static int a;

定义一个全局变量/数组等:

intchar;

2.动态分配内存

什么叫动态分配内存? 与静态分配对应,动态就是不确定在某个时刻分配的内存。 最常见的就是某个函数定义一个局部变量,如果这个函数被调用,就会临时分配一个内存空间给这个变量,执行完函数,这个内存就被释放了。

void UART_Send(char *p)
{
  char buf[10];
  //......
}
还有一个经典的就是 malloc() 动态分配内存函数,这个函数对于普通开发者一般不建议使用,因为存在一些“弊端”。 比如:忘记使用 free() 释放内存,还有就是容易产生“内存碎片”等。

梳理FreeRTOS内存分配

1.全局数组(堆栈)

FreeRTOS的内存是在 FreeRTOSConfig.h 文件分配的一个全局数组,这个内存大小由用户自己根据情况分配,比如:

#define configTOTAL_HEAP_SIZE     ((size_t)(10 * 1024))

33ce5790-c985-11ed-bfe3-dac502259ad0.png

数组(堆栈)ucHeap:

33ebf3c2-c985-11ed-bfe3-dac502259ad0.png

这个数组是 FreeRTOS 系统的“堆栈”,创建任务、信号量、队列等都会调用这个堆栈。

2.创建任务

FreeRTOS创建任务,分配堆栈大小,比如:128“字”

xTaskCreate(LED_Task, "LED_Task", 128, NULL, 6, NULL);

提醒:这里“字”是单位,比如:uint32_t

通过进一步追踪代码,你会发现在“创建任务”函数中调用了【pvPortMalloc】函数分配内存。

34011220-c985-11ed-bfe3-dac502259ad0.png

这是系统自定义的函数,并非标准的malloc函数。 看似是在“动态分配内存”,实际是在“瓜分”上面定义的全局数组(堆栈)。 具体如何“瓜分”的,可以参看“heap_4.c”源代码(通过我们使用“heap_4.c”内存分配方式,如果其他的可以参看对应的源码)。 其他创建信号量、队列也是类似原理。

3.删除任务

FreeRTOS删除任务,会调用“vPortFree()”函数释放对应的内存。

3412c9ac-c985-11ed-bfe3-dac502259ad0.png

这里会牵涉到 TCB(任务控制块),就是任务相关的这一块数据。(这里不细说,后面有机会再说)。

FreeRTOS是动态分配内存吗?

看到这里,你能回答开篇这个问题了吗?

答案:FreeRTOS不是动态分配内存,只是模拟了动态分配的方式,实际的内存是静态分配的。

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

    关注

    8

    文章

    2760

    浏览量

    72694
  • 函数
    +关注

    关注

    3

    文章

    3859

    浏览量

    61297
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61336
  • 编译
    +关注

    关注

    0

    文章

    611

    浏览量

    32358
  • 动态分配
    +关注

    关注

    0

    文章

    5

    浏览量

    9691

原文标题:FreeRTOS内存是动态分配吗?

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言既然可以自动为变量分配内存,为什么还要用动态分配内存呢?

    不知道大家在学习C语言动态分配内存的时候有没有过这样的疑问,既然系统可以自动帮我们分配内存,为什么还需要我们程序员自己去分配
    发表于 12-13 11:14 754次阅读

    怎么在LL2和DDR3上用malloc同时动态分配内存

    程序中需要用malloc动态分配两块内存,分别在LL2和DDR3上,请问用cmd动态分配的空间都是在.sysmem里面吗?怎么在两块内存中都动态
    发表于 06-21 09:29

    请教关于在堆区的动态分配内存问题

    ;]CmplxSgn_t;在定义信号之后会动态分配一段arrayLen长的内存给ptSignalArray,在信号的使命结束后会把内存释放掉。但是俺刚接触dsp不久,有资料说频繁的申请/释放
    发表于 08-07 08:29

    请问使用动态内存分配安全吗?

    在使用完毕后,需要显式的释放之,这就要求程序员对动态分配内存了然于胸。在非常重视安全(safety-critical)的嵌入式C语言程序开发中,动态内存分配广泛被认为是禁忌。使用C语
    发表于 12-15 06:10

    使用动态内存分配安全吗

    安全吗?”为了更加安全稳定,美国军方禁止在C语言程序中使用malloc()使用动态内存分配安全吗?在C语言程序开发中,动态内存分配允许程序在运行时向系统申请
    发表于 12-15 07:44

    可以使用malloc()和free()这两个函数动态分配内存和释放内存

    在ANSI C中,可以使用malloc()和free()这两个函数动态分配内存和释放内存,但是,在嵌入式操作系统中,调用malloc()和free()(不可重入函数)却是很危险的(由于多任务,有
    发表于 12-17 08:26

    CH545芯片可以使用malloc函数进行内存动态分配嘛?

    如题,请问贵公司的单片机芯片(如CH545)可以使用malloc函数进行内存动态分配嘛?
    发表于 06-24 12:46

    请问没有MMU的ARM芯片是否支持使用malloc()函数动态分配内存呢?

    请问没有MMU的ARM芯片是否支持使用malloc()函数动态分配内存呢?求解答|
    发表于 10-17 15:41

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

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

    LPCXpresso55S16如何从闪存中动态分配内存

    我正在使用 LPCXpresso55S16,我想从闪存中动态分配内存,向其中写入数据,从中读取数据,并在需要时释放它。是否有教程或任何人都可以帮助我吗?
    发表于 06-09 06:57

    动态分配内存知识

    最近学习动态分配内存 这个程序是我自己编的,呵呵,好有成就感啊... #include stdio.h/*Feng原创...*/ #define N 2 char *GetCity(void
    发表于 05-28 15:27 99次下载

    零矢量动态分配的-直接转矩控制

    零矢量动态分配的-直接转矩控制
    发表于 01-21 11:49 1次下载

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

    FreeRTOS内存分配多少才合适
    的头像 发表于 03-06 15:04 1.7w次阅读

    51单片机内存动态分配

    51单片机内存动态分配序言最近玩51单片机碰到一个问题,51中malloc函数并不能像在PC上一样正常运行,这涉及到了内存池的概念。下面就来演示一下如何在单片机上也可正常使用动态内存
    发表于 11-12 14:36 11次下载
    51单片机<b class='flag-5'>内存</b><b class='flag-5'>动态分配</b>

    C语言怎么建立内存动态分配

    在C语言中,全局变量是分配在内存中的静态存储区的,非静态的局部变量,包括形参是分配在内存中的动态存储区的,这个存储区是一个“栈”的区域。
    的头像 发表于 03-10 15:30 648次阅读