背景知识
从FreeRTOS V9.0.0内核版本开始,内核对象占用的内存可以在编译期间静态分配,也可以在运行期间动态分配。内核对象如:tasks(任务),queues(队列),semaphores(信号量)和event groups(事件组)。为了让FreeRTOS更易于使用,新版内核对象都不是在编译期间静态分配的,而是在运行时动态分配。在通常的情况下,FreeRTOS使用一个全局字节数组作为堆内存池,每次一个内核对象创建时,FreeRTOS就会在这个堆上分配内存,当对内核象销毁时,内核又会释放对象所占的内存。这种原则使得FreeRTOS的设计更加简明,内核API更易于使用。所以这里就涉及到了FreeRTOS中动态内存分配的问题,它到底是如何实现的呢?
动态内存分配是C语言编程中的一个概念,而不是FreeRTOS或者多任务里面的特有的概念。FreeRTOS需要涉及到动态内存分配是因为内核对象是动态构造的。在通用的C语言编程环境里,我们可以使用标准库中的malloc()和free()来进行动态内存分配的操作,但这些函数对于实时应用(real-time application)是不合适的,原因有如下几点:
- 在嵌入式系统中他们不总是可