良许Linux教程网 干货合集 FreeRTOS是动态分配内存吗?

FreeRTOS是动态分配内存吗?

有读者可能会有这样一个问题:FreeRTOS中创建和删除任务时,是否使用的是动态分配的内存?

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

这个问题涉及到多个相关的知识点,以下选取几个重要的内容来回答这个问题。

内存的静态分配和动态分配

内存分配通常可以分为静态分配和动态分配两种方式。

1. 静态分配内存

什么是静态分配内存呢?

简单来说,静态分配指的是在编译时就已经为内存分配了空间。可以把它理解为在芯片上通电后,某个指定的地址范围内的内存就被分配出来了。

一般有几种情况需要静态分配内存,比如:

  • 启动时分配栈内存:
Stack_Size    EQU     0x400

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

static int a;

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

int char;

2.动态分配内存

什么叫动态分配内存?

与静态分配对应,动态就是不确定在某个时刻分配的内存。

最常见的就是某个函数定义一个局部变量,如果这个函数被调用,就会临时分配一个内存空间给这个变量,执行完函数,这个内存就被释放了。

void UART_Send(char *p)
{
  char buf[10];
  //......
}

还有一个经典的就是 malloc() 动态分配内存函数,这个函数对于普通开发者一般不建议使用,因为存在一些“弊端”。

比如:忘记使用 free() 释放内存,还有就是容易产生“内存碎片”等。

梳理FreeRTOS内存分配

1.全局数组(堆栈)

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

#define configTOTAL_HEAP_SIZE     ((size_t)(10 * 1024))
image-20240207222822265
image-20240207222822265

数组(堆栈)ucHeap:

image-20240207222825597
image-20240207222825597

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

2.创建任务

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

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

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

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

image-20240207222828578
image-20240207222828578

这是系统自定义的函数,并非标准的malloc函数。

看似是在“动态分配内存”,实际是在“瓜分”上面定义的全局数组(堆栈)。

具体如何“瓜分”的,可以参看“heap_4.c”源代码(通过我们使用“heap_4.c”内存分配方式,如果其他的可以参看对应的源码)。

其他创建信号量、队列也是类似原理。

3.删除任务

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

image-20240207222832216
image-20240207222832216

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

FreeRTOS是动态分配内存吗?

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

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

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部