heap_1 内存管理阅读
直接数组向后一直申请,不支持释放
heap_2 内存管理阅读
除了不合并空闲块以外,其他和heap_4一样
heap_3 内存管理阅读
直接调用系统的malloc和free
heap_4 内存管理阅读
在创建任务时,会给TCB申请内存空间、给任务的栈申请空间、给状态链表申请空间;在使用队列以及信号量时,会给队列申请空间。申请空间时会调用vPortMalloc函数进行申请。下面就来介绍heap_4的管理机制。
首先根据FreeRTOSConfig.h文件下的configTOTAL_HEAP_SIZE大小定义一个unsigned char的数组,这个数组就是整个内存管理的整个堆空间。整个对空间使用类型为BlockList_t的链表进行维护。
在第一次调用vPortMalloc时,会先调用static void prvHeapInit( void )函数将整个RTOS的堆进行初始化,流程如下:

当堆初始化完成后,对数组这段内存的分块如下图:
| 字节对齐舍弃字节 | FirstFreeBlock | FreeHeap | pxEnd | 字节对齐舍弃字节 |
| xStart |
堆空间初始化完成后,继续进行堆内存申请的工作。流程如下:此时xStart.pxNextFreeBlock只想FirstFreeBlock。

申请完堆内存以后,内存表如下图:
| 字节对齐舍弃字节 | MallocedBlock | MallocedHeap |

最低0.47元/天 解锁文章
2626

被折叠的 条评论
为什么被折叠?



