本篇讲heap_3.c、heap_4.c、heap_5.c
一、heap_3.c
heap_3.c里面简单粗暴,直接调用了标准c里的malloc 和 free
二、heap_4.c
xMinimumEverFreeBytesRemaining:heap的最小剩余量
xFreeBytesRemaining:heap剩余量
xBlockAllocatedBit:会被赋值为0x80000000, BlockLink_t中的xBlockSize最高位置1表示这篇内存被用过了
prvHeapInit
初始化完之后,链表数据结构:
prvInsertBlockIntoFreeList
heap_4相比heap_2多了一个内存整理的功能,会且仅会当两片内存首尾相等的时候,把这两片连续的内存拼接成一块,拼接方式分向前拼接和向后拼接
pvPortMalloc
vPortFree
三、heap_5.c
heap_5和heap_4的内存管理算法一样,heap_5允许内存堆跨越多个不连续的内存段。
使用方法:先定义一个HeapRegion_t类型的数组,数组的最后一个元素必须为NULL,然后调用vPortDefineHeapRegions()接口初始化。
假设 现在有三个内存段:CCM、内部SRAM、外部SDRAM,起始分别为:0X10000000、0X20000000、0XC0000000,大小分别为:32KB、192KB、32MB,那么使用方法就如下:
HeapRegion_t xHeapRegions[] = {
{ ( uint8_t * ) 0X10000000UL, 0x8000 }, //CCM内存,起始地址 0X10000000,大小 64KB
{ ( uint8_t * ) 0X20000000UL, 0x30000 }, //内部 SRAM内存,起始地址 0X20000000,
//大小为 192KB
{ ( uint8_t * ) 0XC0000000UL, 0x2000000},//外部 SDRAM内存,起始地址 0XC0000000
//大小为 32MB
{ NULL, 0 } //数组结尾
};
vPortDefineHeapRegions((const HeapRegion_t *)xHeapRegions);