text: /*
  
  	FreeRTOS.org V4.0.5 - Copyright (C) 2003-2006 Richard Barry.
  
  
  
  	This file is part of the FreeRTOS.org distribution.
  
  
  
  	FreeRTOS.org is free software; you can redistribute it and/or modify
  
  	it under the terms of the GNU General Public License as published by
  
  	the Free Software Foundation; either version 2 of the License, or
  
  	(at your option) any later version.
  
  
  
  	FreeRTOS.org is distributed in the hope that it will be useful,
  
  	but WITHOUT ANY WARRANTY; without even the implied warranty of
  
  	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  
  	GNU General Public License for more details.
  
  
  
  	You should have received a copy of the GNU General Public License
  
  	along with FreeRTOS.org; if not, write to the Free Software
  
  	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  
  
  
  	A special exception to the GPL can be applied should you wish to distribute
  
  	a combined work that includes FreeRTOS.org, without being obliged to provide
  
  	the source code for any proprietary components.  See the licensing section 
  
  	of http://www.FreeRTOS.org for full details of how and when the exception
  
  	can be applied.
  
  
  
  	***************************************************************************
  
  	See http://www.FreeRTOS.org for documentation, latest information, license 
  
  	and contact details.  Please ensure to read the configuration and relevant 
  
  	port sections of the online documentation.
  
  	***************************************************************************
  
  */
  
  
  
  /* 
  
  
  
  Changes between V2.5.1 and V2.5.1
  
  
  
  	+ The memory pool has been defined within a struct to ensure correct memory
  
  	  alignment on 32bit systems.
  
  
  
  Changes between V2.6.1 and V3.0.0
  
  
  
  	+ An overflow check has been added to ensure the next free byte variable 
  
  	  does not wrap around.
  
  */
  
  
  
  
  
  /*
  
   * The simplest possible implementation of pvPortMalloc().  Note that this
  
   * implementation does NOT allow allocated memory to be freed again.
  
   *
  
   * See heap_2.c and heap_3.c for alternative implementations, and the memory
  
   * management pages of http://www.FreeRTOS.org for more information.
  
   */
  
  #include <stdlib.h>
  
  #include "FreeRTOS.h"
  
  #include "task.h"
  
  
  
  /* Setup the correct byte alignment mask for the defined byte alignment. */
  
  #if portBYTE_ALIGNMENT == 4
  
  	#define heapBYTE_ALIGNMENT_MASK	( ( size_t ) 0x0003 )
  
  #endif
  
  
  
  #if portBYTE_ALIGNMENT == 2
  
  	#define heapBYTE_ALIGNMENT_MASK	( ( size_t ) 0x0001 )
  
  #endif
  
  
  
  #if portBYTE_ALIGNMENT == 1 
  
  	#define heapBYTE_ALIGNMENT_MASK	( ( size_t ) 0x0000 )
  
  #endif
  
  
  
  #ifndef heapBYTE_ALIGNMENT_MASK
  
  	#error "Invalid portBYTE_ALIGNMENT definition"
  
  #endif
  
  
  
  /* Allocate the memory for the heap.  The struct is used to force byte
  
  alignment without using any non-portable code. */
  
  static struct xRTOS_HEAP
  
  {
  
  	unsigned portLONG ulDummy;
  
  	unsigned portCHAR ucHeap[ configTOTAL_HEAP_SIZE ];
  
  } xHeap;
  
  
  
  static size_t xNextFreeByte = ( size_t ) 0;
  
  /*-----------------------------------------------------------*/
  
  
  
  void *pvPortMalloc( size_t xWantedSize )
  
  {
  
  void *pvReturn = NULL; 
  
  
  
  	/* Ensure that blocks are always aligned to the required number of bytes. */
  
  	#if portBYTE_ALIGNMENT != 1
  
  		if( xWantedSize & heapBYTE_ALIGNMENT_MASK )
  
  		{
  
  			/* Byte alignment required. */
  
  			xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & heapBYTE_ALIGNMENT_MASK ) );
  
  		}
  
  	#endif
  
  
  
  	vTaskSuspendAll();
  
  	{
  
  		/* Check there is enough room left for the allocation. */
  
  		if( ( ( xNextFreeByte + xWantedSize ) < configTOTAL_HEAP_SIZE ) &&
  
  			( ( xNextFreeByte + xWantedSize ) > xNextFreeByte )	)/* Check for overflow. */
  
  		{
  
  			/* Return the next free byte then increment the index past this
  
  			block. */
  
  			pvReturn = &( xHeap.ucHeap[ xNextFreeByte ] );
  
  			xNextFreeByte += xWantedSize;			
  
  		}	
  
  	}
  
  	xTaskResumeAll();
  
  
  
  	return pvReturn;
  
  }
  
  /*-----------------------------------------------------------*/
  
  
  
  void vPortFree( void *pv )
  
  {
  
  	/* Memory cannot be freed using this scheme.  See heap_2.c and heap_3.c 
  
  	for alternative implementations, and the memory management pages of 
  
  	http://www.FreeRTOS.org for more information. */
  
  	( void ) pv;
  
  }
  
  /*-----------------------------------------------------------*/
  
  
  
  void vPortInitialiseBlocks( void )
  
  {
  
  	/* Only required when static memory is not cleared. */
  
  	xNextFreeByte = ( size_t ) 0;
  
  }
  
  
  
  
  
  