FreeRTOS是动态分配内存吗?
内容提要
FreeRTOS中创建和删除任务时,使用的是静态分配的内存,而不是动态分配的内存。内存分配可以分为静态分配和动态分配两种方式。FreeRTOS的内存是在FreeRTOSConfig.h文件中分配的一个全局数组,创建任务、信号量、队列等都会调用这个堆栈。删除任务时会调用vPortFree()函数释放对应的内存。
延伸解读
FreeRTOS内存管理的本质
FreeRTOS的内存管理并非真正的动态分配,而是通过静态分配的全局数组来模拟动态分配。在FreeRTOSConfig.h中定义了一个全局数组作为堆,所有创建任务、信号量、队列等操作都从这个数组中分配内存。这种设计避免了标准malloc的碎片和不确定性,适合嵌入式实时系统。
静态与动态分配的区别
静态分配在编译时确定内存空间,如全局变量和栈;动态分配在运行时进行,如局部变量和malloc。FreeRTOS使用静态分配的全局数组,但通过pvPortMalloc和vPortFree函数在运行时管理内存,实现了类似动态分配的效果,同时保持了内存的确定性和可控性。
FreeRTOS内存操作的实际流程
创建任务时,xTaskCreate调用pvPortMalloc从全局数组ucHeap中分配内存,包括任务控制块和栈空间。删除任务时,vPortFree释放相应内存回堆中。这种机制允许任务动态创建和删除,但底层内存始终来自静态数组,不会向系统申请额外内存。
Q&A
FreeRTOS 创建和删除任务时使用的是动态分配内存吗?
不是。FreeRTOS 创建和删除任务时使用的是静态分配的内存,而不是动态分配的内存。它只是模拟了动态分配的方式,实际内存是静态分配的。
FreeRTOS 的内存是在哪里分配的?
FreeRTOS 的内存是在 FreeRTOSConfig.h 文件中分配的一个全局数组,这个内存大小由用户自己根据情况分配。
FreeRTOS 创建任务时调用了哪个函数来分配内存?
FreeRTOS 创建任务时调用了 pvPortMalloc 函数分配内存,这是系统自定义的函数,并非标准的 malloc 函数。
FreeRTOS 删除任务时如何释放内存?
FreeRTOS 删除任务时会调用 vPortFree() 函数释放对应的内存,这里会牵涉到任务控制块(TCB)。
静态分配内存和动态分配内存有什么区别?
静态分配内存在编译时就已经为内存分配了空间,比如启动时分配栈内存、定义静态变量和全局变量等。动态分配内存是在运行时根据需要分配,常见的如局部变量和 malloc() 函数,但不建议使用 malloc()。
为什么不建议使用 malloc() 动态分配内存?
因为存在一些弊端,比如忘记使用 free() 释放内存,还有就是容易产生“内存碎片”等。