一.FreeRTOS 之五种内存分配方案
Heap_1:
(1).在此方案中,实现了基础版本的pcPortMalloc ,而没有实现vPortFree(),因此它适用于从来不会删除任务的应用
( 2) 动态分配的内存总是确定的 ,不会产生内存碎片
Heap_2:
该方案不同于方案1,它可以进行任务的删除,对空间进行释放,但是,它不能将相邻的两块相对小的空间进行合并,有可能造成内存碎片的问题,该方案在官方的文档中不推荐使用,它被Heap_4所代替
在图中,可以看出将任务释放之后,会有两块不一样大的空间,这是若创建队列,将可能占据原先的栈空间或TCB空间,再将队列删除之后就有可能将空间再变小,之后若删除队列,那么再次创建任务的时候就不能在原来那里开辟空间了,因此造成了内存碎片
所以该方案只适合于频繁删除,创建相同任务的应用
Heap_3:
在此方案中,pcPortMalloc(),vPortFree() 和原先的Malloc(),free()的区别是,前者保证了是线程安全的
Heap_4:
该方案是Heap_2的增强版,可以对可以合并两块相邻的内存空间,使之变大。
在图中我们可以看到在任务空间释放之后,又创建了队列,随之又创建了用户数据,之后,将队列,用户数据删除之后,又是还原回一块大的内存空间,因此该方案被推荐代替Heap_2
Heap_5:
该方案是对Heap_4,进行再次的增强,将不相邻的代码内存空间进行链接使用,变成更大的内存空间。
ref:
161204_Mastering_the_FreeRTOS_Real_Time_Kernel-A_Hands-On_Tutorial_Guide