Init:
c
xStart.pxNextFreeBlock = ( void * ) uxStartAddress;
xStart.xBlockSize = ( size_t ) 0;
pxEnd= uxStartAddress + xTotalHeapSize - xHeapStructSize
pxEnd->xBlockSize = 0;
pxEnd->pxNextFreeBlock = NULL;
pxFirstFreeBlock = uxStartAddress;
pxFirstFreeBlock->xBlockSize = pxEnd - uxStartAddress;
pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
malloc:
c
xWantedSize += xHeapStructSize;
pxPreviousBlock = &xStart;
pxBlock = px First FreeBlock; //until first free block
pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; // pxblock 从freeblock list中剔除
pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );//新块位置
pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;//新块尺寸
pxNewBlockLink->pxNextFreeBlock = pxPreviousBlock->pxNextFreeBlock;//新块指向后方链表
pxPreviousBlock->pxNextFreeBlock = pxNewBlockLink;//新块被指向
pxBlock->xBlockSize = xWantedSize;//malloc之后的老块尺寸更新
heapALLOCATE_BLOCK( pxBlock );//标记为被使用
Free
c
puc = ( uint8_t * ) pv; puc -= xHeapStructSize;
pxLink = ( void * ) puc;
heapFREE_BLOCK( pxLink );
//找到第一个freeblock, 记录在pxIterator
for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock )
向前合并
c
puc = ( uint8_t * ) pxIterator;
if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) // 待freeblock 与 前一个freeblock相邻??
pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; //previous free block直接扩张
pxBlockToInsert = pxIterator;//变更pxBlockToInsert ,可能还需要与后面的freeblock合并
向后合并
c
puc = ( uint8_t * ) pxBlockToInsert;
if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) // 待freeblock 与 后一个freeblock相邻??
pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; //扩张
pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; 指向后面的后面
else
pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; //不可以向后合并, 那么更新next指针
pxIterator->pxNextFreeBlock = pxBlockToInsert;
