43#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
48#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
50#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 )
51 #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0
54#ifndef configHEAP_CLEAR_MEMORY_ON_FREE
55 #define configHEAP_CLEAR_MEMORY_ON_FREE 0
59#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) )
62#define heapBITS_PER_BYTE ( ( size_t ) 8 )
65#define heapSIZE_MAX ( ~( ( size_t ) 0 ) )
68#define heapMULTIPLY_WILL_OVERFLOW( a, b ) ( ( ( a ) > 0 ) && ( ( b ) > ( heapSIZE_MAX / ( a ) ) ) )
71#define heapADD_WILL_OVERFLOW( a, b ) ( ( a ) > ( heapSIZE_MAX - ( b ) ) )
77#define heapBLOCK_ALLOCATED_BITMASK ( ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ) )
78#define heapBLOCK_SIZE_IS_VALID( xBlockSize ) ( ( ( xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) == 0 )
79#define heapBLOCK_IS_ALLOCATED( pxBlock ) ( ( ( pxBlock->xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) != 0 )
80#define heapALLOCATE_BLOCK( pxBlock ) ( ( pxBlock->xBlockSize ) |= heapBLOCK_ALLOCATED_BITMASK )
81#define heapFREE_BLOCK( pxBlock ) ( ( pxBlock->xBlockSize ) &= ~heapBLOCK_ALLOCATED_BITMASK )
86#if ( configAPPLICATION_ALLOCATED_HEAP == 1 )
123static const size_t xHeapStructSize = (
sizeof(
BlockLink_t ) + ( ( size_t ) (
portBYTE_ALIGNMENT - 1 ) ) ) & ~( (
size_t ) portBYTE_ALIGNMENT_MASK );
143 void * pvReturn =
NULL;
144 size_t xAdditionalRequiredSize;
159 if( xWantedSize > 0 )
165 xWantedSize += xHeapStructSize;
169 if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 )
172 xAdditionalRequiredSize =
portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK );
176 xWantedSize += xAdditionalRequiredSize;
204 if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )
208 pxPreviousBlock = &xStart;
213 pxPreviousBlock = pxBlock;
219 if( pxBlock != pxEnd )
223 pvReturn = (
void * ) ( ( ( uint8_t * ) pxPreviousBlock->
pxNextFreeBlock ) + xHeapStructSize );
237 pxNewBlockLink = (
void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );
238 configASSERT( ( ( (
size_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 );
242 pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;
243 pxBlock->xBlockSize = xWantedSize;
255 if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )
257 xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
268 xNumberOfSuccessfulAllocations++;
289 #if ( configUSE_MALLOC_FAILED_HOOK == 1 )
291 if( pvReturn ==
NULL )
302 configASSERT( ( ( (
size_t ) pvReturn ) & (
size_t ) portBYTE_ALIGNMENT_MASK ) == 0 );
309 uint8_t * puc = ( uint8_t * ) pv;
316 puc -= xHeapStructSize;
319 pxLink = (
void * ) puc;
331 #if ( configHEAP_CLEAR_MEMORY_ON_FREE == 1 )
333 ( void ) memset( puc + xHeapStructSize, 0, pxLink->
xBlockSize - xHeapStructSize );
343 xNumberOfSuccessfulFrees++;
362 return xFreeBytesRemaining;
368 return xMinimumEverFreeBytesRemaining;
389 ( void ) memset( pv, 0, xNum * xSize );
400 uint8_t * pucAlignedHeap;
407 if( ( uxAddress & portBYTE_ALIGNMENT_MASK ) != 0 )
414 pucAlignedHeap = ( uint8_t * ) uxAddress;
418 xStart.pxNextFreeBlock = (
void * ) pucAlignedHeap;
419 xStart.xBlockSize = ( size_t ) 0;
424 uxAddress -= xHeapStructSize;
427 pxEnd->xBlockSize = 0;
428 pxEnd->pxNextFreeBlock =
NULL;
432 pxFirstFreeBlock = (
BlockLink_t * ) pucAlignedHeap;
434 pxFirstFreeBlock->pxNextFreeBlock = pxEnd;
437 xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
438 xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;
456 puc = ( uint8_t * ) pxIterator;
458 if( ( puc + pxIterator->
xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
461 pxBlockToInsert = pxIterator;
470 puc = ( uint8_t * ) pxBlockToInsert;
494 if( pxIterator != pxBlockToInsert )
516 if( pxBlock !=
NULL )
518 while( pxBlock != pxEnd )
#define configTOTAL_HEAP_SIZE
#define portPOINTER_SIZE_TYPE
#define traceFREE(pvAddress, uiSize)
#define mtCOVERAGE_TEST_MARKER()
#define traceMALLOC(pvAddress, uiSize)
void vApplicationMallocFailedHook(void)
size_t xPortGetFreeHeapSize(void)
#define heapBLOCK_IS_ALLOCATED(pxBlock)
static void prvHeapInit(void)
#define heapADD_WILL_OVERFLOW(a, b)
struct A_BLOCK_LINK BlockLink_t
#define heapMULTIPLY_WILL_OVERFLOW(a, b)
void vPortInitialiseBlocks(void)
#define heapALLOCATE_BLOCK(pxBlock)
size_t xPortGetMinimumEverFreeHeapSize(void)
#define heapMINIMUM_BLOCK_SIZE
void vPortGetHeapStats(HeapStats_t *pxHeapStats)
static PRIVILEGED_DATA uint8_t ucHeap[configTOTAL_HEAP_SIZE]
static void prvInsertBlockIntoFreeList(BlockLink_t *pxBlockToInsert) PRIVILEGED_FUNCTION
void * pvPortCalloc(size_t xNum, size_t xSize)
#define heapBLOCK_SIZE_IS_VALID(xBlockSize)
#define heapFREE_BLOCK(pxBlock)
#define PRIVILEGED_FUNCTION
void * pvPortMalloc(size_t xSize) PRIVILEGED_FUNCTION
struct xHeapStats HeapStats_t
#define portBYTE_ALIGNMENT
struct A_BLOCK_LINK * pxNextFreeBlock
The next free block in the list.
size_t xBlockSize
The size of the free block.
size_t xNumberOfSuccessfulAllocations
size_t xNumberOfSuccessfulFrees
size_t xMinimumEverFreeBytesRemaining
size_t xAvailableHeapSpaceInBytes
size_t xSizeOfLargestFreeBlockInBytes
size_t xNumberOfFreeBlocks
size_t xSizeOfSmallestFreeBlockInBytes
BaseType_t xTaskResumeAll(void) PRIVILEGED_FUNCTION
void vTaskSuspendAll(void) PRIVILEGED_FUNCTION
#define taskEXIT_CRITICAL()
#define taskENTER_CRITICAL()