FreeRTOS源码分析之heap2.c .

来源:互联网 发布:理财 大数据 组合 编辑:程序博客网 时间:2024/06/06 07:08


heap2和heap1一样,都是从.bss段定义一个数组,然后进行内存管理。

heap2比heap1厉害得地方在于维护了一个空闲块链表,从而实现既可以分配内存又可以释放内存。


BlockLink_t空闲块结构体:

节点结构体如下,pxNextFreeBlock表示下一个空闲块地址,xBlockSize表示该空闲块大小。


prvHeapInit函数:

和heap1一样,首先要进行自节对齐。但是heap2维护了一个空闲块链表,因此要对链表进行初始化。刚开始的时候,只有一个空闲块,指向ucHeap字节对齐后的地址pucAlignedHeap,大小为ucHeap字节对齐后的整个剩余空间configADJUSTED_HEAP_SIZE


pvPortMalloc函数:

在pvPortMalloc函数的源码中能够发现prvHeapInit函数是不需要主动调用的。在第一次使用pvPortMalloc函数时,会被自动调用。


和heap1中pvPortMalloc函数一样,要对xWantedSize进行字节对齐


然后就是,从空闲块链表中找到一个大小合适的空闲块出来。


将空闲块分配出去。


如果该空闲块远远大于想要分配的内存(远远大于的标准为两个空闲块结构体大小),则要把大于的部分分割出来,继续加入到空闲块链表中。并且更新剩余空间大小。


prvInsertBlockIntoFreeList函数:

prvInsertBlockIntoFreeList函数做的事情,就是将一块空闲块按从大到小的顺序插入到空闲链表中。



vPortFree函数:

heap2是可以释放内存的,通过把要释放的空间重新加入空闲链表来达到。按照从大到小的顺序进行插入,并没有将相邻空闲块合并,这使得空闲空间越来越碎,最终没有可用空间。


xPortGetFreeHeapSize函数:

xPortGetFreeHeapSize函数用来返回剩余空闲空间大小。

0 0