83 #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE 88 #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE 91 #define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) 94 #define heapBITS_PER_BYTE ( ( size_t ) 8 ) 97 #if( configAPPLICATION_ALLOCATED_HEAP == 1 ) 127 static void prvHeapInit(
void );
133 static const size_t xHeapStructSize = (
sizeof(
BlockLink_t ) + ( (
size_t ) (
portBYTE_ALIGNMENT - 1 ) ) ) & ~( (
size_t ) portBYTE_ALIGNMENT_MASK );
140 static size_t xFreeBytesRemaining = 0U;
141 static size_t xMinimumEverFreeBytesRemaining = 0U;
147 static size_t xBlockAllocatedBit = 0;
153 BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
154 void *pvReturn =
NULL;
173 if( ( xWantedSize & xBlockAllocatedBit ) == 0 )
177 if( xWantedSize > 0 )
179 xWantedSize += xHeapStructSize;
183 if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 )
187 configASSERT( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) == 0 );
199 if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )
203 pxPreviousBlock = &xStart;
207 pxPreviousBlock = pxBlock;
213 if( pxBlock != pxEnd )
217 pvReturn = (
void * ) ( ( ( uint8_t * ) pxPreviousBlock->
pxNextFreeBlock ) + xHeapStructSize );
231 pxNewBlockLink = (
void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );
232 configASSERT( ( ( (
size_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 );
236 pxNewBlockLink->xBlockSize = pxBlock->
xBlockSize - xWantedSize;
249 if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )
251 xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
282 #if( configUSE_MALLOC_FAILED_HOOK == 1 ) 284 if( pvReturn ==
NULL )
286 extern void vApplicationMallocFailedHook(
void );
287 vApplicationMallocFailedHook();
296 configASSERT( ( ( ( uint32_t ) pvReturn ) & portBYTE_ALIGNMENT_MASK ) == 0 );
303 uint8_t *puc = ( uint8_t * ) pv;
310 puc -= xHeapStructSize;
313 pxLink = (
void * ) puc;
319 if( ( pxLink->
xBlockSize & xBlockAllocatedBit ) != 0 )
351 return xFreeBytesRemaining;
357 return xMinimumEverFreeBytesRemaining;
367 static void prvHeapInit(
void )
370 uint8_t *pucAlignedHeap;
375 uxAddress = ( size_t ) ucHeap;
377 if( ( uxAddress & portBYTE_ALIGNMENT_MASK ) != 0 )
380 uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK );
381 xTotalHeapSize -= uxAddress - ( size_t ) ucHeap;
384 pucAlignedHeap = ( uint8_t * ) uxAddress;
393 uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize;
394 uxAddress -= xHeapStructSize;
395 uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK );
396 pxEnd = (
void * ) uxAddress;
402 pxFirstFreeBlock = (
void * ) pucAlignedHeap;
403 pxFirstFreeBlock->
xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock;
407 xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->
xBlockSize;
408 xFreeBytesRemaining = pxFirstFreeBlock->
xBlockSize;
411 xBlockAllocatedBit = ( ( size_t ) 1 ) << ( (
sizeof( size_t ) *
heapBITS_PER_BYTE ) - 1 );
429 puc = ( uint8_t * ) pxIterator;
430 if( ( puc + pxIterator->
xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
433 pxBlockToInsert = pxIterator;
442 puc = ( uint8_t * ) pxBlockToInsert;
465 if( pxIterator != pxBlockToInsert )
struct A_BLOCK_LINK * pxNextFreeBlock
#define mtCOVERAGE_TEST_MARKER()
void vPortInitialiseBlocks(void)
void vTaskSuspendAll(void) PRIVILEGED_FUNCTION
size_t xPortGetMinimumEverFreeHeapSize(void)
#define heapMINIMUM_BLOCK_SIZE
#define configTOTAL_HEAP_SIZE
#define prvInsertBlockIntoFreeList(pxBlockToInsert)
#define heapBITS_PER_BYTE
#define traceFREE(pvAddress, uiSize)
struct A_BLOCK_LINK BlockLink_t
void * pvPortMalloc(size_t xWantedSize)
BaseType_t xTaskResumeAll(void) PRIVILEGED_FUNCTION
#define portBYTE_ALIGNMENT
#define traceMALLOC(pvAddress, uiSize)
size_t xPortGetFreeHeapSize(void)