79 #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
84 #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
87 #define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( heapSTRUCT_SIZE * 2 ) )
90 #define heapBITS_PER_BYTE ( ( size_t ) 8 )
93 #define heapADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT )
114 static void prvInsertBlockIntoFreeList(
BlockLink_t *pxBlockToInsert );
120 static void prvHeapInit(
void );
129 static const size_t xTotalHeapSize = ( ( size_t )
heapADJUSTED_HEAP_SIZE ) & ( ( size_t ) ~portBYTE_ALIGNMENT_MASK );
136 static size_t xFreeBytesRemaining = ( ( size_t )
heapADJUSTED_HEAP_SIZE ) & ( ( size_t ) ~portBYTE_ALIGNMENT_MASK );
137 static size_t xMinimumEverFreeBytesRemaining = ( ( size_t )
heapADJUSTED_HEAP_SIZE ) & ( ( size_t ) ~portBYTE_ALIGNMENT_MASK );
143 static size_t xBlockAllocatedBit = 0;
149 BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
150 void *pvReturn = NULL;
169 if( ( xWantedSize & xBlockAllocatedBit ) == 0 )
173 if( xWantedSize > 0 )
175 xWantedSize += heapSTRUCT_SIZE;
179 if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 )
194 if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )
198 pxPreviousBlock = &xStart;
202 pxPreviousBlock = pxBlock;
208 if( pxBlock != pxEnd )
212 pvReturn = (
void * ) ( ( ( uint8_t * ) pxPreviousBlock->
pxNextFreeBlock ) + heapSTRUCT_SIZE );
226 pxNewBlockLink = (
void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );
234 prvInsertBlockIntoFreeList( ( pxNewBlockLink ) );
243 if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )
245 xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;
276 #if( configUSE_MALLOC_FAILED_HOOK == 1 )
278 if( pvReturn == NULL )
296 uint8_t *puc = ( uint8_t * ) pv;
303 puc -= heapSTRUCT_SIZE;
306 pxLink = (
void * ) puc;
312 if( ( pxLink->
xBlockSize & xBlockAllocatedBit ) != 0 )
325 prvInsertBlockIntoFreeList( ( (
BlockLink_t * ) pxLink ) );
344 return xFreeBytesRemaining;
350 return xMinimumEverFreeBytesRemaining;
360 static void prvHeapInit(
void )
363 uint8_t *pucHeapEnd, *pucAlignedHeap;
375 pucHeapEnd = pucAlignedHeap + xTotalHeapSize;
376 pucHeapEnd -= heapSTRUCT_SIZE;
377 pxEnd = (
void * ) pucHeapEnd;
378 configASSERT( ( ( ( uint32_t ) pxEnd ) & ( ( uint32_t ) portBYTE_ALIGNMENT_MASK ) ) == 0UL );
379 pxEnd->xBlockSize = 0;
380 pxEnd->pxNextFreeBlock = NULL;
384 pxFirstFreeBlock = (
void * ) pucAlignedHeap;
385 pxFirstFreeBlock->
xBlockSize = xTotalHeapSize - heapSTRUCT_SIZE;
389 xFreeBytesRemaining -= heapSTRUCT_SIZE;
392 xBlockAllocatedBit = ( ( size_t ) 1 ) << ( (
sizeof( size_t ) *
heapBITS_PER_BYTE ) - 1 );
396 static void prvInsertBlockIntoFreeList(
BlockLink_t *pxBlockToInsert )
410 puc = ( uint8_t * ) pxIterator;
411 if( ( puc + pxIterator->
xBlockSize ) == ( uint8_t * ) pxBlockToInsert )
414 pxBlockToInsert = pxIterator;
423 puc = ( uint8_t * ) pxBlockToInsert;
446 if( pxIterator != pxBlockToInsert )
#define mtCOVERAGE_TEST_MARKER()
void vPortInitialiseBlocks(void)
void vTaskSuspendAll(void) PRIVILEGED_FUNCTION
size_t xPortGetMinimumEverFreeHeapSize(void)
#define heapMINIMUM_BLOCK_SIZE
struct A_BLOCK_LINK * pxNextFreeBlock
#define configTOTAL_HEAP_SIZE
#define heapBITS_PER_BYTE
#define heapADJUSTED_HEAP_SIZE
#define traceFREE(pvAddress, uiSize)
struct A_BLOCK_LINK BlockLink_t
void vApplicationMallocFailedHook(void)
FreeRTOS hook (or callback) functions that are defined in this file.
void * pvPortMalloc(size_t xWantedSize)
BaseType_t xTaskResumeAll(void) PRIVILEGED_FUNCTION
#define portPOINTER_SIZE_TYPE
#define portBYTE_ALIGNMENT
#define traceMALLOC(pvAddress, uiSize)
size_t xPortGetFreeHeapSize(void)