这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 软件与操作系统 » FreeRTOS是动态分配内存吗?

共8条 1/1 1 跳转至

FreeRTOS是动态分配内存吗?

高工
2023-02-11 19:54:33     打赏
有读者大概问了这么一个问题: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.png


数组(堆栈)ucHeap:

image.png


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

2.创建任务

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


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

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


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

image.png    


这是系统自定义的函数,并非标准的malloc函数。
看似是在“动态分配内存”,实际是在“瓜分”上面定义的全局数组(堆栈)。

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

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

3.删除任务

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


image.png


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

FreeRTOS是动态分配内存吗?

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


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





关键词: FreeRTOS     动态     分配     内存    

专家
2023-03-03 13:04:07     打赏
2楼

谢谢分享


高工
2023-03-03 13:18:31     打赏
3楼

感谢楼主分享


专家
2023-03-03 16:13:34     打赏
4楼

感谢分享


高工
2023-03-03 17:00:17     打赏
5楼

谢谢分享


高工
2023-03-04 20:37:41     打赏
6楼

感谢分享


专家
2023-03-07 08:55:42     打赏
7楼

谢谢分享


院士
2023-03-07 08:54:51     打赏
8楼

谢谢分享


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]