Remove the files from the SAM4S demo that are copied using the CreateProjectDirectoryStructure.bat batch file.
diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/BlockQ.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/BlockQ.c
deleted file mode 100644
index bc99bcb..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/BlockQ.c
+++ /dev/null
@@ -1,321 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-/*

- * Creates six tasks that operate on three queues as follows:

- *

- * The first two tasks send and receive an incrementing number to/from a queue.

- * One task acts as a producer and the other as the consumer.  The consumer is a

- * higher priority than the producer and is set to block on queue reads.  The queue

- * only has space for one item - as soon as the producer posts a message on the

- * queue the consumer will unblock, pre-empt the producer, and remove the item.

- *

- * The second two tasks work the other way around.  Again the queue used only has

- * enough space for one item.  This time the consumer has a lower priority than the

- * producer.  The producer will try to post on the queue blocking when the queue is

- * full.  When the consumer wakes it will remove the item from the queue, causing

- * the producer to unblock, pre-empt the consumer, and immediately re-fill the

- * queue.

- *

- * The last two tasks use the same queue producer and consumer functions.  This time the queue has

- * enough space for lots of items and the tasks operate at the same priority.  The

- * producer will execute, placing items into the queue.  The consumer will start

- * executing when either the queue becomes full (causing the producer to block) or

- * a context switch occurs (tasks of the same priority will time slice).

- *

- */

-

-/*

-

-Changes from V4.1.1

-

-	+ The second set of tasks were created the wrong way around.  This has been

-	  corrected.

-*/

-

-

-#include <stdlib.h>

-

-/* Scheduler include files. */

-#include "FreeRTOS.h"

-#include "task.h"

-#include "queue.h"

-

-/* Demo program include files. */

-#include "BlockQ.h"

-

-#define blckqSTACK_SIZE		configMINIMAL_STACK_SIZE

-#define blckqNUM_TASK_SETS	( 3 )

-

-/* Structure used to pass parameters to the blocking queue tasks. */

-typedef struct BLOCKING_QUEUE_PARAMETERS

-{

-	xQueueHandle xQueue;					/*< The queue to be used by the task. */

-	portTickType xBlockTime;				/*< The block time to use on queue reads/writes. */

-	volatile short *psCheckVariable;	/*< Incremented on each successful cycle to check the task is still running. */

-} xBlockingQueueParameters;

-

-/* Task function that creates an incrementing number and posts it on a queue. */

-static portTASK_FUNCTION_PROTO( vBlockingQueueProducer, pvParameters );

-

-/* Task function that removes the incrementing number from a queue and checks that

-it is the expected number. */

-static portTASK_FUNCTION_PROTO( vBlockingQueueConsumer, pvParameters );

-

-/* Variables which are incremented each time an item is removed from a queue, and

-found to be the expected value.

-These are used to check that the tasks are still running. */

-static volatile short sBlockingConsumerCount[ blckqNUM_TASK_SETS ] = { ( unsigned short ) 0, ( unsigned short ) 0, ( unsigned short ) 0 };

-

-/* Variable which are incremented each time an item is posted on a queue.   These

-are used to check that the tasks are still running. */

-static volatile short sBlockingProducerCount[ blckqNUM_TASK_SETS ] = { ( unsigned short ) 0, ( unsigned short ) 0, ( unsigned short ) 0 };

-

-/*-----------------------------------------------------------*/

-

-void vStartBlockingQueueTasks( unsigned portBASE_TYPE uxPriority )

-{

-xBlockingQueueParameters *pxQueueParameters1, *pxQueueParameters2;

-xBlockingQueueParameters *pxQueueParameters3, *pxQueueParameters4;

-xBlockingQueueParameters *pxQueueParameters5, *pxQueueParameters6;

-const unsigned portBASE_TYPE uxQueueSize1 = 1, uxQueueSize5 = 5;

-const portTickType xBlockTime = ( portTickType ) 1000 / portTICK_RATE_MS;

-const portTickType xDontBlock = ( portTickType ) 0;

-

-	/* Create the first two tasks as described at the top of the file. */

-	

-	/* First create the structure used to pass parameters to the consumer tasks. */

-	pxQueueParameters1 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) );

-

-	/* Create the queue used by the first two tasks to pass the incrementing number.

-	Pass a pointer to the queue in the parameter structure. */

-	pxQueueParameters1->xQueue = xQueueCreate( uxQueueSize1, ( unsigned portBASE_TYPE ) sizeof( unsigned short ) );

-

-	/* The consumer is created first so gets a block time as described above. */

-	pxQueueParameters1->xBlockTime = xBlockTime;

-

-	/* Pass in the variable that this task is going to increment so we can check it

-	is still running. */

-	pxQueueParameters1->psCheckVariable = &( sBlockingConsumerCount[ 0 ] );

-		

-	/* Create the structure used to pass parameters to the producer task. */

-	pxQueueParameters2 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) );

-

-	/* Pass the queue to this task also, using the parameter structure. */

-	pxQueueParameters2->xQueue = pxQueueParameters1->xQueue;

-

-	/* The producer is not going to block - as soon as it posts the consumer will

-	wake and remove the item so the producer should always have room to post. */

-	pxQueueParameters2->xBlockTime = xDontBlock;

-

-	/* Pass in the variable that this task is going to increment so we can check

-	it is still running. */

-	pxQueueParameters2->psCheckVariable = &( sBlockingProducerCount[ 0 ] );

-

-

-	/* Note the producer has a lower priority than the consumer when the tasks are

-	spawned. */

-	xTaskCreate( vBlockingQueueConsumer, ( signed char * ) "QConsB1", blckqSTACK_SIZE, ( void * ) pxQueueParameters1, uxPriority, NULL );

-	xTaskCreate( vBlockingQueueProducer, ( signed char * ) "QProdB2", blckqSTACK_SIZE, ( void * ) pxQueueParameters2, tskIDLE_PRIORITY, NULL );

-

-	

-

-	/* Create the second two tasks as described at the top of the file.   This uses

-	the same mechanism but reverses the task priorities. */

-

-	pxQueueParameters3 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) );

-	pxQueueParameters3->xQueue = xQueueCreate( uxQueueSize1, ( unsigned portBASE_TYPE ) sizeof( unsigned short ) );

-	pxQueueParameters3->xBlockTime = xDontBlock;

-	pxQueueParameters3->psCheckVariable = &( sBlockingProducerCount[ 1 ] );

-

-	pxQueueParameters4 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) );

-	pxQueueParameters4->xQueue = pxQueueParameters3->xQueue;

-	pxQueueParameters4->xBlockTime = xBlockTime;

-	pxQueueParameters4->psCheckVariable = &( sBlockingConsumerCount[ 1 ] );

-

-	xTaskCreate( vBlockingQueueConsumer, ( signed char * ) "QConsB3", blckqSTACK_SIZE, ( void * ) pxQueueParameters3, tskIDLE_PRIORITY, NULL );

-	xTaskCreate( vBlockingQueueProducer, ( signed char * ) "QProdB4", blckqSTACK_SIZE, ( void * ) pxQueueParameters4, uxPriority, NULL );

-

-

-

-	/* Create the last two tasks as described above.  The mechanism is again just

-	the same.  This time both parameter structures are given a block time. */

-	pxQueueParameters5 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) );

-	pxQueueParameters5->xQueue = xQueueCreate( uxQueueSize5, ( unsigned portBASE_TYPE ) sizeof( unsigned short ) );

-	pxQueueParameters5->xBlockTime = xBlockTime;

-	pxQueueParameters5->psCheckVariable = &( sBlockingProducerCount[ 2 ] );

-

-	pxQueueParameters6 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) );

-	pxQueueParameters6->xQueue = pxQueueParameters5->xQueue;

-	pxQueueParameters6->xBlockTime = xBlockTime;

-	pxQueueParameters6->psCheckVariable = &( sBlockingConsumerCount[ 2 ] );	

-

-	xTaskCreate( vBlockingQueueProducer, ( signed char * ) "QProdB5", blckqSTACK_SIZE, ( void * ) pxQueueParameters5, tskIDLE_PRIORITY, NULL );

-	xTaskCreate( vBlockingQueueConsumer, ( signed char * ) "QConsB6", blckqSTACK_SIZE, ( void * ) pxQueueParameters6, tskIDLE_PRIORITY, NULL );

-}

-/*-----------------------------------------------------------*/

-

-static portTASK_FUNCTION( vBlockingQueueProducer, pvParameters )

-{

-unsigned short usValue = 0;

-xBlockingQueueParameters *pxQueueParameters;

-short sErrorEverOccurred = pdFALSE;

-

-	pxQueueParameters = ( xBlockingQueueParameters * ) pvParameters;

-

-	for( ;; )

-	{		

-		if( xQueueSend( pxQueueParameters->xQueue, ( void * ) &usValue, pxQueueParameters->xBlockTime ) != pdPASS )

-		{

-			sErrorEverOccurred = pdTRUE;

-		}

-		else

-		{

-			/* We have successfully posted a message, so increment the variable

-			used to check we are still running. */

-			if( sErrorEverOccurred == pdFALSE )

-			{

-				( *pxQueueParameters->psCheckVariable )++;

-			}

-

-			/* Increment the variable we are going to post next time round.  The

-			consumer will expect the numbers to	follow in numerical order. */

-			++usValue;

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-static portTASK_FUNCTION( vBlockingQueueConsumer, pvParameters )

-{

-unsigned short usData, usExpectedValue = 0;

-xBlockingQueueParameters *pxQueueParameters;

-short sErrorEverOccurred = pdFALSE;

-

-	pxQueueParameters = ( xBlockingQueueParameters * ) pvParameters;

-

-	for( ;; )

-	{	

-		if( xQueueReceive( pxQueueParameters->xQueue, &usData, pxQueueParameters->xBlockTime ) == pdPASS )

-		{

-			if( usData != usExpectedValue )

-			{

-				/* Catch-up. */

-				usExpectedValue = usData;

-

-				sErrorEverOccurred = pdTRUE;

-			}

-			else

-			{

-				/* We have successfully received a message, so increment the

-				variable used to check we are still running. */	

-				if( sErrorEverOccurred == pdFALSE )

-				{

-					( *pxQueueParameters->psCheckVariable )++;

-				}

-							

-				/* Increment the value we expect to remove from the queue next time

-				round. */

-				++usExpectedValue;

-			}			

-		}		

-	}

-}

-/*-----------------------------------------------------------*/

-

-/* This is called to check that all the created tasks are still running. */

-portBASE_TYPE xAreBlockingQueuesStillRunning( void )

-{

-static short sLastBlockingConsumerCount[ blckqNUM_TASK_SETS ] = { ( unsigned short ) 0, ( unsigned short ) 0, ( unsigned short ) 0 };

-static short sLastBlockingProducerCount[ blckqNUM_TASK_SETS ] = { ( unsigned short ) 0, ( unsigned short ) 0, ( unsigned short ) 0 };

-portBASE_TYPE xReturn = pdPASS, xTasks;

-

-	/* Not too worried about mutual exclusion on these variables as they are 16

-	bits and we are only reading them. We also only care to see if they have

-	changed or not.

-	

-	Loop through each check variable to and return pdFALSE if any are found not

-	to have changed since the last call. */

-

-	for( xTasks = 0; xTasks < blckqNUM_TASK_SETS; xTasks++ )

-	{

-		if( sBlockingConsumerCount[ xTasks ] == sLastBlockingConsumerCount[ xTasks ]  )

-		{

-			xReturn = pdFALSE;

-		}

-		sLastBlockingConsumerCount[ xTasks ] = sBlockingConsumerCount[ xTasks ];

-

-

-		if( sBlockingProducerCount[ xTasks ] == sLastBlockingProducerCount[ xTasks ]  )

-		{

-			xReturn = pdFALSE;

-		}

-		sLastBlockingProducerCount[ xTasks ] = sBlockingProducerCount[ xTasks ];

-	}

-

-	return xReturn;

-}

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/GenQTest.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/GenQTest.c
deleted file mode 100644
index 1d2ea76..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/GenQTest.c
+++ /dev/null
@@ -1,585 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-

-/* 

- * Tests the extra queue functionality introduced in FreeRTOS.org V4.5.0 - 

- * including xQueueSendToFront(), xQueueSendToBack(), xQueuePeek() and 

- * mutex behaviour. 

- *

- * See the comments above the prvSendFrontAndBackTest() and 

- * prvLowPriorityMutexTask() prototypes below for more information.

- */

-

-

-#include <stdlib.h>

-

-/* Scheduler include files. */

-#include "FreeRTOS.h"

-#include "task.h"

-#include "queue.h"

-#include "semphr.h"

-

-/* Demo program include files. */

-#include "GenQTest.h"

-

-#define genqQUEUE_LENGTH		( 5 )

-#define genqNO_BLOCK			( 0 )

-

-#define genqMUTEX_LOW_PRIORITY		( tskIDLE_PRIORITY )

-#define genqMUTEX_TEST_PRIORITY		( tskIDLE_PRIORITY + 1 )

-#define genqMUTEX_MEDIUM_PRIORITY	( tskIDLE_PRIORITY + 2 )

-#define genqMUTEX_HIGH_PRIORITY		( tskIDLE_PRIORITY + 3 )

-

-/*-----------------------------------------------------------*/

-

-/*

- * Tests the behaviour of the xQueueSendToFront() and xQueueSendToBack()

- * macros by using both to fill a queue, then reading from the queue to

- * check the resultant queue order is as expected.  Queue data is also

- * peeked.

- */

-static void prvSendFrontAndBackTest( void *pvParameters );

-

-/*

- * The following three tasks are used to demonstrate the mutex behaviour.

- * Each task is given a different priority to demonstrate the priority

- * inheritance mechanism.

- *

- * The low priority task obtains a mutex.  After this a high priority task

- * attempts to obtain the same mutex, causing its priority to be inherited

- * by the low priority task.  The task with the inherited high priority then

- * resumes a medium priority task to ensure it is not blocked by the medium

- * priority task while it holds the inherited high priority.  Once the mutex

- * is returned the task with the inherited priority returns to its original

- * low priority, and is therefore immediately preempted by first the high

- * priority task and then the medium prioroity task before it can continue.

- */

-static void prvLowPriorityMutexTask( void *pvParameters );

-static void prvMediumPriorityMutexTask( void *pvParameters );

-static void prvHighPriorityMutexTask( void *pvParameters );

-

-/*-----------------------------------------------------------*/

-

-/* Flag that will be latched to pdTRUE should any unexpected behaviour be

-detected in any of the tasks. */

-static portBASE_TYPE xErrorDetected = pdFALSE;

-

-/* Counters that are incremented on each cycle of a test.  This is used to

-detect a stalled task - a test that is no longer running. */

-static volatile unsigned portLONG ulLoopCounter = 0;

-static volatile unsigned portLONG ulLoopCounter2 = 0;

-

-/* The variable that is guarded by the mutex in the mutex demo tasks. */

-static volatile unsigned portLONG ulGuardedVariable = 0;

-

-/* Handles used in the mutext test to suspend and resume the high and medium

-priority mutex test tasks. */

-static xTaskHandle xHighPriorityMutexTask, xMediumPriorityMutexTask;

-

-/*-----------------------------------------------------------*/

-

-void vStartGenericQueueTasks( unsigned portBASE_TYPE uxPriority )

-{

-xQueueHandle xQueue;

-xSemaphoreHandle xMutex;

-

-	/* Create the queue that we are going to use for the

-	prvSendFrontAndBackTest demo. */

-	xQueue = xQueueCreate( genqQUEUE_LENGTH, sizeof( unsigned portLONG ) );

-

-	/* vQueueAddToRegistry() adds the queue to the queue registry, if one is

-	in use.  The queue registry is provided as a means for kernel aware 

-	debuggers to locate queues and has no purpose if a kernel aware debugger

-	is not being used.  The call to vQueueAddToRegistry() will be removed

-	by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is 

-	defined to be less than 1. */

-	vQueueAddToRegistry( xQueue, ( signed portCHAR * ) "Gen_Queue_Test" );

-

-	/* Create the demo task and pass it the queue just created.  We are

-	passing the queue handle by value so it does not matter that it is

-	declared on the stack here. */

-	xTaskCreate( prvSendFrontAndBackTest, ( signed portCHAR * )"GenQ", configMINIMAL_STACK_SIZE, ( void * ) xQueue, uxPriority, NULL );

-

-	/* Create the mutex used by the prvMutexTest task. */

-	xMutex = xSemaphoreCreateMutex();

-

-	/* vQueueAddToRegistry() adds the mutex to the registry, if one is

-	in use.  The registry is provided as a means for kernel aware 

-	debuggers to locate mutexes and has no purpose if a kernel aware debugger

-	is not being used.  The call to vQueueAddToRegistry() will be removed

-	by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is 

-	defined to be less than 1. */

-	vQueueAddToRegistry( ( xQueueHandle ) xMutex, ( signed portCHAR * ) "Gen_Queue_Mutex" );

-

-	/* Create the mutex demo tasks and pass it the mutex just created.  We are

-	passing the mutex handle by value so it does not matter that it is declared

-	on the stack here. */

-	xTaskCreate( prvLowPriorityMutexTask, ( signed portCHAR * )"MuLow", configMINIMAL_STACK_SIZE, ( void * ) xMutex, genqMUTEX_LOW_PRIORITY, NULL );

-	xTaskCreate( prvMediumPriorityMutexTask, ( signed portCHAR * )"MuMed", configMINIMAL_STACK_SIZE, NULL, genqMUTEX_MEDIUM_PRIORITY, &xMediumPriorityMutexTask );

-	xTaskCreate( prvHighPriorityMutexTask, ( signed portCHAR * )"MuHigh", configMINIMAL_STACK_SIZE, ( void * ) xMutex, genqMUTEX_HIGH_PRIORITY, &xHighPriorityMutexTask );

-}

-/*-----------------------------------------------------------*/

-

-static void prvSendFrontAndBackTest( void *pvParameters )

-{

-unsigned portLONG ulData, ulData2;

-xQueueHandle xQueue;

-

-	#ifdef USE_STDIO

-	void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend );

-	

-		const portCHAR * const pcTaskStartMsg = "Queue SendToFront/SendToBack/Peek test started.\r\n";

-

-		/* Queue a message for printing to say the task has started. */

-		vPrintDisplayMessage( &pcTaskStartMsg );

-	#endif

-

-	xQueue = ( xQueueHandle ) pvParameters;

-

-	for( ;; )

-	{

-		/* The queue is empty, so sending an item to the back of the queue

-		should have the same efect as sending it to the front of the queue.

-

-		First send to the front and check everything is as expected. */

-		xQueueSendToFront( xQueue, ( void * ) &ulLoopCounter, genqNO_BLOCK );

-

-		if( uxQueueMessagesWaiting( xQueue ) != 1 )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		if( xQueueReceive( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != pdPASS )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		/* The data we sent to the queue should equal the data we just received

-		from the queue. */

-		if( ulLoopCounter != ulData )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		/* Then do the same, sending the data to the back, checking everything

-		is as expected. */

-		if( uxQueueMessagesWaiting( xQueue ) != 0 )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		xQueueSendToBack( xQueue, ( void * ) &ulLoopCounter, genqNO_BLOCK );

-

-		if( uxQueueMessagesWaiting( xQueue ) != 1 )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		if( xQueueReceive( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != pdPASS )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		if( uxQueueMessagesWaiting( xQueue ) != 0 )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		/* The data we sent to the queue should equal the data we just received

-		from the queue. */

-		if( ulLoopCounter != ulData )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		#if configUSE_PREEMPTION == 0

-			taskYIELD();

-		#endif

-

-

-

-		/* Place 2, 3, 4 into the queue, adding items to the back of the queue. */

-		for( ulData = 2; ulData < 5; ulData++ )

-		{

-			xQueueSendToBack( xQueue, ( void * ) &ulData, genqNO_BLOCK );

-		}

-

-		/* Now the order in the queue should be 2, 3, 4, with 2 being the first

-		thing to be read out.  Now add 1 then 0 to the front of the queue. */

-		if( uxQueueMessagesWaiting( xQueue ) != 3 )

-		{

-			xErrorDetected = pdTRUE;

-		}

-		ulData = 1;

-		xQueueSendToFront( xQueue, ( void * ) &ulData, genqNO_BLOCK );

-		ulData = 0;

-		xQueueSendToFront( xQueue, ( void * ) &ulData, genqNO_BLOCK );

-

-		/* Now the queue should be full, and when we read the data out we

-		should receive 0, 1, 2, 3, 4. */

-		if( uxQueueMessagesWaiting( xQueue ) != 5 )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		if( xQueueSendToFront( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != errQUEUE_FULL )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		if( xQueueSendToBack( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != errQUEUE_FULL )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		#if configUSE_PREEMPTION == 0

-			taskYIELD();

-		#endif

-

-		/* Check the data we read out is in the expected order. */

-		for( ulData = 0; ulData < genqQUEUE_LENGTH; ulData++ )

-		{

-			/* Try peeking the data first. */

-			if( xQueuePeek( xQueue, &ulData2, genqNO_BLOCK ) != pdPASS )

-			{

-				xErrorDetected = pdTRUE;

-			}

-

-			if( ulData != ulData2 )

-			{

-				xErrorDetected = pdTRUE;

-			}

-			

-

-			/* Now try receiving the data for real.  The value should be the

-			same.  Clobber the value first so we know we really received it. */

-			ulData2 = ~ulData2;

-			if( xQueueReceive( xQueue, &ulData2, genqNO_BLOCK ) != pdPASS )

-			{

-				xErrorDetected = pdTRUE;

-			}

-

-			if( ulData != ulData2 )

-			{

-				xErrorDetected = pdTRUE;

-			}

-		}

-

-		/* The queue should now be empty again. */

-		if( uxQueueMessagesWaiting( xQueue ) != 0 )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		#if configUSE_PREEMPTION == 0

-			taskYIELD();

-		#endif

-

-

-		/* Our queue is empty once more, add 10, 11 to the back. */

-		ulData = 10;

-		if( xQueueSend( xQueue, &ulData, genqNO_BLOCK ) != pdPASS )

-		{

-			xErrorDetected = pdTRUE;

-		}

-		ulData = 11;

-		if( xQueueSend( xQueue, &ulData, genqNO_BLOCK ) != pdPASS )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		if( uxQueueMessagesWaiting( xQueue ) != 2 )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		/* Now we should have 10, 11 in the queue.  Add 7, 8, 9 to the

-		front. */

-		for( ulData = 9; ulData >= 7; ulData-- )

-		{

-			if( xQueueSendToFront( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != pdPASS )

-			{

-				xErrorDetected = pdTRUE;

-			}

-		}

-

-		/* Now check that the queue is full, and that receiving data provides

-		the expected sequence of 7, 8, 9, 10, 11. */

-		if( uxQueueMessagesWaiting( xQueue ) != 5 )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		if( xQueueSendToFront( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != errQUEUE_FULL )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		if( xQueueSendToBack( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != errQUEUE_FULL )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		#if configUSE_PREEMPTION == 0

-			taskYIELD();

-		#endif

-

-		/* Check the data we read out is in the expected order. */

-		for( ulData = 7; ulData < ( 7 + genqQUEUE_LENGTH ); ulData++ )

-		{

-			if( xQueueReceive( xQueue, &ulData2, genqNO_BLOCK ) != pdPASS )

-			{

-				xErrorDetected = pdTRUE;

-			}

-

-			if( ulData != ulData2 )

-			{

-				xErrorDetected = pdTRUE;

-			}

-		}

-

-		if( uxQueueMessagesWaiting( xQueue ) != 0 )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		ulLoopCounter++;

-	}

-}

-/*-----------------------------------------------------------*/

-

-static void prvLowPriorityMutexTask( void *pvParameters )

-{

-xSemaphoreHandle xMutex = ( xSemaphoreHandle ) pvParameters;

-

-	#ifdef USE_STDIO

-	void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend );

-	

-		const portCHAR * const pcTaskStartMsg = "Mutex with priority inheritance test started.\r\n";

-

-		/* Queue a message for printing to say the task has started. */

-		vPrintDisplayMessage( &pcTaskStartMsg );

-	#endif

-

-	for( ;; )

-	{

-		/* Take the mutex.  It should be available now. */

-		if( xSemaphoreTake( xMutex, genqNO_BLOCK ) != pdPASS )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		/* Set our guarded variable to a known start value. */

-		ulGuardedVariable = 0;

-

-		/* Our priority should be as per that assigned when the task was

-		created. */

-		if( uxTaskPriorityGet( NULL ) != genqMUTEX_LOW_PRIORITY )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		/* Now unsuspend the high priority task.  This will attempt to take the

-		mutex, and block when it finds it cannot obtain it. */

-		vTaskResume( xHighPriorityMutexTask );

-

-		/* We should now have inherited the prioritoy of the high priority task,

-		as by now it will have attempted to get the mutex. */

-		if( uxTaskPriorityGet( NULL ) != genqMUTEX_HIGH_PRIORITY )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		/* We can attempt to set our priority to the test priority - between the

-		idle priority and the medium/high test priorities, but our actual

-		prioroity should remain at the high priority. */

-		vTaskPrioritySet( NULL, genqMUTEX_TEST_PRIORITY );

-		if( uxTaskPriorityGet( NULL ) != genqMUTEX_HIGH_PRIORITY )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		/* Now unsuspend the medium priority task.  This should not run as our

-		inherited priority is above that of the medium priority task. */

-		vTaskResume( xMediumPriorityMutexTask );

-

-		/* If the did run then it will have incremented our guarded variable. */

-		if( ulGuardedVariable != 0 )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		/* When we give back the semaphore our priority should be disinherited

-		back to the priority to which we attempted to set ourselves.  This means

-		that when the high priority task next blocks, the medium priority task

-		should execute and increment the guarded variable.   When we next run

-		both the high and medium priority tasks will have been suspended again. */

-		if( xSemaphoreGive( xMutex ) != pdPASS )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		/* Check that the guarded variable did indeed increment... */

-		if( ulGuardedVariable != 1 )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		/* ... and that our priority has been disinherited to

-		genqMUTEX_TEST_PRIORITY. */

-		if( uxTaskPriorityGet( NULL ) != genqMUTEX_TEST_PRIORITY )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		/* Set our priority back to our original priority ready for the next

-		loop around this test. */

-		vTaskPrioritySet( NULL, genqMUTEX_LOW_PRIORITY );

-

-		/* Just to show we are still running. */

-		ulLoopCounter2++;

-

-		#if configUSE_PREEMPTION == 0

-			taskYIELD();

-		#endif		

-	}

-}

-/*-----------------------------------------------------------*/

-

-static void prvMediumPriorityMutexTask( void *pvParameters )

-{

-	( void ) pvParameters;

-

-	for( ;; )

-	{

-		/* The medium priority task starts by suspending itself.  The low

-		priority task will unsuspend this task when required. */

-		vTaskSuspend( NULL );

-

-		/* When this task unsuspends all it does is increment the guarded

-		variable, this is so the low priority task knows that it has

-		executed. */

-		ulGuardedVariable++;

-	}

-}

-/*-----------------------------------------------------------*/

-

-static void prvHighPriorityMutexTask( void *pvParameters )

-{

-xSemaphoreHandle xMutex = ( xSemaphoreHandle ) pvParameters;

-

-	for( ;; )

-	{

-		/* The high priority task starts by suspending itself.  The low

-		priority task will unsuspend this task when required. */

-		vTaskSuspend( NULL );

-

-		/* When this task unsuspends all it does is attempt to obtain

-		the mutex.  It should find the mutex is not available so a

-		block time is specified. */

-		if( xSemaphoreTake( xMutex, portMAX_DELAY ) != pdPASS )

-		{

-			xErrorDetected = pdTRUE;

-		}

-

-		/* When we eventually obtain the mutex we just give it back then

-		return to suspend ready for the next test. */

-		if( xSemaphoreGive( xMutex ) != pdPASS )

-		{

-			xErrorDetected = pdTRUE;

-		}		

-	}

-}

-/*-----------------------------------------------------------*/

-

-/* This is called to check that all the created tasks are still running. */

-portBASE_TYPE xAreGenericQueueTasksStillRunning( void )

-{

-static unsigned portLONG ulLastLoopCounter = 0, ulLastLoopCounter2 = 0;

-

-	/* If the demo task is still running then we expect the loopcounters to

-	have incremented since this function was last called. */

-	if( ulLastLoopCounter == ulLoopCounter )

-	{

-		xErrorDetected = pdTRUE;

-	}

-

-	if( ulLastLoopCounter2 == ulLoopCounter2 )

-	{

-		xErrorDetected = pdTRUE;

-	}

-

-	ulLastLoopCounter = ulLoopCounter;

-	ulLastLoopCounter2 = ulLoopCounter2;	

-

-	/* Errors detected in the task itself will have latched xErrorDetected

-	to true. */

-

-	return !xErrorDetected;

-}

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/PollQ.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/PollQ.c
deleted file mode 100644
index 9b7eb5a..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/PollQ.c
+++ /dev/null
@@ -1,259 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-/*

- * This version of PollQ. c is for use on systems that have limited stack

- * space and no display facilities.  The complete version can be found in

- * the Demo/Common/Full directory.

- *

- * Creates two tasks that communicate over a single queue.  One task acts as a

- * producer, the other a consumer.

- *

- * The producer loops for three iteration, posting an incrementing number onto the

- * queue each cycle.  It then delays for a fixed period before doing exactly the

- * same again.

- *

- * The consumer loops emptying the queue.  Each item removed from the queue is

- * checked to ensure it contains the expected value.  When the queue is empty it

- * blocks for a fixed period, then does the same again.

- *

- * All queue access is performed without blocking.  The consumer completely empties

- * the queue each time it runs so the producer should never find the queue full.

- *

- * An error is flagged if the consumer obtains an unexpected value or the producer

- * find the queue is full.

- */

-

-/*

-Changes from V2.0.0

-

-	+ Delay periods are now specified using variables and constants of

-	  portTickType rather than unsigned long.

-*/

-

-#include <stdlib.h>

-

-/* Scheduler include files. */

-#include "FreeRTOS.h"

-#include "task.h"

-#include "queue.h"

-

-/* Demo program include files. */

-#include "PollQ.h"

-

-#define pollqSTACK_SIZE			configMINIMAL_STACK_SIZE

-#define pollqQUEUE_SIZE			( 10 )

-#define pollqPRODUCER_DELAY		( ( portTickType ) 200 / portTICK_RATE_MS )

-#define pollqCONSUMER_DELAY		( pollqPRODUCER_DELAY - ( portTickType ) ( 20 / portTICK_RATE_MS ) )

-#define pollqNO_DELAY			( ( portTickType ) 0 )

-#define pollqVALUES_TO_PRODUCE	( ( signed portBASE_TYPE ) 3 )

-#define pollqINITIAL_VALUE		( ( signed portBASE_TYPE ) 0 )

-

-/* The task that posts the incrementing number onto the queue. */

-static portTASK_FUNCTION_PROTO( vPolledQueueProducer, pvParameters );

-

-/* The task that empties the queue. */

-static portTASK_FUNCTION_PROTO( vPolledQueueConsumer, pvParameters );

-

-/* Variables that are used to check that the tasks are still running with no

-errors. */

-static volatile signed portBASE_TYPE xPollingConsumerCount = pollqINITIAL_VALUE, xPollingProducerCount = pollqINITIAL_VALUE;

-

-/*-----------------------------------------------------------*/

-

-void vStartPolledQueueTasks( unsigned portBASE_TYPE uxPriority )

-{

-static xQueueHandle xPolledQueue;

-

-	/* Create the queue used by the producer and consumer. */

-	xPolledQueue = xQueueCreate( pollqQUEUE_SIZE, ( unsigned portBASE_TYPE ) sizeof( unsigned short ) );

-

-	/* vQueueAddToRegistry() adds the queue to the queue registry, if one is

-	in use.  The queue registry is provided as a means for kernel aware 

-	debuggers to locate queues and has no purpose if a kernel aware debugger

-	is not being used.  The call to vQueueAddToRegistry() will be removed

-	by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is 

-	defined to be less than 1. */

-	vQueueAddToRegistry( xPolledQueue, ( signed char * ) "Poll_Test_Queue" );

-

-	/* Spawn the producer and consumer. */

-	xTaskCreate( vPolledQueueConsumer, ( signed char * ) "QConsNB", pollqSTACK_SIZE, ( void * ) &xPolledQueue, uxPriority, ( xTaskHandle * ) NULL );

-	xTaskCreate( vPolledQueueProducer, ( signed char * ) "QProdNB", pollqSTACK_SIZE, ( void * ) &xPolledQueue, uxPriority, ( xTaskHandle * ) NULL );

-}

-/*-----------------------------------------------------------*/

-

-static portTASK_FUNCTION( vPolledQueueProducer, pvParameters )

-{

-unsigned short usValue = ( unsigned short ) 0;

-signed portBASE_TYPE xError = pdFALSE, xLoop;

-

-	for( ;; )

-	{		

-		for( xLoop = 0; xLoop < pollqVALUES_TO_PRODUCE; xLoop++ )

-		{

-			/* Send an incrementing number on the queue without blocking. */

-			if( xQueueSend( *( ( xQueueHandle * ) pvParameters ), ( void * ) &usValue, pollqNO_DELAY ) != pdPASS )

-			{

-				/* We should never find the queue full so if we get here there

-				has been an error. */

-				xError = pdTRUE;

-			}

-			else

-			{

-				if( xError == pdFALSE )

-				{

-					/* If an error has ever been recorded we stop incrementing the

-					check variable. */

-					portENTER_CRITICAL();

-						xPollingProducerCount++;

-					portEXIT_CRITICAL();

-				}

-

-				/* Update the value we are going to post next time around. */

-				usValue++;

-			}

-		}

-

-		/* Wait before we start posting again to ensure the consumer runs and

-		empties the queue. */

-		vTaskDelay( pollqPRODUCER_DELAY );

-	}

-}  /*lint !e818 Function prototype must conform to API. */

-/*-----------------------------------------------------------*/

-

-static portTASK_FUNCTION( vPolledQueueConsumer, pvParameters )

-{

-unsigned short usData, usExpectedValue = ( unsigned short ) 0;

-signed portBASE_TYPE xError = pdFALSE;

-

-	for( ;; )

-	{		

-		/* Loop until the queue is empty. */

-		while( uxQueueMessagesWaiting( *( ( xQueueHandle * ) pvParameters ) ) )

-		{

-			if( xQueueReceive( *( ( xQueueHandle * ) pvParameters ), &usData, pollqNO_DELAY ) == pdPASS )

-			{

-				if( usData != usExpectedValue )

-				{

-					/* This is not what we expected to receive so an error has

-					occurred. */

-					xError = pdTRUE;

-

-					/* Catch-up to the value we received so our next expected

-					value should again be correct. */

-					usExpectedValue = usData;

-				}

-				else

-				{

-					if( xError == pdFALSE )

-					{

-						/* Only increment the check variable if no errors have

-						occurred. */

-						portENTER_CRITICAL();

-							xPollingConsumerCount++;

-						portEXIT_CRITICAL();

-					}

-				}

-

-				/* Next time round we would expect the number to be one higher. */

-				usExpectedValue++;

-			}

-		}

-

-		/* Now the queue is empty we block, allowing the producer to place more

-		items in the queue. */

-		vTaskDelay( pollqCONSUMER_DELAY );

-	}

-} /*lint !e818 Function prototype must conform to API. */

-/*-----------------------------------------------------------*/

-

-/* This is called to check that all the created tasks are still running with no errors. */

-portBASE_TYPE xArePollingQueuesStillRunning( void )

-{

-portBASE_TYPE xReturn;

-

-	/* Check both the consumer and producer poll count to check they have both

-	been changed since out last trip round.  We do not need a critical section

-	around the check variables as this is called from a higher priority than

-	the other tasks that access the same variables. */

-	if( ( xPollingConsumerCount == pollqINITIAL_VALUE ) ||

-		( xPollingProducerCount == pollqINITIAL_VALUE )

-	  )

-	{

-		xReturn = pdFALSE;

-	}

-	else

-	{

-		xReturn = pdTRUE;

-	}

-

-	/* Set the check variables back down so we know if they have been

-	incremented the next time around. */

-	xPollingConsumerCount = pollqINITIAL_VALUE;

-	xPollingProducerCount = pollqINITIAL_VALUE;

-

-	return xReturn;

-}

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/blocktim.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/blocktim.c
deleted file mode 100644
index b19972b..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/blocktim.c
+++ /dev/null
@@ -1,506 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-/*

- * This file contains some test scenarios that ensure tasks do not exit queue

- * send or receive functions prematurely.  A description of the tests is

- * included within the code.

- */

-

-/* Kernel includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-#include "queue.h"

-

-/* Demo includes. */

-#include "blocktim.h"

-

-/* Task priorities.  Allow these to be overridden. */

-#ifndef bktPRIMARY_PRIORITY

-	#define bktPRIMARY_PRIORITY		( configMAX_PRIORITIES - 3 )

-#endif

-

-#ifndef bktSECONDARY_PRIORITY

-	#define bktSECONDARY_PRIORITY	( configMAX_PRIORITIES - 4 )

-#endif

-

-/* Task behaviour. */

-#define bktQUEUE_LENGTH				( 5 )

-#define bktSHORT_WAIT				( ( ( portTickType ) 20 ) / portTICK_RATE_MS )

-#define bktPRIMARY_BLOCK_TIME		( 10 )

-#define bktALLOWABLE_MARGIN			( 15 )

-#define bktTIME_TO_BLOCK			( 175 )

-#define bktDONT_BLOCK				( ( portTickType ) 0 )

-#define bktRUN_INDICATOR			( ( unsigned portBASE_TYPE ) 0x55 )

-

-/* The queue on which the tasks block. */

-static xQueueHandle xTestQueue;

-

-/* Handle to the secondary task is required by the primary task for calls

-to vTaskSuspend/Resume(). */

-static xTaskHandle xSecondary;

-

-/* Used to ensure that tasks are still executing without error. */

-static volatile portBASE_TYPE xPrimaryCycles = 0, xSecondaryCycles = 0;

-static volatile portBASE_TYPE xErrorOccurred = pdFALSE;

-

-/* Provides a simple mechanism for the primary task to know when the

-secondary task has executed. */

-static volatile unsigned portBASE_TYPE xRunIndicator;

-

-/* The two test tasks.  Their behaviour is commented within the files. */

-static void vPrimaryBlockTimeTestTask( void *pvParameters );

-static void vSecondaryBlockTimeTestTask( void *pvParameters );

-

-/*-----------------------------------------------------------*/

-

-void vCreateBlockTimeTasks( void )

-{

-	/* Create the queue on which the two tasks block. */

-    xTestQueue = xQueueCreate( bktQUEUE_LENGTH, sizeof( portBASE_TYPE ) );

-

-	/* vQueueAddToRegistry() adds the queue to the queue registry, if one is

-	in use.  The queue registry is provided as a means for kernel aware

-	debuggers to locate queues and has no purpose if a kernel aware debugger

-	is not being used.  The call to vQueueAddToRegistry() will be removed

-	by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is

-	defined to be less than 1. */

-	vQueueAddToRegistry( xTestQueue, ( signed char * ) "Block_Time_Queue" );

-

-	/* Create the two test tasks. */

-	xTaskCreate( vPrimaryBlockTimeTestTask, ( signed char * )"BTest1", configMINIMAL_STACK_SIZE, NULL, bktPRIMARY_PRIORITY, NULL );

-	xTaskCreate( vSecondaryBlockTimeTestTask, ( signed char * )"BTest2", configMINIMAL_STACK_SIZE, NULL, bktSECONDARY_PRIORITY, &xSecondary );

-}

-/*-----------------------------------------------------------*/

-

-static void vPrimaryBlockTimeTestTask( void *pvParameters )

-{

-portBASE_TYPE xItem, xData;

-portTickType xTimeWhenBlocking;

-portTickType xTimeToBlock, xBlockedTime;

-

-	( void ) pvParameters;

-

-	for( ;; )

-	{

-		/*********************************************************************

-        Test 1

-

-        Simple block time wakeup test on queue receives. */

-		for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ )

-		{

-			/* The queue is empty. Attempt to read from the queue using a block

-			time.  When we wake, ensure the delta in time is as expected. */

-			xTimeToBlock = bktPRIMARY_BLOCK_TIME << xItem;

-

-			xTimeWhenBlocking = xTaskGetTickCount();

-

-			/* We should unblock after xTimeToBlock having not received

-			anything on the queue. */

-			if( xQueueReceive( xTestQueue, &xData, xTimeToBlock ) != errQUEUE_EMPTY )

-			{

-				xErrorOccurred = pdTRUE;

-			}

-

-			/* How long were we blocked for? */

-			xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking;

-

-			if( xBlockedTime < xTimeToBlock )

-			{

-				/* Should not have blocked for less than we requested. */

-				xErrorOccurred = pdTRUE;

-			}

-

-			if( xBlockedTime > ( xTimeToBlock + bktALLOWABLE_MARGIN ) )

-			{

-				/* Should not have blocked for longer than we requested,

-				although we would not necessarily run as soon as we were

-				unblocked so a margin is allowed. */

-				xErrorOccurred = pdTRUE;

-			}

-		}

-

-		/*********************************************************************

-        Test 2

-

-        Simple block time wakeup test on queue sends.

-

-		First fill the queue.  It should be empty so all sends should pass. */

-		for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ )

-		{

-			if( xQueueSend( xTestQueue, &xItem, bktDONT_BLOCK ) != pdPASS )

-			{

-				xErrorOccurred = pdTRUE;

-			}

-

-			#if configUSE_PREEMPTION == 0

-				taskYIELD();

-			#endif

-		}

-

-		for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ )

-		{

-			/* The queue is full. Attempt to write to the queue using a block

-			time.  When we wake, ensure the delta in time is as expected. */

-			xTimeToBlock = bktPRIMARY_BLOCK_TIME << xItem;

-

-			xTimeWhenBlocking = xTaskGetTickCount();

-

-			/* We should unblock after xTimeToBlock having not received

-			anything on the queue. */

-			if( xQueueSend( xTestQueue, &xItem, xTimeToBlock ) != errQUEUE_FULL )

-			{

-				xErrorOccurred = pdTRUE;

-			}

-

-			/* How long were we blocked for? */

-			xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking;

-

-			if( xBlockedTime < xTimeToBlock )

-			{

-				/* Should not have blocked for less than we requested. */

-				xErrorOccurred = pdTRUE;

-			}

-

-			if( xBlockedTime > ( xTimeToBlock + bktALLOWABLE_MARGIN ) )

-			{

-				/* Should not have blocked for longer than we requested,

-				although we would not necessarily run as soon as we were

-				unblocked so a margin is allowed. */

-				xErrorOccurred = pdTRUE;

-			}

-		}

-

-		/*********************************************************************

-        Test 3

-

-		Wake the other task, it will block attempting to post to the queue.

-		When we read from the queue the other task will wake, but before it

-		can run we will post to the queue again.  When the other task runs it

-		will find the queue still full, even though it was woken.  It should

-		recognise that its block time has not expired and return to block for

-		the remains of its block time.

-

-		Wake the other task so it blocks attempting to post to the already

-		full queue. */

-		xRunIndicator = 0;

-		vTaskResume( xSecondary );

-

-		/* We need to wait a little to ensure the other task executes. */

-		while( xRunIndicator != bktRUN_INDICATOR )

-		{

-			/* The other task has not yet executed. */

-			vTaskDelay( bktSHORT_WAIT );

-		}

-		/* Make sure the other task is blocked on the queue. */

-		vTaskDelay( bktSHORT_WAIT );

-		xRunIndicator = 0;

-

-		for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ )

-		{

-			/* Now when we make space on the queue the other task should wake

-			but not execute as this task has higher priority. */

-			if( xQueueReceive( xTestQueue, &xData, bktDONT_BLOCK ) != pdPASS )

-			{

-				xErrorOccurred = pdTRUE;

-			}

-

-			/* Now fill the queue again before the other task gets a chance to

-			execute.  If the other task had executed we would find the queue

-			full ourselves, and the other task have set xRunIndicator. */

-			if( xQueueSend( xTestQueue, &xItem, bktDONT_BLOCK ) != pdPASS )

-			{

-				xErrorOccurred = pdTRUE;

-			}

-

-			if( xRunIndicator == bktRUN_INDICATOR )

-			{

-				/* The other task should not have executed. */

-				xErrorOccurred = pdTRUE;

-			}

-

-			/* Raise the priority of the other task so it executes and blocks

-			on the queue again. */

-			vTaskPrioritySet( xSecondary, bktPRIMARY_PRIORITY + 2 );

-

-			/* The other task should now have re-blocked without exiting the

-			queue function. */

-			if( xRunIndicator == bktRUN_INDICATOR )

-			{

-				/* The other task should not have executed outside of the

-				queue function. */

-				xErrorOccurred = pdTRUE;

-			}

-

-			/* Set the priority back down. */

-			vTaskPrioritySet( xSecondary, bktSECONDARY_PRIORITY );

-		}

-

-		/* Let the other task timeout.  When it unblockes it will check that it

-		unblocked at the correct time, then suspend itself. */

-		while( xRunIndicator != bktRUN_INDICATOR )

-		{

-			vTaskDelay( bktSHORT_WAIT );

-		}

-		vTaskDelay( bktSHORT_WAIT );

-		xRunIndicator = 0;

-

-

-		/*********************************************************************

-        Test 4

-

-		As per test 3 - but with the send and receive the other way around.

-		The other task blocks attempting to read from the queue.

-

-		Empty the queue.  We should find that it is full. */

-		for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ )

-		{

-			if( xQueueReceive( xTestQueue, &xData, bktDONT_BLOCK ) != pdPASS )

-			{

-				xErrorOccurred = pdTRUE;

-			}

-		}

-

-		/* Wake the other task so it blocks attempting to read from  the

-		already	empty queue. */

-		vTaskResume( xSecondary );

-

-		/* We need to wait a little to ensure the other task executes. */

-		while( xRunIndicator != bktRUN_INDICATOR )

-		{

-			vTaskDelay( bktSHORT_WAIT );

-		}

-		vTaskDelay( bktSHORT_WAIT );

-		xRunIndicator = 0;

-

-		for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ )

-		{

-			/* Now when we place an item on the queue the other task should

-			wake but not execute as this task has higher priority. */

-			if( xQueueSend( xTestQueue, &xItem, bktDONT_BLOCK ) != pdPASS )

-			{

-				xErrorOccurred = pdTRUE;

-			}

-

-			/* Now empty the queue again before the other task gets a chance to

-			execute.  If the other task had executed we would find the queue

-			empty ourselves, and the other task would be suspended. */

-			if( xQueueReceive( xTestQueue, &xData, bktDONT_BLOCK ) != pdPASS )

-			{

-				xErrorOccurred = pdTRUE;

-			}

-

-			if( xRunIndicator == bktRUN_INDICATOR )

-			{

-				/* The other task should not have executed. */

-				xErrorOccurred = pdTRUE;

-			}

-

-			/* Raise the priority of the other task so it executes and blocks

-			on the queue again. */

-			vTaskPrioritySet( xSecondary, bktPRIMARY_PRIORITY + 2 );

-

-			/* The other task should now have re-blocked without exiting the

-			queue function. */

-			if( xRunIndicator == bktRUN_INDICATOR )

-			{

-				/* The other task should not have executed outside of the

-				queue function. */

-				xErrorOccurred = pdTRUE;

-			}

-			vTaskPrioritySet( xSecondary, bktSECONDARY_PRIORITY );

-		}

-

-		/* Let the other task timeout.  When it unblockes it will check that it

-		unblocked at the correct time, then suspend itself. */

-		while( xRunIndicator != bktRUN_INDICATOR )

-		{

-			vTaskDelay( bktSHORT_WAIT );

-		}

-		vTaskDelay( bktSHORT_WAIT );

-

-		xPrimaryCycles++;

-	}

-}

-/*-----------------------------------------------------------*/

-

-static void vSecondaryBlockTimeTestTask( void *pvParameters )

-{

-portTickType xTimeWhenBlocking, xBlockedTime;

-portBASE_TYPE xData;

-

-	( void ) pvParameters;

-

-	for( ;; )

-	{

-		/*********************************************************************

-        Test 1 and 2

-

-		This task does does not participate in these tests. */

-		vTaskSuspend( NULL );

-

-		/*********************************************************************

-        Test 3

-

-		The first thing we do is attempt to read from the queue.  It should be

-		full so we block.  Note the time before we block so we can check the

-		wake time is as per that expected. */

-		xTimeWhenBlocking = xTaskGetTickCount();

-

-		/* We should unblock after bktTIME_TO_BLOCK having not sent

-		anything to the queue. */

-		xData = 0;

-		xRunIndicator = bktRUN_INDICATOR;

-		if( xQueueSend( xTestQueue, &xData, bktTIME_TO_BLOCK ) != errQUEUE_FULL )

-		{

-			xErrorOccurred = pdTRUE;

-		}

-

-		/* How long were we inside the send function? */

-		xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking;

-

-		/* We should not have blocked for less time than bktTIME_TO_BLOCK. */

-		if( xBlockedTime < bktTIME_TO_BLOCK )

-		{

-			xErrorOccurred = pdTRUE;

-		}

-

-		/* We should of not blocked for much longer than bktALLOWABLE_MARGIN

-		either.  A margin is permitted as we would not necessarily run as

-		soon as we unblocked. */

-		if( xBlockedTime > ( bktTIME_TO_BLOCK + bktALLOWABLE_MARGIN ) )

-		{

-			xErrorOccurred = pdTRUE;

-		}

-

-		/* Suspend ready for test 3. */

-		xRunIndicator = bktRUN_INDICATOR;

-		vTaskSuspend( NULL );

-

-		/*********************************************************************

-        Test 4

-

-		As per test three, but with the send and receive reversed. */

-		xTimeWhenBlocking = xTaskGetTickCount();

-

-		/* We should unblock after bktTIME_TO_BLOCK having not received

-		anything on the queue. */

-		xRunIndicator = bktRUN_INDICATOR;

-		if( xQueueReceive( xTestQueue, &xData, bktTIME_TO_BLOCK ) != errQUEUE_EMPTY )

-		{

-			xErrorOccurred = pdTRUE;

-		}

-

-		xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking;

-

-		/* We should not have blocked for less time than bktTIME_TO_BLOCK. */

-		if( xBlockedTime < bktTIME_TO_BLOCK )

-		{

-			xErrorOccurred = pdTRUE;

-		}

-

-		/* We should of not blocked for much longer than bktALLOWABLE_MARGIN

-		either.  A margin is permitted as we would not necessarily run as soon

-		as we unblocked. */

-		if( xBlockedTime > ( bktTIME_TO_BLOCK + bktALLOWABLE_MARGIN ) )

-		{

-			xErrorOccurred = pdTRUE;

-		}

-

-		xRunIndicator = bktRUN_INDICATOR;

-

-		xSecondaryCycles++;

-	}

-}

-/*-----------------------------------------------------------*/

-

-portBASE_TYPE xAreBlockTimeTestTasksStillRunning( void )

-{

-static portBASE_TYPE xLastPrimaryCycleCount = 0, xLastSecondaryCycleCount = 0;

-portBASE_TYPE xReturn = pdPASS;

-

-	/* Have both tasks performed at least one cycle since this function was

-	last called? */

-	if( xPrimaryCycles == xLastPrimaryCycleCount )

-	{

-		xReturn = pdFAIL;

-	}

-

-	if( xSecondaryCycles == xLastSecondaryCycleCount )

-	{

-		xReturn = pdFAIL;

-	}

-

-	if( xErrorOccurred == pdTRUE )

-	{

-		xReturn = pdFAIL;

-	}

-

-	xLastSecondaryCycleCount = xSecondaryCycles;

-	xLastPrimaryCycleCount = xPrimaryCycles;

-

-	return xReturn;

-}

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/comtest.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/comtest.c
deleted file mode 100644
index 18b7d4a..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/comtest.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-

-/*

- * This version of comtest. c is for use on systems that have limited stack

- * space and no display facilities.  The complete version can be found in

- * the Demo/Common/Full directory.

- *

- * Creates two tasks that operate on an interrupt driven serial port.  A

- * loopback connector should be used so that everything that is transmitted is

- * also received.  The serial port does not use any flow control.  On a

- * standard 9way 'D' connector pins two and three should be connected together.

- *

- * The first task posts a sequence of characters to the Tx queue, toggling an

- * LED on each successful post.  At the end of the sequence it sleeps for a

- * pseudo-random period before resending the same sequence.

- *

- * The UART Tx end interrupt is enabled whenever data is available in the Tx

- * queue.  The Tx end ISR removes a single character from the Tx queue and

- * passes it to the UART for transmission.

- *

- * The second task blocks on the Rx queue waiting for a character to become

- * available.  When the UART Rx end interrupt receives a character it places

- * it in the Rx queue, waking the second task.  The second task checks that the

- * characters removed from the Rx queue form the same sequence as those posted

- * to the Tx queue, and toggles an LED for each correct character.

- *

- * The receiving task is spawned with a higher priority than the transmitting

- * task.  The receiver will therefore wake every time a character is

- * transmitted so neither the Tx or Rx queue should ever hold more than a few

- * characters.

- *

- */

-

-/* Scheduler include files. */

-#include <stdlib.h>

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* Demo program include files. */

-#include "demo_serial.h"

-#include "comtest2.h"

-#include "partest.h"

-

-#define comSTACK_SIZE				configMINIMAL_STACK_SIZE

-#define comTX_LED_OFFSET			( 0 )

-#define comRX_LED_OFFSET			( 1 )

-#define comTOTAL_PERMISSIBLE_ERRORS ( 2 )

-

-/* The Tx task will transmit the sequence of characters at a pseudo random

-interval.  This is the maximum and minimum block time between sends. */

-#define comTX_MAX_BLOCK_TIME		( ( portTickType ) 0x96 )

-#define comTX_MIN_BLOCK_TIME		( ( portTickType ) 0x32 )

-#define comOFFSET_TIME				( ( portTickType ) 3 )

-

-/* We should find that each character can be queued for Tx immediately and we

-don't have to block to send. */

-#define comNO_BLOCK					( ( portTickType ) 0 )

-

-/* The Rx task will block on the Rx queue for a long period. */

-#define comRX_BLOCK_TIME			( ( portTickType ) 0xffff )

-

-/* The sequence transmitted is from comFIRST_BYTE to and including comLAST_BYTE. */

-#define comFIRST_BYTE				( 'A' )

-#define comLAST_BYTE				( 'X' )

-

-#define comBUFFER_LEN				( ( unsigned portBASE_TYPE ) ( comLAST_BYTE - comFIRST_BYTE ) + ( unsigned portBASE_TYPE ) 1 )

-#define comINITIAL_RX_COUNT_VALUE	( 0 )

-

-/* Handle to the com port used by both tasks. */

-static xComPortHandle xPort = NULL;

-

-/* The transmit task as described at the top of the file. */

-static portTASK_FUNCTION_PROTO( vComTxTask, pvParameters );

-

-/* The receive task as described at the top of the file. */

-static portTASK_FUNCTION_PROTO( vComRxTask, pvParameters );

-

-/* The LED that should be toggled by the Rx and Tx tasks.  The Rx task will

-toggle LED ( uxBaseLED + comRX_LED_OFFSET).  The Tx task will toggle LED

-( uxBaseLED + comTX_LED_OFFSET ). */

-static unsigned portBASE_TYPE uxBaseLED = 0;

-

-/* Check variable used to ensure no error have occurred.  The Rx task will

-increment this variable after every successfully received sequence.  If at any

-time the sequence is incorrect the the variable will stop being incremented. */

-static volatile unsigned portBASE_TYPE uxRxLoops = comINITIAL_RX_COUNT_VALUE;

-

-/*-----------------------------------------------------------*/

-

-void vAltStartComTestTasks( unsigned portBASE_TYPE uxPriority, unsigned long ulBaudRate, unsigned portBASE_TYPE uxLED )

-{

-	/* Initialise the com port then spawn the Rx and Tx tasks. */

-	uxBaseLED = uxLED;

-	xSerialPortInitMinimal( ulBaudRate, comBUFFER_LEN );

-

-	/* The Tx task is spawned with a lower priority than the Rx task. */

-	xTaskCreate( vComTxTask, ( signed char * ) "COMTx", comSTACK_SIZE, NULL, uxPriority - 1, ( xTaskHandle * ) NULL );

-	xTaskCreate( vComRxTask, ( signed char * ) "COMRx", comSTACK_SIZE, NULL, uxPriority, ( xTaskHandle * ) NULL );

-}

-/*-----------------------------------------------------------*/

-

-static portTASK_FUNCTION( vComTxTask, pvParameters )

-{

-signed char cByteToSend;

-portTickType xTimeToWait;

-

-	/* Just to stop compiler warnings. */

-	( void ) pvParameters;

-

-	for( ;; )

-	{

-		/* Simply transmit a sequence of characters from comFIRST_BYTE to

-		comLAST_BYTE. */

-		for( cByteToSend = comFIRST_BYTE; cByteToSend <= comLAST_BYTE; cByteToSend++ )

-		{

-			if( xSerialPutChar( xPort, cByteToSend, comNO_BLOCK ) == pdPASS )

-			{

-				vParTestToggleLED( uxBaseLED + comTX_LED_OFFSET );

-			}

-		}

-

-		/* Turn the LED off while we are not doing anything. */

-		vParTestSetLED( uxBaseLED + comTX_LED_OFFSET, pdFALSE );

-

-		/* We have posted all the characters in the string - wait before

-		re-sending.  Wait a pseudo-random time as this will provide a better

-		test. */

-		xTimeToWait = xTaskGetTickCount() + comOFFSET_TIME;

-

-		/* Make sure we don't wait too long... */

-		xTimeToWait %= comTX_MAX_BLOCK_TIME;

-

-		/* ...but we do want to wait. */

-		if( xTimeToWait < comTX_MIN_BLOCK_TIME )

-		{

-			xTimeToWait = comTX_MIN_BLOCK_TIME;

-		}

-

-		vTaskDelay( xTimeToWait );

-	}

-} /*lint !e715 !e818 pvParameters is required for a task function even if it is not referenced. */

-/*-----------------------------------------------------------*/

-

-static portTASK_FUNCTION( vComRxTask, pvParameters )

-{

-signed char cExpectedByte, cByteRxed;

-portBASE_TYPE xResyncRequired = pdFALSE, xErrorOccurred = pdFALSE;

-

-	/* Just to stop compiler warnings. */

-	( void ) pvParameters;

-

-	for( ;; )

-	{

-		/* We expect to receive the characters from comFIRST_BYTE to

-		comLAST_BYTE in an incrementing order.  Loop to receive each byte. */

-		for( cExpectedByte = comFIRST_BYTE; cExpectedByte <= comLAST_BYTE; cExpectedByte++ )

-		{

-			/* Block on the queue that contains received bytes until a byte is

-			available. */

-			if( xSerialGetChar( xPort, &cByteRxed, comRX_BLOCK_TIME ) )

-			{

-				/* Was this the byte we were expecting?  If so, toggle the LED,

-				otherwise we are out on sync and should break out of the loop

-				until the expected character sequence is about to restart. */

-				if( cByteRxed == cExpectedByte )

-				{

-					vParTestToggleLED( uxBaseLED + comRX_LED_OFFSET );

-				}

-				else

-				{

-					xResyncRequired = pdTRUE;

-					break; /*lint !e960 Non-switch break allowed. */

-				}

-			}

-		}

-

-		/* Turn the LED off while we are not doing anything. */

-		vParTestSetLED( uxBaseLED + comRX_LED_OFFSET, pdFALSE );

-

-		/* Did we break out of the loop because the characters were received in

-		an unexpected order?  If so wait here until the character sequence is

-		about to restart. */

-		if( xResyncRequired == pdTRUE )

-		{

-			while( cByteRxed != comLAST_BYTE )

-			{

-				/* Block until the next char is available. */

-				xSerialGetChar( xPort, &cByteRxed, comRX_BLOCK_TIME );

-			}

-

-			/* Note that an error occurred which caused us to have to resync.

-			We use this to stop incrementing the loop counter so

-			sAreComTestTasksStillRunning() will return false - indicating an

-			error. */

-			xErrorOccurred++;

-

-			/* We have now resynced with the Tx task and can continue. */

-			xResyncRequired = pdFALSE;

-		}

-		else

-		{

-			if( xErrorOccurred < comTOTAL_PERMISSIBLE_ERRORS )

-			{

-				/* Increment the count of successful loops.  As error

-				occurring (i.e. an unexpected character being received) will

-				prevent this counter being incremented for the rest of the

-				execution.   Don't worry about mutual exclusion on this

-				variable - it doesn't really matter as we just want it

-				to change. */

-				uxRxLoops++;

-			}

-		}

-	}

-} /*lint !e715 !e818 pvParameters is required for a task function even if it is not referenced. */

-/*-----------------------------------------------------------*/

-

-portBASE_TYPE xAreComTestTasksStillRunning( void )

-{

-portBASE_TYPE xReturn;

-

-	/* If the count of successful reception loops has not changed than at

-	some time an error occurred (i.e. a character was received out of sequence)

-	and we will return false. */

-	if( uxRxLoops == comINITIAL_RX_COUNT_VALUE )

-	{

-		xReturn = pdFALSE;

-	}

-	else

-	{

-		xReturn = pdTRUE;

-	}

-

-	/* Reset the count of successful Rx loops.  When this function is called

-	again we expect this to have been incremented. */

-	uxRxLoops = comINITIAL_RX_COUNT_VALUE;

-

-	return xReturn;

-}

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/countsem.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/countsem.c
deleted file mode 100644
index ede5b14..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/countsem.c
+++ /dev/null
@@ -1,323 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-

-/* 

- * Simple demonstration of the usage of counting semaphore.

- */

-

-/* Scheduler include files. */

-#include "FreeRTOS.h"

-#include "task.h"

-#include "semphr.h"

-

-/* Demo program include files. */

-#include "countsem.h"

-

-/* The maximum count value that the semaphore used for the demo can hold. */

-#define countMAX_COUNT_VALUE	( 200 )

-

-/* Constants used to indicate whether or not the semaphore should have been

-created with its maximum count value, or its minimum count value.  These 

-numbers are used to ensure that the pointers passed in as the task parameters

-are valid. */

-#define countSTART_AT_MAX_COUNT	( 0xaa )

-#define countSTART_AT_ZERO		( 0x55 )

-

-/* Two tasks are created for the test.  One uses a semaphore created with its

-count value set to the maximum, and one with the count value set to zero. */

-#define countNUM_TEST_TASKS		( 2 )

-#define countDONT_BLOCK			( 0 )

-

-/*-----------------------------------------------------------*/

-

-/* Flag that will be latched to pdTRUE should any unexpected behaviour be

-detected in any of the tasks. */

-static volatile portBASE_TYPE xErrorDetected = pdFALSE;

-

-/*-----------------------------------------------------------*/

-

-/*

- * The demo task.  This simply counts the semaphore up to its maximum value,

- * the counts it back down again.  The result of each semaphore 'give' and

- * 'take' is inspected, with an error being flagged if it is found not to be

- * the expected result.

- */

-static void prvCountingSemaphoreTask( void *pvParameters );

-

-/*

- * Utility function to increment the semaphore count value up from zero to

- * countMAX_COUNT_VALUE.

- */

-static void prvIncrementSemaphoreCount( xSemaphoreHandle xSemaphore, unsigned portBASE_TYPE *puxLoopCounter );

-

-/*

- * Utility function to decrement the semaphore count value up from 

- * countMAX_COUNT_VALUE to zero.

- */

-static void prvDecrementSemaphoreCount( xSemaphoreHandle xSemaphore, unsigned portBASE_TYPE *puxLoopCounter );

-

-/*-----------------------------------------------------------*/

-

-/* The structure that is passed into the task as the task parameter. */

-typedef struct COUNT_SEM_STRUCT

-{

-	/* The semaphore to be used for the demo. */

-	xSemaphoreHandle xSemaphore;

-

-	/* Set to countSTART_AT_MAX_COUNT if the semaphore should be created with

-	its count value set to its max count value, or countSTART_AT_ZERO if it

-	should have been created with its count value set to 0. */

-	unsigned portBASE_TYPE uxExpectedStartCount;	

-

-	/* Incremented on each cycle of the demo task.  Used to detect a stalled

-	task. */

-	unsigned portBASE_TYPE uxLoopCounter;			

-} xCountSemStruct;

-

-/* Two structures are defined, one is passed to each test task. */

-static volatile xCountSemStruct xParameters[ countNUM_TEST_TASKS ];

-

-/*-----------------------------------------------------------*/

-

-void vStartCountingSemaphoreTasks( void )

-{

-	/* Create the semaphores that we are going to use for the test/demo.  The

-	first should be created such that it starts at its maximum count value,

-	the second should be created such that it starts with a count value of zero. */

-	xParameters[ 0 ].xSemaphore = xSemaphoreCreateCounting( countMAX_COUNT_VALUE, countMAX_COUNT_VALUE );

-	xParameters[ 0 ].uxExpectedStartCount = countSTART_AT_MAX_COUNT;

-	xParameters[ 0 ].uxLoopCounter = 0;

-

-	xParameters[ 1 ].xSemaphore = xSemaphoreCreateCounting( countMAX_COUNT_VALUE, 0 );

-	xParameters[ 1 ].uxExpectedStartCount = 0;

-	xParameters[ 1 ].uxLoopCounter = 0;

-

-	/* vQueueAddToRegistry() adds the semaphore to the registry, if one is

-	in use.  The registry is provided as a means for kernel aware 

-	debuggers to locate semaphores and has no purpose if a kernel aware debugger

-	is not being used.  The call to vQueueAddToRegistry() will be removed

-	by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is 

-	defined to be less than 1. */

-	vQueueAddToRegistry( ( xQueueHandle ) xParameters[ 0 ].xSemaphore, ( signed portCHAR * ) "Counting_Sem_1" );

-	vQueueAddToRegistry( ( xQueueHandle ) xParameters[ 1 ].xSemaphore, ( signed portCHAR * ) "Counting_Sem_2" );

-

-

-	/* Were the semaphores created? */

-	if( ( xParameters[ 0 ].xSemaphore != NULL ) || ( xParameters[ 1 ].xSemaphore != NULL ) )

-	{

-		/* Create the demo tasks, passing in the semaphore to use as the parameter. */

-		xTaskCreate( prvCountingSemaphoreTask, ( signed portCHAR * ) "CNT1", configMINIMAL_STACK_SIZE, ( void * ) &( xParameters[ 0 ] ), tskIDLE_PRIORITY, NULL );

-		xTaskCreate( prvCountingSemaphoreTask, ( signed portCHAR * ) "CNT2", configMINIMAL_STACK_SIZE, ( void * ) &( xParameters[ 1 ] ), tskIDLE_PRIORITY, NULL );		

-	}

-}

-/*-----------------------------------------------------------*/

-

-static void prvDecrementSemaphoreCount( xSemaphoreHandle xSemaphore, unsigned portBASE_TYPE *puxLoopCounter )

-{

-unsigned portBASE_TYPE ux;

-

-	/* If the semaphore count is at its maximum then we should not be able to

-	'give' the semaphore. */

-	if( xSemaphoreGive( xSemaphore ) == pdPASS )

-	{

-		xErrorDetected = pdTRUE;

-	}

-

-	/* We should be able to 'take' the semaphore countMAX_COUNT_VALUE times. */

-	for( ux = 0; ux < countMAX_COUNT_VALUE; ux++ )

-	{

-		if( xSemaphoreTake( xSemaphore, countDONT_BLOCK ) != pdPASS )

-		{

-			/* We expected to be able to take the semaphore. */

-			xErrorDetected = pdTRUE;

-		}

-

-		( *puxLoopCounter )++;

-	}

-

-	#if configUSE_PREEMPTION == 0

-		taskYIELD();

-	#endif

-

-	/* If the semaphore count is zero then we should not be able to	'take' 

-	the semaphore. */

-	if( xSemaphoreTake( xSemaphore, countDONT_BLOCK ) == pdPASS )

-	{

-		xErrorDetected = pdTRUE;

-	}

-}

-/*-----------------------------------------------------------*/

-

-static void prvIncrementSemaphoreCount( xSemaphoreHandle xSemaphore, unsigned portBASE_TYPE *puxLoopCounter )

-{

-unsigned portBASE_TYPE ux;

-

-	/* If the semaphore count is zero then we should not be able to	'take' 

-	the semaphore. */

-	if( xSemaphoreTake( xSemaphore, countDONT_BLOCK ) == pdPASS )

-	{

-		xErrorDetected = pdTRUE;

-	}

-

-	/* We should be able to 'give' the semaphore countMAX_COUNT_VALUE times. */

-	for( ux = 0; ux < countMAX_COUNT_VALUE; ux++ )

-	{

-		if( xSemaphoreGive( xSemaphore ) != pdPASS )

-		{

-			/* We expected to be able to take the semaphore. */

-			xErrorDetected = pdTRUE;

-		}

-

-		( *puxLoopCounter )++;

-	}

-

-	#if configUSE_PREEMPTION == 0

-		taskYIELD();

-	#endif

-

-	/* If the semaphore count is at its maximum then we should not be able to

-	'give' the semaphore. */

-	if( xSemaphoreGive( xSemaphore ) == pdPASS )

-	{

-		xErrorDetected = pdTRUE;

-	}

-}

-/*-----------------------------------------------------------*/

-

-static void prvCountingSemaphoreTask( void *pvParameters )

-{

-xCountSemStruct *pxParameter;

-

-	#ifdef USE_STDIO

-	void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend );

-	

-		const portCHAR * const pcTaskStartMsg = "Counting semaphore demo started.\r\n";

-

-		/* Queue a message for printing to say the task has started. */

-		vPrintDisplayMessage( &pcTaskStartMsg );

-	#endif

-

-	/* The semaphore to be used was passed as the parameter. */

-	pxParameter = ( xCountSemStruct * ) pvParameters;

-

-	/* Did we expect to find the semaphore already at its max count value, or

-	at zero? */

-	if( pxParameter->uxExpectedStartCount == countSTART_AT_MAX_COUNT )

-	{

-		prvDecrementSemaphoreCount( pxParameter->xSemaphore, &( pxParameter->uxLoopCounter ) );

-	}

-

-	/* Now we expect the semaphore count to be 0, so this time there is an

-	error if we can take the semaphore. */

-	if( xSemaphoreTake( pxParameter->xSemaphore, 0 ) == pdPASS )

-	{

-		xErrorDetected = pdTRUE;

-	}

-

-	for( ;; )

-	{

-		prvIncrementSemaphoreCount( pxParameter->xSemaphore, &( pxParameter->uxLoopCounter ) );

-		prvDecrementSemaphoreCount( pxParameter->xSemaphore, &( pxParameter->uxLoopCounter ) );

-	}

-}

-/*-----------------------------------------------------------*/

-

-portBASE_TYPE xAreCountingSemaphoreTasksStillRunning( void )

-{

-static unsigned portBASE_TYPE uxLastCount0 = 0, uxLastCount1 = 0;

-portBASE_TYPE xReturn = pdPASS;

-

-	/* Return fail if any 'give' or 'take' did not result in the expected

-	behaviour. */

-	if( xErrorDetected != pdFALSE )

-	{

-		xReturn = pdFAIL;

-	}

-

-	/* Return fail if either task is not still incrementing its loop counter. */

-	if( uxLastCount0 == xParameters[ 0 ].uxLoopCounter )

-	{

-		xReturn = pdFAIL;

-	}

-	else

-	{

-		uxLastCount0 = xParameters[ 0 ].uxLoopCounter;

-	}

-

-	if( uxLastCount1 == xParameters[ 1 ].uxLoopCounter )

-	{

-		xReturn = pdFAIL;

-	}

-	else

-	{

-		uxLastCount1 = xParameters[ 1 ].uxLoopCounter;

-	}

-

-	return xReturn;

-}

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/death.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/death.c
deleted file mode 100644
index 71f1f4e..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/death.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-/**

- * Create a single persistent task which periodically dynamically creates another

- * two tasks.  The original task is called the creator task, the two tasks it

- * creates are called suicidal tasks.

- *

- * One of the created suicidal tasks kill one other suicidal task before killing

- * itself - leaving just the original task remaining.

- *

- * The creator task must be spawned after all of the other demo application tasks

- * as it keeps a check on the number of tasks under the scheduler control.  The

- * number of tasks it expects to see running should never be greater than the

- * number of tasks that were in existence when the creator task was spawned, plus

- * one set of four suicidal tasks.  If this number is exceeded an error is flagged.

- *

- * \page DeathC death.c

- * \ingroup DemoFiles

- * <HR>

- */

-

-/*

-Changes from V3.0.0

-	+ CreationCount sizes changed from unsigned portBASE_TYPE to

-	  unsigned short to minimize the risk of overflowing.

-	

-	+ Reset of usLastCreationCount added

-	

-Changes from V3.1.0

-	+ Changed the dummy calculation to use variables of type long, rather than

-	  float.  This allows the file to be used with ports that do not support

-	  floating point.

-

-*/

-

-#include <stdlib.h>

-

-/* Scheduler include files. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* Demo program include files. */

-#include "death.h"

-

-#define deathSTACK_SIZE		( configMINIMAL_STACK_SIZE + 60 )

-

-/* The task originally created which is responsible for periodically dynamically

-creating another four tasks. */

-static portTASK_FUNCTION_PROTO( vCreateTasks, pvParameters );

-

-/* The task function of the dynamically created tasks. */

-static portTASK_FUNCTION_PROTO( vSuicidalTask, pvParameters );

-

-/* A variable which is incremented every time the dynamic tasks are created.  This

-is used to check that the task is still running. */

-static volatile unsigned short usCreationCount = 0;

-

-/* Used to store the number of tasks that were originally running so the creator

-task can tell if any of the suicidal tasks have failed to die.

-*/

-static volatile unsigned portBASE_TYPE uxTasksRunningAtStart = 0;

-

-/* Tasks are deleted by the idle task.  Under heavy load the idle task might

-not get much processing time, so it would be legitimate for several tasks to

-remain undeleted for a short period. */

-static const unsigned portBASE_TYPE uxMaxNumberOfExtraTasksRunning = 2;

-

-/* Used to store a handle to the task that should be killed by a suicidal task,

-before it kills itself. */

-xTaskHandle xCreatedTask;

-

-/*-----------------------------------------------------------*/

-

-void vCreateSuicidalTasks( unsigned portBASE_TYPE uxPriority )

-{

-unsigned portBASE_TYPE *puxPriority;

-

-	/* Create the Creator tasks - passing in as a parameter the priority at which

-	the suicidal tasks should be created. */

-	puxPriority = ( unsigned portBASE_TYPE * ) pvPortMalloc( sizeof( unsigned portBASE_TYPE ) );

-	*puxPriority = uxPriority;

-

-	xTaskCreate( vCreateTasks, ( signed char * ) "CREATOR", deathSTACK_SIZE, ( void * ) puxPriority, uxPriority, NULL );

-

-	/* Record the number of tasks that are running now so we know if any of the

-	suicidal tasks have failed to be killed. */

-	uxTasksRunningAtStart = ( unsigned portBASE_TYPE ) uxTaskGetNumberOfTasks();

-	

-	/* FreeRTOS.org versions before V3.0 started the idle-task as the very

-	first task. The idle task was then already included in uxTasksRunningAtStart.

-	From FreeRTOS V3.0 on, the idle task is started when the scheduler is

-	started. Therefore the idle task is not yet accounted for. We correct

-	this by increasing uxTasksRunningAtStart by 1. */

-	uxTasksRunningAtStart++;

-	

-	/* From FreeRTOS version 7.0.0 can optionally create a timer service task.  

-	If this is done, then uxTasksRunningAtStart needs incrementing again as that

-	too is created when the scheduler is started. */

-	#if configUSE_TIMERS == 1

-		uxTasksRunningAtStart++;

-	#endif

-}

-/*-----------------------------------------------------------*/

-					

-static portTASK_FUNCTION( vSuicidalTask, pvParameters )

-{

-volatile long l1, l2;

-xTaskHandle xTaskToKill;

-const portTickType xDelay = ( portTickType ) 200 / portTICK_RATE_MS;

-

-	if( pvParameters != NULL )

-	{

-		/* This task is periodically created four times.  Two created tasks are

-		passed a handle to the other task so it can kill it before killing itself.

-		The other task is passed in null. */

-		xTaskToKill = *( xTaskHandle* )pvParameters;

-	}

-	else

-	{

-		xTaskToKill = NULL;

-	}

-

-	for( ;; )

-	{

-		/* Do something random just to use some stack and registers. */

-		l1 = 2;

-		l2 = 89;

-		l2 *= l1;

-		vTaskDelay( xDelay );

-

-		if( xTaskToKill != NULL )

-		{

-			/* Make sure the other task has a go before we delete it. */

-			vTaskDelay( ( portTickType ) 0 );

-

-			/* Kill the other task that was created by vCreateTasks(). */

-			vTaskDelete( xTaskToKill );

-

-			/* Kill ourselves. */

-			vTaskDelete( NULL );

-		}

-	}

-}/*lint !e818 !e550 Function prototype must be as per standard for task functions. */

-/*-----------------------------------------------------------*/

-

-static portTASK_FUNCTION( vCreateTasks, pvParameters )

-{

-const portTickType xDelay = ( portTickType ) 1000 / portTICK_RATE_MS;

-unsigned portBASE_TYPE uxPriority;

-

-	uxPriority = *( unsigned portBASE_TYPE * ) pvParameters;

-	vPortFree( pvParameters );

-

-	for( ;; )

-	{

-		/* Just loop round, delaying then creating the four suicidal tasks. */

-		vTaskDelay( xDelay );

-

-		xCreatedTask = NULL;

-

-		xTaskCreate( vSuicidalTask, ( signed char * ) "SUICID1", configMINIMAL_STACK_SIZE, NULL, uxPriority, &xCreatedTask );

-		xTaskCreate( vSuicidalTask, ( signed char * ) "SUICID2", configMINIMAL_STACK_SIZE, &xCreatedTask, uxPriority, NULL );

-

-		++usCreationCount;

-	}

-}

-/*-----------------------------------------------------------*/

-

-/* This is called to check that the creator task is still running and that there

-are not any more than four extra tasks. */

-portBASE_TYPE xIsCreateTaskStillRunning( void )

-{

-static unsigned short usLastCreationCount = 0xfff;

-portBASE_TYPE xReturn = pdTRUE;

-static unsigned portBASE_TYPE uxTasksRunningNow;

-

-	if( usLastCreationCount == usCreationCount )

-	{

-		xReturn = pdFALSE;

-	}

-	else

-	{

-		usLastCreationCount = usCreationCount;

-	}

-	

-	uxTasksRunningNow = ( unsigned portBASE_TYPE ) uxTaskGetNumberOfTasks();

-

-	if( uxTasksRunningNow < uxTasksRunningAtStart )

-	{

-		xReturn = pdFALSE;

-	}

-	else if( ( uxTasksRunningNow - uxTasksRunningAtStart ) > uxMaxNumberOfExtraTasksRunning )

-	{

-		xReturn = pdFALSE;

-	}

-	else

-	{

-		/* Everything is okay. */

-	}

-

-	return xReturn;

-}

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/dynamic.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/dynamic.c
deleted file mode 100644
index 5262614..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/dynamic.c
+++ /dev/null
@@ -1,440 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-/*

- * The first test creates three tasks - two counter tasks (one continuous count 

- * and one limited count) and one controller.  A "count" variable is shared 

- * between all three tasks.  The two counter tasks should never be in a "ready" 

- * state at the same time.  The controller task runs at the same priority as 

- * the continuous count task, and at a lower priority than the limited count 

- * task.

- *

- * One counter task loops indefinitely, incrementing the shared count variable

- * on each iteration.  To ensure it has exclusive access to the variable it

- * raises it's priority above that of the controller task before each 

- * increment, lowering it again to it's original priority before starting the

- * next iteration.

- *

- * The other counter task increments the shared count variable on each

- * iteration of it's loop until the count has reached a limit of 0xff - at

- * which point it suspends itself.  It will not start a new loop until the 

- * controller task has made it "ready" again by calling vTaskResume ().  

- * This second counter task operates at a higher priority than controller 

- * task so does not need to worry about mutual exclusion of the counter 

- * variable.

- *

- * The controller task is in two sections.  The first section controls and

- * monitors the continuous count task.  When this section is operational the 

- * limited count task is suspended.  Likewise, the second section controls 

- * and monitors the limited count task.  When this section is operational the 

- * continuous count task is suspended.

- *

- * In the first section the controller task first takes a copy of the shared

- * count variable.  To ensure mutual exclusion on the count variable it

- * suspends the continuous count task, resuming it again when the copy has been

- * taken.  The controller task then sleeps for a fixed period - during which

- * the continuous count task will execute and increment the shared variable.

- * When the controller task wakes it checks that the continuous count task

- * has executed by comparing the copy of the shared variable with its current

- * value.  This time, to ensure mutual exclusion, the scheduler itself is 

- * suspended with a call to vTaskSuspendAll ().  This is for demonstration 

- * purposes only and is not a recommended technique due to its inefficiency.

- *

- * After a fixed number of iterations the controller task suspends the 

- * continuous count task, and moves on to its second section.

- *

- * At the start of the second section the shared variable is cleared to zero.

- * The limited count task is then woken from it's suspension by a call to

- * vTaskResume ().  As this counter task operates at a higher priority than

- * the controller task the controller task should not run again until the

- * shared variable has been counted up to the limited value causing the counter

- * task to suspend itself.  The next line after vTaskResume () is therefore

- * a check on the shared variable to ensure everything is as expected.

- *

- *

- * The second test consists of a couple of very simple tasks that post onto a 

- * queue while the scheduler is suspended.  This test was added to test parts

- * of the scheduler not exercised by the first test.

- *

- */

-

-#include <stdlib.h>

-

-/* Scheduler include files. */

-#include "FreeRTOS.h"

-#include "task.h"

-#include "semphr.h"

-

-/* Demo app include files. */

-#include "dynamic.h"

-

-/* Function that implements the "limited count" task as described above. */

-static portTASK_FUNCTION_PROTO( vLimitedIncrementTask, pvParameters );

-

-/* Function that implements the "continuous count" task as described above. */

-static portTASK_FUNCTION_PROTO( vContinuousIncrementTask, pvParameters );

-

-/* Function that implements the controller task as described above. */

-static portTASK_FUNCTION_PROTO( vCounterControlTask, pvParameters );

-

-static portTASK_FUNCTION_PROTO( vQueueReceiveWhenSuspendedTask, pvParameters );

-static portTASK_FUNCTION_PROTO( vQueueSendWhenSuspendedTask, pvParameters );

-

-/* Demo task specific constants. */

-#define priSTACK_SIZE				( configMINIMAL_STACK_SIZE )

-#define priSLEEP_TIME				( ( portTickType ) 128 / portTICK_RATE_MS )

-#define priLOOPS					( 5 )

-#define priMAX_COUNT				( ( unsigned long ) 0xff )

-#define priNO_BLOCK					( ( portTickType ) 0 )

-#define priSUSPENDED_QUEUE_LENGTH	( 1 )

-

-/*-----------------------------------------------------------*/

-

-/* Handles to the two counter tasks.  These could be passed in as parameters

-to the controller task to prevent them having to be file scope. */

-static xTaskHandle xContinousIncrementHandle, xLimitedIncrementHandle;

-

-/* The shared counter variable.  This is passed in as a parameter to the two 

-counter variables for demonstration purposes. */

-static unsigned long ulCounter;

-

-/* Variables used to check that the tasks are still operating without error.

-Each complete iteration of the controller task increments this variable

-provided no errors have been found.  The variable maintaining the same value

-is therefore indication of an error. */

-static volatile unsigned short usCheckVariable = ( unsigned short ) 0;

-static volatile portBASE_TYPE xSuspendedQueueSendError = pdFALSE;

-static volatile portBASE_TYPE xSuspendedQueueReceiveError = pdFALSE;

-

-/* Queue used by the second test. */

-xQueueHandle xSuspendedTestQueue;

-

-/*-----------------------------------------------------------*/

-/*

- * Start the three tasks as described at the top of the file.

- * Note that the limited count task is given a higher priority.

- */

-void vStartDynamicPriorityTasks( void )

-{

-	xSuspendedTestQueue = xQueueCreate( priSUSPENDED_QUEUE_LENGTH, sizeof( unsigned long ) );

-

-	/* vQueueAddToRegistry() adds the queue to the queue registry, if one is

-	in use.  The queue registry is provided as a means for kernel aware 

-	debuggers to locate queues and has no purpose if a kernel aware debugger

-	is not being used.  The call to vQueueAddToRegistry() will be removed

-	by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is 

-	defined to be less than 1. */

-	vQueueAddToRegistry( xSuspendedTestQueue, ( signed char * ) "Suspended_Test_Queue" );

-

-	xTaskCreate( vContinuousIncrementTask, ( signed char * ) "CNT_INC", priSTACK_SIZE, ( void * ) &ulCounter, tskIDLE_PRIORITY, &xContinousIncrementHandle );

-	xTaskCreate( vLimitedIncrementTask, ( signed char * ) "LIM_INC", priSTACK_SIZE, ( void * ) &ulCounter, tskIDLE_PRIORITY + 1, &xLimitedIncrementHandle );

-	xTaskCreate( vCounterControlTask, ( signed char * ) "C_CTRL", priSTACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );

-	xTaskCreate( vQueueSendWhenSuspendedTask, ( signed char * ) "SUSP_TX", priSTACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );

-	xTaskCreate( vQueueReceiveWhenSuspendedTask, ( signed char * ) "SUSP_RX", priSTACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );

-}

-/*-----------------------------------------------------------*/

-

-/*

- * Just loops around incrementing the shared variable until the limit has been

- * reached.  Once the limit has been reached it suspends itself. 

- */

-static portTASK_FUNCTION( vLimitedIncrementTask, pvParameters )

-{

-unsigned long *pulCounter;

-

-	/* Take a pointer to the shared variable from the parameters passed into

-	the task. */

-	pulCounter = ( unsigned long * ) pvParameters;

-

-	/* This will run before the control task, so the first thing it does is

-	suspend - the control task will resume it when ready. */

-	vTaskSuspend( NULL );

-

-	for( ;; )

-	{

-		/* Just count up to a value then suspend. */

-		( *pulCounter )++;	

-		

-		if( *pulCounter >= priMAX_COUNT )

-		{

-			vTaskSuspend( NULL );

-		} 	

-	}

-}

-/*-----------------------------------------------------------*/

-

-/*

- * Just keep counting the shared variable up.  The control task will suspend

- * this task when it wants.

- */

-static portTASK_FUNCTION( vContinuousIncrementTask, pvParameters )

-{

-unsigned long *pulCounter;

-unsigned portBASE_TYPE uxOurPriority;

-

-	/* Take a pointer to the shared variable from the parameters passed into

-	the task. */

-	pulCounter = ( unsigned long * ) pvParameters;

-

-	/* Query our priority so we can raise it when exclusive access to the 

-	shared variable is required. */

-	uxOurPriority = uxTaskPriorityGet( NULL );

-

-	for( ;; )

-	{

-		/* Raise our priority above the controller task to ensure a context

-		switch does not occur while we are accessing this variable. */

-		vTaskPrioritySet( NULL, uxOurPriority + 1 );

-			( *pulCounter )++;		

-		vTaskPrioritySet( NULL, uxOurPriority );

-	}

-}

-/*-----------------------------------------------------------*/

-

-/*

- * Controller task as described above.

- */

-static portTASK_FUNCTION( vCounterControlTask, pvParameters )

-{

-unsigned long ulLastCounter;

-short sLoops;

-short sError = pdFALSE;

-

-	/* Just to stop warning messages. */

-	( void ) pvParameters;

-

-	for( ;; )

-	{

-		/* Start with the counter at zero. */

-		ulCounter = ( unsigned long ) 0;

-

-		/* First section : */

-

-		/* Check the continuous count task is running. */

-		for( sLoops = 0; sLoops < priLOOPS; sLoops++ )

-		{

-			/* Suspend the continuous count task so we can take a mirror of the

-			shared variable without risk of corruption. */

-			vTaskSuspend( xContinousIncrementHandle );

-				ulLastCounter = ulCounter;

-			vTaskResume( xContinousIncrementHandle );

-			

-			/* Now delay to ensure the other task has processor time. */

-			vTaskDelay( priSLEEP_TIME );

-

-			/* Check the shared variable again.  This time to ensure mutual 

-			exclusion the whole scheduler will be locked.  This is just for

-			demo purposes! */

-			vTaskSuspendAll();

-			{

-				if( ulLastCounter == ulCounter )

-				{

-					/* The shared variable has not changed.  There is a problem

-					with the continuous count task so flag an error. */

-					sError = pdTRUE;

-				}

-			}

-			xTaskResumeAll();

-		}

-

-

-		/* Second section: */

-

-		/* Suspend the continuous counter task so it stops accessing the shared variable. */

-		vTaskSuspend( xContinousIncrementHandle );

-

-		/* Reset the variable. */

-		ulCounter = ( unsigned long ) 0;

-

-		/* Resume the limited count task which has a higher priority than us.

-		We should therefore not return from this call until the limited count

-		task has suspended itself with a known value in the counter variable. */

-		vTaskResume( xLimitedIncrementHandle );

-

-		/* Does the counter variable have the expected value? */

-		if( ulCounter != priMAX_COUNT )

-		{

-			sError = pdTRUE;

-		}

-

-		if( sError == pdFALSE )

-		{

-			/* If no errors have occurred then increment the check variable. */

-			portENTER_CRITICAL();

-				usCheckVariable++;

-			portEXIT_CRITICAL();

-		}

-

-		/* Resume the continuous count task and do it all again. */

-		vTaskResume( xContinousIncrementHandle );

-	}

-}

-/*-----------------------------------------------------------*/

-

-static portTASK_FUNCTION( vQueueSendWhenSuspendedTask, pvParameters )

-{

-static unsigned long ulValueToSend = ( unsigned long ) 0;

-

-	/* Just to stop warning messages. */

-	( void ) pvParameters;

-

-	for( ;; )

-	{

-		vTaskSuspendAll();

-		{

-			/* We must not block while the scheduler is suspended! */

-			if( xQueueSend( xSuspendedTestQueue, ( void * ) &ulValueToSend, priNO_BLOCK ) != pdTRUE )

-			{

-				xSuspendedQueueSendError = pdTRUE;

-			}

-		}

-		xTaskResumeAll();

-

-		vTaskDelay( priSLEEP_TIME );

-

-		++ulValueToSend;

-	}

-}

-/*-----------------------------------------------------------*/

-

-static portTASK_FUNCTION( vQueueReceiveWhenSuspendedTask, pvParameters )

-{

-static unsigned long ulExpectedValue = ( unsigned long ) 0, ulReceivedValue;

-portBASE_TYPE xGotValue;

-

-	/* Just to stop warning messages. */

-	( void ) pvParameters;

-

-	for( ;; )

-	{

-		do

-		{

-			/* Suspending the scheduler here is fairly pointless and 

-			undesirable for a normal application.  It is done here purely

-			to test the scheduler.  The inner xTaskResumeAll() should

-			never return pdTRUE as the scheduler is still locked by the

-			outer call. */

-			vTaskSuspendAll();

-			{

-				vTaskSuspendAll();

-				{

-					xGotValue = xQueueReceive( xSuspendedTestQueue, ( void * ) &ulReceivedValue, priNO_BLOCK );

-				}

-				if( xTaskResumeAll() )

-				{

-					xSuspendedQueueReceiveError = pdTRUE;

-				}

-			}

-			xTaskResumeAll();

-

-			#if configUSE_PREEMPTION == 0

-			{

-				taskYIELD();

-			}

-			#endif

-

-		} while( xGotValue == pdFALSE );

-

-		if( ulReceivedValue != ulExpectedValue )

-		{

-			xSuspendedQueueReceiveError = pdTRUE;

-		}

-

-		++ulExpectedValue;

-	}

-}

-/*-----------------------------------------------------------*/

-

-/* Called to check that all the created tasks are still running without error. */

-portBASE_TYPE xAreDynamicPriorityTasksStillRunning( void )

-{

-/* Keep a history of the check variables so we know if it has been incremented 

-since the last call. */

-static unsigned short usLastTaskCheck = ( unsigned short ) 0;

-portBASE_TYPE xReturn = pdTRUE;

-

-	/* Check the tasks are still running by ensuring the check variable

-	is still incrementing. */

-

-	if( usCheckVariable == usLastTaskCheck )

-	{

-		/* The check has not incremented so an error exists. */

-		xReturn = pdFALSE;

-	}

-

-	if( xSuspendedQueueSendError == pdTRUE )

-	{

-		xReturn = pdFALSE;

-	}

-

-	if( xSuspendedQueueReceiveError == pdTRUE )

-	{

-		xReturn = pdFALSE;

-	}

-

-	usLastTaskCheck = usCheckVariable;

-	return xReturn;

-}

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/flash_timer.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/flash_timer.c
deleted file mode 100644
index 39c0fc8..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/flash_timer.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-/**

- * Repeatedly toggles one or more LEDs using software timers - one timer per

- * LED.

- */

- 

-/* Scheduler include files. */

-#include "FreeRTOS.h"

-#include "timers.h"

-

-/* Demo program include files. */

-#include "partest.h"

-#include "flash_timer.h"

-

-/* The toggle rates are all a multple of ledFLASH_RATE_BASE. */

-#define ledFLASH_RATE_BASE	( ( ( portTickType ) 333 ) / portTICK_RATE_MS )

-

-/* A block time of zero simple means "don't block". */

-#define ledDONT_BLOCK		( ( portTickType ) 0 )

-

-/*-----------------------------------------------------------*/

-

-/*

- * The callback function used by each LED flashing timer.  All the timers use

- * this function, and the timer ID is used within the function to determine

- * which timer has actually expired.

- */

-static void prvLEDTimerCallback( xTimerHandle xTimer );

-

-/*-----------------------------------------------------------*/

-

-void vStartLEDFlashTimers( unsigned portBASE_TYPE uxNumberOfLEDs )

-{

-unsigned portBASE_TYPE uxLEDTimer;

-xTimerHandle xTimer;

-

-	/* Create and start the requested number of timers. */

-	for( uxLEDTimer = 0; uxLEDTimer < uxNumberOfLEDs; ++uxLEDTimer )

-	{

-		/* Create the timer. */

-		xTimer = xTimerCreate( 	( const signed char * const ) "Flasher",/* A text name, purely to help debugging. */

-								ledFLASH_RATE_BASE * ( uxLEDTimer + 1 ),	/* The timer period, which is a multiple of ledFLASH_RATE_BASE. */

-								pdTRUE,									/* This is an auto-reload timer, so xAutoReload is set to pdTRUE. */

-								( void * ) uxLEDTimer,					/* The ID is used to identify the timer within the timer callback function, as each timer uses the same callback. */

-								prvLEDTimerCallback						/* Each timer uses the same callback. */

-							  );

-				

-		/* If the timer was created successfully, attempt to start it.  If the

-		scheduler has not yet been started then the timer command queue must

-		be long enough to hold each command sent to it until such time that the

-		scheduler is started.  The timer command queue length is set by

-		configTIMER_QUEUE_LENGTH in FreeRTOSConfig.h. */

-		if( xTimer != NULL )

-		{

-			xTimerStart( xTimer, ledDONT_BLOCK );

-		}							  

-	}

-}

-/*-----------------------------------------------------------*/

-

-static void prvLEDTimerCallback( xTimerHandle xTimer )

-{

-portBASE_TYPE xTimerID;

-

-	/* The timer ID is used to identify the timer that has actually expired as

-	each timer uses the same callback.  The ID is then also used as the number

-	of the LED that is to be toggled. */

-	xTimerID = ( portBASE_TYPE ) pvTimerGetTimerID( xTimer );

-	vParTestToggleLED( xTimerID );

-}

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/BlockQ.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/BlockQ.h
deleted file mode 100644
index dc7bde4..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/BlockQ.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef BLOCK_Q_H

-#define BLOCK_Q_H

-

-void vStartBlockingQueueTasks( unsigned portBASE_TYPE uxPriority );

-portBASE_TYPE xAreBlockingQueuesStillRunning( void );

-

-#endif

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/GenQTest.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/GenQTest.h
deleted file mode 100644
index 1ae25b3..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/GenQTest.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef GEN_Q_TEST_H

-#define GEN_Q_TEST_H

-

-void vStartGenericQueueTasks( unsigned portBASE_TYPE uxPriority );

-portBASE_TYPE xAreGenericQueueTasksStillRunning( void );

-

-#endif /* GEN_Q_TEST_H */

-

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/PollQ.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/PollQ.h
deleted file mode 100644
index a722eef..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/PollQ.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef POLLED_Q_H

-#define POLLED_Q_H

-

-void vStartPolledQueueTasks( unsigned portBASE_TYPE uxPriority );

-portBASE_TYPE xArePollingQueuesStillRunning( void );

-

-#endif

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/blocktim.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/blocktim.h
deleted file mode 100644
index b20a234..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/blocktim.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef BLOCK_TIME_TEST_H

-#define BLOCK_TIME_TEST_H

-

-void vCreateBlockTimeTasks( void );

-portBASE_TYPE xAreBlockTimeTestTasksStillRunning( void );

-

-#endif

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/comtest2.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/comtest2.h
deleted file mode 100644
index 7014670..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/comtest2.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef COMTEST_H

-#define COMTEST_H

-

-void vAltStartComTestTasks( unsigned portBASE_TYPE uxPriority, unsigned long ulBaudRate, unsigned portBASE_TYPE uxLED );

-portBASE_TYPE xAreComTestTasksStillRunning( void );

-

-#endif

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/countsem.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/countsem.h
deleted file mode 100644
index 5d66b98..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/countsem.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef COUNT_SEMAPHORE_TEST_H

-#define COUNT_SEMAPHORE_TEST_H

-

-void vStartCountingSemaphoreTasks( void );

-portBASE_TYPE xAreCountingSemaphoreTasksStillRunning( void );

-

-#endif

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/death.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/death.h
deleted file mode 100644
index 5f3c27f..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/death.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef SUICIDE_TASK_H

-#define SUICIDE_TASK_H

-

-void vCreateSuicidalTasks( unsigned portBASE_TYPE uxPriority );

-portBASE_TYPE xIsCreateTaskStillRunning( void );

-

-#endif

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/demo_serial.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/demo_serial.h
deleted file mode 100644
index afafdd5..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/demo_serial.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef SERIAL_COMMS_H

-#define SERIAL_COMMS_H

-

-typedef void * xComPortHandle;

-

-typedef enum

-{ 

-	serCOM1, 

-	serCOM2, 

-	serCOM3, 

-	serCOM4, 

-	serCOM5, 

-	serCOM6, 

-	serCOM7, 

-	serCOM8 

-} eCOMPort;

-

-typedef enum 

-{ 

-	serNO_PARITY, 

-	serODD_PARITY, 

-	serEVEN_PARITY, 

-	serMARK_PARITY, 

-	serSPACE_PARITY 

-} eParity;

-

-typedef enum 

-{ 

-	serSTOP_1, 

-	serSTOP_2 

-} eStopBits;

-

-typedef enum 

-{ 

-	serBITS_5, 

-	serBITS_6, 

-	serBITS_7, 

-	serBITS_8 

-} eDataBits;

-

-typedef enum 

-{ 

-	ser50,		

-	ser75,		

-	ser110,		

-	ser134,		

-	ser150,    

-	ser200,

-	ser300,		

-	ser600,		

-	ser1200,	

-	ser1800,	

-	ser2400,   

-	ser4800,

-	ser9600,		

-	ser19200,	

-	ser38400,	

-	ser57600,	

-	ser115200

-} eBaud;

-

-xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength );

-xComPortHandle xSerialPortInit( eCOMPort ePort, eBaud eWantedBaud, eParity eWantedParity, eDataBits eWantedDataBits, eStopBits eWantedStopBits, unsigned portBASE_TYPE uxBufferLength );

-void vSerialPutString( xComPortHandle pxPort, const signed char * const pcString, unsigned short usStringLength );

-signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, portTickType xBlockTime );

-signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, portTickType xBlockTime );

-portBASE_TYPE xSerialWaitForSemaphore( xComPortHandle xPort );

-void vSerialClose( xComPortHandle xPort );

-

-#endif

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/dynamic.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/dynamic.h
deleted file mode 100644
index e717a9d..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/dynamic.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef DYNAMIC_MANIPULATION_H

-#define DYNAMIC_MANIPULATION_H

-

-void vStartDynamicPriorityTasks( void );

-portBASE_TYPE xAreDynamicPriorityTasksStillRunning( void );

-

-#endif

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/flash_timer.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/flash_timer.h
deleted file mode 100644
index fd0b071..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/flash_timer.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef FLASH_TIMER_H

-#define FLASH_TIMER_H

-

-/*

- * Creates the LED flashing timers.  xNumberOfLEDs specifies how many timers to

- * create, with each timer toggling a different LED.  The first LED to be 

- * toggled is LED 0, with subsequent LEDs following on in numerical order.  Each

- * timer uses the exact same callback function, with the timer ID being used

- * within the callback function to determine which timer has actually expired

- * (and therefore which LED to toggle).

- */

-void vStartLEDFlashTimers( unsigned portBASE_TYPE uxNumberOfLEDs );

-

-#endif /* FLASH_TIMER_H */

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/integer.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/integer.h
deleted file mode 100644
index 1734542..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/integer.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef INTEGER_TASKS_H

-#define INTEGER_TASKS_H

-

-void vStartIntegerMathTasks( unsigned portBASE_TYPE uxPriority );

-portBASE_TYPE xAreIntegerMathsTaskStillRunning( void );

-

-#endif

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/partest.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/partest.h
deleted file mode 100644
index 398239f..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/partest.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef PARTEST_H

-#define PARTEST_H

-

-#define partstDEFAULT_PORT_ADDRESS		( ( unsigned short ) 0x378 )

-

-void vParTestInitialise( void );

-void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue );

-void vParTestToggleLED( unsigned portBASE_TYPE uxLED );

-

-#endif

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/recmutex.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/recmutex.h
deleted file mode 100644
index 80d20f4..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/recmutex.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef RECURSIVE_MUTEX_TEST_H

-#define RECURSIVE_MUTEX_TEST_H

-

-void vStartRecursiveMutexTasks( void );

-portBASE_TYPE xAreRecursiveMutexTasksStillRunning( void );

-

-#endif

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/semtest.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/semtest.h
deleted file mode 100644
index d65d386..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/include/semtest.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef SEMAPHORE_TEST_H

-#define SEMAPHORE_TEST_H

-

-void vStartSemaphoreTasks( unsigned portBASE_TYPE uxPriority );

-portBASE_TYPE xAreSemaphoreTasksStillRunning( void );

-

-#endif

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/integer.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/integer.c
deleted file mode 100644
index 9954ff7..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/integer.c
+++ /dev/null
@@ -1,225 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-/*

- * This version of integer. c is for use on systems that have limited stack

- * space and no display facilities.  The complete version can be found in

- * the Demo/Common/Full directory.

- *

- * As with the full version, the tasks created in this file are a good test 

- * of the scheduler context switch mechanism.  The processor has to access 

- * 32bit variables in two or four chunks (depending on the processor).  The low 

- * priority of these tasks means there is a high probability that a context 

- * switch will occur mid calculation.  See flop. c documentation for 

- * more information.

- *

- */

-

-/*

-Changes from V1.2.1

-

-	+ The constants used in the calculations are larger to ensure the

-	  optimiser does not truncate them to 16 bits.

-

-Changes from V1.2.3

-

-	+ uxTaskCheck is now just used as a boolean.  Instead of incrementing

-	  the variable each cycle of the task, the variable is simply set to

-	  true.  sAreIntegerMathsTaskStillRunning() sets it back to false and

-	  expects it to have been set back to true by the time it is called

-	  again.

-	+ A division has been included in the calculation.

-*/

-

-#include <stdlib.h>

-

-/* Scheduler include files. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* Demo program include files. */

-#include "integer.h"

-

-/* The constants used in the calculation. */

-#define intgCONST1				( ( long ) 123 )

-#define intgCONST2				( ( long ) 234567 )

-#define intgCONST3				( ( long ) -3 )

-#define intgCONST4				( ( long ) 7 )

-#define intgEXPECTED_ANSWER		( ( ( intgCONST1 + intgCONST2 ) * intgCONST3 ) / intgCONST4 )

-

-#define intgSTACK_SIZE			configMINIMAL_STACK_SIZE

-

-/* As this is the minimal version, we will only create one task. */

-#define intgNUMBER_OF_TASKS		( 1 )

-

-/* The task function.  Repeatedly performs a 32 bit calculation, checking the

-result against the expected result.  If the result is incorrect then the

-context switch must have caused some corruption. */

-static portTASK_FUNCTION_PROTO( vCompeteingIntMathTask, pvParameters );

-

-/* Variables that are set to true within the calculation task to indicate

-that the task is still executing.  The check task sets the variable back to

-false, flagging an error if the variable is still false the next time it

-is called. */

-static volatile signed portBASE_TYPE xTaskCheck[ intgNUMBER_OF_TASKS ] = { ( signed portBASE_TYPE ) pdFALSE };

-

-/*-----------------------------------------------------------*/

-

-void vStartIntegerMathTasks( unsigned portBASE_TYPE uxPriority )

-{

-short sTask;

-

-	for( sTask = 0; sTask < intgNUMBER_OF_TASKS; sTask++ )

-	{

-		xTaskCreate( vCompeteingIntMathTask, ( signed char * ) "IntMath", intgSTACK_SIZE, ( void * ) &( xTaskCheck[ sTask ] ), uxPriority, ( xTaskHandle * ) NULL );

-	}

-}

-/*-----------------------------------------------------------*/

-

-static portTASK_FUNCTION( vCompeteingIntMathTask, pvParameters )

-{

-/* These variables are all effectively set to constants so they are volatile to

-ensure the compiler does not just get rid of them. */

-volatile long lValue;

-short sError = pdFALSE;

-volatile signed portBASE_TYPE *pxTaskHasExecuted;

-

-	/* Set a pointer to the variable we are going to set to true each

-	iteration.  This is also a good test of the parameter passing mechanism

-	within each port. */

-	pxTaskHasExecuted = ( volatile signed portBASE_TYPE * ) pvParameters;

-

-	/* Keep performing a calculation and checking the result against a constant. */

-	for( ;; )

-	{

-		/* Perform the calculation.  This will store partial value in

-		registers, resulting in a good test of the context switch mechanism. */

-		lValue = intgCONST1;

-		lValue += intgCONST2;

-

-		/* Yield in case cooperative scheduling is being used. */

-		#if configUSE_PREEMPTION == 0

-		{

-			taskYIELD();

-		}

-		#endif

-

-		/* Finish off the calculation. */

-		lValue *= intgCONST3;

-		lValue /= intgCONST4;

-

-		/* If the calculation is found to be incorrect we stop setting the 

-		TaskHasExecuted variable so the check task can see an error has 

-		occurred. */

-		if( lValue != intgEXPECTED_ANSWER ) /*lint !e774 volatile used to prevent this being optimised out. */

-		{

-			sError = pdTRUE;

-		}

-

-		if( sError == pdFALSE )

-		{

-			/* We have not encountered any errors, so set the flag that show

-			we are still executing.  This will be periodically cleared by

-			the check task. */

-			portENTER_CRITICAL();

-				*pxTaskHasExecuted = pdTRUE;

-			portEXIT_CRITICAL();

-		}

-

-		/* Yield in case cooperative scheduling is being used. */

-		#if configUSE_PREEMPTION == 0

-		{

-			taskYIELD();

-		}

-		#endif

-	}

-}

-/*-----------------------------------------------------------*/

-

-/* This is called to check that all the created tasks are still running. */

-portBASE_TYPE xAreIntegerMathsTaskStillRunning( void )

-{

-portBASE_TYPE xReturn = pdTRUE;

-short sTask;

-

-	/* Check the maths tasks are still running by ensuring their check variables 

-	are still being set to true. */

-	for( sTask = 0; sTask < intgNUMBER_OF_TASKS; sTask++ )

-	{

-		if( xTaskCheck[ sTask ] == pdFALSE )

-		{

-			/* The check has not incremented so an error exists. */

-			xReturn = pdFALSE;

-		}

-

-		/* Reset the check variable so we can tell if it has been set by

-		the next time around. */

-		xTaskCheck[ sTask ] = pdFALSE;

-	}

-

-	return xReturn;

-}

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/recmutex.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/recmutex.c
deleted file mode 100644
index 998e533..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/recmutex.c
+++ /dev/null
@@ -1,408 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-/*

-	The tasks defined on this page demonstrate the use of recursive mutexes.

-

-	For recursive mutex functionality the created mutex should be created using

-	xSemaphoreCreateRecursiveMutex(), then be manipulated

-	using the xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() API

-	functions.

-

-	This demo creates three tasks all of which access the same recursive mutex:

-

-	prvRecursiveMutexControllingTask() has the highest priority so executes 

-	first and grabs the mutex.  It then performs some recursive accesses - 

-	between each of which it sleeps for a short period to let the lower 

-	priority tasks execute.  When it has completed its demo functionality

-	it gives the mutex back before suspending itself.

-

-	prvRecursiveMutexBlockingTask() attempts to access the mutex by performing

-	a blocking 'take'.  The blocking task has a lower priority than the 

-	controlling	task so by the time it executes the mutex has already been

-	taken by the controlling task,  causing the blocking task to block.  It 

-	does not unblock until the controlling task has given the mutex back, 

-	and it does not actually run until the controlling task has suspended 

-	itself (due to the relative priorities).  When it eventually does obtain

-	the mutex all it does is give the mutex back prior to also suspending 

-	itself.  At this point both the controlling task and the blocking task are 

-	suspended.

-

-	prvRecursiveMutexPollingTask() runs at the idle priority.  It spins round

-	a tight loop attempting to obtain the mutex with a non-blocking call.  As

-	the lowest priority task it will not successfully obtain the mutex until

-	both the controlling and blocking tasks are suspended.  Once it eventually 

-	does obtain the mutex it first unsuspends both the controlling task and

-	blocking task prior to giving the mutex back - resulting in the polling

-	task temporarily inheriting the controlling tasks priority.

-*/

-

-/* Scheduler include files. */

-#include "FreeRTOS.h"

-#include "task.h"

-#include "semphr.h"

-

-/* Demo app include files. */

-#include "recmutex.h"

-

-/* Priorities assigned to the three tasks. */

-#define recmuCONTROLLING_TASK_PRIORITY	( tskIDLE_PRIORITY + 2 )

-#define recmuBLOCKING_TASK_PRIORITY		( tskIDLE_PRIORITY + 1 )

-#define recmuPOLLING_TASK_PRIORITY		( tskIDLE_PRIORITY + 0 )

-

-/* The recursive call depth. */

-#define recmuMAX_COUNT					( 10 )

-

-/* Misc. */

-#define recmuSHORT_DELAY				( 20 / portTICK_RATE_MS )

-#define recmuNO_DELAY					( ( portTickType ) 0 )

-#define recmuTWO_TICK_DELAY				( ( portTickType ) 2 )

-

-/* The three tasks as described at the top of this file. */

-static void prvRecursiveMutexControllingTask( void *pvParameters );

-static void prvRecursiveMutexBlockingTask( void *pvParameters );

-static void prvRecursiveMutexPollingTask( void *pvParameters );

-

-/* The mutex used by the demo. */

-static xSemaphoreHandle xMutex;

-

-/* Variables used to detect and latch errors. */

-static volatile portBASE_TYPE xErrorOccurred = pdFALSE, xControllingIsSuspended = pdFALSE, xBlockingIsSuspended = pdFALSE;

-static volatile unsigned portBASE_TYPE uxControllingCycles = 0, uxBlockingCycles = 0, uxPollingCycles = 0;

-

-/* Handles of the two higher priority tasks, required so they can be resumed 

-(unsuspended). */

-static xTaskHandle xControllingTaskHandle, xBlockingTaskHandle;

-

-/*-----------------------------------------------------------*/

-

-void vStartRecursiveMutexTasks( void )

-{

-	/* Just creates the mutex and the three tasks. */

-

-	xMutex = xSemaphoreCreateRecursiveMutex();

-

-	/* vQueueAddToRegistry() adds the mutex to the registry, if one is

-	in use.  The registry is provided as a means for kernel aware 

-	debuggers to locate mutex and has no purpose if a kernel aware debugger

-	is not being used.  The call to vQueueAddToRegistry() will be removed

-	by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is 

-	defined to be less than 1. */

-	vQueueAddToRegistry( ( xQueueHandle ) xMutex, ( signed portCHAR * ) "Recursive_Mutex" );

-

-

-	if( xMutex != NULL )

-	{

-		xTaskCreate( prvRecursiveMutexControllingTask, ( signed portCHAR * ) "Rec1", configMINIMAL_STACK_SIZE, NULL, recmuCONTROLLING_TASK_PRIORITY, &xControllingTaskHandle );

-        xTaskCreate( prvRecursiveMutexBlockingTask, ( signed portCHAR * ) "Rec2", configMINIMAL_STACK_SIZE, NULL, recmuBLOCKING_TASK_PRIORITY, &xBlockingTaskHandle );

-        xTaskCreate( prvRecursiveMutexPollingTask, ( signed portCHAR * ) "Rec3", configMINIMAL_STACK_SIZE, NULL, recmuPOLLING_TASK_PRIORITY, NULL );

-	}

-}

-/*-----------------------------------------------------------*/

-

-static void prvRecursiveMutexControllingTask( void *pvParameters )

-{

-unsigned portBASE_TYPE ux;

-

-	/* Just to remove compiler warning. */

-	( void ) pvParameters;

-

-	for( ;; )

-	{

-		/* Should not be able to 'give' the mutex, as we have not yet 'taken'

-		it.   The first time through, the mutex will not have been used yet,

-		subsequent times through, at this point the mutex will be held by the

-		polling task. */

-		if( xSemaphoreGiveRecursive( xMutex ) == pdPASS )

-		{

-			xErrorOccurred = pdTRUE;

-		}

-

-		for( ux = 0; ux < recmuMAX_COUNT; ux++ )

-		{

-			/* We should now be able to take the mutex as many times as

-			we like.

-			

-			The first time through the mutex will be immediately available, on

-			subsequent times through the mutex will be held by the polling task

-			at this point and this Take will cause the polling task to inherit

-			the priority of this task.  In this case the block time must be

-			long enough to ensure the polling task will execute again before the

-			block time expires.  If the block time does expire then the error

-			flag will be set here. */

-			if( xSemaphoreTakeRecursive( xMutex, recmuTWO_TICK_DELAY ) != pdPASS )

-			{

-				xErrorOccurred = pdTRUE;

-			}

-

-			/* Ensure the other task attempting to access the mutex (and the

-			other demo tasks) are able to execute to ensure they either block

-			(where a block time is specified) or return an error (where no 

-			block time is specified) as the mutex is held by this task. */

-			vTaskDelay( recmuSHORT_DELAY );

-		}

-

-		/* For each time we took the mutex, give it back. */

-		for( ux = 0; ux < recmuMAX_COUNT; ux++ )

-		{

-			/* Ensure the other task attempting to access the mutex (and the

-			other demo tasks) are able to execute. */

-			vTaskDelay( recmuSHORT_DELAY );

-

-			/* We should now be able to give the mutex as many times as we

-			took it.  When the mutex is available again the Blocking task

-			should be unblocked but not run because it has a lower priority

-			than this task.  The polling task should also not run at this point

-			as it too has a lower priority than this task. */

-			if( xSemaphoreGiveRecursive( xMutex ) != pdPASS )

-			{

-				xErrorOccurred = pdTRUE;

-			}

-		}

-

-		/* Having given it back the same number of times as it was taken, we

-		should no longer be the mutex owner, so the next give sh ould fail. */

-		if( xSemaphoreGiveRecursive( xMutex ) == pdPASS )

-		{

-			xErrorOccurred = pdTRUE;

-		}

-

-		/* Keep count of the number of cycles this task has performed so a 

-		stall can be detected. */

-		uxControllingCycles++;

-

-		/* Suspend ourselves to the blocking task can execute. */

-		xControllingIsSuspended = pdTRUE;

-		vTaskSuspend( NULL );

-		xControllingIsSuspended = pdFALSE;

-	}

-}

-/*-----------------------------------------------------------*/

-

-static void prvRecursiveMutexBlockingTask( void *pvParameters )

-{

-	/* Just to remove compiler warning. */

-	( void ) pvParameters;

-

-	for( ;; )

-	{

-		/* This task will run while the controlling task is blocked, and the

-		controlling task will block only once it has the mutex - therefore

-		this call should block until the controlling task has given up the 

-		mutex, and not actually execute	past this call until the controlling 

-		task is suspended. */

-		if( xSemaphoreTakeRecursive( xMutex, portMAX_DELAY ) == pdPASS )

-		{

-			if( xControllingIsSuspended != pdTRUE )

-			{

-				/* Did not expect to execute until the controlling task was

-				suspended. */

-				xErrorOccurred = pdTRUE;

-			}

-			else

-			{

-				/* Give the mutex back before suspending ourselves to allow

-				the polling task to obtain the mutex. */

-				if( xSemaphoreGiveRecursive( xMutex ) != pdPASS )

-				{

-					xErrorOccurred = pdTRUE;

-				}

-

-				xBlockingIsSuspended = pdTRUE;

-				vTaskSuspend( NULL );

-				xBlockingIsSuspended = pdFALSE;

-			}

-		}

-		else

-		{

-			/* We should not leave the xSemaphoreTakeRecursive() function

-			until the mutex was obtained. */

-			xErrorOccurred = pdTRUE;

-		}

-

-		/* The controlling and blocking tasks should be in lock step. */

-		if( uxControllingCycles != ( uxBlockingCycles + 1 ) )

-		{

-			xErrorOccurred = pdTRUE;

-		}

-

-		/* Keep count of the number of cycles this task has performed so a 

-		stall can be detected. */

-		uxBlockingCycles++;

-	}

-}

-/*-----------------------------------------------------------*/

-

-static void prvRecursiveMutexPollingTask( void *pvParameters )

-{

-	/* Just to remove compiler warning. */

-	( void ) pvParameters;

-

-	for( ;; )

-	{

-		/* Keep attempting to obtain the mutex.  We should only obtain it when

-		the blocking task has suspended itself, which in turn should only

-		happen when the controlling task is also suspended. */

-		if( xSemaphoreTakeRecursive( xMutex, recmuNO_DELAY ) == pdPASS )

-		{

-			/* Is the blocking task suspended? */

-			if( ( xBlockingIsSuspended != pdTRUE ) || ( xControllingIsSuspended != pdTRUE ) )

-			{

-				xErrorOccurred = pdTRUE;

-			}

-			else

-			{

-				/* Keep count of the number of cycles this task has performed 

-				so a stall can be detected. */

-				uxPollingCycles++;

-

-				/* We can resume the other tasks here even though they have a

-				higher priority than the polling task.  When they execute they

-				will attempt to obtain the mutex but fail because the polling

-				task is still the mutex holder.  The polling task (this task)

-				will then inherit the higher priority.  The Blocking task will

-				block indefinitely when it attempts to obtain the mutex, the

-				Controlling task will only block for a fixed period and an

-				error will be latched if the polling task has not returned the

-				mutex by the time this fixed period has expired. */

-				vTaskResume( xBlockingTaskHandle );

-                vTaskResume( xControllingTaskHandle );

-			

-				/* The other two tasks should now have executed and no longer

-				be suspended. */

-				if( ( xBlockingIsSuspended == pdTRUE ) || ( xControllingIsSuspended == pdTRUE ) )

-				{

-					xErrorOccurred = pdTRUE;

-				}				

-			

-				/* Release the mutex, disinheriting the higher priority again. */

-				if( xSemaphoreGiveRecursive( xMutex ) != pdPASS )

-				{

-					xErrorOccurred = pdTRUE;

-				}

-			}

-		}

-

-		#if configUSE_PREEMPTION == 0

-		{

-			taskYIELD();

-		}

-		#endif

-	}

-}

-/*-----------------------------------------------------------*/

-

-/* This is called to check that all the created tasks are still running. */

-portBASE_TYPE xAreRecursiveMutexTasksStillRunning( void )

-{

-portBASE_TYPE xReturn;

-static unsigned portBASE_TYPE uxLastControllingCycles = 0, uxLastBlockingCycles = 0, uxLastPollingCycles = 0;

-

-	/* Is the controlling task still cycling? */

-	if( uxLastControllingCycles == uxControllingCycles )

-	{

-		xErrorOccurred = pdTRUE;

-	}

-	else

-	{

-		uxLastControllingCycles = uxControllingCycles;

-	}

-

-	/* Is the blocking task still cycling? */

-	if( uxLastBlockingCycles == uxBlockingCycles )

-	{

-		xErrorOccurred = pdTRUE;

-	}

-	else

-	{

-		uxLastBlockingCycles = uxBlockingCycles;

-	}

-

-	/* Is the polling task still cycling? */

-	if( uxLastPollingCycles == uxPollingCycles )

-	{

-		xErrorOccurred = pdTRUE;

-	}

-	else

-	{

-		uxLastPollingCycles = uxPollingCycles;

-	}

-

-	if( xErrorOccurred == pdTRUE )

-	{

-		xReturn = pdFAIL;

-	}

-	else

-	{

-		xReturn = pdTRUE;

-	}

-

-	return xReturn;

-}

-

-

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/semtest.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/semtest.c
deleted file mode 100644
index 73a6903..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/Common-Demo-Source/semtest.c
+++ /dev/null
@@ -1,297 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-/*

- * Creates two sets of two tasks.  The tasks within a set share a variable, access 

- * to which is guarded by a semaphore.

- * 

- * Each task starts by attempting to obtain the semaphore.  On obtaining a 

- * semaphore a task checks to ensure that the guarded variable has an expected 

- * value.  It then clears the variable to zero before counting it back up to the 

- * expected value in increments of 1.  After each increment the variable is checked 

- * to ensure it contains the value to which it was just set. When the starting 

- * value is again reached the task releases the semaphore giving the other task in 

- * the set a chance to do exactly the same thing.  The starting value is high 

- * enough to ensure that a tick is likely to occur during the incrementing loop.

- *

- * An error is flagged if at any time during the process a shared variable is 

- * found to have a value other than that expected.  Such an occurrence would 

- * suggest an error in the mutual exclusion mechanism by which access to the 

- * variable is restricted.

- *

- * The first set of two tasks poll their semaphore.  The second set use blocking 

- * calls.

- *

- */

-

-

-#include <stdlib.h>

-

-/* Scheduler include files. */

-#include "FreeRTOS.h"

-#include "task.h"

-#include "semphr.h"

-

-/* Demo app include files. */

-#include "semtest.h"

-

-/* The value to which the shared variables are counted. */

-#define semtstBLOCKING_EXPECTED_VALUE		( ( unsigned long ) 0xfff )

-#define semtstNON_BLOCKING_EXPECTED_VALUE	( ( unsigned long ) 0xff  )

-

-#define semtstSTACK_SIZE			configMINIMAL_STACK_SIZE

-

-#define semtstNUM_TASKS				( 4 )

-

-#define semtstDELAY_FACTOR			( ( portTickType ) 10 )

-

-/* The task function as described at the top of the file. */

-static portTASK_FUNCTION_PROTO( prvSemaphoreTest, pvParameters );

-

-/* Structure used to pass parameters to each task. */

-typedef struct SEMAPHORE_PARAMETERS

-{

-	xSemaphoreHandle xSemaphore;

-	volatile unsigned long *pulSharedVariable;

-	portTickType xBlockTime;

-} xSemaphoreParameters;

-

-/* Variables used to check that all the tasks are still running without errors. */

-static volatile short sCheckVariables[ semtstNUM_TASKS ] = { 0 };

-static volatile short sNextCheckVariable = 0;

-

-/*-----------------------------------------------------------*/

-

-void vStartSemaphoreTasks( unsigned portBASE_TYPE uxPriority )

-{

-xSemaphoreParameters *pxFirstSemaphoreParameters, *pxSecondSemaphoreParameters;

-const portTickType xBlockTime = ( portTickType ) 100;

-

-	/* Create the structure used to pass parameters to the first two tasks. */

-	pxFirstSemaphoreParameters = ( xSemaphoreParameters * ) pvPortMalloc( sizeof( xSemaphoreParameters ) );

-

-	if( pxFirstSemaphoreParameters != NULL )

-	{

-		/* Create the semaphore used by the first two tasks. */

-		vSemaphoreCreateBinary( pxFirstSemaphoreParameters->xSemaphore );

-

-		if( pxFirstSemaphoreParameters->xSemaphore != NULL )

-		{

-			/* Create the variable which is to be shared by the first two tasks. */

-			pxFirstSemaphoreParameters->pulSharedVariable = ( unsigned long * ) pvPortMalloc( sizeof( unsigned long ) );

-

-			/* Initialise the share variable to the value the tasks expect. */

-			*( pxFirstSemaphoreParameters->pulSharedVariable ) = semtstNON_BLOCKING_EXPECTED_VALUE;

-

-			/* The first two tasks do not block on semaphore calls. */

-			pxFirstSemaphoreParameters->xBlockTime = ( portTickType ) 0;

-

-			/* Spawn the first two tasks.  As they poll they operate at the idle priority. */

-			xTaskCreate( prvSemaphoreTest, ( signed char * ) "PolSEM1", semtstSTACK_SIZE, ( void * ) pxFirstSemaphoreParameters, tskIDLE_PRIORITY, ( xTaskHandle * ) NULL );

-			xTaskCreate( prvSemaphoreTest, ( signed char * ) "PolSEM2", semtstSTACK_SIZE, ( void * ) pxFirstSemaphoreParameters, tskIDLE_PRIORITY, ( xTaskHandle * ) NULL );

-		}

-	}

-

-	/* Do exactly the same to create the second set of tasks, only this time 

-	provide a block time for the semaphore calls. */

-	pxSecondSemaphoreParameters = ( xSemaphoreParameters * ) pvPortMalloc( sizeof( xSemaphoreParameters ) );

-	if( pxSecondSemaphoreParameters != NULL )

-	{

-		vSemaphoreCreateBinary( pxSecondSemaphoreParameters->xSemaphore );

-

-		if( pxSecondSemaphoreParameters->xSemaphore != NULL )

-		{

-			pxSecondSemaphoreParameters->pulSharedVariable = ( unsigned long * ) pvPortMalloc( sizeof( unsigned long ) );

-			*( pxSecondSemaphoreParameters->pulSharedVariable ) = semtstBLOCKING_EXPECTED_VALUE;

-			pxSecondSemaphoreParameters->xBlockTime = xBlockTime / portTICK_RATE_MS;

-

-			xTaskCreate( prvSemaphoreTest, ( signed char * ) "BlkSEM1", semtstSTACK_SIZE, ( void * ) pxSecondSemaphoreParameters, uxPriority, ( xTaskHandle * ) NULL );

-			xTaskCreate( prvSemaphoreTest, ( signed char * ) "BlkSEM2", semtstSTACK_SIZE, ( void * ) pxSecondSemaphoreParameters, uxPriority, ( xTaskHandle * ) NULL );

-		}

-	}

-

-	/* vQueueAddToRegistry() adds the semaphore to the registry, if one is

-	in use.  The registry is provided as a means for kernel aware 

-	debuggers to locate semaphores and has no purpose if a kernel aware debugger

-	is not being used.  The call to vQueueAddToRegistry() will be removed

-	by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is 

-	defined to be less than 1. */

-	vQueueAddToRegistry( ( xQueueHandle ) pxFirstSemaphoreParameters->xSemaphore, ( signed char * ) "Counting_Sem_1" );

-	vQueueAddToRegistry( ( xQueueHandle ) pxSecondSemaphoreParameters->xSemaphore, ( signed char * ) "Counting_Sem_2" );

-}

-/*-----------------------------------------------------------*/

-

-static portTASK_FUNCTION( prvSemaphoreTest, pvParameters )

-{

-xSemaphoreParameters *pxParameters;

-volatile unsigned long *pulSharedVariable, ulExpectedValue;

-unsigned long ulCounter;

-short sError = pdFALSE, sCheckVariableToUse;

-

-	/* See which check variable to use.  sNextCheckVariable is not semaphore 

-	protected! */

-	portENTER_CRITICAL();

-		sCheckVariableToUse = sNextCheckVariable;

-		sNextCheckVariable++;

-	portEXIT_CRITICAL();

-

-	/* A structure is passed in as the parameter.  This contains the shared 

-	variable being guarded. */

-	pxParameters = ( xSemaphoreParameters * ) pvParameters;

-	pulSharedVariable = pxParameters->pulSharedVariable;

-

-	/* If we are blocking we use a much higher count to ensure loads of context

-	switches occur during the count. */

-	if( pxParameters->xBlockTime > ( portTickType ) 0 )

-	{

-		ulExpectedValue = semtstBLOCKING_EXPECTED_VALUE;

-	}

-	else

-	{

-		ulExpectedValue = semtstNON_BLOCKING_EXPECTED_VALUE;

-	}

-

-	for( ;; )

-	{

-		/* Try to obtain the semaphore. */

-		if( xSemaphoreTake( pxParameters->xSemaphore, pxParameters->xBlockTime ) == pdPASS )

-		{

-			/* We have the semaphore and so expect any other tasks using the

-			shared variable to have left it in the state we expect to find

-			it. */

-			if( *pulSharedVariable != ulExpectedValue )

-			{

-				sError = pdTRUE;

-			}

-			

-			/* Clear the variable, then count it back up to the expected value

-			before releasing the semaphore.  Would expect a context switch or

-			two during this time. */

-			for( ulCounter = ( unsigned long ) 0; ulCounter <= ulExpectedValue; ulCounter++ )

-			{

-				*pulSharedVariable = ulCounter;

-				if( *pulSharedVariable != ulCounter )

-				{

-					sError = pdTRUE;

-				}

-			}

-

-			/* Release the semaphore, and if no errors have occurred increment the check

-			variable. */

-			if(	xSemaphoreGive( pxParameters->xSemaphore ) == pdFALSE )

-			{

-				sError = pdTRUE;

-			}

-

-			if( sError == pdFALSE )

-			{

-				if( sCheckVariableToUse < semtstNUM_TASKS )

-				{

-					( sCheckVariables[ sCheckVariableToUse ] )++;

-				}

-			}

-

-			/* If we have a block time then we are running at a priority higher

-			than the idle priority.  This task takes a long time to complete

-			a cycle	(deliberately so to test the guarding) so will be starving

-			out lower priority tasks.  Block for some time to allow give lower

-			priority tasks some processor time. */

-			vTaskDelay( pxParameters->xBlockTime * semtstDELAY_FACTOR );

-		}

-		else

-		{

-			if( pxParameters->xBlockTime == ( portTickType ) 0 )

-			{

-				/* We have not got the semaphore yet, so no point using the

-				processor.  We are not blocking when attempting to obtain the

-				semaphore. */

-				taskYIELD();

-			}

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-/* This is called to check that all the created tasks are still running. */

-portBASE_TYPE xAreSemaphoreTasksStillRunning( void )

-{

-static short sLastCheckVariables[ semtstNUM_TASKS ] = { 0 };

-portBASE_TYPE xTask, xReturn = pdTRUE;

-

-	for( xTask = 0; xTask < semtstNUM_TASKS; xTask++ )

-	{

-		if( sLastCheckVariables[ xTask ] == sCheckVariables[ xTask ] )

-		{

-			xReturn = pdFALSE;

-		}

-

-		sLastCheckVariables[ xTask ] = sCheckVariables[ xTask ];

-	}

-

-	return xReturn;

-}

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/FreeRTOS.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/FreeRTOS.h
deleted file mode 100644
index fb31e73..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/FreeRTOS.h
+++ /dev/null
@@ -1,522 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef INC_FREERTOS_H

-#define INC_FREERTOS_H

-

-

-/*

- * Include the generic headers required for the FreeRTOS port being used.

- */

-#include <stddef.h>

-

-/* Basic FreeRTOS definitions. */

-#include "projdefs.h"

-

-/* Application specific configuration options. */

-#include "FreeRTOSConfig.h"

-

-/* Definitions specific to the port being used. */

-#include "portable.h"

-

-

-/* Defines the prototype to which the application task hook function must

-conform. */

-typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * );

-

-

-

-

-

-/*

- * Check all the required application specific macros have been defined.

- * These macros are application specific and (as downloaded) are defined

- * within FreeRTOSConfig.h.

- */

-

-#ifndef configUSE_PREEMPTION

-	#error Missing definition:  configUSE_PREEMPTION should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#ifndef configUSE_IDLE_HOOK

-	#error Missing definition:  configUSE_IDLE_HOOK should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#ifndef configUSE_TICK_HOOK

-	#error Missing definition:  configUSE_TICK_HOOK should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#ifndef configUSE_CO_ROUTINES

-	#error  Missing definition:  configUSE_CO_ROUTINES should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#ifndef INCLUDE_vTaskPrioritySet

-	#error Missing definition:  INCLUDE_vTaskPrioritySet should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#ifndef INCLUDE_uxTaskPriorityGet

-	#error Missing definition:  INCLUDE_uxTaskPriorityGet should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#ifndef INCLUDE_vTaskDelete		

-	#error Missing definition:  INCLUDE_vTaskDelete		 should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#ifndef INCLUDE_vTaskSuspend	

-	#error Missing definition:  INCLUDE_vTaskSuspend	 should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#ifndef INCLUDE_vTaskDelayUntil

-	#error Missing definition:  INCLUDE_vTaskDelayUntil should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#ifndef INCLUDE_vTaskDelay

-	#error Missing definition:  INCLUDE_vTaskDelay should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#ifndef configUSE_16_BIT_TICKS

-	#error Missing definition:  configUSE_16_BIT_TICKS should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.

-#endif

-

-#ifndef INCLUDE_xTaskGetIdleTaskHandle

-	#define INCLUDE_xTaskGetIdleTaskHandle 0

-#endif

-

-#ifndef INCLUDE_xTimerGetTimerDaemonTaskHandle

-	#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0

-#endif

-

-#ifndef INCLUDE_xQueueGetMutexHolder

-	#define INCLUDE_xQueueGetMutexHolder 0

-#endif

-

-#ifndef INCLUDE_pcTaskGetTaskName

-	#define INCLUDE_pcTaskGetTaskName 0

-#endif

-

-#ifndef configUSE_APPLICATION_TASK_TAG

-	#define configUSE_APPLICATION_TASK_TAG 0

-#endif

-

-#ifndef INCLUDE_uxTaskGetStackHighWaterMark

-	#define INCLUDE_uxTaskGetStackHighWaterMark 0

-#endif

-

-#ifndef configUSE_RECURSIVE_MUTEXES

-	#define configUSE_RECURSIVE_MUTEXES 0

-#endif

-

-#ifndef configUSE_MUTEXES

-	#define configUSE_MUTEXES 0

-#endif

-

-#ifndef configUSE_TIMERS

-	#define configUSE_TIMERS 0

-#endif

-

-#ifndef configUSE_COUNTING_SEMAPHORES

-	#define configUSE_COUNTING_SEMAPHORES 0

-#endif

-

-#ifndef configUSE_ALTERNATIVE_API

-	#define configUSE_ALTERNATIVE_API 0

-#endif

-

-#ifndef portCRITICAL_NESTING_IN_TCB

-	#define portCRITICAL_NESTING_IN_TCB 0

-#endif

-

-#ifndef configMAX_TASK_NAME_LEN

-	#define configMAX_TASK_NAME_LEN 16

-#endif

-

-#ifndef configIDLE_SHOULD_YIELD

-	#define configIDLE_SHOULD_YIELD		1

-#endif

-

-#if configMAX_TASK_NAME_LEN < 1

-	#error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h

-#endif

-

-#ifndef INCLUDE_xTaskResumeFromISR

-	#define INCLUDE_xTaskResumeFromISR 1

-#endif

-

-#ifndef configASSERT

-	#define configASSERT( x )

-#endif

-

-#ifndef portALIGNMENT_ASSERT_pxCurrentTCB

-	#define portALIGNMENT_ASSERT_pxCurrentTCB configASSERT

-#endif

-

-/* The timers module relies on xTaskGetSchedulerState(). */

-#if configUSE_TIMERS == 1

-

-	#ifndef configTIMER_TASK_PRIORITY

-		#error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined.

-	#endif /* configTIMER_TASK_PRIORITY */

-

-	#ifndef configTIMER_QUEUE_LENGTH

-		#error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined.

-	#endif /* configTIMER_QUEUE_LENGTH */

-

-	#ifndef configTIMER_TASK_STACK_DEPTH

-		#error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined.

-	#endif /* configTIMER_TASK_STACK_DEPTH */

-

-#endif /* configUSE_TIMERS */

-

-#ifndef INCLUDE_xTaskGetSchedulerState

-	#define INCLUDE_xTaskGetSchedulerState 0

-#endif

-

-#ifndef INCLUDE_xTaskGetCurrentTaskHandle

-	#define INCLUDE_xTaskGetCurrentTaskHandle 0

-#endif

-

-

-#ifndef portSET_INTERRUPT_MASK_FROM_ISR

-	#define portSET_INTERRUPT_MASK_FROM_ISR() 0

-#endif

-

-#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR

-	#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue

-#endif

-

-#ifndef portCLEAN_UP_TCB

-	#define portCLEAN_UP_TCB( pxTCB ) ( void ) pxTCB

-#endif

-

-#ifndef portSETUP_TCB

-	#define portSETUP_TCB( pxTCB ) ( void ) pxTCB

-#endif

-

-#ifndef configQUEUE_REGISTRY_SIZE

-	#define configQUEUE_REGISTRY_SIZE 0U

-#endif

-

-#if ( configQUEUE_REGISTRY_SIZE < 1 )

-	#define vQueueAddToRegistry( xQueue, pcName )

-	#define vQueueUnregisterQueue( xQueue )

-#endif

-

-#ifndef portPOINTER_SIZE_TYPE

-	#define portPOINTER_SIZE_TYPE unsigned long

-#endif

-

-/* Remove any unused trace macros. */

-#ifndef traceSTART

-	/* Used to perform any necessary initialisation - for example, open a file

-	into which trace is to be written. */

-	#define traceSTART()

-#endif

-

-#ifndef traceEND

-	/* Use to close a trace, for example close a file into which trace has been

-	written. */

-	#define traceEND()

-#endif

-

-#ifndef traceTASK_SWITCHED_IN

-	/* Called after a task has been selected to run.  pxCurrentTCB holds a pointer

-	to the task control block of the selected task. */

-	#define traceTASK_SWITCHED_IN()

-#endif

-

-#ifndef traceTASK_SWITCHED_OUT

-	/* Called before a task has been selected to run.  pxCurrentTCB holds a pointer

-	to the task control block of the task being switched out. */

-	#define traceTASK_SWITCHED_OUT()

-#endif

-

-#ifndef traceTASK_PRIORITY_INHERIT

-	/* Called when a task attempts to take a mutex that is already held by a

-	lower priority task.  pxTCBOfMutexHolder is a pointer to the TCB of the task

-	that holds the mutex.  uxInheritedPriority is the priority the mutex holder

-	will inherit (the priority of the task that is attempting to obtain the

-	muted. */

-	#define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority )

-#endif

-

-#ifndef traceTASK_PRIORITY_DISINHERIT

-	/* Called when a task releases a mutex, the holding of which had resulted in

-	the task inheriting the priority of a higher priority task.  

-	pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the

-	mutex.  uxOriginalPriority is the task's configured (base) priority. */

-	#define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority )

-#endif

-

-#ifndef traceBLOCKING_ON_QUEUE_RECEIVE

-	/* Task is about to block because it cannot read from a

-	queue/mutex/semaphore.  pxQueue is a pointer to the queue/mutex/semaphore

-	upon which the read was attempted.  pxCurrentTCB points to the TCB of the

-	task that attempted the read. */

-	#define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue )

-#endif

-

-#ifndef traceBLOCKING_ON_QUEUE_SEND

-	/* Task is about to block because it cannot write to a

-	queue/mutex/semaphore.  pxQueue is a pointer to the queue/mutex/semaphore

-	upon which the write was attempted.  pxCurrentTCB points to the TCB of the

-	task that attempted the write. */

-	#define traceBLOCKING_ON_QUEUE_SEND( pxQueue )

-#endif

-

-#ifndef configCHECK_FOR_STACK_OVERFLOW

-	#define configCHECK_FOR_STACK_OVERFLOW 0

-#endif

-

-/* The following event macros are embedded in the kernel API calls. */

-

-#ifndef traceMOVED_TASK_TO_READY_STATE

-	#define traceMOVED_TASK_TO_READY_STATE( pxTCB )

-#endif

-

-#ifndef traceQUEUE_CREATE	

-	#define traceQUEUE_CREATE( pxNewQueue )

-#endif

-

-#ifndef traceQUEUE_CREATE_FAILED

-	#define traceQUEUE_CREATE_FAILED( ucQueueType )

-#endif

-

-#ifndef traceCREATE_MUTEX

-	#define traceCREATE_MUTEX( pxNewQueue )

-#endif

-

-#ifndef traceCREATE_MUTEX_FAILED

-	#define traceCREATE_MUTEX_FAILED()

-#endif

-

-#ifndef traceGIVE_MUTEX_RECURSIVE

-	#define traceGIVE_MUTEX_RECURSIVE( pxMutex )

-#endif

-

-#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED

-	#define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex )

-#endif

-

-#ifndef traceTAKE_MUTEX_RECURSIVE

-	#define traceTAKE_MUTEX_RECURSIVE( pxMutex )

-#endif

-

-#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED

-	#define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex )

-#endif

-

-#ifndef traceCREATE_COUNTING_SEMAPHORE

-	#define traceCREATE_COUNTING_SEMAPHORE()

-#endif

-

-#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED

-	#define traceCREATE_COUNTING_SEMAPHORE_FAILED()

-#endif

-

-#ifndef traceQUEUE_SEND

-	#define traceQUEUE_SEND( pxQueue )

-#endif

-

-#ifndef traceQUEUE_SEND_FAILED

-	#define traceQUEUE_SEND_FAILED( pxQueue )

-#endif

-

-#ifndef traceQUEUE_RECEIVE

-	#define traceQUEUE_RECEIVE( pxQueue )

-#endif

-

-#ifndef traceQUEUE_PEEK

-	#define traceQUEUE_PEEK( pxQueue )

-#endif

-

-#ifndef traceQUEUE_RECEIVE_FAILED

-	#define traceQUEUE_RECEIVE_FAILED( pxQueue )

-#endif

-

-#ifndef traceQUEUE_SEND_FROM_ISR

-	#define traceQUEUE_SEND_FROM_ISR( pxQueue )

-#endif

-

-#ifndef traceQUEUE_SEND_FROM_ISR_FAILED

-	#define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue )

-#endif

-

-#ifndef traceQUEUE_RECEIVE_FROM_ISR

-	#define traceQUEUE_RECEIVE_FROM_ISR( pxQueue )

-#endif

-

-#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED

-	#define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue )

-#endif

-

-#ifndef traceQUEUE_DELETE

-	#define traceQUEUE_DELETE( pxQueue )

-#endif

-

-#ifndef traceTASK_CREATE

-	#define traceTASK_CREATE( pxNewTCB )

-#endif

-

-#ifndef traceTASK_CREATE_FAILED

-	#define traceTASK_CREATE_FAILED()

-#endif

-

-#ifndef traceTASK_DELETE

-	#define traceTASK_DELETE( pxTaskToDelete )

-#endif

-

-#ifndef traceTASK_DELAY_UNTIL

-	#define traceTASK_DELAY_UNTIL()

-#endif

-

-#ifndef traceTASK_DELAY

-	#define traceTASK_DELAY()

-#endif

-

-#ifndef traceTASK_PRIORITY_SET

-	#define traceTASK_PRIORITY_SET( pxTask, uxNewPriority )

-#endif

-

-#ifndef traceTASK_SUSPEND

-	#define traceTASK_SUSPEND( pxTaskToSuspend )

-#endif

-

-#ifndef traceTASK_RESUME

-	#define traceTASK_RESUME( pxTaskToResume )

-#endif

-

-#ifndef traceTASK_RESUME_FROM_ISR

-	#define traceTASK_RESUME_FROM_ISR( pxTaskToResume )

-#endif

-

-#ifndef traceTASK_INCREMENT_TICK

-	#define traceTASK_INCREMENT_TICK( xTickCount )

-#endif

-

-#ifndef traceTIMER_CREATE

-	#define traceTIMER_CREATE( pxNewTimer )

-#endif

-

-#ifndef traceTIMER_CREATE_FAILED

-	#define traceTIMER_CREATE_FAILED()

-#endif

-

-#ifndef traceTIMER_COMMAND_SEND

-	#define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn )

-#endif

-

-#ifndef traceTIMER_EXPIRED

-	#define traceTIMER_EXPIRED( pxTimer )

-#endif

-

-#ifndef traceTIMER_COMMAND_RECEIVED

-	#define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue )

-#endif

-

-#ifndef configGENERATE_RUN_TIME_STATS

-	#define configGENERATE_RUN_TIME_STATS 0

-#endif

-

-#if ( configGENERATE_RUN_TIME_STATS == 1 )

-

-	#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS

-		#error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined.  portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base.

-	#endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */

-

-	#ifndef portGET_RUN_TIME_COUNTER_VALUE

-		#ifndef portALT_GET_RUN_TIME_COUNTER_VALUE

-			#error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined.  See the examples provided and the FreeRTOS web site for more information.

-		#endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */

-	#endif /* portGET_RUN_TIME_COUNTER_VALUE */

-

-#endif /* configGENERATE_RUN_TIME_STATS */

-

-#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS

-	#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()

-#endif

-

-#ifndef configUSE_MALLOC_FAILED_HOOK

-	#define configUSE_MALLOC_FAILED_HOOK 0

-#endif

-

-#ifndef portPRIVILEGE_BIT

-	#define portPRIVILEGE_BIT ( ( unsigned portBASE_TYPE ) 0x00 )

-#endif

-

-#ifndef portYIELD_WITHIN_API

-	#define portYIELD_WITHIN_API portYIELD

-#endif

-

-#ifndef pvPortMallocAligned

-	#define pvPortMallocAligned( x, puxStackBuffer ) ( ( ( puxStackBuffer ) == NULL ) ? ( pvPortMalloc( ( x ) ) ) : ( puxStackBuffer ) )

-#endif

-

-#ifndef vPortFreeAligned

-	#define vPortFreeAligned( pvBlockToFree ) vPortFree( pvBlockToFree )

-#endif

-

-#endif /* INC_FREERTOS_H */

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/StackMacros.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/StackMacros.h
deleted file mode 100644
index b7a98ef..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/StackMacros.h
+++ /dev/null
@@ -1,181 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef STACK_MACROS_H

-#define STACK_MACROS_H

-

-/*

- * Call the stack overflow hook function if the stack of the task being swapped

- * out is currently overflowed, or looks like it might have overflowed in the

- * past.

- *

- * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check

- * the current stack state only - comparing the current top of stack value to

- * the stack limit.  Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1

- * will also cause the last few stack bytes to be checked to ensure the value

- * to which the bytes were set when the task was created have not been

- * overwritten.  Note this second test does not guarantee that an overflowed

- * stack will always be recognised.

- */

-

-/*-----------------------------------------------------------*/

-

-#if( configCHECK_FOR_STACK_OVERFLOW == 0 )

-

-	/* FreeRTOSConfig.h is not set to check for stack overflows. */

-	#define taskFIRST_CHECK_FOR_STACK_OVERFLOW()

-	#define taskSECOND_CHECK_FOR_STACK_OVERFLOW()

-

-#endif /* configCHECK_FOR_STACK_OVERFLOW == 0 */

-/*-----------------------------------------------------------*/

-

-#if( configCHECK_FOR_STACK_OVERFLOW == 1 )

-

-	/* FreeRTOSConfig.h is only set to use the first method of

-	overflow checking. */

-	#define taskSECOND_CHECK_FOR_STACK_OVERFLOW()

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH < 0 ) )

-

-	/* Only the current stack state is to be checked. */

-	#define taskFIRST_CHECK_FOR_STACK_OVERFLOW()														\

-	{																									\

-		/* Is the currently saved stack pointer within the stack limit? */								\

-		if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack )										\

-		{																								\

-			vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName );	\

-		}																								\

-	}

-

-#endif /* configCHECK_FOR_STACK_OVERFLOW > 0 */

-/*-----------------------------------------------------------*/

-

-#if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH > 0 ) )

-

-	/* Only the current stack state is to be checked. */

-	#define taskFIRST_CHECK_FOR_STACK_OVERFLOW()														\

-	{																									\

-																										\

-		/* Is the currently saved stack pointer within the stack limit? */								\

-		if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack )									\

-		{																								\

-			vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName );	\

-		}																								\

-	}

-

-#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */

-/*-----------------------------------------------------------*/

-

-#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )

-

-	#define taskSECOND_CHECK_FOR_STACK_OVERFLOW()																								\

-	{																																			\

-	static const unsigned char ucExpectedStackBytes[] = {	tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\

-															tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\

-															tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\

-															tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\

-															tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE };	\

-																																				\

-																																				\

-		/* Has the extremity of the task stack ever been written over? */																		\

-		if( memcmp( ( void * ) pxCurrentTCB->pxStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 )					\

-		{																																		\

-			vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName );											\

-		}																																		\

-	}

-

-#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */

-/*-----------------------------------------------------------*/

-

-#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) )

-

-	#define taskSECOND_CHECK_FOR_STACK_OVERFLOW()																								\

-	{																																			\

-	char *pcEndOfStack = ( char * ) pxCurrentTCB->pxEndOfStack;																					\

-	static const unsigned char ucExpectedStackBytes[] = {	tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\

-															tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\

-															tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\

-															tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,		\

-															tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE };	\

-																																				\

-																																				\

-		pcEndOfStack -= sizeof( ucExpectedStackBytes );																							\

-																																				\

-		/* Has the extremity of the task stack ever been written over? */																		\

-		if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 )							\

-		{																																		\

-			vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName );											\

-		}																																		\

-	}

-

-#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */

-/*-----------------------------------------------------------*/

-

-#endif /* STACK_MACROS_H */

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/croutine.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/croutine.h
deleted file mode 100644
index 725c5db..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/croutine.h
+++ /dev/null
@@ -1,759 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef CO_ROUTINE_H

-#define CO_ROUTINE_H

-

-#ifndef INC_FREERTOS_H

-	#error "include FreeRTOS.h must appear in source files before include croutine.h"

-#endif

-

-#include "list.h"

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/* Used to hide the implementation of the co-routine control block.  The

-control block structure however has to be included in the header due to

-the macro implementation of the co-routine functionality. */

-typedef void * xCoRoutineHandle;

-

-/* Defines the prototype to which co-routine functions must conform. */

-typedef void (*crCOROUTINE_CODE)( xCoRoutineHandle, unsigned portBASE_TYPE );

-

-typedef struct corCoRoutineControlBlock

-{

-	crCOROUTINE_CODE 		pxCoRoutineFunction;

-	xListItem				xGenericListItem;	/*< List item used to place the CRCB in ready and blocked queues. */

-	xListItem				xEventListItem;		/*< List item used to place the CRCB in event lists. */

-	unsigned portBASE_TYPE 	uxPriority;			/*< The priority of the co-routine in relation to other co-routines. */

-	unsigned portBASE_TYPE 	uxIndex;			/*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */

-	unsigned short 		uxState;			/*< Used internally by the co-routine implementation. */

-} corCRCB; /* Co-routine control block.  Note must be identical in size down to uxPriority with tskTCB. */

-

-/**

- * croutine. h

- *<pre>

- portBASE_TYPE xCoRoutineCreate(

-                                 crCOROUTINE_CODE pxCoRoutineCode,

-                                 unsigned portBASE_TYPE uxPriority,

-                                 unsigned portBASE_TYPE uxIndex

-                               );</pre>

- *

- * Create a new co-routine and add it to the list of co-routines that are

- * ready to run.

- *

- * @param pxCoRoutineCode Pointer to the co-routine function.  Co-routine

- * functions require special syntax - see the co-routine section of the WEB

- * documentation for more information.

- *

- * @param uxPriority The priority with respect to other co-routines at which

- *  the co-routine will run.

- *

- * @param uxIndex Used to distinguish between different co-routines that

- * execute the same function.  See the example below and the co-routine section

- * of the WEB documentation for further information.

- *

- * @return pdPASS if the co-routine was successfully created and added to a ready

- * list, otherwise an error code defined with ProjDefs.h.

- *

- * Example usage:

-   <pre>

- // Co-routine to be created.

- void vFlashCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )

- {

- // Variables in co-routines must be declared static if they must maintain value across a blocking call.

- // This may not be necessary for const variables.

- static const char cLedToFlash[ 2 ] = { 5, 6 };

- static const portTickType uxFlashRates[ 2 ] = { 200, 400 };

-

-     // Must start every co-routine with a call to crSTART();

-     crSTART( xHandle );

-

-     for( ;; )

-     {

-         // This co-routine just delays for a fixed period, then toggles

-         // an LED.  Two co-routines are created using this function, so

-         // the uxIndex parameter is used to tell the co-routine which

-         // LED to flash and how long to delay.  This assumes xQueue has

-         // already been created.

-         vParTestToggleLED( cLedToFlash[ uxIndex ] );

-         crDELAY( xHandle, uxFlashRates[ uxIndex ] );

-     }

-

-     // Must end every co-routine with a call to crEND();

-     crEND();

- }

-

- // Function that creates two co-routines.

- void vOtherFunction( void )

- {

- unsigned char ucParameterToPass;

- xTaskHandle xHandle;

-		

-     // Create two co-routines at priority 0.  The first is given index 0

-     // so (from the code above) toggles LED 5 every 200 ticks.  The second

-     // is given index 1 so toggles LED 6 every 400 ticks.

-     for( uxIndex = 0; uxIndex < 2; uxIndex++ )

-     {

-         xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex );

-     }

- }

-   </pre>

- * \defgroup xCoRoutineCreate xCoRoutineCreate

- * \ingroup Tasks

- */

-signed portBASE_TYPE xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, unsigned portBASE_TYPE uxPriority, unsigned portBASE_TYPE uxIndex );

-

-

-/**

- * croutine. h

- *<pre>

- void vCoRoutineSchedule( void );</pre>

- *

- * Run a co-routine.

- *

- * vCoRoutineSchedule() executes the highest priority co-routine that is able

- * to run.  The co-routine will execute until it either blocks, yields or is

- * preempted by a task.  Co-routines execute cooperatively so one

- * co-routine cannot be preempted by another, but can be preempted by a task.

- *

- * If an application comprises of both tasks and co-routines then

- * vCoRoutineSchedule should be called from the idle task (in an idle task

- * hook).

- *

- * Example usage:

-   <pre>

- // This idle task hook will schedule a co-routine each time it is called.

- // The rest of the idle task will execute between co-routine calls.

- void vApplicationIdleHook( void )

- {

-	vCoRoutineSchedule();

- }

-

- // Alternatively, if you do not require any other part of the idle task to

- // execute, the idle task hook can call vCoRoutineScheduler() within an

- // infinite loop.

- void vApplicationIdleHook( void )

- {

-    for( ;; )

-    {

-        vCoRoutineSchedule();

-    }

- }

- </pre>

- * \defgroup vCoRoutineSchedule vCoRoutineSchedule

- * \ingroup Tasks

- */

-void vCoRoutineSchedule( void );

-

-/**

- * croutine. h

- * <pre>

- crSTART( xCoRoutineHandle xHandle );</pre>

- *

- * This macro MUST always be called at the start of a co-routine function.

- *

- * Example usage:

-   <pre>

- // Co-routine to be created.

- void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )

- {

- // Variables in co-routines must be declared static if they must maintain value across a blocking call.

- static long ulAVariable;

-

-     // Must start every co-routine with a call to crSTART();

-     crSTART( xHandle );

-

-     for( ;; )

-     {

-          // Co-routine functionality goes here.

-     }

-

-     // Must end every co-routine with a call to crEND();

-     crEND();

- }</pre>

- * \defgroup crSTART crSTART

- * \ingroup Tasks

- */

-#define crSTART( pxCRCB ) switch( ( ( corCRCB * )( pxCRCB ) )->uxState ) { case 0:

-

-/**

- * croutine. h

- * <pre>

- crEND();</pre>

- *

- * This macro MUST always be called at the end of a co-routine function.

- *

- * Example usage:

-   <pre>

- // Co-routine to be created.

- void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )

- {

- // Variables in co-routines must be declared static if they must maintain value across a blocking call.

- static long ulAVariable;

-

-     // Must start every co-routine with a call to crSTART();

-     crSTART( xHandle );

-

-     for( ;; )

-     {

-          // Co-routine functionality goes here.

-     }

-

-     // Must end every co-routine with a call to crEND();

-     crEND();

- }</pre>

- * \defgroup crSTART crSTART

- * \ingroup Tasks

- */

-#define crEND() }

-

-/*

- * These macros are intended for internal use by the co-routine implementation

- * only.  The macros should not be used directly by application writers.

- */

-#define crSET_STATE0( xHandle ) ( ( corCRCB * )( xHandle ) )->uxState = (__LINE__ * 2); return; case (__LINE__ * 2):

-#define crSET_STATE1( xHandle ) ( ( corCRCB * )( xHandle ) )->uxState = ((__LINE__ * 2)+1); return; case ((__LINE__ * 2)+1):

-

-/**

- * croutine. h

- *<pre>

- crDELAY( xCoRoutineHandle xHandle, portTickType xTicksToDelay );</pre>

- *

- * Delay a co-routine for a fixed period of time.

- *

- * crDELAY can only be called from the co-routine function itself - not

- * from within a function called by the co-routine function.  This is because

- * co-routines do not maintain their own stack.

- *

- * @param xHandle The handle of the co-routine to delay.  This is the xHandle

- * parameter of the co-routine function.

- *

- * @param xTickToDelay The number of ticks that the co-routine should delay

- * for.  The actual amount of time this equates to is defined by

- * configTICK_RATE_HZ (set in FreeRTOSConfig.h).  The constant portTICK_RATE_MS

- * can be used to convert ticks to milliseconds.

- *

- * Example usage:

-   <pre>

- // Co-routine to be created.

- void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )

- {

- // Variables in co-routines must be declared static if they must maintain value across a blocking call.

- // This may not be necessary for const variables.

- // We are to delay for 200ms.

- static const xTickType xDelayTime = 200 / portTICK_RATE_MS;

-

-     // Must start every co-routine with a call to crSTART();

-     crSTART( xHandle );

-

-     for( ;; )

-     {

-        // Delay for 200ms.

-        crDELAY( xHandle, xDelayTime );

-

-        // Do something here.

-     }

-

-     // Must end every co-routine with a call to crEND();

-     crEND();

- }</pre>

- * \defgroup crDELAY crDELAY

- * \ingroup Tasks

- */

-#define crDELAY( xHandle, xTicksToDelay )												\

-	if( ( xTicksToDelay ) > 0 )															\

-	{																					\

-		vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL );							\

-	}																					\

-	crSET_STATE0( ( xHandle ) );

-

-/**

- * <pre>

- crQUEUE_SEND(

-                  xCoRoutineHandle xHandle,

-                  xQueueHandle pxQueue,

-                  void *pvItemToQueue,

-                  portTickType xTicksToWait,

-                  portBASE_TYPE *pxResult

-             )</pre>

- *

- * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine

- * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks.

- *

- * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas

- * xQueueSend() and xQueueReceive() can only be used from tasks.

- *

- * crQUEUE_SEND can only be called from the co-routine function itself - not

- * from within a function called by the co-routine function.  This is because

- * co-routines do not maintain their own stack.

- *

- * See the co-routine section of the WEB documentation for information on

- * passing data between tasks and co-routines and between ISR's and

- * co-routines.

- *

- * @param xHandle The handle of the calling co-routine.  This is the xHandle

- * parameter of the co-routine function.

- *

- * @param pxQueue The handle of the queue on which the data will be posted.

- * The handle is obtained as the return value when the queue is created using

- * the xQueueCreate() API function.

- *

- * @param pvItemToQueue A pointer to the data being posted onto the queue.

- * The number of bytes of each queued item is specified when the queue is

- * created.  This number of bytes is copied from pvItemToQueue into the queue

- * itself.

- *

- * @param xTickToDelay The number of ticks that the co-routine should block

- * to wait for space to become available on the queue, should space not be

- * available immediately. The actual amount of time this equates to is defined

- * by configTICK_RATE_HZ (set in FreeRTOSConfig.h).  The constant

- * portTICK_RATE_MS can be used to convert ticks to milliseconds (see example

- * below).

- *

- * @param pxResult The variable pointed to by pxResult will be set to pdPASS if

- * data was successfully posted onto the queue, otherwise it will be set to an

- * error defined within ProjDefs.h.

- *

- * Example usage:

-   <pre>

- // Co-routine function that blocks for a fixed period then posts a number onto

- // a queue.

- static void prvCoRoutineFlashTask( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )

- {

- // Variables in co-routines must be declared static if they must maintain value across a blocking call.

- static portBASE_TYPE xNumberToPost = 0;

- static portBASE_TYPE xResult;

-

-    // Co-routines must begin with a call to crSTART().

-    crSTART( xHandle );

-

-    for( ;; )

-    {

-        // This assumes the queue has already been created.

-        crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult );

-

-        if( xResult != pdPASS )

-        {

-            // The message was not posted!

-        }

-

-        // Increment the number to be posted onto the queue.

-        xNumberToPost++;

-

-        // Delay for 100 ticks.

-        crDELAY( xHandle, 100 );

-    }

-

-    // Co-routines must end with a call to crEND().

-    crEND();

- }</pre>

- * \defgroup crQUEUE_SEND crQUEUE_SEND

- * \ingroup Tasks

- */

-#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult )			\

-{																						\

-	*( pxResult ) = xQueueCRSend( ( pxQueue) , ( pvItemToQueue) , ( xTicksToWait ) );	\

-	if( *( pxResult ) == errQUEUE_BLOCKED )												\

-	{																					\

-		crSET_STATE0( ( xHandle ) );													\

-		*pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 );					\

-	}																					\

-	if( *pxResult == errQUEUE_YIELD )													\

-	{																					\

-		crSET_STATE1( ( xHandle ) );													\

-		*pxResult = pdPASS;																\

-	}																					\

-}

-

-/**

- * croutine. h

- * <pre>

-  crQUEUE_RECEIVE(

-                     xCoRoutineHandle xHandle,

-                     xQueueHandle pxQueue,

-                     void *pvBuffer,

-                     portTickType xTicksToWait,

-                     portBASE_TYPE *pxResult

-                 )</pre>

- *

- * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine

- * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks.

- *

- * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas

- * xQueueSend() and xQueueReceive() can only be used from tasks.

- *

- * crQUEUE_RECEIVE can only be called from the co-routine function itself - not

- * from within a function called by the co-routine function.  This is because

- * co-routines do not maintain their own stack.

- *

- * See the co-routine section of the WEB documentation for information on

- * passing data between tasks and co-routines and between ISR's and

- * co-routines.

- *

- * @param xHandle The handle of the calling co-routine.  This is the xHandle

- * parameter of the co-routine function.

- *

- * @param pxQueue The handle of the queue from which the data will be received.

- * The handle is obtained as the return value when the queue is created using

- * the xQueueCreate() API function.

- *

- * @param pvBuffer The buffer into which the received item is to be copied.

- * The number of bytes of each queued item is specified when the queue is

- * created.  This number of bytes is copied into pvBuffer.

- *

- * @param xTickToDelay The number of ticks that the co-routine should block

- * to wait for data to become available from the queue, should data not be

- * available immediately. The actual amount of time this equates to is defined

- * by configTICK_RATE_HZ (set in FreeRTOSConfig.h).  The constant

- * portTICK_RATE_MS can be used to convert ticks to milliseconds (see the

- * crQUEUE_SEND example).

- *

- * @param pxResult The variable pointed to by pxResult will be set to pdPASS if

- * data was successfully retrieved from the queue, otherwise it will be set to

- * an error code as defined within ProjDefs.h.

- *

- * Example usage:

- <pre>

- // A co-routine receives the number of an LED to flash from a queue.  It

- // blocks on the queue until the number is received.

- static void prvCoRoutineFlashWorkTask( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )

- {

- // Variables in co-routines must be declared static if they must maintain value across a blocking call.

- static portBASE_TYPE xResult;

- static unsigned portBASE_TYPE uxLEDToFlash;

-

-    // All co-routines must start with a call to crSTART().

-    crSTART( xHandle );

-

-    for( ;; )

-    {

-        // Wait for data to become available on the queue.

-        crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );

-

-        if( xResult == pdPASS )

-        {

-            // We received the LED to flash - flash it!

-            vParTestToggleLED( uxLEDToFlash );

-        }

-    }

-

-    crEND();

- }</pre>

- * \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE

- * \ingroup Tasks

- */

-#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult )			\

-{																						\

-	*( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), ( xTicksToWait ) );		\

-	if( *( pxResult ) == errQUEUE_BLOCKED ) 											\

-	{																					\

-		crSET_STATE0( ( xHandle ) );													\

-		*( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), 0 );				\

-	}																					\

-	if( *( pxResult ) == errQUEUE_YIELD )												\

-	{																					\

-		crSET_STATE1( ( xHandle ) );													\

-		*( pxResult ) = pdPASS;															\

-	}																					\

-}

-

-/**

- * croutine. h

- * <pre>

-  crQUEUE_SEND_FROM_ISR(

-                            xQueueHandle pxQueue,

-                            void *pvItemToQueue,

-                            portBASE_TYPE xCoRoutinePreviouslyWoken

-                       )</pre>

- *

- * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the

- * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR()

- * functions used by tasks.

- *

- * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to

- * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and

- * xQueueReceiveFromISR() can only be used to pass data between a task and and

- * ISR.

- *

- * crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue

- * that is being used from within a co-routine.

- *

- * See the co-routine section of the WEB documentation for information on

- * passing data between tasks and co-routines and between ISR's and

- * co-routines.

- *

- * @param xQueue The handle to the queue on which the item is to be posted.

- *

- * @param pvItemToQueue A pointer to the item that is to be placed on the

- * queue.  The size of the items the queue will hold was defined when the

- * queue was created, so this many bytes will be copied from pvItemToQueue

- * into the queue storage area.

- *

- * @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto

- * the same queue multiple times from a single interrupt.  The first call

- * should always pass in pdFALSE.  Subsequent calls should pass in

- * the value returned from the previous call.

- *

- * @return pdTRUE if a co-routine was woken by posting onto the queue.  This is

- * used by the ISR to determine if a context switch may be required following

- * the ISR.

- *

- * Example usage:

- <pre>

- // A co-routine that blocks on a queue waiting for characters to be received.

- static void vReceivingCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )

- {

- char cRxedChar;

- portBASE_TYPE xResult;

-

-     // All co-routines must start with a call to crSTART().

-     crSTART( xHandle );

-

-     for( ;; )

-     {

-         // Wait for data to become available on the queue.  This assumes the

-         // queue xCommsRxQueue has already been created!

-         crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );

-

-         // Was a character received?

-         if( xResult == pdPASS )

-         {

-             // Process the character here.

-         }

-     }

-

-     // All co-routines must end with a call to crEND().

-     crEND();

- }

-

- // An ISR that uses a queue to send characters received on a serial port to

- // a co-routine.

- void vUART_ISR( void )

- {

- char cRxedChar;

- portBASE_TYPE xCRWokenByPost = pdFALSE;

-

-     // We loop around reading characters until there are none left in the UART.

-     while( UART_RX_REG_NOT_EMPTY() )

-     {

-         // Obtain the character from the UART.

-         cRxedChar = UART_RX_REG;

-

-         // Post the character onto a queue.  xCRWokenByPost will be pdFALSE

-         // the first time around the loop.  If the post causes a co-routine

-         // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE.

-         // In this manner we can ensure that if more than one co-routine is

-         // blocked on the queue only one is woken by this ISR no matter how

-         // many characters are posted to the queue.

-         xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost );

-     }

- }</pre>

- * \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR

- * \ingroup Tasks

- */

-#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) )

-

-

-/**

- * croutine. h

- * <pre>

-  crQUEUE_SEND_FROM_ISR(

-                            xQueueHandle pxQueue,

-                            void *pvBuffer,

-                            portBASE_TYPE * pxCoRoutineWoken

-                       )</pre>

- *

- * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the

- * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR()

- * functions used by tasks.

- *

- * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to

- * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and

- * xQueueReceiveFromISR() can only be used to pass data between a task and and

- * ISR.

- *

- * crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data

- * from a queue that is being used from within a co-routine (a co-routine

- * posted to the queue).

- *

- * See the co-routine section of the WEB documentation for information on

- * passing data between tasks and co-routines and between ISR's and

- * co-routines.

- *

- * @param xQueue The handle to the queue on which the item is to be posted.

- *

- * @param pvBuffer A pointer to a buffer into which the received item will be

- * placed.  The size of the items the queue will hold was defined when the

- * queue was created, so this many bytes will be copied from the queue into

- * pvBuffer.

- *

- * @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become

- * available on the queue.  If crQUEUE_RECEIVE_FROM_ISR causes such a

- * co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise

- * *pxCoRoutineWoken will remain unchanged.

- *

- * @return pdTRUE an item was successfully received from the queue, otherwise

- * pdFALSE.

- *

- * Example usage:

- <pre>

- // A co-routine that posts a character to a queue then blocks for a fixed

- // period.  The character is incremented each time.

- static void vSendingCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )

- {

- // cChar holds its value while this co-routine is blocked and must therefore

- // be declared static.

- static char cCharToTx = 'a';

- portBASE_TYPE xResult;

-

-     // All co-routines must start with a call to crSTART().

-     crSTART( xHandle );

-

-     for( ;; )

-     {

-         // Send the next character to the queue.

-         crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult );

-

-         if( xResult == pdPASS )

-         {

-             // The character was successfully posted to the queue.

-         }

-		 else

-		 {

-			// Could not post the character to the queue.

-		 }

-

-         // Enable the UART Tx interrupt to cause an interrupt in this

-		 // hypothetical UART.  The interrupt will obtain the character

-		 // from the queue and send it.

-		 ENABLE_RX_INTERRUPT();

-

-		 // Increment to the next character then block for a fixed period.

-		 // cCharToTx will maintain its value across the delay as it is

-		 // declared static.

-		 cCharToTx++;

-		 if( cCharToTx > 'x' )

-		 {

-			cCharToTx = 'a';

-		 }

-		 crDELAY( 100 );

-     }

-

-     // All co-routines must end with a call to crEND().

-     crEND();

- }

-

- // An ISR that uses a queue to receive characters to send on a UART.

- void vUART_ISR( void )

- {

- char cCharToTx;

- portBASE_TYPE xCRWokenByPost = pdFALSE;

-

-     while( UART_TX_REG_EMPTY() )

-     {

-         // Are there any characters in the queue waiting to be sent?

-		 // xCRWokenByPost will automatically be set to pdTRUE if a co-routine

-		 // is woken by the post - ensuring that only a single co-routine is

-		 // woken no matter how many times we go around this loop.

-         if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) )

-		 {

-			 SEND_CHARACTER( cCharToTx );

-		 }

-     }

- }</pre>

- * \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR

- * \ingroup Tasks

- */

-#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) )

-

-/*

- * This function is intended for internal use by the co-routine macros only.

- * The macro nature of the co-routine implementation requires that the

- * prototype appears here.  The function should not be used by application

- * writers.

- *

- * Removes the current co-routine from its ready list and places it in the

- * appropriate delayed list.

- */

-void vCoRoutineAddToDelayedList( portTickType xTicksToDelay, xList *pxEventList );

-

-/*

- * This function is intended for internal use by the queue implementation only.

- * The function should not be used by application writers.

- *

- * Removes the highest priority co-routine from the event list and places it in

- * the pending ready list.

- */

-signed portBASE_TYPE xCoRoutineRemoveFromEventList( const xList *pxEventList );

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* CO_ROUTINE_H */

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/list.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/list.h
deleted file mode 100644
index c36de57..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/list.h
+++ /dev/null
@@ -1,337 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-/*

- * This is the list implementation used by the scheduler.  While it is tailored

- * heavily for the schedulers needs, it is also available for use by

- * application code.

- *

- * xLists can only store pointers to xListItems.  Each xListItem contains a

- * numeric value (xItemValue).  Most of the time the lists are sorted in

- * descending item value order.

- *

- * Lists are created already containing one list item.  The value of this

- * item is the maximum possible that can be stored, it is therefore always at

- * the end of the list and acts as a marker.  The list member pxHead always

- * points to this marker - even though it is at the tail of the list.  This

- * is because the tail contains a wrap back pointer to the true head of

- * the list.

- *

- * In addition to it's value, each list item contains a pointer to the next

- * item in the list (pxNext), a pointer to the list it is in (pxContainer)

- * and a pointer to back to the object that contains it.  These later two

- * pointers are included for efficiency of list manipulation.  There is

- * effectively a two way link between the object containing the list item and

- * the list item itself.

- *

- *

- * \page ListIntroduction List Implementation

- * \ingroup FreeRTOSIntro

- */

-

-

-#ifndef LIST_H

-#define LIST_H

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-/*

- * Definition of the only type of object that a list can contain.

- */

-struct xLIST_ITEM

-{

-	portTickType xItemValue;				/*< The value being listed.  In most cases this is used to sort the list in descending order. */

-	volatile struct xLIST_ITEM * pxNext;	/*< Pointer to the next xListItem in the list. */

-	volatile struct xLIST_ITEM * pxPrevious;/*< Pointer to the previous xListItem in the list. */

-	void * pvOwner;							/*< Pointer to the object (normally a TCB) that contains the list item.  There is therefore a two way link between the object containing the list item and the list item itself. */

-	void * pvContainer;						/*< Pointer to the list in which this list item is placed (if any). */

-};

-typedef struct xLIST_ITEM xListItem;		/* For some reason lint wants this as two separate definitions. */

-

-struct xMINI_LIST_ITEM

-{

-	portTickType xItemValue;

-	volatile struct xLIST_ITEM *pxNext;

-	volatile struct xLIST_ITEM *pxPrevious;

-};

-typedef struct xMINI_LIST_ITEM xMiniListItem;

-

-/*

- * Definition of the type of queue used by the scheduler.

- */

-typedef struct xLIST

-{

-	volatile unsigned portBASE_TYPE uxNumberOfItems;

-	volatile xListItem * pxIndex;			/*< Used to walk through the list.  Points to the last item returned by a call to pvListGetOwnerOfNextEntry (). */

-	volatile xMiniListItem xListEnd;		/*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */

-} xList;

-

-/*

- * Access macro to set the owner of a list item.  The owner of a list item

- * is the object (usually a TCB) that contains the list item.

- *

- * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER

- * \ingroup LinkedList

- */

-#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner )		( pxListItem )->pvOwner = ( void * ) ( pxOwner )

-

-/*

- * Access macro to get the owner of a list item.  The owner of a list item

- * is the object (usually a TCB) that contains the list item.

- *

- * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER

- * \ingroup LinkedList

- */

-#define listGET_LIST_ITEM_OWNER( pxListItem )		( pxListItem )->pvOwner

-

-/*

- * Access macro to set the value of the list item.  In most cases the value is

- * used to sort the list in descending order.

- *

- * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE

- * \ingroup LinkedList

- */

-#define listSET_LIST_ITEM_VALUE( pxListItem, xValue )		( pxListItem )->xItemValue = ( xValue )

-

-/*

- * Access macro to retrieve the value of the list item.  The value can

- * represent anything - for example a the priority of a task, or the time at

- * which a task should be unblocked.

- *

- * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE

- * \ingroup LinkedList

- */

-#define listGET_LIST_ITEM_VALUE( pxListItem )				( ( pxListItem )->xItemValue )

-

-/*

- * Access macro the retrieve the value of the list item at the head of a given

- * list.

- *

- * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE

- * \ingroup LinkedList

- */

-#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList )			( (&( ( pxList )->xListEnd ))->pxNext->xItemValue )

-

-/*

- * Access macro to determine if a list contains any items.  The macro will

- * only have the value true if the list is empty.

- *

- * \page listLIST_IS_EMPTY listLIST_IS_EMPTY

- * \ingroup LinkedList

- */

-#define listLIST_IS_EMPTY( pxList )				( ( pxList )->uxNumberOfItems == ( unsigned portBASE_TYPE ) 0 )

-

-/*

- * Access macro to return the number of items in the list.

- */

-#define listCURRENT_LIST_LENGTH( pxList )		( ( pxList )->uxNumberOfItems )

-

-/*

- * Access function to obtain the owner of the next entry in a list.

- *

- * The list member pxIndex is used to walk through a list.  Calling

- * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list

- * and returns that entries pxOwner parameter.  Using multiple calls to this

- * function it is therefore possible to move through every item contained in

- * a list.

- *

- * The pxOwner parameter of a list item is a pointer to the object that owns

- * the list item.  In the scheduler this is normally a task control block.

- * The pxOwner parameter effectively creates a two way link between the list

- * item and its owner.

- *

- * @param pxList The list from which the next item owner is to be returned.

- *

- * \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY

- * \ingroup LinkedList

- */

-#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList )									\

-{																						\

-xList * const pxConstList = ( pxList );													\

-	/* Increment the index to the next item and return the item, ensuring */			\

-	/* we don't return the marker used at the end of the list.  */						\

-	( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext;						\

-	if( ( pxConstList )->pxIndex == ( xListItem * ) &( ( pxConstList )->xListEnd ) )	\

-	{																					\

-		( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext;					\

-	}																					\

-	( pxTCB ) = ( pxConstList )->pxIndex->pvOwner;										\

-}

-

-

-/*

- * Access function to obtain the owner of the first entry in a list.  Lists

- * are normally sorted in ascending item value order.

- *

- * This function returns the pxOwner member of the first item in the list.

- * The pxOwner parameter of a list item is a pointer to the object that owns

- * the list item.  In the scheduler this is normally a task control block.

- * The pxOwner parameter effectively creates a two way link between the list

- * item and its owner.

- *

- * @param pxList The list from which the owner of the head item is to be

- * returned.

- *

- * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY

- * \ingroup LinkedList

- */

-#define listGET_OWNER_OF_HEAD_ENTRY( pxList )  ( (&( ( pxList )->xListEnd ))->pxNext->pvOwner )

-

-/*

- * Check to see if a list item is within a list.  The list item maintains a

- * "container" pointer that points to the list it is in.  All this macro does

- * is check to see if the container and the list match.

- *

- * @param pxList The list we want to know if the list item is within.

- * @param pxListItem The list item we want to know if is in the list.

- * @return pdTRUE is the list item is in the list, otherwise pdFALSE.

- * pointer against

- */

-#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( pxListItem )->pvContainer == ( void * ) ( pxList ) )

-

-/*

- * This provides a crude means of knowing if a list has been initialised, as

- * pxList->xListEnd.xItemValue is set to portMAX_DELAY by the vListInitialise()

- * function.

- */

-#define listLIST_IS_INITIALISED( pxList ) ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY )

-

-/*

- * Must be called before a list is used!  This initialises all the members

- * of the list structure and inserts the xListEnd item into the list as a

- * marker to the back of the list.

- *

- * @param pxList Pointer to the list being initialised.

- *

- * \page vListInitialise vListInitialise

- * \ingroup LinkedList

- */

-void vListInitialise( xList *pxList );

-

-/*

- * Must be called before a list item is used.  This sets the list container to

- * null so the item does not think that it is already contained in a list.

- *

- * @param pxItem Pointer to the list item being initialised.

- *

- * \page vListInitialiseItem vListInitialiseItem

- * \ingroup LinkedList

- */

-void vListInitialiseItem( xListItem *pxItem );

-

-/*

- * Insert a list item into a list.  The item will be inserted into the list in

- * a position determined by its item value (descending item value order).

- *

- * @param pxList The list into which the item is to be inserted.

- *

- * @param pxNewListItem The item to that is to be placed in the list.

- *

- * \page vListInsert vListInsert

- * \ingroup LinkedList

- */

-void vListInsert( xList *pxList, xListItem *pxNewListItem );

-

-/*

- * Insert a list item into a list.  The item will be inserted in a position

- * such that it will be the last item within the list returned by multiple

- * calls to listGET_OWNER_OF_NEXT_ENTRY.

- *

- * The list member pvIndex is used to walk through a list.  Calling

- * listGET_OWNER_OF_NEXT_ENTRY increments pvIndex to the next item in the list.

- * Placing an item in a list using vListInsertEnd effectively places the item

- * in the list position pointed to by pvIndex.  This means that every other

- * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before

- * the pvIndex parameter again points to the item being inserted.

- *

- * @param pxList The list into which the item is to be inserted.

- *

- * @param pxNewListItem The list item to be inserted into the list.

- *

- * \page vListInsertEnd vListInsertEnd

- * \ingroup LinkedList

- */

-void vListInsertEnd( xList *pxList, xListItem *pxNewListItem );

-

-/*

- * Remove an item from a list.  The list item has a pointer to the list that

- * it is in, so only the list item need be passed into the function.

- *

- * @param vListRemove The item to be removed.  The item will remove itself from

- * the list pointed to by it's pxContainer parameter.

- *

- * \page vListRemove vListRemove

- * \ingroup LinkedList

- */

-void vListRemove( xListItem *pxItemToRemove );

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/mpu_wrappers.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/mpu_wrappers.h
deleted file mode 100644
index 12246b8..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/mpu_wrappers.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef MPU_WRAPPERS_H

-#define MPU_WRAPPERS_H

-

-/* This file redefines API functions to be called through a wrapper macro, but

-only for ports that are using the MPU. */

-#ifdef portUSING_MPU_WRAPPERS

-

-	/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is

-	included from queue.c or task.c to prevent it from having an effect within

-	those files. */

-	#ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE

-

-		#define xTaskGenericCreate				MPU_xTaskGenericCreate

-		#define vTaskAllocateMPURegions			MPU_vTaskAllocateMPURegions

-		#define vTaskDelete						MPU_vTaskDelete

-		#define vTaskDelayUntil					MPU_vTaskDelayUntil

-		#define vTaskDelay						MPU_vTaskDelay

-		#define uxTaskPriorityGet				MPU_uxTaskPriorityGet

-		#define vTaskPrioritySet				MPU_vTaskPrioritySet

-		#define vTaskSuspend					MPU_vTaskSuspend

-		#define xTaskIsTaskSuspended			MPU_xTaskIsTaskSuspended

-		#define vTaskResume						MPU_vTaskResume

-		#define vTaskSuspendAll					MPU_vTaskSuspendAll

-		#define xTaskResumeAll					MPU_xTaskResumeAll

-		#define xTaskGetTickCount				MPU_xTaskGetTickCount

-		#define uxTaskGetNumberOfTasks			MPU_uxTaskGetNumberOfTasks

-		#define vTaskList						MPU_vTaskList

-		#define vTaskGetRunTimeStats			MPU_vTaskGetRunTimeStats

-		#define vTaskStartTrace					MPU_vTaskStartTrace

-		#define ulTaskEndTrace					MPU_ulTaskEndTrace

-		#define vTaskSetApplicationTaskTag		MPU_vTaskSetApplicationTaskTag

-		#define xTaskGetApplicationTaskTag		MPU_xTaskGetApplicationTaskTag

-		#define xTaskCallApplicationTaskHook	MPU_xTaskCallApplicationTaskHook

-		#define uxTaskGetStackHighWaterMark		MPU_uxTaskGetStackHighWaterMark

-		#define xTaskGetCurrentTaskHandle		MPU_xTaskGetCurrentTaskHandle

-		#define xTaskGetSchedulerState			MPU_xTaskGetSchedulerState

-

-		#define xQueueGenericCreate				MPU_xQueueGenericCreate

-		#define xQueueCreateMutex				MPU_xQueueCreateMutex

-		#define xQueueGiveMutexRecursive		MPU_xQueueGiveMutexRecursive

-		#define xQueueTakeMutexRecursive		MPU_xQueueTakeMutexRecursive

-		#define xQueueCreateCountingSemaphore	MPU_xQueueCreateCountingSemaphore

-		#define xQueueGenericSend				MPU_xQueueGenericSend

-		#define xQueueAltGenericSend			MPU_xQueueAltGenericSend

-		#define xQueueAltGenericReceive			MPU_xQueueAltGenericReceive

-		#define xQueueGenericReceive			MPU_xQueueGenericReceive

-		#define uxQueueMessagesWaiting			MPU_uxQueueMessagesWaiting

-		#define vQueueDelete					MPU_vQueueDelete

-

-		#define pvPortMalloc					MPU_pvPortMalloc

-		#define vPortFree						MPU_vPortFree

-		#define xPortGetFreeHeapSize			MPU_xPortGetFreeHeapSize

-		#define vPortInitialiseBlocks			MPU_vPortInitialiseBlocks

-

-		#if configQUEUE_REGISTRY_SIZE > 0

-			#define vQueueAddToRegistry				MPU_vQueueAddToRegistry

-			#define vQueueUnregisterQueue			MPU_vQueueUnregisterQueue

-		#endif

-

-		/* Remove the privileged function macro. */

-		#define PRIVILEGED_FUNCTION

-

-	#else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */

-

-		/* Ensure API functions go in the privileged execution section. */

-		#define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions")))

-		#define PRIVILEGED_DATA __attribute__((section("privileged_data")))

-        //#define PRIVILEGED_DATA

-

-	#endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */

-

-#else /* portUSING_MPU_WRAPPERS */

-

-	#define PRIVILEGED_FUNCTION

-	#define PRIVILEGED_DATA

-	#define portUSING_MPU_WRAPPERS 0

-

-#endif /* portUSING_MPU_WRAPPERS */

-

-

-#endif /* MPU_WRAPPERS_H */

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/portable.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/portable.h
deleted file mode 100644
index 38882d3..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/portable.h
+++ /dev/null
@@ -1,403 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-/*-----------------------------------------------------------

- * Portable layer API.  Each function must be defined for each port.

- *----------------------------------------------------------*/

-

-#ifndef PORTABLE_H

-#define PORTABLE_H

-

-/* Include the macro file relevant to the port being used. */

-

-#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT

-	#include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h"

-	typedef void ( __interrupt __far *pxISR )();

-#endif

-

-#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT

-	#include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h"

-	typedef void ( __interrupt __far *pxISR )();

-#endif

-

-#ifdef GCC_MEGA_AVR

-	#include "../portable/GCC/ATMega323/portmacro.h"

-#endif

-

-#ifdef IAR_MEGA_AVR

-	#include "../portable/IAR/ATMega323/portmacro.h"

-#endif

-

-#ifdef MPLAB_PIC24_PORT

-	#include "..\..\Source\portable\MPLAB\PIC24_dsPIC\portmacro.h"

-#endif

-

-#ifdef MPLAB_DSPIC_PORT

-	#include "..\..\Source\portable\MPLAB\PIC24_dsPIC\portmacro.h"

-#endif

-

-#ifdef MPLAB_PIC18F_PORT

-	#include "..\..\Source\portable\MPLAB\PIC18F\portmacro.h"

-#endif

-

-#ifdef MPLAB_PIC32MX_PORT

-	#include "..\..\Source\portable\MPLAB\PIC32MX\portmacro.h"

-#endif

-

-#ifdef _FEDPICC

-	#include "libFreeRTOS/Include/portmacro.h"

-#endif

-

-#ifdef SDCC_CYGNAL

-	#include "../../Source/portable/SDCC/Cygnal/portmacro.h"

-#endif

-

-#ifdef GCC_ARM7

-	#include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h"

-#endif

-

-#ifdef GCC_ARM7_ECLIPSE

-	#include "portmacro.h"

-#endif

-

-#ifdef ROWLEY_LPC23xx

-	#include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h"

-#endif

-

-#ifdef IAR_MSP430

-	#include "..\..\Source\portable\IAR\MSP430\portmacro.h"	

-#endif

-	

-#ifdef GCC_MSP430

-	#include "../../Source/portable/GCC/MSP430F449/portmacro.h"

-#endif

-

-#ifdef ROWLEY_MSP430

-	#include "../../Source/portable/Rowley/MSP430F449/portmacro.h"

-#endif

-

-#ifdef ARM7_LPC21xx_KEIL_RVDS

-	#include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h"

-#endif

-

-#ifdef SAM7_GCC

-	#include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h"

-#endif

-

-#ifdef SAM7_IAR

-	#include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h"

-#endif

-

-#ifdef SAM9XE_IAR

-	#include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h"

-#endif

-

-#ifdef LPC2000_IAR

-	#include "..\..\Source\portable\IAR\LPC2000\portmacro.h"

-#endif

-

-#ifdef STR71X_IAR

-	#include "..\..\Source\portable\IAR\STR71x\portmacro.h"

-#endif

-

-#ifdef STR75X_IAR

-	#include "..\..\Source\portable\IAR\STR75x\portmacro.h"

-#endif

-	

-#ifdef STR75X_GCC

-	#include "..\..\Source\portable\GCC\STR75x\portmacro.h"

-#endif

-

-#ifdef STR91X_IAR

-	#include "..\..\Source\portable\IAR\STR91x\portmacro.h"

-#endif

-	

-#ifdef GCC_H8S

-	#include "../../Source/portable/GCC/H8S2329/portmacro.h"

-#endif

-

-#ifdef GCC_AT91FR40008

-	#include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h"

-#endif

-

-#ifdef RVDS_ARMCM3_LM3S102

-	#include "../../Source/portable/RVDS/ARM_CM3/portmacro.h"

-#endif

-

-#ifdef GCC_ARMCM3_LM3S102

-	#include "../../Source/portable/GCC/ARM_CM3/portmacro.h"

-#endif

-

-#ifdef GCC_ARMCM3

-	#include "../../Source/portable/GCC/ARM_CM3/portmacro.h"

-#endif

-

-#ifdef IAR_ARM_CM3

-	#include "../../Source/portable/IAR/ARM_CM3/portmacro.h"

-#endif

-

-#ifdef IAR_ARMCM3_LM

-	#include "../../Source/portable/IAR/ARM_CM3/portmacro.h"

-#endif

-	

-#ifdef HCS12_CODE_WARRIOR

-	#include "../../Source/portable/CodeWarrior/HCS12/portmacro.h"

-#endif	

-

-#ifdef MICROBLAZE_GCC

-	#include "../../Source/portable/GCC/MicroBlaze/portmacro.h"

-#endif

-

-#ifdef TERN_EE

-	#include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h"

-#endif

-

-#ifdef GCC_HCS12

-	#include "../../Source/portable/GCC/HCS12/portmacro.h"

-#endif

-

-#ifdef GCC_MCF5235

-    #include "../../Source/portable/GCC/MCF5235/portmacro.h"

-#endif

-

-#ifdef COLDFIRE_V2_GCC

-	#include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h"

-#endif

-

-#ifdef COLDFIRE_V2_CODEWARRIOR

-	#include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h"

-#endif

-

-#ifdef GCC_PPC405

-	#include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h"

-#endif

-

-#ifdef GCC_PPC440

-	#include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h"

-#endif

-

-#ifdef _16FX_SOFTUNE

-	#include "..\..\Source\portable\Softune\MB96340\portmacro.h"

-#endif

-

-#ifdef BCC_INDUSTRIAL_PC_PORT

-	/* A short file name has to be used in place of the normal

-	FreeRTOSConfig.h when using the Borland compiler. */

-	#include "frconfig.h"

-	#include "..\portable\BCC\16BitDOS\PC\prtmacro.h"

-    typedef void ( __interrupt __far *pxISR )();

-#endif

-

-#ifdef BCC_FLASH_LITE_186_PORT

-	/* A short file name has to be used in place of the normal

-	FreeRTOSConfig.h when using the Borland compiler. */

-	#include "frconfig.h"

-	#include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h"

-    typedef void ( __interrupt __far *pxISR )();

-#endif

-

-#ifdef __GNUC__

-   #ifdef __AVR32_AVR32A__

-	   #include "portmacro.h"

-   #endif

-#endif

-

-#ifdef __ICCAVR32__

-   #ifdef __CORE__

-      #if __CORE__ == __AVR32A__

-	      #include "portmacro.h"

-      #endif

-   #endif

-#endif

-

-#ifdef __91467D

-	#include "portmacro.h"

-#endif

-

-#ifdef __96340

-	#include "portmacro.h"

-#endif

-

-

-#ifdef __IAR_V850ES_Fx3__

-	#include "../../Source/portable/IAR/V850ES/portmacro.h"

-#endif

-

-#ifdef __IAR_V850ES_Jx3__

-	#include "../../Source/portable/IAR/V850ES/portmacro.h"

-#endif

-

-#ifdef __IAR_V850ES_Jx3_L__

-	#include "../../Source/portable/IAR/V850ES/portmacro.h"

-#endif

-

-#ifdef __IAR_V850ES_Jx2__

-	#include "../../Source/portable/IAR/V850ES/portmacro.h"

-#endif

-

-#ifdef __IAR_V850ES_Hx2__

-	#include "../../Source/portable/IAR/V850ES/portmacro.h"

-#endif

-

-#ifdef __IAR_78K0R_Kx3__

-	#include "../../Source/portable/IAR/78K0R/portmacro.h"

-#endif

-	

-#ifdef __IAR_78K0R_Kx3L__

-	#include "../../Source/portable/IAR/78K0R/portmacro.h"

-#endif

-	

-/* Catch all to ensure portmacro.h is included in the build.  Newer demos

-have the path as part of the project options, rather than as relative from

-the project location.  If portENTER_CRITICAL() has not been defined then

-portmacro.h has not yet been included - as every portmacro.h provides a

-portENTER_CRITICAL() definition.  Check the demo application for your demo

-to find the path to the correct portmacro.h file. */

-#ifndef portENTER_CRITICAL

-	#include "portmacro.h"	

-#endif

-	

-#if portBYTE_ALIGNMENT == 8

-	#define portBYTE_ALIGNMENT_MASK ( 0x0007 )

-#endif

-

-#if portBYTE_ALIGNMENT == 4

-	#define portBYTE_ALIGNMENT_MASK	( 0x0003 )

-#endif

-

-#if portBYTE_ALIGNMENT == 2

-	#define portBYTE_ALIGNMENT_MASK	( 0x0001 )

-#endif

-

-#if portBYTE_ALIGNMENT == 1

-	#define portBYTE_ALIGNMENT_MASK	( 0x0000 )

-#endif

-

-#ifndef portBYTE_ALIGNMENT_MASK

-	#error "Invalid portBYTE_ALIGNMENT definition"

-#endif

-

-#ifndef portNUM_CONFIGURABLE_REGIONS

-	#define portNUM_CONFIGURABLE_REGIONS 1

-#endif

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-#include "mpu_wrappers.h"

-

-/*

- * Setup the stack of a new task so it is ready to be placed under the

- * scheduler control.  The registers have to be placed on the stack in

- * the order that the port expects to find them.

- *

- */

-#if( portUSING_MPU_WRAPPERS == 1 )

-	portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters, portBASE_TYPE xRunPrivileged ) PRIVILEGED_FUNCTION;

-#else

-	portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters );

-#endif

-

-/*

- * Map to the memory management routines required for the port.

- */

-void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION;

-void vPortFree( void *pv ) PRIVILEGED_FUNCTION;

-void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION;

-size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION;

-

-/*

- * Setup the hardware ready for the scheduler to take control.  This generally

- * sets up a tick interrupt and sets timers for the correct tick frequency.

- */

-portBASE_TYPE xPortStartScheduler( void ) PRIVILEGED_FUNCTION;

-

-/*

- * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so

- * the hardware is left in its original condition after the scheduler stops

- * executing.

- */

-void vPortEndScheduler( void ) PRIVILEGED_FUNCTION;

-

-/*

- * The structures and methods of manipulating the MPU are contained within the

- * port layer.

- *

- * Fills the xMPUSettings structure with the memory region information

- * contained in xRegions.

- */

-#if( portUSING_MPU_WRAPPERS == 1 ) 

-	struct xMEMORY_REGION;

-	void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, portSTACK_TYPE *pxBottomOfStack, unsigned short usStackDepth ) PRIVILEGED_FUNCTION;

-#endif

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTABLE_H */

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/projdefs.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/projdefs.h
deleted file mode 100644
index c6b04db..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/projdefs.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef PROJDEFS_H

-#define PROJDEFS_H

-

-/* Defines the prototype to which task functions must conform. */

-typedef void (*pdTASK_CODE)( void * );

-

-#define pdTRUE		( 1 )

-#define pdFALSE		( 0 )

-

-#define pdPASS									( 1 )

-#define pdFAIL									( 0 )

-#define errQUEUE_EMPTY							( 0 )

-#define errQUEUE_FULL							( 0 )

-

-/* Error definitions. */

-#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY	( -1 )

-#define errNO_TASK_TO_RUN						( -2 )

-#define errQUEUE_BLOCKED						( -4 )

-#define errQUEUE_YIELD							( -5 )

-

-#endif /* PROJDEFS_H */

-

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/queue.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/queue.h
deleted file mode 100644
index 4574895..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/queue.h
+++ /dev/null
@@ -1,1300 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-

-#ifndef QUEUE_H

-#define QUEUE_H

-

-#ifndef INC_FREERTOS_H

-	#error "include FreeRTOS.h" must appear in source files before "include queue.h"

-#endif

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-

-#include "mpu_wrappers.h"

-

-/**

- * Type by which queues are referenced.  For example, a call to xQueueCreate

- * returns (via a pointer parameter) an xQueueHandle variable that can then

- * be used as a parameter to xQueueSend(), xQueueReceive(), etc.

- */

-typedef void * xQueueHandle;

-

-

-/* For internal use only. */

-#define	queueSEND_TO_BACK	( 0 )

-#define	queueSEND_TO_FRONT	( 1 )

-

-/* For internal use only.  These definitions *must* match those in queue.c. */

-#define queueQUEUE_TYPE_BASE				( 0U )

-#define queueQUEUE_TYPE_MUTEX 				( 1U )

-#define queueQUEUE_TYPE_COUNTING_SEMAPHORE	( 2U )

-#define queueQUEUE_TYPE_BINARY_SEMAPHORE	( 3U )

-#define queueQUEUE_TYPE_RECURSIVE_MUTEX		( 4U )

-

-/**

- * queue. h

- * <pre>

- xQueueHandle xQueueCreate(

-							  unsigned portBASE_TYPE uxQueueLength,

-							  unsigned portBASE_TYPE uxItemSize

-						  );

- * </pre>

- *

- * Creates a new queue instance.  This allocates the storage required by the

- * new queue and returns a handle for the queue.

- *

- * @param uxQueueLength The maximum number of items that the queue can contain.

- *

- * @param uxItemSize The number of bytes each item in the queue will require.

- * Items are queued by copy, not by reference, so this is the number of bytes

- * that will be copied for each posted item.  Each item on the queue must be

- * the same size.

- *

- * @return If the queue is successfully create then a handle to the newly

- * created queue is returned.  If the queue cannot be created then 0 is

- * returned.

- *

- * Example usage:

-   <pre>

- struct AMessage

- {

-	char ucMessageID;

-	char ucData[ 20 ];

- };

-

- void vATask( void *pvParameters )

- {

- xQueueHandle xQueue1, xQueue2;

-

-	// Create a queue capable of containing 10 unsigned long values.

-	xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );

-	if( xQueue1 == 0 )

-	{

-		// Queue was not created and must not be used.

-	}

-

-	// Create a queue capable of containing 10 pointers to AMessage structures.

-	// These should be passed by pointer as they contain a lot of data.

-	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );

-	if( xQueue2 == 0 )

-	{

-		// Queue was not created and must not be used.

-	}

-

-	// ... Rest of task code.

- }

- </pre>

- * \defgroup xQueueCreate xQueueCreate

- * \ingroup QueueManagement

- */

-#define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( uxQueueLength, uxItemSize, queueQUEUE_TYPE_BASE )

-

-/**

- * queue. h

- * <pre>

- portBASE_TYPE xQueueSendToToFront(

-								   xQueueHandle	xQueue,

-								   const void	*	pvItemToQueue,

-								   portTickType	xTicksToWait

-							   );

- * </pre>

- *

- * This is a macro that calls xQueueGenericSend().

- *

- * Post an item to the front of a queue.  The item is queued by copy, not by

- * reference.  This function must not be called from an interrupt service

- * routine.  See xQueueSendFromISR () for an alternative which may be used

- * in an ISR.

- *

- * @param xQueue The handle to the queue on which the item is to be posted.

- *

- * @param pvItemToQueue A pointer to the item that is to be placed on the

- * queue.  The size of the items the queue will hold was defined when the

- * queue was created, so this many bytes will be copied from pvItemToQueue

- * into the queue storage area.

- *

- * @param xTicksToWait The maximum amount of time the task should block

- * waiting for space to become available on the queue, should it already

- * be full.  The call will return immediately if this is set to 0 and the

- * queue is full.  The time is defined in tick periods so the constant

- * portTICK_RATE_MS should be used to convert to real time if this is required.

- *

- * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.

- *

- * Example usage:

-   <pre>

- struct AMessage

- {

-	char ucMessageID;

-	char ucData[ 20 ];

- } xMessage;

-

- unsigned long ulVar = 10UL;

-

- void vATask( void *pvParameters )

- {

- xQueueHandle xQueue1, xQueue2;

- struct AMessage *pxMessage;

-

-	// Create a queue capable of containing 10 unsigned long values.

-	xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );

-

-	// Create a queue capable of containing 10 pointers to AMessage structures.

-	// These should be passed by pointer as they contain a lot of data.

-	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );

-

-	// ...

-

-	if( xQueue1 != 0 )

-	{

-		// Send an unsigned long.  Wait for 10 ticks for space to become

-		// available if necessary.

-		if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS )

-		{

-			// Failed to post the message, even after 10 ticks.

-		}

-	}

-

-	if( xQueue2 != 0 )

-	{

-		// Send a pointer to a struct AMessage object.  Don't block if the

-		// queue is already full.

-		pxMessage = & xMessage;

-		xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 );

-	}

-

-	// ... Rest of task code.

- }

- </pre>

- * \defgroup xQueueSend xQueueSend

- * \ingroup QueueManagement

- */

-#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT )

-

-/**

- * queue. h

- * <pre>

- portBASE_TYPE xQueueSendToBack(

-								   xQueueHandle	xQueue,

-								   const	void	*	pvItemToQueue,

-								   portTickType	xTicksToWait

-							   );

- * </pre>

- *

- * This is a macro that calls xQueueGenericSend().

- *

- * Post an item to the back of a queue.  The item is queued by copy, not by

- * reference.  This function must not be called from an interrupt service

- * routine.  See xQueueSendFromISR () for an alternative which may be used

- * in an ISR.

- *

- * @param xQueue The handle to the queue on which the item is to be posted.

- *

- * @param pvItemToQueue A pointer to the item that is to be placed on the

- * queue.  The size of the items the queue will hold was defined when the

- * queue was created, so this many bytes will be copied from pvItemToQueue

- * into the queue storage area.

- *

- * @param xTicksToWait The maximum amount of time the task should block

- * waiting for space to become available on the queue, should it already

- * be full.  The call will return immediately if this is set to 0 and the queue

- * is full.  The  time is defined in tick periods so the constant

- * portTICK_RATE_MS should be used to convert to real time if this is required.

- *

- * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.

- *

- * Example usage:

-   <pre>

- struct AMessage

- {

-	char ucMessageID;

-	char ucData[ 20 ];

- } xMessage;

-

- unsigned long ulVar = 10UL;

-

- void vATask( void *pvParameters )

- {

- xQueueHandle xQueue1, xQueue2;

- struct AMessage *pxMessage;

-

-	// Create a queue capable of containing 10 unsigned long values.

-	xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );

-

-	// Create a queue capable of containing 10 pointers to AMessage structures.

-	// These should be passed by pointer as they contain a lot of data.

-	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );

-

-	// ...

-

-	if( xQueue1 != 0 )

-	{

-		// Send an unsigned long.  Wait for 10 ticks for space to become

-		// available if necessary.

-		if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS )

-		{

-			// Failed to post the message, even after 10 ticks.

-		}

-	}

-

-	if( xQueue2 != 0 )

-	{

-		// Send a pointer to a struct AMessage object.  Don't block if the

-		// queue is already full.

-		pxMessage = & xMessage;

-		xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 );

-	}

-

-	// ... Rest of task code.

- }

- </pre>

- * \defgroup xQueueSend xQueueSend

- * \ingroup QueueManagement

- */

-#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK )

-

-/**

- * queue. h

- * <pre>

- portBASE_TYPE xQueueSend(

-							  xQueueHandle xQueue,

-							  const void * pvItemToQueue,

-							  portTickType xTicksToWait

-						 );

- * </pre>

- *

- * This is a macro that calls xQueueGenericSend().  It is included for

- * backward compatibility with versions of FreeRTOS.org that did not

- * include the xQueueSendToFront() and xQueueSendToBack() macros.  It is

- * equivalent to xQueueSendToBack().

- *

- * Post an item on a queue.  The item is queued by copy, not by reference.

- * This function must not be called from an interrupt service routine.

- * See xQueueSendFromISR () for an alternative which may be used in an ISR.

- *

- * @param xQueue The handle to the queue on which the item is to be posted.

- *

- * @param pvItemToQueue A pointer to the item that is to be placed on the

- * queue.  The size of the items the queue will hold was defined when the

- * queue was created, so this many bytes will be copied from pvItemToQueue

- * into the queue storage area.

- *

- * @param xTicksToWait The maximum amount of time the task should block

- * waiting for space to become available on the queue, should it already

- * be full.  The call will return immediately if this is set to 0 and the

- * queue is full.  The time is defined in tick periods so the constant

- * portTICK_RATE_MS should be used to convert to real time if this is required.

- *

- * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.

- *

- * Example usage:

-   <pre>

- struct AMessage

- {

-	char ucMessageID;

-	char ucData[ 20 ];

- } xMessage;

-

- unsigned long ulVar = 10UL;

-

- void vATask( void *pvParameters )

- {

- xQueueHandle xQueue1, xQueue2;

- struct AMessage *pxMessage;

-

-	// Create a queue capable of containing 10 unsigned long values.

-	xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );

-

-	// Create a queue capable of containing 10 pointers to AMessage structures.

-	// These should be passed by pointer as they contain a lot of data.

-	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );

-

-	// ...

-

-	if( xQueue1 != 0 )

-	{

-		// Send an unsigned long.  Wait for 10 ticks for space to become

-		// available if necessary.

-		if( xQueueSend( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS )

-		{

-			// Failed to post the message, even after 10 ticks.

-		}

-	}

-

-	if( xQueue2 != 0 )

-	{

-		// Send a pointer to a struct AMessage object.  Don't block if the

-		// queue is already full.

-		pxMessage = & xMessage;

-		xQueueSend( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 );

-	}

-

-	// ... Rest of task code.

- }

- </pre>

- * \defgroup xQueueSend xQueueSend

- * \ingroup QueueManagement

- */

-#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK )

-

-

-/**

- * queue. h

- * <pre>

- portBASE_TYPE xQueueGenericSend(

-									xQueueHandle xQueue,

-									const void * pvItemToQueue,

-									portTickType xTicksToWait

-									portBASE_TYPE xCopyPosition

-								);

- * </pre>

- *

- * It is preferred that the macros xQueueSend(), xQueueSendToFront() and

- * xQueueSendToBack() are used in place of calling this function directly.

- *

- * Post an item on a queue.  The item is queued by copy, not by reference.

- * This function must not be called from an interrupt service routine.

- * See xQueueSendFromISR () for an alternative which may be used in an ISR.

- *

- * @param xQueue The handle to the queue on which the item is to be posted.

- *

- * @param pvItemToQueue A pointer to the item that is to be placed on the

- * queue.  The size of the items the queue will hold was defined when the

- * queue was created, so this many bytes will be copied from pvItemToQueue

- * into the queue storage area.

- *

- * @param xTicksToWait The maximum amount of time the task should block

- * waiting for space to become available on the queue, should it already

- * be full.  The call will return immediately if this is set to 0 and the

- * queue is full.  The time is defined in tick periods so the constant

- * portTICK_RATE_MS should be used to convert to real time if this is required.

- *

- * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the

- * item at the back of the queue, or queueSEND_TO_FRONT to place the item

- * at the front of the queue (for high priority messages).

- *

- * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.

- *

- * Example usage:

-   <pre>

- struct AMessage

- {

-	char ucMessageID;

-	char ucData[ 20 ];

- } xMessage;

-

- unsigned long ulVar = 10UL;

-

- void vATask( void *pvParameters )

- {

- xQueueHandle xQueue1, xQueue2;

- struct AMessage *pxMessage;

-

-	// Create a queue capable of containing 10 unsigned long values.

-	xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );

-

-	// Create a queue capable of containing 10 pointers to AMessage structures.

-	// These should be passed by pointer as they contain a lot of data.

-	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );

-

-	// ...

-

-	if( xQueue1 != 0 )

-	{

-		// Send an unsigned long.  Wait for 10 ticks for space to become

-		// available if necessary.

-		if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( portTickType ) 10, queueSEND_TO_BACK ) != pdPASS )

-		{

-			// Failed to post the message, even after 10 ticks.

-		}

-	}

-

-	if( xQueue2 != 0 )

-	{

-		// Send a pointer to a struct AMessage object.  Don't block if the

-		// queue is already full.

-		pxMessage = & xMessage;

-		xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0, queueSEND_TO_BACK );

-	}

-

-	// ... Rest of task code.

- }

- </pre>

- * \defgroup xQueueSend xQueueSend

- * \ingroup QueueManagement

- */

-signed portBASE_TYPE xQueueGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition );

-

-/**

- * queue. h

- * <pre>

- portBASE_TYPE xQueuePeek(

-							 xQueueHandle xQueue,

-							 void *pvBuffer,

-							 portTickType xTicksToWait

-						 );</pre>

- *

- * This is a macro that calls the xQueueGenericReceive() function.

- *

- * Receive an item from a queue without removing the item from the queue.

- * The item is received by copy so a buffer of adequate size must be

- * provided.  The number of bytes copied into the buffer was defined when

- * the queue was created.

- *

- * Successfully received items remain on the queue so will be returned again

- * by the next call, or a call to xQueueReceive().

- *

- * This macro must not be used in an interrupt service routine.

- *

- * @param pxQueue The handle to the queue from which the item is to be

- * received.

- *

- * @param pvBuffer Pointer to the buffer into which the received item will

- * be copied.

- *

- * @param xTicksToWait The maximum amount of time the task should block

- * waiting for an item to receive should the queue be empty at the time

- * of the call.	 The time is defined in tick periods so the constant

- * portTICK_RATE_MS should be used to convert to real time if this is required.

- * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue

- * is empty.

- *

- * @return pdTRUE if an item was successfully received from the queue,

- * otherwise pdFALSE.

- *

- * Example usage:

-   <pre>

- struct AMessage

- {

-	char ucMessageID;

-	char ucData[ 20 ];

- } xMessage;

-

- xQueueHandle xQueue;

-

- // Task to create a queue and post a value.

- void vATask( void *pvParameters )

- {

- struct AMessage *pxMessage;

-

-	// Create a queue capable of containing 10 pointers to AMessage structures.

-	// These should be passed by pointer as they contain a lot of data.

-	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );

-	if( xQueue == 0 )

-	{

-		// Failed to create the queue.

-	}

-

-	// ...

-

-	// Send a pointer to a struct AMessage object.  Don't block if the

-	// queue is already full.

-	pxMessage = & xMessage;

-	xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 );

-

-	// ... Rest of task code.

- }

-

- // Task to peek the data from the queue.

- void vADifferentTask( void *pvParameters )

- {

- struct AMessage *pxRxedMessage;

-

-	if( xQueue != 0 )

-	{

-		// Peek a message on the created queue.  Block for 10 ticks if a

-		// message is not immediately available.

-		if( xQueuePeek( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) )

-		{

-			// pcRxedMessage now points to the struct AMessage variable posted

-			// by vATask, but the item still remains on the queue.

-		}

-	}

-

-	// ... Rest of task code.

- }

- </pre>

- * \defgroup xQueueReceive xQueueReceive

- * \ingroup QueueManagement

- */

-#define xQueuePeek( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE )

-

-/**

- * queue. h

- * <pre>

- portBASE_TYPE xQueueReceive(

-								 xQueueHandle xQueue,

-								 void *pvBuffer,

-								 portTickType xTicksToWait

-							);</pre>

- *

- * This is a macro that calls the xQueueGenericReceive() function.

- *

- * Receive an item from a queue.  The item is received by copy so a buffer of

- * adequate size must be provided.  The number of bytes copied into the buffer

- * was defined when the queue was created.

- *

- * Successfully received items are removed from the queue.

- *

- * This function must not be used in an interrupt service routine.  See

- * xQueueReceiveFromISR for an alternative that can.

- *

- * @param pxQueue The handle to the queue from which the item is to be

- * received.

- *

- * @param pvBuffer Pointer to the buffer into which the received item will

- * be copied.

- *

- * @param xTicksToWait The maximum amount of time the task should block

- * waiting for an item to receive should the queue be empty at the time

- * of the call.	 xQueueReceive() will return immediately if xTicksToWait

- * is zero and the queue is empty.  The time is defined in tick periods so the

- * constant portTICK_RATE_MS should be used to convert to real time if this is

- * required.

- *

- * @return pdTRUE if an item was successfully received from the queue,

- * otherwise pdFALSE.

- *

- * Example usage:

-   <pre>

- struct AMessage

- {

-	char ucMessageID;

-	char ucData[ 20 ];

- } xMessage;

-

- xQueueHandle xQueue;

-

- // Task to create a queue and post a value.

- void vATask( void *pvParameters )

- {

- struct AMessage *pxMessage;

-

-	// Create a queue capable of containing 10 pointers to AMessage structures.

-	// These should be passed by pointer as they contain a lot of data.

-	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );

-	if( xQueue == 0 )

-	{

-		// Failed to create the queue.

-	}

-

-	// ...

-

-	// Send a pointer to a struct AMessage object.  Don't block if the

-	// queue is already full.

-	pxMessage = & xMessage;

-	xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 );

-

-	// ... Rest of task code.

- }

-

- // Task to receive from the queue.

- void vADifferentTask( void *pvParameters )

- {

- struct AMessage *pxRxedMessage;

-

-	if( xQueue != 0 )

-	{

-		// Receive a message on the created queue.  Block for 10 ticks if a

-		// message is not immediately available.

-		if( xQueueReceive( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) )

-		{

-			// pcRxedMessage now points to the struct AMessage variable posted

-			// by vATask.

-		}

-	}

-

-	// ... Rest of task code.

- }

- </pre>

- * \defgroup xQueueReceive xQueueReceive

- * \ingroup QueueManagement

- */

-#define xQueueReceive( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE )

-

-

-/**

- * queue. h

- * <pre>

- portBASE_TYPE xQueueGenericReceive(

-									   xQueueHandle	xQueue,

-									   void	*pvBuffer,

-									   portTickType	xTicksToWait

-									   portBASE_TYPE	xJustPeek

-									);</pre>

- *

- * It is preferred that the macro xQueueReceive() be used rather than calling

- * this function directly.

- *

- * Receive an item from a queue.  The item is received by copy so a buffer of

- * adequate size must be provided.  The number of bytes copied into the buffer

- * was defined when the queue was created.

- *

- * This function must not be used in an interrupt service routine.  See

- * xQueueReceiveFromISR for an alternative that can.

- *

- * @param pxQueue The handle to the queue from which the item is to be

- * received.

- *

- * @param pvBuffer Pointer to the buffer into which the received item will

- * be copied.

- *

- * @param xTicksToWait The maximum amount of time the task should block

- * waiting for an item to receive should the queue be empty at the time

- * of the call.	 The time is defined in tick periods so the constant

- * portTICK_RATE_MS should be used to convert to real time if this is required.

- * xQueueGenericReceive() will return immediately if the queue is empty and

- * xTicksToWait is 0.

- *

- * @param xJustPeek When set to true, the item received from the queue is not

- * actually removed from the queue - meaning a subsequent call to

- * xQueueReceive() will return the same item.  When set to false, the item

- * being received from the queue is also removed from the queue.

- *

- * @return pdTRUE if an item was successfully received from the queue,

- * otherwise pdFALSE.

- *

- * Example usage:

-   <pre>

- struct AMessage

- {

-	char ucMessageID;

-	char ucData[ 20 ];

- } xMessage;

-

- xQueueHandle xQueue;

-

- // Task to create a queue and post a value.

- void vATask( void *pvParameters )

- {

- struct AMessage *pxMessage;

-

-	// Create a queue capable of containing 10 pointers to AMessage structures.

-	// These should be passed by pointer as they contain a lot of data.

-	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );

-	if( xQueue == 0 )

-	{

-		// Failed to create the queue.

-	}

-

-	// ...

-

-	// Send a pointer to a struct AMessage object.  Don't block if the

-	// queue is already full.

-	pxMessage = & xMessage;

-	xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 );

-

-	// ... Rest of task code.

- }

-

- // Task to receive from the queue.

- void vADifferentTask( void *pvParameters )

- {

- struct AMessage *pxRxedMessage;

-

-	if( xQueue != 0 )

-	{

-		// Receive a message on the created queue.  Block for 10 ticks if a

-		// message is not immediately available.

-		if( xQueueGenericReceive( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) )

-		{

-			// pcRxedMessage now points to the struct AMessage variable posted

-			// by vATask.

-		}

-	}

-

-	// ... Rest of task code.

- }

- </pre>

- * \defgroup xQueueReceive xQueueReceive

- * \ingroup QueueManagement

- */

-signed portBASE_TYPE xQueueGenericReceive( xQueueHandle xQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeek );

-

-/**

- * queue. h

- * <pre>unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue );</pre>

- *

- * Return the number of messages stored in a queue.

- *

- * @param xQueue A handle to the queue being queried.

- *

- * @return The number of messages available in the queue.

- *

- * \page uxQueueMessagesWaiting uxQueueMessagesWaiting

- * \ingroup QueueManagement

- */

-unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue );

-

-/**

- * queue. h

- * <pre>void vQueueDelete( xQueueHandle xQueue );</pre>

- *

- * Delete a queue - freeing all the memory allocated for storing of items

- * placed on the queue.

- *

- * @param xQueue A handle to the queue to be deleted.

- *

- * \page vQueueDelete vQueueDelete

- * \ingroup QueueManagement

- */

-void vQueueDelete( xQueueHandle pxQueue );

-

-/**

- * queue. h

- * <pre>

- portBASE_TYPE xQueueSendToFrontFromISR(

-										 xQueueHandle pxQueue,

-										 const void *pvItemToQueue,

-										 portBASE_TYPE *pxHigherPriorityTaskWoken

-									  );

- </pre>

- *

- * This is a macro that calls xQueueGenericSendFromISR().

- *

- * Post an item to the front of a queue.  It is safe to use this macro from

- * within an interrupt service routine.

- *

- * Items are queued by copy not reference so it is preferable to only

- * queue small items, especially when called from an ISR.  In most cases

- * it would be preferable to store a pointer to the item being queued.

- *

- * @param xQueue The handle to the queue on which the item is to be posted.

- *

- * @param pvItemToQueue A pointer to the item that is to be placed on the

- * queue.  The size of the items the queue will hold was defined when the

- * queue was created, so this many bytes will be copied from pvItemToQueue

- * into the queue storage area.

- *

- * @param pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set

- * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task

- * to unblock, and the unblocked task has a priority higher than the currently

- * running task.  If xQueueSendToFromFromISR() sets this value to pdTRUE then

- * a context switch should be requested before the interrupt is exited.

- *

- * @return pdTRUE if the data was successfully sent to the queue, otherwise

- * errQUEUE_FULL.

- *

- * Example usage for buffered IO (where the ISR can obtain more than one value

- * per call):

-   <pre>

- void vBufferISR( void )

- {

- char cIn;

- portBASE_TYPE xHigherPrioritTaskWoken;

-

-	// We have not woken a task at the start of the ISR.

-	xHigherPriorityTaskWoken = pdFALSE;

-

-	// Loop until the buffer is empty.

-	do

-	{

-		// Obtain a byte from the buffer.

-		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );

-

-		// Post the byte.

-		xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );

-

-	} while( portINPUT_BYTE( BUFFER_COUNT ) );

-

-	// Now the buffer is empty we can switch context if necessary.

-	if( xHigherPriorityTaskWoken )

-	{

-		taskYIELD ();

-	}

- }

- </pre>

- *

- * \defgroup xQueueSendFromISR xQueueSendFromISR

- * \ingroup QueueManagement

- */

-#define xQueueSendToFrontFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT )

-

-

-/**

- * queue. h

- * <pre>

- portBASE_TYPE xQueueSendToBackFromISR(

-										 xQueueHandle pxQueue,

-										 const void *pvItemToQueue,

-										 portBASE_TYPE *pxHigherPriorityTaskWoken

-									  );

- </pre>

- *

- * This is a macro that calls xQueueGenericSendFromISR().

- *

- * Post an item to the back of a queue.  It is safe to use this macro from

- * within an interrupt service routine.

- *

- * Items are queued by copy not reference so it is preferable to only

- * queue small items, especially when called from an ISR.  In most cases

- * it would be preferable to store a pointer to the item being queued.

- *

- * @param xQueue The handle to the queue on which the item is to be posted.

- *

- * @param pvItemToQueue A pointer to the item that is to be placed on the

- * queue.  The size of the items the queue will hold was defined when the

- * queue was created, so this many bytes will be copied from pvItemToQueue

- * into the queue storage area.

- *

- * @param pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set

- * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task

- * to unblock, and the unblocked task has a priority higher than the currently

- * running task.  If xQueueSendToBackFromISR() sets this value to pdTRUE then

- * a context switch should be requested before the interrupt is exited.

- *

- * @return pdTRUE if the data was successfully sent to the queue, otherwise

- * errQUEUE_FULL.

- *

- * Example usage for buffered IO (where the ISR can obtain more than one value

- * per call):

-   <pre>

- void vBufferISR( void )

- {

- char cIn;

- portBASE_TYPE xHigherPriorityTaskWoken;

-

-	// We have not woken a task at the start of the ISR.

-	xHigherPriorityTaskWoken = pdFALSE;

-

-	// Loop until the buffer is empty.

-	do

-	{

-		// Obtain a byte from the buffer.

-		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );

-

-		// Post the byte.

-		xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );

-

-	} while( portINPUT_BYTE( BUFFER_COUNT ) );

-

-	// Now the buffer is empty we can switch context if necessary.

-	if( xHigherPriorityTaskWoken )

-	{

-		taskYIELD ();

-	}

- }

- </pre>

- *

- * \defgroup xQueueSendFromISR xQueueSendFromISR

- * \ingroup QueueManagement

- */

-#define xQueueSendToBackFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )

-

-/**

- * queue. h

- * <pre>

- portBASE_TYPE xQueueSendFromISR(

-									 xQueueHandle pxQueue,

-									 const void *pvItemToQueue,

-									 portBASE_TYPE *pxHigherPriorityTaskWoken

-								);

- </pre>

- *

- * This is a macro that calls xQueueGenericSendFromISR().  It is included

- * for backward compatibility with versions of FreeRTOS.org that did not

- * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR()

- * macros.

- *

- * Post an item to the back of a queue.  It is safe to use this function from

- * within an interrupt service routine.

- *

- * Items are queued by copy not reference so it is preferable to only

- * queue small items, especially when called from an ISR.  In most cases

- * it would be preferable to store a pointer to the item being queued.

- *

- * @param xQueue The handle to the queue on which the item is to be posted.

- *

- * @param pvItemToQueue A pointer to the item that is to be placed on the

- * queue.  The size of the items the queue will hold was defined when the

- * queue was created, so this many bytes will be copied from pvItemToQueue

- * into the queue storage area.

- *

- * @param pxHigherPriorityTaskWoken xQueueSendFromISR() will set

- * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task

- * to unblock, and the unblocked task has a priority higher than the currently

- * running task.  If xQueueSendFromISR() sets this value to pdTRUE then

- * a context switch should be requested before the interrupt is exited.

- *

- * @return pdTRUE if the data was successfully sent to the queue, otherwise

- * errQUEUE_FULL.

- *

- * Example usage for buffered IO (where the ISR can obtain more than one value

- * per call):

-   <pre>

- void vBufferISR( void )

- {

- char cIn;

- portBASE_TYPE xHigherPriorityTaskWoken;

-

-	// We have not woken a task at the start of the ISR.

-	xHigherPriorityTaskWoken = pdFALSE;

-

-	// Loop until the buffer is empty.

-	do

-	{

-		// Obtain a byte from the buffer.

-		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );

-

-		// Post the byte.

-		xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );

-

-	} while( portINPUT_BYTE( BUFFER_COUNT ) );

-

-	// Now the buffer is empty we can switch context if necessary.

-	if( xHigherPriorityTaskWoken )

-	{

-		// Actual macro used here is port specific.

-		taskYIELD_FROM_ISR ();

-	}

- }

- </pre>

- *

- * \defgroup xQueueSendFromISR xQueueSendFromISR

- * \ingroup QueueManagement

- */

-#define xQueueSendFromISR( pxQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )

-

-/**

- * queue. h

- * <pre>

- portBASE_TYPE xQueueGenericSendFromISR(

-										   xQueueHandle	pxQueue,

-										   const	void	*pvItemToQueue,

-										   portBASE_TYPE	*pxHigherPriorityTaskWoken,

-										   portBASE_TYPE	xCopyPosition

-									   );

- </pre>

- *

- * It is preferred that the macros xQueueSendFromISR(),

- * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place

- * of calling this function directly.

- *

- * Post an item on a queue.  It is safe to use this function from within an

- * interrupt service routine.

- *

- * Items are queued by copy not reference so it is preferable to only

- * queue small items, especially when called from an ISR.  In most cases

- * it would be preferable to store a pointer to the item being queued.

- *

- * @param xQueue The handle to the queue on which the item is to be posted.

- *

- * @param pvItemToQueue A pointer to the item that is to be placed on the

- * queue.  The size of the items the queue will hold was defined when the

- * queue was created, so this many bytes will be copied from pvItemToQueue

- * into the queue storage area.

- *

- * @param pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set

- * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task

- * to unblock, and the unblocked task has a priority higher than the currently

- * running task.  If xQueueGenericSendFromISR() sets this value to pdTRUE then

- * a context switch should be requested before the interrupt is exited.

- *

- * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the

- * item at the back of the queue, or queueSEND_TO_FRONT to place the item

- * at the front of the queue (for high priority messages).

- *

- * @return pdTRUE if the data was successfully sent to the queue, otherwise

- * errQUEUE_FULL.

- *

- * Example usage for buffered IO (where the ISR can obtain more than one value

- * per call):

-   <pre>

- void vBufferISR( void )

- {

- char cIn;

- portBASE_TYPE xHigherPriorityTaskWokenByPost;

-

-	// We have not woken a task at the start of the ISR.

-	xHigherPriorityTaskWokenByPost = pdFALSE;

-

-	// Loop until the buffer is empty.

-	do

-	{

-		// Obtain a byte from the buffer.

-		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );

-

-		// Post each byte.

-		xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK );

-

-	} while( portINPUT_BYTE( BUFFER_COUNT ) );

-

-	// Now the buffer is empty we can switch context if necessary.  Note that the

-	// name of the yield function required is port specific.

-	if( xHigherPriorityTaskWokenByPost )

-	{

-		taskYIELD_YIELD_FROM_ISR();

-	}

- }

- </pre>

- *

- * \defgroup xQueueSendFromISR xQueueSendFromISR

- * \ingroup QueueManagement

- */

-signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition );

-

-/**

- * queue. h

- * <pre>

- portBASE_TYPE xQueueReceiveFromISR(

-									   xQueueHandle	pxQueue,

-									   void	*pvBuffer,

-									   portBASE_TYPE	*pxTaskWoken

-								   );

- * </pre>

- *

- * Receive an item from a queue.  It is safe to use this function from within an

- * interrupt service routine.

- *

- * @param pxQueue The handle to the queue from which the item is to be

- * received.

- *

- * @param pvBuffer Pointer to the buffer into which the received item will

- * be copied.

- *

- * @param pxTaskWoken A task may be blocked waiting for space to become

- * available on the queue.  If xQueueReceiveFromISR causes such a task to

- * unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will

- * remain unchanged.

- *

- * @return pdTRUE if an item was successfully received from the queue,

- * otherwise pdFALSE.

- *

- * Example usage:

-   <pre>

-

- xQueueHandle xQueue;

-

- // Function to create a queue and post some values.

- void vAFunction( void *pvParameters )

- {

- char cValueToPost;

- const portTickType xBlockTime = ( portTickType )0xff;

-

-	// Create a queue capable of containing 10 characters.

-	xQueue = xQueueCreate( 10, sizeof( char ) );

-	if( xQueue == 0 )

-	{

-		// Failed to create the queue.

-	}

-

-	// ...

-

-	// Post some characters that will be used within an ISR.  If the queue

-	// is full then this task will block for xBlockTime ticks.

-	cValueToPost = 'a';

-	xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );

-	cValueToPost = 'b';

-	xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );

-

-	// ... keep posting characters ... this task may block when the queue

-	// becomes full.

-

-	cValueToPost = 'c';

-	xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );

- }

-

- // ISR that outputs all the characters received on the queue.

- void vISR_Routine( void )

- {

- portBASE_TYPE xTaskWokenByReceive = pdFALSE;

- char cRxedChar;

-

-	while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) )

-	{

-		// A character was received.  Output the character now.

-		vOutputCharacter( cRxedChar );

-

-		// If removing the character from the queue woke the task that was

-		// posting onto the queue cTaskWokenByReceive will have been set to

-		// pdTRUE.  No matter how many times this loop iterates only one

-		// task will be woken.

-	}

-

-	if( cTaskWokenByPost != ( char ) pdFALSE;

-	{

-		taskYIELD ();

-	}

- }

- </pre>

- * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR

- * \ingroup QueueManagement

- */

-signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxHigherPriorityTaskWoken );

-

-/*

- * Utilities to query queues that are safe to use from an ISR.  These utilities

- * should be used only from witin an ISR, or within a critical section.

- */

-signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle pxQueue );

-signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle pxQueue );

-unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle pxQueue );

-

-

-/*

- * xQueueAltGenericSend() is an alternative version of xQueueGenericSend().

- * Likewise xQueueAltGenericReceive() is an alternative version of

- * xQueueGenericReceive().

- *

- * The source code that implements the alternative (Alt) API is much

- * simpler	because it executes everything from within a critical section.

- * This is	the approach taken by many other RTOSes, but FreeRTOS.org has the

- * preferred fully featured API too.  The fully featured API has more

- * complex	code that takes longer to execute, but makes much less use of

- * critical sections.  Therefore the alternative API sacrifices interrupt

- * responsiveness to gain execution speed, whereas the fully featured API

- * sacrifices execution speed to ensure better interrupt responsiveness.

- */

-signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition );

-signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking );

-#define xQueueAltSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT )

-#define xQueueAltSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK )

-#define xQueueAltReceive( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE )

-#define xQueueAltPeek( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE )

-

-/*

- * The functions defined above are for passing data to and from tasks.  The

- * functions below are the equivalents for passing data to and from

- * co-routines.

- *

- * These functions are called from the co-routine macro implementation and

- * should not be called directly from application code.  Instead use the macro

- * wrappers defined within croutine.h.

- */

-signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken );

-signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken );

-signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQueue, portTickType xTicksToWait );

-signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait );

-

-/*

- * For internal use only.  Use xSemaphoreCreateMutex(), 

- * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling 

- * these functions directly.

- */

-xQueueHandle xQueueCreateMutex( unsigned char ucQueueType );

-xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount );

-void* xQueueGetMutexHolder( xQueueHandle xSemaphore );

-

-/*

- * For internal use only.  Use xSemaphoreTakeMutexRecursive() or

- * xSemaphoreGiveMutexRecursive() instead of calling these functions directly.

- */

-portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle pxMutex, portTickType xBlockTime );

-portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex );

-

-/*

- * Reset a queue back to its original empty state.  pdPASS is returned if the

- * queue is successfully reset.  pdFAIL is returned if the queue could not be

- * reset because there are tasks blocked on the queue waiting to either

- * receive from the queue or send to the queue.

- */

-#define xQueueReset( pxQueue ) xQueueGenericReset( pxQueue, pdFALSE )

-

-/*

- * The registry is provided as a means for kernel aware debuggers to

- * locate queues, semaphores and mutexes.  Call vQueueAddToRegistry() add

- * a queue, semaphore or mutex handle to the registry if you want the handle

- * to be available to a kernel aware debugger.  If you are not using a kernel

- * aware debugger then this function can be ignored.

- *

- * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the

- * registry can hold.  configQUEUE_REGISTRY_SIZE must be greater than 0

- * within FreeRTOSConfig.h for the registry to be available.  Its value

- * does not effect the number of queues, semaphores and mutexes that can be

- * created - just the number that the registry can hold.

- *

- * @param xQueue The handle of the queue being added to the registry.  This

- * is the handle returned by a call to xQueueCreate().  Semaphore and mutex

- * handles can also be passed in here.

- *

- * @param pcName The name to be associated with the handle.  This is the

- * name that the kernel aware debugger will display.

- */

-#if configQUEUE_REGISTRY_SIZE > 0U

-	void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcName );

-#endif

-

-/*

- * Generic version of the queue creation function, which is in turn called by 

- * any queue, semaphore or mutex creation function or macro.

- */

-xQueueHandle xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize, unsigned char ucQueueType );

-

-/* Not public API functions. */

-void vQueueWaitForMessageRestricted( xQueueHandle pxQueue, portTickType xTicksToWait );

-portBASE_TYPE xQueueGenericReset( xQueueHandle pxQueue, portBASE_TYPE xNewQueue );

-

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* QUEUE_H */

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/semphr.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/semphr.h
deleted file mode 100644
index b523c72..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/semphr.h
+++ /dev/null
@@ -1,787 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#ifndef SEMAPHORE_H

-#define SEMAPHORE_H

-

-#ifndef INC_FREERTOS_H

-	#error "include FreeRTOS.h" must appear in source files before "include semphr.h"

-#endif

-

-#include "queue.h"

-

-typedef xQueueHandle xSemaphoreHandle;

-

-#define semBINARY_SEMAPHORE_QUEUE_LENGTH	( ( unsigned char ) 1U )

-#define semSEMAPHORE_QUEUE_ITEM_LENGTH		( ( unsigned char ) 0U )

-#define semGIVE_BLOCK_TIME					( ( portTickType ) 0U )

-

-

-/**

- * semphr. h

- * <pre>vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore )</pre>

- *

- * <i>Macro</i> that implements a semaphore by using the existing queue mechanism.

- * The queue length is 1 as this is a binary semaphore.  The data size is 0

- * as we don't want to actually store any data - we just want to know if the

- * queue is empty or full.

- *

- * This type of semaphore can be used for pure synchronisation between tasks or

- * between an interrupt and a task.  The semaphore need not be given back once

- * obtained, so one task/interrupt can continuously 'give' the semaphore while

- * another continuously 'takes' the semaphore.  For this reason this type of

- * semaphore does not use a priority inheritance mechanism.  For an alternative

- * that does use priority inheritance see xSemaphoreCreateMutex().

- *

- * @param xSemaphore Handle to the created semaphore.  Should be of type xSemaphoreHandle.

- *

- * Example usage:

- <pre>

- xSemaphoreHandle xSemaphore;

-

- void vATask( void * pvParameters )

- {

-    // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().

-    // This is a macro so pass the variable in directly.

-    vSemaphoreCreateBinary( xSemaphore );

-

-    if( xSemaphore != NULL )

-    {

-        // The semaphore was created successfully.

-        // The semaphore can now be used.  

-    }

- }

- </pre>

- * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary

- * \ingroup Semaphores

- */

-#define vSemaphoreCreateBinary( xSemaphore )																									\

-	{																																			\

-		( xSemaphore ) = xQueueGenericCreate( ( unsigned portBASE_TYPE ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE );	\

-		if( ( xSemaphore ) != NULL )																											\

-		{																																		\

-			xSemaphoreGive( ( xSemaphore ) );																									\

-		}																																		\

-	}

-

-/**

- * semphr. h

- * <pre>xSemaphoreTake( 

- *                   xSemaphoreHandle xSemaphore, 

- *                   portTickType xBlockTime 

- *               )</pre>

- *

- * <i>Macro</i> to obtain a semaphore.  The semaphore must have previously been

- * created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or

- * xSemaphoreCreateCounting().

- *

- * @param xSemaphore A handle to the semaphore being taken - obtained when

- * the semaphore was created.

- *

- * @param xBlockTime The time in ticks to wait for the semaphore to become

- * available.  The macro portTICK_RATE_MS can be used to convert this to a

- * real time.  A block time of zero can be used to poll the semaphore.  A block

- * time of portMAX_DELAY can be used to block indefinitely (provided

- * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h).

- *

- * @return pdTRUE if the semaphore was obtained.  pdFALSE

- * if xBlockTime expired without the semaphore becoming available.

- *

- * Example usage:

- <pre>

- xSemaphoreHandle xSemaphore = NULL;

-

- // A task that creates a semaphore.

- void vATask( void * pvParameters )

- {

-    // Create the semaphore to guard a shared resource.

-    vSemaphoreCreateBinary( xSemaphore );

- }

-

- // A task that uses the semaphore.

- void vAnotherTask( void * pvParameters )

- {

-    // ... Do other things.

-

-    if( xSemaphore != NULL )

-    {

-        // See if we can obtain the semaphore.  If the semaphore is not available

-        // wait 10 ticks to see if it becomes free.	

-        if( xSemaphoreTake( xSemaphore, ( portTickType ) 10 ) == pdTRUE )

-        {

-            // We were able to obtain the semaphore and can now access the

-            // shared resource.

-

-            // ...

-

-            // We have finished accessing the shared resource.  Release the 

-            // semaphore.

-            xSemaphoreGive( xSemaphore );

-        }

-        else

-        {

-            // We could not obtain the semaphore and can therefore not access

-            // the shared resource safely.

-        }

-    }

- }

- </pre>

- * \defgroup xSemaphoreTake xSemaphoreTake

- * \ingroup Semaphores

- */

-#define xSemaphoreTake( xSemaphore, xBlockTime )		xQueueGenericReceive( ( xQueueHandle ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE )

-

-/**

- * semphr. h

- * xSemaphoreTakeRecursive( 

- *                          xSemaphoreHandle xMutex, 

- *                          portTickType xBlockTime 

- *                        )

- *

- * <i>Macro</i> to recursively obtain, or 'take', a mutex type semaphore.  

- * The mutex must have previously been created using a call to 

- * xSemaphoreCreateRecursiveMutex();

- * 

- * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this

- * macro to be available.

- * 

- * This macro must not be used on mutexes created using xSemaphoreCreateMutex().

- *

- * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex 

- * doesn't become available again until the owner has called 

- * xSemaphoreGiveRecursive() for each successful 'take' request.  For example, 

- * if a task successfully 'takes' the same mutex 5 times then the mutex will 

- * not be available to any other task until it has also  'given' the mutex back

- * exactly five times.

- *

- * @param xMutex A handle to the mutex being obtained.  This is the

- * handle returned by xSemaphoreCreateRecursiveMutex();

- *

- * @param xBlockTime The time in ticks to wait for the semaphore to become

- * available.  The macro portTICK_RATE_MS can be used to convert this to a

- * real time.  A block time of zero can be used to poll the semaphore.  If

- * the task already owns the semaphore then xSemaphoreTakeRecursive() will

- * return immediately no matter what the value of xBlockTime. 

- *

- * @return pdTRUE if the semaphore was obtained.  pdFALSE if xBlockTime

- * expired without the semaphore becoming available.

- *

- * Example usage:

- <pre>

- xSemaphoreHandle xMutex = NULL;

-

- // A task that creates a mutex.

- void vATask( void * pvParameters )

- {

-    // Create the mutex to guard a shared resource.

-    xMutex = xSemaphoreCreateRecursiveMutex();

- }

-

- // A task that uses the mutex.

- void vAnotherTask( void * pvParameters )

- {

-    // ... Do other things.

-

-    if( xMutex != NULL )

-    {

-        // See if we can obtain the mutex.  If the mutex is not available

-        // wait 10 ticks to see if it becomes free.	

-        if( xSemaphoreTakeRecursive( xSemaphore, ( portTickType ) 10 ) == pdTRUE )

-        {

-            // We were able to obtain the mutex and can now access the

-            // shared resource.

-

-            // ...

-            // For some reason due to the nature of the code further calls to 

-			// xSemaphoreTakeRecursive() are made on the same mutex.  In real

-			// code these would not be just sequential calls as this would make

-			// no sense.  Instead the calls are likely to be buried inside

-			// a more complex call structure.

-            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );

-            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );

-

-            // The mutex has now been 'taken' three times, so will not be 

-			// available to another task until it has also been given back

-			// three times.  Again it is unlikely that real code would have

-			// these calls sequentially, but instead buried in a more complex

-			// call structure.  This is just for illustrative purposes.

-            xSemaphoreGiveRecursive( xMutex );

-			xSemaphoreGiveRecursive( xMutex );

-			xSemaphoreGiveRecursive( xMutex );

-

-			// Now the mutex can be taken by other tasks.

-        }

-        else

-        {

-            // We could not obtain the mutex and can therefore not access

-            // the shared resource safely.

-        }

-    }

- }

- </pre>

- * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive

- * \ingroup Semaphores

- */

-#define xSemaphoreTakeRecursive( xMutex, xBlockTime )	xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) )

-

-

-/* 

- * xSemaphoreAltTake() is an alternative version of xSemaphoreTake().

- *

- * The source code that implements the alternative (Alt) API is much 

- * simpler	because it executes everything from within a critical section.  

- * This is	the approach taken by many other RTOSes, but FreeRTOS.org has the 

- * preferred fully featured API too.  The fully featured API has more 

- * complex	code that takes longer to execute, but makes much less use of 

- * critical sections.  Therefore the alternative API sacrifices interrupt 

- * responsiveness to gain execution speed, whereas the fully featured API

- * sacrifices execution speed to ensure better interrupt responsiveness.

- */

-#define xSemaphoreAltTake( xSemaphore, xBlockTime )		xQueueAltGenericReceive( ( xQueueHandle ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE )

-

-/**

- * semphr. h

- * <pre>xSemaphoreGive( xSemaphoreHandle xSemaphore )</pre>

- *

- * <i>Macro</i> to release a semaphore.  The semaphore must have previously been

- * created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or

- * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake().

- *

- * This macro must not be used from an ISR.  See xSemaphoreGiveFromISR () for

- * an alternative which can be used from an ISR.

- *

- * This macro must also not be used on semaphores created using 

- * xSemaphoreCreateRecursiveMutex().

- *

- * @param xSemaphore A handle to the semaphore being released.  This is the

- * handle returned when the semaphore was created.

- *

- * @return pdTRUE if the semaphore was released.  pdFALSE if an error occurred.

- * Semaphores are implemented using queues.  An error can occur if there is

- * no space on the queue to post a message - indicating that the 

- * semaphore was not first obtained correctly.

- *

- * Example usage:

- <pre>

- xSemaphoreHandle xSemaphore = NULL;

-

- void vATask( void * pvParameters )

- {

-    // Create the semaphore to guard a shared resource.

-    vSemaphoreCreateBinary( xSemaphore );

-

-    if( xSemaphore != NULL )

-    {

-        if( xSemaphoreGive( xSemaphore ) != pdTRUE )

-        {

-            // We would expect this call to fail because we cannot give

-            // a semaphore without first "taking" it!

-        }

-

-        // Obtain the semaphore - don't block if the semaphore is not

-        // immediately available.

-        if( xSemaphoreTake( xSemaphore, ( portTickType ) 0 ) )

-        {

-            // We now have the semaphore and can access the shared resource.

-

-            // ...

-

-            // We have finished accessing the shared resource so can free the

-            // semaphore.

-            if( xSemaphoreGive( xSemaphore ) != pdTRUE )

-            {

-                // We would not expect this call to fail because we must have

-                // obtained the semaphore to get here.

-            }

-        }

-    }

- }

- </pre>

- * \defgroup xSemaphoreGive xSemaphoreGive

- * \ingroup Semaphores

- */

-#define xSemaphoreGive( xSemaphore )		xQueueGenericSend( ( xQueueHandle ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )

-

-/**

- * semphr. h

- * <pre>xSemaphoreGiveRecursive( xSemaphoreHandle xMutex )</pre>

- *

- * <i>Macro</i> to recursively release, or 'give', a mutex type semaphore.

- * The mutex must have previously been created using a call to 

- * xSemaphoreCreateRecursiveMutex();

- * 

- * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this

- * macro to be available.

- *

- * This macro must not be used on mutexes created using xSemaphoreCreateMutex().

- * 

- * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex 

- * doesn't become available again until the owner has called 

- * xSemaphoreGiveRecursive() for each successful 'take' request.  For example, 

- * if a task successfully 'takes' the same mutex 5 times then the mutex will 

- * not be available to any other task until it has also  'given' the mutex back

- * exactly five times.

- *

- * @param xMutex A handle to the mutex being released, or 'given'.  This is the

- * handle returned by xSemaphoreCreateMutex();

- *

- * @return pdTRUE if the semaphore was given.

- *

- * Example usage:

- <pre>

- xSemaphoreHandle xMutex = NULL;

-

- // A task that creates a mutex.

- void vATask( void * pvParameters )

- {

-    // Create the mutex to guard a shared resource.

-    xMutex = xSemaphoreCreateRecursiveMutex();

- }

-

- // A task that uses the mutex.

- void vAnotherTask( void * pvParameters )

- {

-    // ... Do other things.

-

-    if( xMutex != NULL )

-    {

-        // See if we can obtain the mutex.  If the mutex is not available

-        // wait 10 ticks to see if it becomes free.	

-        if( xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ) == pdTRUE )

-        {

-            // We were able to obtain the mutex and can now access the

-            // shared resource.

-

-            // ...

-            // For some reason due to the nature of the code further calls to 

-			// xSemaphoreTakeRecursive() are made on the same mutex.  In real

-			// code these would not be just sequential calls as this would make

-			// no sense.  Instead the calls are likely to be buried inside

-			// a more complex call structure.

-            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );

-            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );

-

-            // The mutex has now been 'taken' three times, so will not be 

-			// available to another task until it has also been given back

-			// three times.  Again it is unlikely that real code would have

-			// these calls sequentially, it would be more likely that the calls

-			// to xSemaphoreGiveRecursive() would be called as a call stack

-			// unwound.  This is just for demonstrative purposes.

-            xSemaphoreGiveRecursive( xMutex );

-			xSemaphoreGiveRecursive( xMutex );

-			xSemaphoreGiveRecursive( xMutex );

-

-			// Now the mutex can be taken by other tasks.

-        }

-        else

-        {

-            // We could not obtain the mutex and can therefore not access

-            // the shared resource safely.

-        }

-    }

- }

- </pre>

- * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive

- * \ingroup Semaphores

- */

-#define xSemaphoreGiveRecursive( xMutex )	xQueueGiveMutexRecursive( ( xMutex ) )

-

-/* 

- * xSemaphoreAltGive() is an alternative version of xSemaphoreGive().

- *

- * The source code that implements the alternative (Alt) API is much 

- * simpler	because it executes everything from within a critical section.  

- * This is	the approach taken by many other RTOSes, but FreeRTOS.org has the 

- * preferred fully featured API too.  The fully featured API has more 

- * complex	code that takes longer to execute, but makes much less use of 

- * critical sections.  Therefore the alternative API sacrifices interrupt 

- * responsiveness to gain execution speed, whereas the fully featured API

- * sacrifices execution speed to ensure better interrupt responsiveness.

- */

-#define xSemaphoreAltGive( xSemaphore )		xQueueAltGenericSend( ( xQueueHandle ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )

-

-/**

- * semphr. h

- * <pre>

- xSemaphoreGiveFromISR( 

-                          xSemaphoreHandle xSemaphore, 

-                          signed portBASE_TYPE *pxHigherPriorityTaskWoken

-                      )</pre>

- *

- * <i>Macro</i> to  release a semaphore.  The semaphore must have previously been

- * created with a call to vSemaphoreCreateBinary() or xSemaphoreCreateCounting().

- *

- * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex())

- * must not be used with this macro.

- *

- * This macro can be used from an ISR.

- *

- * @param xSemaphore A handle to the semaphore being released.  This is the

- * handle returned when the semaphore was created.

- *

- * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set

- * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task

- * to unblock, and the unblocked task has a priority higher than the currently

- * running task.  If xSemaphoreGiveFromISR() sets this value to pdTRUE then

- * a context switch should be requested before the interrupt is exited.

- *

- * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL.

- *

- * Example usage:

- <pre>

- \#define LONG_TIME 0xffff

- \#define TICKS_TO_WAIT	10

- xSemaphoreHandle xSemaphore = NULL;

-

- // Repetitive task.

- void vATask( void * pvParameters )

- {

-    for( ;; )

-    {

-        // We want this task to run every 10 ticks of a timer.  The semaphore 

-        // was created before this task was started.

-

-        // Block waiting for the semaphore to become available.

-        if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )

-        {

-            // It is time to execute.

-

-            // ...

-

-            // We have finished our task.  Return to the top of the loop where

-            // we will block on the semaphore until it is time to execute 

-            // again.  Note when using the semaphore for synchronisation with an

-			// ISR in this manner there is no need to 'give' the semaphore back.

-        }

-    }

- }

-

- // Timer ISR

- void vTimerISR( void * pvParameters )

- {

- static unsigned char ucLocalTickCount = 0;

- static signed portBASE_TYPE xHigherPriorityTaskWoken;

-

-    // A timer tick has occurred.

-

-    // ... Do other time functions.

-

-    // Is it time for vATask () to run?

-	xHigherPriorityTaskWoken = pdFALSE;

-    ucLocalTickCount++;

-    if( ucLocalTickCount >= TICKS_TO_WAIT )

-    {

-        // Unblock the task by releasing the semaphore.

-        xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );

-

-        // Reset the count so we release the semaphore again in 10 ticks time.

-        ucLocalTickCount = 0;

-    }

-

-    if( xHigherPriorityTaskWoken != pdFALSE )

-    {

-        // We can force a context switch here.  Context switching from an

-        // ISR uses port specific syntax.  Check the demo task for your port

-        // to find the syntax required.

-    }

- }

- </pre>

- * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR

- * \ingroup Semaphores

- */

-#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken )			xQueueGenericSendFromISR( ( xQueueHandle ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )

-

-/**

- * semphr. h

- * <pre>

- xSemaphoreTakeFromISR( 

-                          xSemaphoreHandle xSemaphore, 

-                          signed portBASE_TYPE *pxHigherPriorityTaskWoken

-                      )</pre>

- *

- * <i>Macro</i> to  take a semaphore from an ISR.  The semaphore must have 

- * previously been created with a call to vSemaphoreCreateBinary() or 

- * xSemaphoreCreateCounting().

- *

- * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex())

- * must not be used with this macro.

- *

- * This macro can be used from an ISR, however taking a semaphore from an ISR

- * is not a common operation.  It is likely to only be useful when taking a

- * counting semaphore when an interrupt is obtaining an object from a resource

- * pool (when the semaphore count indicates the number of resources available).

- *

- * @param xSemaphore A handle to the semaphore being taken.  This is the

- * handle returned when the semaphore was created.

- *

- * @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set

- * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task

- * to unblock, and the unblocked task has a priority higher than the currently

- * running task.  If xSemaphoreTakeFromISR() sets this value to pdTRUE then

- * a context switch should be requested before the interrupt is exited.

- *

- * @return pdTRUE if the semaphore was successfully taken, otherwise 

- * pdFALSE

- */

-#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken )			xQueueReceiveFromISR( ( xQueueHandle ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) )

-

-/**

- * semphr. h

- * <pre>xSemaphoreHandle xSemaphoreCreateMutex( void )</pre>

- *

- * <i>Macro</i> that implements a mutex semaphore by using the existing queue 

- * mechanism.

- *

- * Mutexes created using this macro can be accessed using the xSemaphoreTake()

- * and xSemaphoreGive() macros.  The xSemaphoreTakeRecursive() and 

- * xSemaphoreGiveRecursive() macros should not be used.

- * 

- * This type of semaphore uses a priority inheritance mechanism so a task 

- * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the 

- * semaphore it is no longer required.  

- *

- * Mutex type semaphores cannot be used from within interrupt service routines.  

- *

- * See vSemaphoreCreateBinary() for an alternative implementation that can be 

- * used for pure synchronisation (where one task or interrupt always 'gives' the 

- * semaphore and another always 'takes' the semaphore) and from within interrupt 

- * service routines.

- *

- * @return xSemaphore Handle to the created mutex semaphore.  Should be of type 

- *		xSemaphoreHandle.

- *

- * Example usage:

- <pre>

- xSemaphoreHandle xSemaphore;

-

- void vATask( void * pvParameters )

- {

-    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().

-    // This is a macro so pass the variable in directly.

-    xSemaphore = xSemaphoreCreateMutex();

-

-    if( xSemaphore != NULL )

-    {

-        // The semaphore was created successfully.

-        // The semaphore can now be used.  

-    }

- }

- </pre>

- * \defgroup vSemaphoreCreateMutex vSemaphoreCreateMutex

- * \ingroup Semaphores

- */

-#define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX )

-

-

-/**

- * semphr. h

- * <pre>xSemaphoreHandle xSemaphoreCreateRecursiveMutex( void )</pre>

- *

- * <i>Macro</i> that implements a recursive mutex by using the existing queue 

- * mechanism.

- *

- * Mutexes created using this macro can be accessed using the 

- * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros.  The 

- * xSemaphoreTake() and xSemaphoreGive() macros should not be used.

- *

- * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex 

- * doesn't become available again until the owner has called 

- * xSemaphoreGiveRecursive() for each successful 'take' request.  For example, 

- * if a task successfully 'takes' the same mutex 5 times then the mutex will 

- * not be available to any other task until it has also  'given' the mutex back

- * exactly five times.

- * 

- * This type of semaphore uses a priority inheritance mechanism so a task 

- * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the 

- * semaphore it is no longer required.  

- *

- * Mutex type semaphores cannot be used from within interrupt service routines.  

- *

- * See vSemaphoreCreateBinary() for an alternative implementation that can be 

- * used for pure synchronisation (where one task or interrupt always 'gives' the 

- * semaphore and another always 'takes' the semaphore) and from within interrupt 

- * service routines.

- *

- * @return xSemaphore Handle to the created mutex semaphore.  Should be of type 

- *		xSemaphoreHandle.

- *

- * Example usage:

- <pre>

- xSemaphoreHandle xSemaphore;

-

- void vATask( void * pvParameters )

- {

-    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().

-    // This is a macro so pass the variable in directly.

-    xSemaphore = xSemaphoreCreateRecursiveMutex();

-

-    if( xSemaphore != NULL )

-    {

-        // The semaphore was created successfully.

-        // The semaphore can now be used.  

-    }

- }

- </pre>

- * \defgroup vSemaphoreCreateMutex vSemaphoreCreateMutex

- * \ingroup Semaphores

- */

-#define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX )

-

-/**

- * semphr. h

- * <pre>xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount )</pre>

- *

- * <i>Macro</i> that creates a counting semaphore by using the existing 

- * queue mechanism.  

- *

- * Counting semaphores are typically used for two things:

- *

- * 1) Counting events.  

- *

- *    In this usage scenario an event handler will 'give' a semaphore each time

- *    an event occurs (incrementing the semaphore count value), and a handler 

- *    task will 'take' a semaphore each time it processes an event 

- *    (decrementing the semaphore count value).  The count value is therefore 

- *    the difference between the number of events that have occurred and the 

- *    number that have been processed.  In this case it is desirable for the 

- *    initial count value to be zero.

- *

- * 2) Resource management.

- *

- *    In this usage scenario the count value indicates the number of resources

- *    available.  To obtain control of a resource a task must first obtain a 

- *    semaphore - decrementing the semaphore count value.  When the count value

- *    reaches zero there are no free resources.  When a task finishes with the

- *    resource it 'gives' the semaphore back - incrementing the semaphore count

- *    value.  In this case it is desirable for the initial count value to be

- *    equal to the maximum count value, indicating that all resources are free.

- *

- * @param uxMaxCount The maximum count value that can be reached.  When the 

- *        semaphore reaches this value it can no longer be 'given'.

- *

- * @param uxInitialCount The count value assigned to the semaphore when it is

- *        created.

- *

- * @return Handle to the created semaphore.  Null if the semaphore could not be

- *         created.

- * 

- * Example usage:

- <pre>

- xSemaphoreHandle xSemaphore;

-

- void vATask( void * pvParameters )

- {

- xSemaphoreHandle xSemaphore = NULL;

-

-    // Semaphore cannot be used before a call to xSemaphoreCreateCounting().

-    // The max value to which the semaphore can count should be 10, and the

-    // initial value assigned to the count should be 0.

-    xSemaphore = xSemaphoreCreateCounting( 10, 0 );

-

-    if( xSemaphore != NULL )

-    {

-        // The semaphore was created successfully.

-        // The semaphore can now be used.  

-    }

- }

- </pre>

- * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting

- * \ingroup Semaphores

- */

-#define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) )

-

-/**

- * semphr. h

- * <pre>void vSemaphoreDelete( xSemaphoreHandle xSemaphore );</pre>

- *

- * Delete a semaphore.  This function must be used with care.  For example,

- * do not delete a mutex type semaphore if the mutex is held by a task.

- *

- * @param xSemaphore A handle to the semaphore to be deleted.

- *

- * \page vSemaphoreDelete vSemaphoreDelete

- * \ingroup Semaphores

- */

-#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( xQueueHandle ) ( xSemaphore ) )

-

-/**

- * semphr.h

- * <pre>xTaskHandle xSemaphoreGetMutexHolder( xSemaphoreHandle xMutex );</pre>

- *

- * If xMutex is indeed a mutex type semaphore, return the current mutex holder.

- * If xMutex is not a mutex type semaphore, or the mutex is available (not held

- * by a task), return NULL.

- *

- * Note: This Is is a good way of determining if the calling task is the mutex 

- * holder, but not a good way of determining the identity of the mutex holder as

- * the holder may change between the function exiting and the returned value

- * being tested.

- */

-#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) )

-

-#endif /* SEMAPHORE_H */

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/task.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/task.h
deleted file mode 100644
index 3f462ff..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/task.h
+++ /dev/null
@@ -1,1336 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-

-	

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-	 *    not run, what could be wrong?                                      *

-	 *                                                                       *

-	 *    http://www.FreeRTOS.org/FAQHelp.html                               *

-	 *                                                                       *

-    ***************************************************************************

-

-	

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-	

-	http://www.FreeRTOS.org/plus - Selection of FreeRTOS ecosystem products,

-	including FreeRTOS+Trace - an indispensable productivity tool.

-

-	Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-	the code with commercial support, indemnification, and middleware, under 

-	the OpenRTOS brand:  http://www.OpenRTOS.com.  High Integrity Systems also

-	provide a safety engineered and independently SIL3 certified version under 

-	the	SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-

-#ifndef TASK_H

-#define TASK_H

-

-#ifndef INC_FREERTOS_H

-	#error "include FreeRTOS.h must appear in source files before include task.h"

-#endif

-

-#include "portable.h"

-#include "list.h"

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/*-----------------------------------------------------------

- * MACROS AND DEFINITIONS

- *----------------------------------------------------------*/

-

-#define tskKERNEL_VERSION_NUMBER "V7.1.1"

-

-/**

- * task. h

- *

- * Type by which tasks are referenced.  For example, a call to xTaskCreate

- * returns (via a pointer parameter) an xTaskHandle variable that can then

- * be used as a parameter to vTaskDelete to delete the task.

- *

- * \page xTaskHandle xTaskHandle

- * \ingroup Tasks

- */

-typedef void * xTaskHandle;

-

-/*

- * Used internally only.

- */

-typedef struct xTIME_OUT

-{

-	portBASE_TYPE xOverflowCount;

-	portTickType  xTimeOnEntering;

-} xTimeOutType;

-

-/*

- * Defines the memory ranges allocated to the task when an MPU is used.

- */

-typedef struct xMEMORY_REGION

-{

-	void *pvBaseAddress;

-	unsigned long ulLengthInBytes;

-	unsigned long ulParameters;

-} xMemoryRegion;

-

-/*

- * Parameters required to create an MPU protected task.

- */

-typedef struct xTASK_PARAMTERS

-{

-	pdTASK_CODE pvTaskCode;

-	const signed char * const pcName;

-	unsigned short usStackDepth;

-	void *pvParameters;

-	unsigned portBASE_TYPE uxPriority;

-	portSTACK_TYPE *puxStackBuffer;

-	xMemoryRegion xRegions[ portNUM_CONFIGURABLE_REGIONS ];

-} xTaskParameters;

-

-/*

- * Defines the priority used by the idle task.  This must not be modified.

- *

- * \ingroup TaskUtils

- */

-#define tskIDLE_PRIORITY			( ( unsigned portBASE_TYPE ) 0U )

-

-/**

- * task. h

- *

- * Macro for forcing a context switch.

- *

- * \page taskYIELD taskYIELD

- * \ingroup SchedulerControl

- */

-#define taskYIELD()					portYIELD()

-

-/**

- * task. h

- *

- * Macro to mark the start of a critical code region.  Preemptive context

- * switches cannot occur when in a critical region.

- *

- * NOTE: This may alter the stack (depending on the portable implementation)

- * so must be used with care!

- *

- * \page taskENTER_CRITICAL taskENTER_CRITICAL

- * \ingroup SchedulerControl

- */

-#define taskENTER_CRITICAL()		portENTER_CRITICAL()

-

-/**

- * task. h

- *

- * Macro to mark the end of a critical code region.  Preemptive context

- * switches cannot occur when in a critical region.

- *

- * NOTE: This may alter the stack (depending on the portable implementation)

- * so must be used with care!

- *

- * \page taskEXIT_CRITICAL taskEXIT_CRITICAL

- * \ingroup SchedulerControl

- */

-#define taskEXIT_CRITICAL()			portEXIT_CRITICAL()

-

-/**

- * task. h

- *

- * Macro to disable all maskable interrupts.

- *

- * \page taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS

- * \ingroup SchedulerControl

- */

-#define taskDISABLE_INTERRUPTS()	portDISABLE_INTERRUPTS()

-

-/**

- * task. h

- *

- * Macro to enable microcontroller interrupts.

- *

- * \page taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS

- * \ingroup SchedulerControl

- */

-#define taskENABLE_INTERRUPTS()		portENABLE_INTERRUPTS()

-

-/* Definitions returned by xTaskGetSchedulerState(). */

-#define taskSCHEDULER_NOT_STARTED	0

-#define taskSCHEDULER_RUNNING		1

-#define taskSCHEDULER_SUSPENDED		2

-

-/*-----------------------------------------------------------

- * TASK CREATION API

- *----------------------------------------------------------*/

-

-/**

- * task. h

- *<pre>

- portBASE_TYPE xTaskCreate(

-							  pdTASK_CODE pvTaskCode,

-							  const char * const pcName,

-							  unsigned short usStackDepth,

-							  void *pvParameters,

-							  unsigned portBASE_TYPE uxPriority,

-							  xTaskHandle *pvCreatedTask

-						  );</pre>

- *

- * Create a new task and add it to the list of tasks that are ready to run.

- *

- * xTaskCreate() can only be used to create a task that has unrestricted

- * access to the entire microcontroller memory map.  Systems that include MPU

- * support can alternatively create an MPU constrained task using

- * xTaskCreateRestricted().

- *

- * @param pvTaskCode Pointer to the task entry function.  Tasks

- * must be implemented to never return (i.e. continuous loop).

- *

- * @param pcName A descriptive name for the task.  This is mainly used to

- * facilitate debugging.  Max length defined by tskMAX_TASK_NAME_LEN - default

- * is 16.

- *

- * @param usStackDepth The size of the task stack specified as the number of

- * variables the stack can hold - not the number of bytes.  For example, if

- * the stack is 16 bits wide and usStackDepth is defined as 100, 200 bytes

- * will be allocated for stack storage.

- *

- * @param pvParameters Pointer that will be used as the parameter for the task

- * being created.

- *

- * @param uxPriority The priority at which the task should run.  Systems that

- * include MPU support can optionally create tasks in a privileged (system)

- * mode by setting bit portPRIVILEGE_BIT of the priority parameter.  For

- * example, to create a privileged task at priority 2 the uxPriority parameter

- * should be set to ( 2 | portPRIVILEGE_BIT ).

- *

- * @param pvCreatedTask Used to pass back a handle by which the created task

- * can be referenced.

- *

- * @return pdPASS if the task was successfully created and added to a ready

- * list, otherwise an error code defined in the file errors. h

- *

- * Example usage:

-   <pre>

- // Task to be created.

- void vTaskCode( void * pvParameters )

- {

-	 for( ;; )

-	 {

-		 // Task code goes here.

-	 }

- }

-

- // Function that creates a task.

- void vOtherFunction( void )

- {

- static unsigned char ucParameterToPass;

- xTaskHandle xHandle;

-

-	 // Create the task, storing the handle.  Note that the passed parameter ucParameterToPass

-	 // must exist for the lifetime of the task, so in this case is declared static.  If it was just an

-	 // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time

-	 // the new task attempts to access it.

-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );

-

-	 // Use the handle to delete the task.

-	 vTaskDelete( xHandle );

- }

-   </pre>

- * \defgroup xTaskCreate xTaskCreate

- * \ingroup Tasks

- */

-#define xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ) xTaskGenericCreate( ( pvTaskCode ), ( pcName ), ( usStackDepth ), ( pvParameters ), ( uxPriority ), ( pxCreatedTask ), ( NULL ), ( NULL ) )

-

-/**

- * task. h

- *<pre>

- portBASE_TYPE xTaskCreateRestricted( xTaskParameters *pxTaskDefinition, xTaskHandle *pxCreatedTask );</pre>

- *

- * xTaskCreateRestricted() should only be used in systems that include an MPU

- * implementation.

- *

- * Create a new task and add it to the list of tasks that are ready to run.

- * The function parameters define the memory regions and associated access

- * permissions allocated to the task.

- *

- * @param pxTaskDefinition Pointer to a structure that contains a member

- * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API

- * documentation) plus an optional stack buffer and the memory region

- * definitions.

- *

- * @param pxCreatedTask Used to pass back a handle by which the created task

- * can be referenced.

- *

- * @return pdPASS if the task was successfully created and added to a ready

- * list, otherwise an error code defined in the file errors. h

- *

- * Example usage:

-   <pre>

-// Create an xTaskParameters structure that defines the task to be created.

-static const xTaskParameters xCheckTaskParameters =

-{

-	vATask,		// pvTaskCode - the function that implements the task.

-	"ATask",	// pcName - just a text name for the task to assist debugging.

-	100,		// usStackDepth	- the stack size DEFINED IN WORDS.

-	NULL,		// pvParameters - passed into the task function as the function parameters.

-	( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state.

-	cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack.

-

-	// xRegions - Allocate up to three separate memory regions for access by

-	// the task, with appropriate access permissions.  Different processors have

-	// different memory alignment requirements - refer to the FreeRTOS documentation

-	// for full information.

-	{											

-		// Base address					Length	Parameters

-        { cReadWriteArray,				32,		portMPU_REGION_READ_WRITE },

-        { cReadOnlyArray,				32,		portMPU_REGION_READ_ONLY },

-        { cPrivilegedOnlyAccessArray,	128,	portMPU_REGION_PRIVILEGED_READ_WRITE }

-	}

-};

-

-int main( void )

-{

-xTaskHandle xHandle;

-

-	// Create a task from the const structure defined above.  The task handle

-	// is requested (the second parameter is not NULL) but in this case just for

-	// demonstration purposes as its not actually used.

-	xTaskCreateRestricted( &xRegTest1Parameters, &xHandle );

-

-	// Start the scheduler.

-	vTaskStartScheduler();

-

-	// Will only get here if there was insufficient memory to create the idle

-	// task.

-	for( ;; );

-}

-   </pre>

- * \defgroup xTaskCreateRestricted xTaskCreateRestricted

- * \ingroup Tasks

- */

-#define xTaskCreateRestricted( x, pxCreatedTask ) xTaskGenericCreate( ((x)->pvTaskCode), ((x)->pcName), ((x)->usStackDepth), ((x)->pvParameters), ((x)->uxPriority), (pxCreatedTask), ((x)->puxStackBuffer), ((x)->xRegions) )

-

-/**

- * task. h

- *<pre>

- void vTaskAllocateMPURegions( xTaskHandle xTask, const xMemoryRegion * const pxRegions );</pre>

- *

- * Memory regions are assigned to a restricted task when the task is created by

- * a call to xTaskCreateRestricted().  These regions can be redefined using

- * vTaskAllocateMPURegions().

- *

- * @param xTask The handle of the task being updated.

- *

- * @param xRegions A pointer to an xMemoryRegion structure that contains the

- * new memory region definitions.

- *

- * Example usage:

-   <pre>

-// Define an array of xMemoryRegion structures that configures an MPU region

-// allowing read/write access for 1024 bytes starting at the beginning of the

-// ucOneKByte array.  The other two of the maximum 3 definable regions are

-// unused so set to zero.

-static const xMemoryRegion xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] =

-{											

-	// Base address		Length		Parameters

-	{ ucOneKByte,		1024,		portMPU_REGION_READ_WRITE },

-	{ 0,				0,			0 },

-	{ 0,				0,			0 }

-};

-

-void vATask( void *pvParameters )

-{

-	// This task was created such that it has access to certain regions of

-	// memory as defined by the MPU configuration.  At some point it is

-	// desired that these MPU regions are replaced with that defined in the

-	// xAltRegions const struct above.  Use a call to vTaskAllocateMPURegions()

-	// for this purpose.  NULL is used as the task handle to indicate that this

-	// function should modify the MPU regions of the calling task.

-	vTaskAllocateMPURegions( NULL, xAltRegions );

-	

-	// Now the task can continue its function, but from this point on can only

-	// access its stack and the ucOneKByte array (unless any other statically

-	// defined or shared regions have been declared elsewhere).

-}

-   </pre>

- * \defgroup xTaskCreateRestricted xTaskCreateRestricted

- * \ingroup Tasks

- */

-void vTaskAllocateMPURegions( xTaskHandle xTask, const xMemoryRegion * const pxRegions ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <pre>void vTaskDelete( xTaskHandle pxTask );</pre>

- *

- * INCLUDE_vTaskDelete must be defined as 1 for this function to be available.

- * See the configuration section for more information.

- *

- * Remove a task from the RTOS real time kernels management.  The task being

- * deleted will be removed from all ready, blocked, suspended and event lists.

- *

- * NOTE:  The idle task is responsible for freeing the kernel allocated

- * memory from tasks that have been deleted.  It is therefore important that

- * the idle task is not starved of microcontroller processing time if your

- * application makes any calls to vTaskDelete ().  Memory allocated by the

- * task code is not automatically freed, and should be freed before the task

- * is deleted.

- *

- * See the demo application file death.c for sample code that utilises

- * vTaskDelete ().

- *

- * @param pxTask The handle of the task to be deleted.  Passing NULL will

- * cause the calling task to be deleted.

- *

- * Example usage:

-   <pre>

- void vOtherFunction( void )

- {

- xTaskHandle xHandle;

-

-	 // Create the task, storing the handle.

-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

-

-	 // Use the handle to delete the task.

-	 vTaskDelete( xHandle );

- }

-   </pre>

- * \defgroup vTaskDelete vTaskDelete

- * \ingroup Tasks

- */

-void vTaskDelete( xTaskHandle pxTaskToDelete ) PRIVILEGED_FUNCTION;

-

-/*-----------------------------------------------------------

- * TASK CONTROL API

- *----------------------------------------------------------*/

-

-/**

- * task. h

- * <pre>void vTaskDelay( portTickType xTicksToDelay );</pre>

- *

- * Delay a task for a given number of ticks.  The actual time that the

- * task remains blocked depends on the tick rate.  The constant

- * portTICK_RATE_MS can be used to calculate real time from the tick

- * rate - with the resolution of one tick period.

- *

- * INCLUDE_vTaskDelay must be defined as 1 for this function to be available.

- * See the configuration section for more information.

- *

- *

- * vTaskDelay() specifies a time at which the task wishes to unblock relative to

- * the time at which vTaskDelay() is called.  For example, specifying a block

- * period of 100 ticks will cause the task to unblock 100 ticks after

- * vTaskDelay() is called.  vTaskDelay() does not therefore provide a good method

- * of controlling the frequency of a cyclical task as the path taken through the

- * code, as well as other task and interrupt activity, will effect the frequency

- * at which vTaskDelay() gets called and therefore the time at which the task

- * next executes.  See vTaskDelayUntil() for an alternative API function designed

- * to facilitate fixed frequency execution.  It does this by specifying an

- * absolute time (rather than a relative time) at which the calling task should

- * unblock.

- *

- * @param xTicksToDelay The amount of time, in tick periods, that

- * the calling task should block.

- *

- * Example usage:

-

- void vTaskFunction( void * pvParameters )

- {

- void vTaskFunction( void * pvParameters )

- {

- // Block for 500ms.

- const portTickType xDelay = 500 / portTICK_RATE_MS;

-

-	 for( ;; )

-	 {

-		 // Simply toggle the LED every 500ms, blocking between each toggle.

-		 vToggleLED();

-		 vTaskDelay( xDelay );

-	 }

- }

-

- * \defgroup vTaskDelay vTaskDelay

- * \ingroup TaskCtrl

- */

-void vTaskDelay( portTickType xTicksToDelay ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <pre>void vTaskDelayUntil( portTickType *pxPreviousWakeTime, portTickType xTimeIncrement );</pre>

- *

- * INCLUDE_vTaskDelayUntil must be defined as 1 for this function to be available.

- * See the configuration section for more information.

- *

- * Delay a task until a specified time.  This function can be used by cyclical

- * tasks to ensure a constant execution frequency.

- *

- * This function differs from vTaskDelay () in one important aspect:  vTaskDelay () will

- * cause a task to block for the specified number of ticks from the time vTaskDelay () is

- * called.  It is therefore difficult to use vTaskDelay () by itself to generate a fixed

- * execution frequency as the time between a task starting to execute and that task

- * calling vTaskDelay () may not be fixed [the task may take a different path though the

- * code between calls, or may get interrupted or preempted a different number of times

- * each time it executes].

- *

- * Whereas vTaskDelay () specifies a wake time relative to the time at which the function

- * is called, vTaskDelayUntil () specifies the absolute (exact) time at which it wishes to

- * unblock.

- *

- * The constant portTICK_RATE_MS can be used to calculate real time from the tick

- * rate - with the resolution of one tick period.

- *

- * @param pxPreviousWakeTime Pointer to a variable that holds the time at which the

- * task was last unblocked.  The variable must be initialised with the current time

- * prior to its first use (see the example below).  Following this the variable is

- * automatically updated within vTaskDelayUntil ().

- *

- * @param xTimeIncrement The cycle time period.  The task will be unblocked at

- * time *pxPreviousWakeTime + xTimeIncrement.  Calling vTaskDelayUntil with the

- * same xTimeIncrement parameter value will cause the task to execute with

- * a fixed interface period.

- *

- * Example usage:

-   <pre>

- // Perform an action every 10 ticks.

- void vTaskFunction( void * pvParameters )

- {

- portTickType xLastWakeTime;

- const portTickType xFrequency = 10;

-

-	 // Initialise the xLastWakeTime variable with the current time.

-	 xLastWakeTime = xTaskGetTickCount ();

-	 for( ;; )

-	 {

-		 // Wait for the next cycle.

-		 vTaskDelayUntil( &xLastWakeTime, xFrequency );

-

-		 // Perform action here.

-	 }

- }

-   </pre>

- * \defgroup vTaskDelayUntil vTaskDelayUntil

- * \ingroup TaskCtrl

- */

-void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <pre>unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );</pre>

- *

- * INCLUDE_xTaskPriorityGet must be defined as 1 for this function to be available.

- * See the configuration section for more information.

- *

- * Obtain the priority of any task.

- *

- * @param pxTask Handle of the task to be queried.  Passing a NULL

- * handle results in the priority of the calling task being returned.

- *

- * @return The priority of pxTask.

- *

- * Example usage:

-   <pre>

- void vAFunction( void )

- {

- xTaskHandle xHandle;

-

-	 // Create a task, storing the handle.

-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

-

-	 // ...

-

-	 // Use the handle to obtain the priority of the created task.

-	 // It was created with tskIDLE_PRIORITY, but may have changed

-	 // it itself.

-	 if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY )

-	 {

-		 // The task has changed it's priority.

-	 }

-

-	 // ...

-

-	 // Is our priority higher than the created task?

-	 if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) )

-	 {

-		 // Our priority (obtained using NULL handle) is higher.

-	 }

- }

-   </pre>

- * \defgroup uxTaskPriorityGet uxTaskPriorityGet

- * \ingroup TaskCtrl

- */

-unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <pre>void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority );</pre>

- *

- * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available.

- * See the configuration section for more information.

- *

- * Set the priority of any task.

- *

- * A context switch will occur before the function returns if the priority

- * being set is higher than the currently executing task.

- *

- * @param pxTask Handle to the task for which the priority is being set.

- * Passing a NULL handle results in the priority of the calling task being set.

- *

- * @param uxNewPriority The priority to which the task will be set.

- *

- * Example usage:

-   <pre>

- void vAFunction( void )

- {

- xTaskHandle xHandle;

-

-	 // Create a task, storing the handle.

-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

-

-	 // ...

-

-	 // Use the handle to raise the priority of the created task.

-	 vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 );

-

-	 // ...

-

-	 // Use a NULL handle to raise our priority to the same value.

-	 vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 );

- }

-   </pre>

- * \defgroup vTaskPrioritySet vTaskPrioritySet

- * \ingroup TaskCtrl

- */

-void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <pre>void vTaskSuspend( xTaskHandle pxTaskToSuspend );</pre>

- *

- * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available.

- * See the configuration section for more information.

- *

- * Suspend any task.  When suspended a task will never get any microcontroller

- * processing time, no matter what its priority.

- *

- * Calls to vTaskSuspend are not accumulative -

- * i.e. calling vTaskSuspend () twice on the same task still only requires one

- * call to vTaskResume () to ready the suspended task.

- *

- * @param pxTaskToSuspend Handle to the task being suspended.  Passing a NULL

- * handle will cause the calling task to be suspended.

- *

- * Example usage:

-   <pre>

- void vAFunction( void )

- {

- xTaskHandle xHandle;

-

-	 // Create a task, storing the handle.

-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

-

-	 // ...

-

-	 // Use the handle to suspend the created task.

-	 vTaskSuspend( xHandle );

-

-	 // ...

-

-	 // The created task will not run during this period, unless

-	 // another task calls vTaskResume( xHandle ).

-

-	 //...

-

-

-	 // Suspend ourselves.

-	 vTaskSuspend( NULL );

-

-	 // We cannot get here unless another task calls vTaskResume

-	 // with our handle as the parameter.

- }

-   </pre>

- * \defgroup vTaskSuspend vTaskSuspend

- * \ingroup TaskCtrl

- */

-void vTaskSuspend( xTaskHandle pxTaskToSuspend ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <pre>void vTaskResume( xTaskHandle pxTaskToResume );</pre>

- *

- * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available.

- * See the configuration section for more information.

- *

- * Resumes a suspended task.

- *

- * A task that has been suspended by one of more calls to vTaskSuspend ()

- * will be made available for running again by a single call to

- * vTaskResume ().

- *

- * @param pxTaskToResume Handle to the task being readied.

- *

- * Example usage:

-   <pre>

- void vAFunction( void )

- {

- xTaskHandle xHandle;

-

-	 // Create a task, storing the handle.

-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

-

-	 // ...

-

-	 // Use the handle to suspend the created task.

-	 vTaskSuspend( xHandle );

-

-	 // ...

-

-	 // The created task will not run during this period, unless

-	 // another task calls vTaskResume( xHandle ).

-

-	 //...

-

-

-	 // Resume the suspended task ourselves.

-	 vTaskResume( xHandle );

-

-	 // The created task will once again get microcontroller processing

-	 // time in accordance with it priority within the system.

- }

-   </pre>

- * \defgroup vTaskResume vTaskResume

- * \ingroup TaskCtrl

- */

-void vTaskResume( xTaskHandle pxTaskToResume ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <pre>void xTaskResumeFromISR( xTaskHandle pxTaskToResume );</pre>

- *

- * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be

- * available.  See the configuration section for more information.

- *

- * An implementation of vTaskResume() that can be called from within an ISR.

- *

- * A task that has been suspended by one of more calls to vTaskSuspend ()

- * will be made available for running again by a single call to

- * xTaskResumeFromISR ().

- *

- * @param pxTaskToResume Handle to the task being readied.

- *

- * \defgroup vTaskResumeFromISR vTaskResumeFromISR

- * \ingroup TaskCtrl

- */

-portBASE_TYPE xTaskResumeFromISR( xTaskHandle pxTaskToResume ) PRIVILEGED_FUNCTION;

-

-/*-----------------------------------------------------------

- * SCHEDULER CONTROL

- *----------------------------------------------------------*/

-

-/**

- * task. h

- * <pre>void vTaskStartScheduler( void );</pre>

- *

- * Starts the real time kernel tick processing.  After calling the kernel

- * has control over which tasks are executed and when.  This function

- * does not return until an executing task calls vTaskEndScheduler ().

- *

- * At least one task should be created via a call to xTaskCreate ()

- * before calling vTaskStartScheduler ().  The idle task is created

- * automatically when the first application task is created.

- *

- * See the demo application file main.c for an example of creating

- * tasks and starting the kernel.

- *

- * Example usage:

-   <pre>

- void vAFunction( void )

- {

-	 // Create at least one task before starting the kernel.

-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );

-

-	 // Start the real time kernel with preemption.

-	 vTaskStartScheduler ();

-

-	 // Will not get here unless a task calls vTaskEndScheduler ()

- }

-   </pre>

- *

- * \defgroup vTaskStartScheduler vTaskStartScheduler

- * \ingroup SchedulerControl

- */

-void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <pre>void vTaskEndScheduler( void );</pre>

- *

- * Stops the real time kernel tick.  All created tasks will be automatically

- * deleted and multitasking (either preemptive or cooperative) will

- * stop.  Execution then resumes from the point where vTaskStartScheduler ()

- * was called, as if vTaskStartScheduler () had just returned.

- *

- * See the demo application file main. c in the demo/PC directory for an

- * example that uses vTaskEndScheduler ().

- *

- * vTaskEndScheduler () requires an exit function to be defined within the

- * portable layer (see vPortEndScheduler () in port. c for the PC port).  This

- * performs hardware specific operations such as stopping the kernel tick.

- *

- * vTaskEndScheduler () will cause all of the resources allocated by the

- * kernel to be freed - but will not free resources allocated by application

- * tasks.

- *

- * Example usage:

-   <pre>

- void vTaskCode( void * pvParameters )

- {

-	 for( ;; )

-	 {

-		 // Task code goes here.

-

-		 // At some point we want to end the real time kernel processing

-		 // so call ...

-		 vTaskEndScheduler ();

-	 }

- }

-

- void vAFunction( void )

- {

-	 // Create at least one task before starting the kernel.

-	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );

-

-	 // Start the real time kernel with preemption.

-	 vTaskStartScheduler ();

-

-	 // Will only get here when the vTaskCode () task has called

-	 // vTaskEndScheduler ().  When we get here we are back to single task

-	 // execution.

- }

-   </pre>

- *

- * \defgroup vTaskEndScheduler vTaskEndScheduler

- * \ingroup SchedulerControl

- */

-void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <pre>void vTaskSuspendAll( void );</pre>

- *

- * Suspends all real time kernel activity while keeping interrupts (including the

- * kernel tick) enabled.

- *

- * After calling vTaskSuspendAll () the calling task will continue to execute

- * without risk of being swapped out until a call to xTaskResumeAll () has been

- * made.

- *

- * API functions that have the potential to cause a context switch (for example,

- * vTaskDelayUntil(), xQueueSend(), etc.) must not be called while the scheduler

- * is suspended.

- *

- * Example usage:

-   <pre>

- void vTask1( void * pvParameters )

- {

-	 for( ;; )

-	 {

-		 // Task code goes here.

-

-		 // ...

-

-		 // At some point the task wants to perform a long operation during

-		 // which it does not want to get swapped out.  It cannot use

-		 // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the

-		 // operation may cause interrupts to be missed - including the

-		 // ticks.

-

-		 // Prevent the real time kernel swapping out the task.

-		 vTaskSuspendAll ();

-

-		 // Perform the operation here.  There is no need to use critical

-		 // sections as we have all the microcontroller processing time.

-		 // During this time interrupts will still operate and the kernel

-		 // tick count will be maintained.

-

-		 // ...

-

-		 // The operation is complete.  Restart the kernel.

-		 xTaskResumeAll ();

-	 }

- }

-   </pre>

- * \defgroup vTaskSuspendAll vTaskSuspendAll

- * \ingroup SchedulerControl

- */

-void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <pre>char xTaskResumeAll( void );</pre>

- *

- * Resumes real time kernel activity following a call to vTaskSuspendAll ().

- * After a call to vTaskSuspendAll () the kernel will take control of which

- * task is executing at any time.

- *

- * @return If resuming the scheduler caused a context switch then pdTRUE is

- *		  returned, otherwise pdFALSE is returned.

- *

- * Example usage:

-   <pre>

- void vTask1( void * pvParameters )

- {

-	 for( ;; )

-	 {

-		 // Task code goes here.

-

-		 // ...

-

-		 // At some point the task wants to perform a long operation during

-		 // which it does not want to get swapped out.  It cannot use

-		 // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the

-		 // operation may cause interrupts to be missed - including the

-		 // ticks.

-

-		 // Prevent the real time kernel swapping out the task.

-		 vTaskSuspendAll ();

-

-		 // Perform the operation here.  There is no need to use critical

-		 // sections as we have all the microcontroller processing time.

-		 // During this time interrupts will still operate and the real

-		 // time kernel tick count will be maintained.

-

-		 // ...

-

-		 // The operation is complete.  Restart the kernel.  We want to force

-		 // a context switch - but there is no point if resuming the scheduler

-		 // caused a context switch already.

-		 if( !xTaskResumeAll () )

-		 {

-			  taskYIELD ();

-		 }

-	 }

- }

-   </pre>

- * \defgroup xTaskResumeAll xTaskResumeAll

- * \ingroup SchedulerControl

- */

-signed portBASE_TYPE xTaskResumeAll( void ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <pre>signed portBASE_TYPE xTaskIsTaskSuspended( xTaskHandle xTask );</pre>

- *

- * Utility task that simply returns pdTRUE if the task referenced by xTask is

- * currently in the Suspended state, or pdFALSE if the task referenced by xTask

- * is in any other state.

- *

- */

-signed portBASE_TYPE xTaskIsTaskSuspended( xTaskHandle xTask ) PRIVILEGED_FUNCTION;

-

-/*-----------------------------------------------------------

- * TASK UTILITIES

- *----------------------------------------------------------*/

-

-/**

- * task. h

- * <PRE>portTickType xTaskGetTickCount( void );</PRE>

- *

- * @return The count of ticks since vTaskStartScheduler was called.

- *

- * \page xTaskGetTickCount xTaskGetTickCount

- * \ingroup TaskUtils

- */

-portTickType xTaskGetTickCount( void ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <PRE>portTickType xTaskGetTickCountFromISR( void );</PRE>

- *

- * @return The count of ticks since vTaskStartScheduler was called.

- *

- * This is a version of xTaskGetTickCount() that is safe to be called from an

- * ISR - provided that portTickType is the natural word size of the

- * microcontroller being used or interrupt nesting is either not supported or

- * not being used.

- *

- * \page xTaskGetTickCount xTaskGetTickCount

- * \ingroup TaskUtils

- */

-portTickType xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <PRE>unsigned short uxTaskGetNumberOfTasks( void );</PRE>

- *

- * @return The number of tasks that the real time kernel is currently managing.

- * This includes all ready, blocked and suspended tasks.  A task that

- * has been deleted but not yet freed by the idle task will also be

- * included in the count.

- *

- * \page uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks

- * \ingroup TaskUtils

- */

-unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <PRE>signed char *pcTaskGetTaskName( xTaskHandle xTaskToQuery );</PRE>

- *

- * @return The text (human readable) name of the task referenced by the handle

- * xTaskToQueury.  A task can query its own name by either passing in its own

- * handle, or by setting xTaskToQuery to NULL.  INCLUDE_pcTaskGetTaskName must be

- * set to 1 in FreeRTOSConfig.h for pcTaskGetTaskName() to be available.

- *

- * \page pcTaskGetTaskName pcTaskGetTaskName

- * \ingroup TaskUtils

- */

-signed char *pcTaskGetTaskName( xTaskHandle xTaskToQuery );

-

-/**

- * task. h

- * <PRE>void vTaskList( char *pcWriteBuffer );</PRE>

- *

- * configUSE_TRACE_FACILITY must be defined as 1 for this function to be

- * available.  See the configuration section for more information.

- *

- * NOTE: This function will disable interrupts for its duration.  It is

- * not intended for normal application runtime use but as a debug aid.

- *

- * Lists all the current tasks, along with their current state and stack

- * usage high water mark.

- *

- * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or

- * suspended ('S').

- *

- * @param pcWriteBuffer A buffer into which the above mentioned details

- * will be written, in ascii form.  This buffer is assumed to be large

- * enough to contain the generated report.  Approximately 40 bytes per

- * task should be sufficient.

- *

- * \page vTaskList vTaskList

- * \ingroup TaskUtils

- */

-void vTaskList( signed char *pcWriteBuffer ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <PRE>void vTaskGetRunTimeStats( char *pcWriteBuffer );</PRE>

- *

- * configGENERATE_RUN_TIME_STATS must be defined as 1 for this function

- * to be available.  The application must also then provide definitions

- * for portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and

- * portGET_RUN_TIME_COUNTER_VALUE to configure a peripheral timer/counter

- * and return the timers current count value respectively.  The counter

- * should be at least 10 times the frequency of the tick count.

- *

- * NOTE: This function will disable interrupts for its duration.  It is

- * not intended for normal application runtime use but as a debug aid.

- *

- * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total

- * accumulated execution time being stored for each task.  The resolution

- * of the accumulated time value depends on the frequency of the timer

- * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro.

- * Calling vTaskGetRunTimeStats() writes the total execution time of each

- * task into a buffer, both as an absolute count value and as a percentage

- * of the total system execution time.

- *

- * @param pcWriteBuffer A buffer into which the execution times will be

- * written, in ascii form.  This buffer is assumed to be large enough to

- * contain the generated report.  Approximately 40 bytes per task should

- * be sufficient.

- *

- * \page vTaskGetRunTimeStats vTaskGetRunTimeStats

- * \ingroup TaskUtils

- */

-void vTaskGetRunTimeStats( signed char *pcWriteBuffer ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <PRE>void vTaskStartTrace( char * pcBuffer, unsigned portBASE_TYPE uxBufferSize );</PRE>

- *

- * Starts a real time kernel activity trace.  The trace logs the identity of

- * which task is running when.

- *

- * The trace file is stored in binary format.  A separate DOS utility called

- * convtrce.exe is used to convert this into a tab delimited text file which

- * can be viewed and plotted in a spread sheet.

- *

- * @param pcBuffer The buffer into which the trace will be written.

- *

- * @param ulBufferSize The size of pcBuffer in bytes.  The trace will continue

- * until either the buffer in full, or ulTaskEndTrace () is called.

- *

- * \page vTaskStartTrace vTaskStartTrace

- * \ingroup TaskUtils

- */

-void vTaskStartTrace( signed char * pcBuffer, unsigned long ulBufferSize ) PRIVILEGED_FUNCTION;

-

-/**

- * task. h

- * <PRE>unsigned long ulTaskEndTrace( void );</PRE>

- *

- * Stops a kernel activity trace.  See vTaskStartTrace ().

- *

- * @return The number of bytes that have been written into the trace buffer.

- *

- * \page usTaskEndTrace usTaskEndTrace

- * \ingroup TaskUtils

- */

-unsigned long ulTaskEndTrace( void ) PRIVILEGED_FUNCTION;

-

-/**

- * task.h

- * <PRE>unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask );</PRE>

- *

- * INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for

- * this function to be available.

- *

- * Returns the high water mark of the stack associated with xTask.  That is,

- * the minimum free stack space there has been (in words, so on a 32 bit machine

- * a value of 1 means 4 bytes) since the task started.  The smaller the returned

- * number the closer the task has come to overflowing its stack.

- *

- * @param xTask Handle of the task associated with the stack to be checked.

- * Set xTask to NULL to check the stack of the calling task.

- *

- * @return The smallest amount of free stack space there has been (in bytes)

- * since the task referenced by xTask was created.

- */

-unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask ) PRIVILEGED_FUNCTION;

-

-/* When using trace macros it is sometimes necessary to include tasks.h before

-FreeRTOS.h.  When this is done pdTASK_HOOK_CODE will not yet have been defined,

-so the following two prototypes will cause a compilation error.  This can be

-fixed by simply guarding against the inclusion of these two prototypes unless

-they are explicitly required by the configUSE_APPLICATION_TASK_TAG configuration

-constant. */

-#ifdef configUSE_APPLICATION_TASK_TAG

-	#if configUSE_APPLICATION_TASK_TAG == 1

-		/**

-		 * task.h

-		 * <pre>void vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction );</pre>

-		 *

-		 * Sets pxHookFunction to be the task hook function used by the task xTask.

-		 * Passing xTask as NULL has the effect of setting the calling tasks hook

-		 * function.

-		 */

-		void vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction ) PRIVILEGED_FUNCTION;

-

-		/**

-		 * task.h

-		 * <pre>void xTaskGetApplicationTaskTag( xTaskHandle xTask );</pre>

-		 *

-		 * Returns the pxHookFunction value assigned to the task xTask.

-		 */

-		pdTASK_HOOK_CODE xTaskGetApplicationTaskTag( xTaskHandle xTask ) PRIVILEGED_FUNCTION;

-	#endif /* configUSE_APPLICATION_TASK_TAG ==1 */

-#endif /* ifdef configUSE_APPLICATION_TASK_TAG */

-

-/**

- * task.h

- * <pre>portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction );</pre>

- *

- * Calls the hook function associated with xTask.  Passing xTask as NULL has

- * the effect of calling the Running tasks (the calling task) hook function.

- *

- * pvParameter is passed to the hook function for the task to interpret as it

- * wants.

- */

-portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, void *pvParameter ) PRIVILEGED_FUNCTION;

-

-/**

- * xTaskGetIdleTaskHandle() is only available if 

- * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h.

- *

- * Simply returns the handle of the idle task.  It is not valid to call

- * xTaskGetIdleTaskHandle() before the scheduler has been started.

- */

-xTaskHandle xTaskGetIdleTaskHandle( void );

-

-/*-----------------------------------------------------------

- * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES

- *----------------------------------------------------------*/

-

-/*

- * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE.  IT IS ONLY

- * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS

- * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER.

- *

- * Called from the real time kernel tick (either preemptive or cooperative),

- * this increments the tick count and checks if any tasks that are blocked

- * for a finite period required removing from a blocked list and placing on

- * a ready list.

- */

-void vTaskIncrementTick( void ) PRIVILEGED_FUNCTION;

-

-/*

- * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE.  IT IS AN

- * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER.

- *

- * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED.

- *

- * Removes the calling task from the ready list and places it both

- * on the list of tasks waiting for a particular event, and the

- * list of delayed tasks.  The task will be removed from both lists

- * and replaced on the ready list should either the event occur (and

- * there be no higher priority tasks waiting on the same event) or

- * the delay period expires.

- *

- * @param pxEventList The list containing tasks that are blocked waiting

- * for the event to occur.

- *

- * @param xTicksToWait The maximum amount of time that the task should wait

- * for the event to occur.  This is specified in kernel ticks,the constant

- * portTICK_RATE_MS can be used to convert kernel ticks into a real time

- * period.

- */

-void vTaskPlaceOnEventList( const xList * const pxEventList, portTickType xTicksToWait ) PRIVILEGED_FUNCTION;

-

-/*

- * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE.  IT IS AN

- * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER.

- *

- * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED.

- *

- * This function performs nearly the same function as vTaskPlaceOnEventList().

- * The difference being that this function does not permit tasks to block

- * indefinitely, whereas vTaskPlaceOnEventList() does.

- *

- * @return pdTRUE if the task being removed has a higher priority than the task

- * making the call, otherwise pdFALSE.

- */

-void vTaskPlaceOnEventListRestricted( const xList * const pxEventList, portTickType xTicksToWait ) PRIVILEGED_FUNCTION;

-

-/*

- * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE.  IT IS AN

- * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER.

- *

- * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED.

- *

- * Removes a task from both the specified event list and the list of blocked

- * tasks, and places it on a ready queue.

- *

- * xTaskRemoveFromEventList () will be called if either an event occurs to

- * unblock a task, or the block timeout period expires.

- *

- * @return pdTRUE if the task being removed has a higher priority than the task

- * making the call, otherwise pdFALSE.

- */

-signed portBASE_TYPE xTaskRemoveFromEventList( const xList * const pxEventList ) PRIVILEGED_FUNCTION;

-

-/*

- * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE.  IT IS ONLY

- * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS

- * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER.

- *

- * Sets the pointer to the current TCB to the TCB of the highest priority task

- * that is ready to run.

- */

-void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION;

-

-/*

- * Return the handle of the calling task.

- */

-xTaskHandle xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION;

-

-/*

- * Capture the current time status for future reference.

- */

-void vTaskSetTimeOutState( xTimeOutType * const pxTimeOut ) PRIVILEGED_FUNCTION;

-

-/*

- * Compare the time status now with that previously captured to see if the

- * timeout has expired.

- */

-portBASE_TYPE xTaskCheckForTimeOut( xTimeOutType * const pxTimeOut, portTickType * const pxTicksToWait ) PRIVILEGED_FUNCTION;

-

-/*

- * Shortcut used by the queue implementation to prevent unnecessary call to

- * taskYIELD();

- */

-void vTaskMissedYield( void ) PRIVILEGED_FUNCTION;

-

-/*

- * Returns the scheduler state as taskSCHEDULER_RUNNING,

- * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED.

- */

-portBASE_TYPE xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION;

-

-/*

- * Raises the priority of the mutex holder to that of the calling task should

- * the mutex holder have a priority less than the calling task.

- */

-void vTaskPriorityInherit( xTaskHandle * const pxMutexHolder ) PRIVILEGED_FUNCTION;

-

-/*

- * Set the priority of a task back to its proper priority in the case that it

- * inherited a higher priority while it was holding a semaphore.

- */

-void vTaskPriorityDisinherit( xTaskHandle * const pxMutexHolder ) PRIVILEGED_FUNCTION;

-

-/*

- * Generic version of the task creation function which is in turn called by the

- * xTaskCreate() and xTaskCreateRestricted() macros.

- */

-signed portBASE_TYPE xTaskGenericCreate( pdTASK_CODE pxTaskCode, const signed char * const pcName, unsigned short usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask, portSTACK_TYPE *puxStackBuffer, const xMemoryRegion * const xRegions ) PRIVILEGED_FUNCTION;

-

-/*

- * Get the uxTCBNumber assigned to the task referenced by the xTask parameter.

- */

-unsigned portBASE_TYPE uxTaskGetTaskNumber( xTaskHandle xTask );

-

-/* 

- * Set the uxTCBNumber of the task referenced by the xTask parameter to

- * ucHandle.

- */

-void vTaskSetTaskNumber( xTaskHandle xTask, unsigned portBASE_TYPE uxHandle );

-

-

-#ifdef __cplusplus

-}

-#endif

-#endif /* TASK_H */

-

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/timers.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/timers.h
deleted file mode 100644
index fd0a3e8..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/include/timers.h
+++ /dev/null
@@ -1,952 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-

-#ifndef TIMERS_H

-#define TIMERS_H

-

-#ifndef INC_FREERTOS_H

-	#error "include FreeRTOS.h must appear in source files before include timers.h"

-#endif

-

-#include "portable.h"

-#include "list.h"

-#include "task.h"

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/* IDs for commands that can be sent/received on the timer queue.  These are to

-be used solely through the macros that make up the public software timer API,

-as defined below. */

-#define tmrCOMMAND_START					0

-#define tmrCOMMAND_STOP						1

-#define tmrCOMMAND_CHANGE_PERIOD			2

-#define tmrCOMMAND_DELETE					3

-

-/*-----------------------------------------------------------

- * MACROS AND DEFINITIONS

- *----------------------------------------------------------*/

-

- /**

- * Type by which software timers are referenced.  For example, a call to

- * xTimerCreate() returns an xTimerHandle variable that can then be used to

- * reference the subject timer in calls to other software timer API functions

- * (for example, xTimerStart(), xTimerReset(), etc.).

- */

-typedef void * xTimerHandle;

-

-/* Define the prototype to which timer callback functions must conform. */

-typedef void (*tmrTIMER_CALLBACK)( xTimerHandle xTimer );

-

-/**

- * xTimerHandle xTimerCreate( 	const signed char *pcTimerName,

- * 								portTickType xTimerPeriodInTicks,

- * 								unsigned portBASE_TYPE uxAutoReload,

- * 								void * pvTimerID,

- * 								tmrTIMER_CALLBACK pxCallbackFunction );

- *

- * Creates a new software timer instance.  This allocates the storage required

- * by the new timer, initialises the new timers internal state, and returns a

- * handle by which the new timer can be referenced.

- *

- * Timers are created in the dormant state.  The xTimerStart(), xTimerReset(),

- * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and

- * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the

- * active state.

- *

- * @param pcTimerName A text name that is assigned to the timer.  This is done

- * purely to assist debugging.  The kernel itself only ever references a timer by

- * its handle, and never by its name.

- *

- * @param xTimerPeriodInTicks The timer period.  The time is defined in tick periods so

- * the constant portTICK_RATE_MS can be used to convert a time that has been

- * specified in milliseconds.  For example, if the timer must expire after 100

- * ticks, then xTimerPeriodInTicks should be set to 100.  Alternatively, if the timer

- * must expire after 500ms, then xPeriod can be set to ( 500 / portTICK_RATE_MS )

- * provided configTICK_RATE_HZ is less than or equal to 1000.

- *

- * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will

- * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter.  If

- * uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and

- * enter the dormant state after it expires.

- *

- * @param pvTimerID An identifier that is assigned to the timer being created.

- * Typically this would be used in the timer callback function to identify which

- * timer expired when the same callback function is assigned to more than one

- * timer.

- *

- * @param pxCallbackFunction The function to call when the timer expires.

- * Callback functions must have the prototype defined by tmrTIMER_CALLBACK,

- * which is	"void vCallbackFunction( xTimerHandle xTimer );".

- *

- * @return If the timer is successfully create then a handle to the newly

- * created timer is returned.  If the timer cannot be created (because either

- * there is insufficient FreeRTOS heap remaining to allocate the timer

- * structures, or the timer period was set to 0) then 0 is returned.

- *

- * Example usage:

- *

- * #define NUM_TIMERS 5

- *

- * // An array to hold handles to the created timers.

- * xTimerHandle xTimers[ NUM_TIMERS ];

- *

- * // An array to hold a count of the number of times each timer expires.

- * long lExpireCounters[ NUM_TIMERS ] = { 0 };

- *

- * // Define a callback function that will be used by multiple timer instances.

- * // The callback function does nothing but count the number of times the

- * // associated timer expires, and stop the timer once the timer has expired

- * // 10 times.

- * void vTimerCallback( xTimerHandle pxTimer )

- * {

- * long lArrayIndex;

- * const long xMaxExpiryCountBeforeStopping = 10;

- *

- * 	   // Optionally do something if the pxTimer parameter is NULL.

- * 	   configASSERT( pxTimer );

- * 	

- *     // Which timer expired?

- *     lArrayIndex = ( long ) pvTimerGetTimerID( pxTimer );

- *

- *     // Increment the number of times that pxTimer has expired.

- *     lExpireCounters[ lArrayIndex ] += 1;

- *

- *     // If the timer has expired 10 times then stop it from running.

- *     if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping )

- *     {

- *         // Do not use a block time if calling a timer API function from a

- *         // timer callback function, as doing so could cause a deadlock!

- *         xTimerStop( pxTimer, 0 );

- *     }

- * }

- *

- * void main( void )

- * {

- * long x;

- *

- *     // Create then start some timers.  Starting the timers before the scheduler

- *     // has been started means the timers will start running immediately that

- *     // the scheduler starts.

- *     for( x = 0; x < NUM_TIMERS; x++ )

- *     {

- *         xTimers[ x ] = xTimerCreate(     "Timer",         // Just a text name, not used by the kernel.

- *                                         ( 100 * x ),     // The timer period in ticks.

- *                                         pdTRUE,         // The timers will auto-reload themselves when they expire.

- *                                         ( void * ) x,     // Assign each timer a unique id equal to its array index.

- *                                         vTimerCallback     // Each timer calls the same callback when it expires.

- *                                     );

- *

- *         if( xTimers[ x ] == NULL )

- *         {

- *             // The timer was not created.

- *         }

- *         else

- *         {

- *             // Start the timer.  No block time is specified, and even if one was

- *             // it would be ignored because the scheduler has not yet been

- *             // started.

- *             if( xTimerStart( xTimers[ x ], 0 ) != pdPASS )

- *             {

- *                 // The timer could not be set into the Active state.

- *             }

- *         }

- *     }

- *

- *     // ...

- *     // Create tasks here.

- *     // ...

- *

- *     // Starting the scheduler will start the timers running as they have already

- *     // been set into the active state.

- *     xTaskStartScheduler();

- *

- *     // Should not reach here.

- *     for( ;; );

- * }

- */

-xTimerHandle xTimerCreate( const signed char *pcTimerName, portTickType xTimerPeriodInTicks, unsigned portBASE_TYPE uxAutoReload, void * pvTimerID, tmrTIMER_CALLBACK pxCallbackFunction ) PRIVILEGED_FUNCTION;

-

-/**

- * void *pvTimerGetTimerID( xTimerHandle xTimer );

- *

- * Returns the ID assigned to the timer.

- *

- * IDs are assigned to timers using the pvTimerID parameter of the call to

- * xTimerCreated() that was used to create the timer.

- *

- * If the same callback function is assigned to multiple timers then the timer

- * ID can be used within the callback function to identify which timer actually

- * expired.

- *

- * @param xTimer The timer being queried.

- *

- * @return The ID assigned to the timer being queried.

- *

- * Example usage:

- *

- * See the xTimerCreate() API function example usage scenario.

- */

-void *pvTimerGetTimerID( xTimerHandle xTimer ) PRIVILEGED_FUNCTION;

-

-/**

- * portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer );

- *

- * Queries a timer to see if it is active or dormant.

- *

- * A timer will be dormant if:

- *     1) It has been created but not started, or

- *     2) It is an expired on-shot timer that has not been restarted.

- *

- * Timers are created in the dormant state.  The xTimerStart(), xTimerReset(),

- * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and

- * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the

- * active state.

- *

- * @param xTimer The timer being queried.

- *

- * @return pdFALSE will be returned if the timer is dormant.  A value other than

- * pdFALSE will be returned if the timer is active.

- *

- * Example usage:

- *

- * // This function assumes xTimer has already been created.

- * void vAFunction( xTimerHandle xTimer )

- * {

- *     if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )"

- *     {

- *         // xTimer is active, do something.

- *     }

- *     else

- *     {

- *         // xTimer is not active, do something else.

- *     }

- * }

- */

-portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer ) PRIVILEGED_FUNCTION;

-

-/**

- * xTimerGetTimerDaemonTaskHandle() is only available if 

- * INCLUDE_xTimerGetTimerDaemonTaskHandle is set to 1 in FreeRTOSConfig.h.

- *

- * Simply returns the handle of the timer service/daemon task.  It it not valid

- * to call xTimerGetTimerDaemonTaskHandle() before the scheduler has been started.

- */

-xTaskHandle xTimerGetTimerDaemonTaskHandle( void );

-

-/**

- * portBASE_TYPE xTimerStart( xTimerHandle xTimer, portTickType xBlockTime );

- *

- * Timer functionality is provided by a timer service/daemon task.  Many of the

- * public FreeRTOS timer API functions send commands to the timer service task

- * though a queue called the timer command queue.  The timer command queue is

- * private to the kernel itself and is not directly accessible to application

- * code.  The length of the timer command queue is set by the

- * configTIMER_QUEUE_LENGTH configuration constant.

- *

- * xTimerStart() starts a timer that was previously created using the

- * xTimerCreate() API function.  If the timer had already been started and was

- * already in the active state, then xTimerStart() has equivalent functionality

- * to the xTimerReset() API function.

- *

- * Starting a timer ensures the timer is in the active state.  If the timer

- * is not stopped, deleted, or reset in the mean time, the callback function

- * associated with the timer will get called 'n' ticks after xTimerStart() was

- * called, where 'n' is the timers defined period.

- *

- * It is valid to call xTimerStart() before the scheduler has been started, but

- * when this is done the timer will not actually start until the scheduler is

- * started, and the timers expiry time will be relative to when the scheduler is

- * started, not relative to when xTimerStart() was called.

- *

- * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStart()

- * to be available.

- *

- * @param xTimer The handle of the timer being started/restarted.

- *

- * @param xBlockTime Specifies the time, in ticks, that the calling task should

- * be held in the Blocked state to wait for the start command to be successfully

- * sent to the timer command queue, should the queue already be full when

- * xTimerStart() was called.  xBlockTime is ignored if xTimerStart() is called

- * before the scheduler is started.

- *

- * @return pdFAIL will be returned if the start command could not be sent to

- * the timer command queue even after xBlockTime ticks had passed.  pdPASS will

- * be returned if the command was successfully sent to the timer command queue.

- * When the command is actually processed will depend on the priority of the

- * timer service/daemon task relative to other tasks in the system, although the

- * timers expiry time is relative to when xTimerStart() is actually called.  The

- * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY

- * configuration constant.

- *

- * Example usage:

- *

- * See the xTimerCreate() API function example usage scenario.

- *

- */

-#define xTimerStart( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xBlockTime ) )

-

-/**

- * portBASE_TYPE xTimerStop( xTimerHandle xTimer, portTickType xBlockTime );

- *

- * Timer functionality is provided by a timer service/daemon task.  Many of the

- * public FreeRTOS timer API functions send commands to the timer service task

- * though a queue called the timer command queue.  The timer command queue is

- * private to the kernel itself and is not directly accessible to application

- * code.  The length of the timer command queue is set by the

- * configTIMER_QUEUE_LENGTH configuration constant.

- *

- * xTimerStop() stops a timer that was previously started using either of the

- * The xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(),

- * xTimerChangePeriod() or xTimerChangePeriodFromISR() API functions.

- *

- * Stopping a timer ensures the timer is not in the active state.

- *

- * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStop()

- * to be available.

- *

- * @param xTimer The handle of the timer being stopped.

- *

- * @param xBlockTime Specifies the time, in ticks, that the calling task should

- * be held in the Blocked state to wait for the stop command to be successfully

- * sent to the timer command queue, should the queue already be full when

- * xTimerStop() was called.  xBlockTime is ignored if xTimerStop() is called

- * before the scheduler is started.

- *

- * @return pdFAIL will be returned if the stop command could not be sent to

- * the timer command queue even after xBlockTime ticks had passed.  pdPASS will

- * be returned if the command was successfully sent to the timer command queue.

- * When the command is actually processed will depend on the priority of the

- * timer service/daemon task relative to other tasks in the system.  The timer

- * service/daemon task priority is set by the configTIMER_TASK_PRIORITY

- * configuration constant.

- *

- * Example usage:

- *

- * See the xTimerCreate() API function example usage scenario.

- *

- */

-#define xTimerStop( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xBlockTime ) )

-

-/**

- * portBASE_TYPE xTimerChangePeriod( 	xTimerHandle xTimer,

- *										portTickType xNewPeriod,

- *										portTickType xBlockTime );

- *

- * Timer functionality is provided by a timer service/daemon task.  Many of the

- * public FreeRTOS timer API functions send commands to the timer service task

- * though a queue called the timer command queue.  The timer command queue is

- * private to the kernel itself and is not directly accessible to application

- * code.  The length of the timer command queue is set by the

- * configTIMER_QUEUE_LENGTH configuration constant.

- *

- * xTimerChangePeriod() changes the period of a timer that was previously

- * created using the xTimerCreate() API function.

- *

- * xTimerChangePeriod() can be called to change the period of an active or

- * dormant state timer.

- *

- * The configUSE_TIMERS configuration constant must be set to 1 for

- * xTimerChangePeriod() to be available.

- *

- * @param xTimer The handle of the timer that is having its period changed.

- *

- * @param xNewPeriod The new period for xTimer. Timer periods are specified in

- * tick periods, so the constant portTICK_RATE_MS can be used to convert a time

- * that has been specified in milliseconds.  For example, if the timer must

- * expire after 100 ticks, then xNewPeriod should be set to 100.  Alternatively,

- * if the timer must expire after 500ms, then xNewPeriod can be set to

- * ( 500 / portTICK_RATE_MS ) provided configTICK_RATE_HZ is less than

- * or equal to 1000.

- *

- * @param xBlockTime Specifies the time, in ticks, that the calling task should

- * be held in the Blocked state to wait for the change period command to be

- * successfully sent to the timer command queue, should the queue already be

- * full when xTimerChangePeriod() was called.  xBlockTime is ignored if

- * xTimerChangePeriod() is called before the scheduler is started.

- *

- * @return pdFAIL will be returned if the change period command could not be

- * sent to the timer command queue even after xBlockTime ticks had passed.

- * pdPASS will be returned if the command was successfully sent to the timer

- * command queue.  When the command is actually processed will depend on the

- * priority of the timer service/daemon task relative to other tasks in the

- * system.  The timer service/daemon task priority is set by the

- * configTIMER_TASK_PRIORITY configuration constant.

- *

- * Example usage:

- *

- * // This function assumes xTimer has already been created.  If the timer

- * // referenced by xTimer is already active when it is called, then the timer

- * // is deleted.  If the timer referenced by xTimer is not active when it is

- * // called, then the period of the timer is set to 500ms and the timer is

- * // started.

- * void vAFunction( xTimerHandle xTimer )

- * {

- *     if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )"

- *     {

- *         // xTimer is already active - delete it.

- *         xTimerDelete( xTimer );

- *     }

- *     else

- *     {

- *         // xTimer is not active, change its period to 500ms.  This will also

- *         // cause the timer to start.  Block for a maximum of 100 ticks if the

- *         // change period command cannot immediately be sent to the timer

- *         // command queue.

- *         if( xTimerChangePeriod( xTimer, 500 / portTICK_RATE_MS, 100 ) == pdPASS )

- *         {

- *             // The command was successfully sent.

- *         }

- *         else

- *         {

- *             // The command could not be sent, even after waiting for 100 ticks

- *             // to pass.  Take appropriate action here.

- *         }

- *     }

- * }

- */

- #define xTimerChangePeriod( xTimer, xNewPeriod, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xBlockTime ) )

-

-/**

- * portBASE_TYPE xTimerDelete( xTimerHandle xTimer, portTickType xBlockTime );

- *

- * Timer functionality is provided by a timer service/daemon task.  Many of the

- * public FreeRTOS timer API functions send commands to the timer service task

- * though a queue called the timer command queue.  The timer command queue is

- * private to the kernel itself and is not directly accessible to application

- * code.  The length of the timer command queue is set by the

- * configTIMER_QUEUE_LENGTH configuration constant.

- *

- * xTimerDelete() deletes a timer that was previously created using the

- * xTimerCreate() API function.

- *

- * The configUSE_TIMERS configuration constant must be set to 1 for

- * xTimerDelete() to be available.

- *

- * @param xTimer The handle of the timer being deleted.

- *

- * @param xBlockTime Specifies the time, in ticks, that the calling task should

- * be held in the Blocked state to wait for the delete command to be

- * successfully sent to the timer command queue, should the queue already be

- * full when xTimerDelete() was called.  xBlockTime is ignored if xTimerDelete()

- * is called before the scheduler is started.

- *

- * @return pdFAIL will be returned if the delete command could not be sent to

- * the timer command queue even after xBlockTime ticks had passed.  pdPASS will

- * be returned if the command was successfully sent to the timer command queue.

- * When the command is actually processed will depend on the priority of the

- * timer service/daemon task relative to other tasks in the system.  The timer

- * service/daemon task priority is set by the configTIMER_TASK_PRIORITY

- * configuration constant.

- *

- * Example usage:

- *

- * See the xTimerChangePeriod() API function example usage scenario.

- */

-#define xTimerDelete( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xBlockTime ) )

-

-/**

- * portBASE_TYPE xTimerReset( xTimerHandle xTimer, portTickType xBlockTime );

- *

- * Timer functionality is provided by a timer service/daemon task.  Many of the

- * public FreeRTOS timer API functions send commands to the timer service task

- * though a queue called the timer command queue.  The timer command queue is

- * private to the kernel itself and is not directly accessible to application

- * code.  The length of the timer command queue is set by the

- * configTIMER_QUEUE_LENGTH configuration constant.

- *

- * xTimerReset() re-starts a timer that was previously created using the

- * xTimerCreate() API function.  If the timer had already been started and was

- * already in the active state, then xTimerReset() will cause the timer to

- * re-evaluate its expiry time so that it is relative to when xTimerReset() was

- * called.  If the timer was in the dormant state then xTimerReset() has

- * equivalent functionality to the xTimerStart() API function.

- *

- * Resetting a timer ensures the timer is in the active state.  If the timer

- * is not stopped, deleted, or reset in the mean time, the callback function

- * associated with the timer will get called 'n' ticks after xTimerReset() was

- * called, where 'n' is the timers defined period.

- *

- * It is valid to call xTimerReset() before the scheduler has been started, but

- * when this is done the timer will not actually start until the scheduler is

- * started, and the timers expiry time will be relative to when the scheduler is

- * started, not relative to when xTimerReset() was called.

- *

- * The configUSE_TIMERS configuration constant must be set to 1 for xTimerReset()

- * to be available.

- *

- * @param xTimer The handle of the timer being reset/started/restarted.

- *

- * @param xBlockTime Specifies the time, in ticks, that the calling task should

- * be held in the Blocked state to wait for the reset command to be successfully

- * sent to the timer command queue, should the queue already be full when

- * xTimerReset() was called.  xBlockTime is ignored if xTimerReset() is called

- * before the scheduler is started.

- *

- * @return pdFAIL will be returned if the reset command could not be sent to

- * the timer command queue even after xBlockTime ticks had passed.  pdPASS will

- * be returned if the command was successfully sent to the timer command queue.

- * When the command is actually processed will depend on the priority of the

- * timer service/daemon task relative to other tasks in the system, although the

- * timers expiry time is relative to when xTimerStart() is actually called.  The

- * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY

- * configuration constant.

- *

- * Example usage:

- *

- * // When a key is pressed, an LCD back-light is switched on.  If 5 seconds pass

- * // without a key being pressed, then the LCD back-light is switched off.  In

- * // this case, the timer is a one-shot timer.

- *

- * xTimerHandle xBacklightTimer = NULL;

- *

- * // The callback function assigned to the one-shot timer.  In this case the

- * // parameter is not used.

- * void vBacklightTimerCallback( xTimerHandle pxTimer )

- * {

- *     // The timer expired, therefore 5 seconds must have passed since a key

- *     // was pressed.  Switch off the LCD back-light.

- *     vSetBacklightState( BACKLIGHT_OFF );

- * }

- *

- * // The key press event handler.

- * void vKeyPressEventHandler( char cKey )

- * {

- *     // Ensure the LCD back-light is on, then reset the timer that is

- *     // responsible for turning the back-light off after 5 seconds of

- *     // key inactivity.  Wait 10 ticks for the command to be successfully sent

- *     // if it cannot be sent immediately.

- *     vSetBacklightState( BACKLIGHT_ON );

- *     if( xTimerReset( xBacklightTimer, 100 ) != pdPASS )

- *     {

- *         // The reset command was not executed successfully.  Take appropriate

- *         // action here.

- *     }

- *

- *     // Perform the rest of the key processing here.

- * }

- *

- * void main( void )

- * {

- * long x;

- *

- *     // Create then start the one-shot timer that is responsible for turning

- *     // the back-light off if no keys are pressed within a 5 second period.

- *     xBacklightTimer = xTimerCreate( "BacklightTimer",           // Just a text name, not used by the kernel.

- *                                     ( 5000 / portTICK_RATE_MS), // The timer period in ticks.

- *                                     pdFALSE,                    // The timer is a one-shot timer.

- *                                     0,                          // The id is not used by the callback so can take any value.

- *                                     vBacklightTimerCallback     // The callback function that switches the LCD back-light off.

- *                                   );

- *

- *     if( xBacklightTimer == NULL )

- *     {

- *         // The timer was not created.

- *     }

- *     else

- *     {

- *         // Start the timer.  No block time is specified, and even if one was

- *         // it would be ignored because the scheduler has not yet been

- *         // started.

- *         if( xTimerStart( xBacklightTimer, 0 ) != pdPASS )

- *         {

- *             // The timer could not be set into the Active state.

- *         }

- *     }

- *

- *     // ...

- *     // Create tasks here.

- *     // ...

- *

- *     // Starting the scheduler will start the timer running as it has already

- *     // been set into the active state.

- *     xTaskStartScheduler();

- *

- *     // Should not reach here.

- *     for( ;; );

- * }

- */

-#define xTimerReset( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xBlockTime ) )

-

-/**

- * portBASE_TYPE xTimerStartFromISR( 	xTimerHandle xTimer,

- *										portBASE_TYPE *pxHigherPriorityTaskWoken );

- *

- * A version of xTimerStart() that can be called from an interrupt service

- * routine.

- *

- * @param xTimer The handle of the timer being started/restarted.

- *

- * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most

- * of its time in the Blocked state, waiting for messages to arrive on the timer

- * command queue.  Calling xTimerStartFromISR() writes a message to the timer

- * command queue, so has the potential to transition the timer service/daemon

- * task out of the Blocked state.  If calling xTimerStartFromISR() causes the

- * timer service/daemon task to leave the Blocked state, and the timer service/

- * daemon task has a priority equal to or greater than the currently executing

- * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will

- * get set to pdTRUE internally within the xTimerStartFromISR() function.  If

- * xTimerStartFromISR() sets this value to pdTRUE then a context switch should

- * be performed before the interrupt exits.

- *

- * @return pdFAIL will be returned if the start command could not be sent to

- * the timer command queue.  pdPASS will be returned if the command was

- * successfully sent to the timer command queue.  When the command is actually

- * processed will depend on the priority of the timer service/daemon task

- * relative to other tasks in the system, although the timers expiry time is

- * relative to when xTimerStartFromISR() is actually called.  The timer service/daemon

- * task priority is set by the configTIMER_TASK_PRIORITY configuration constant.

- *

- * Example usage:

- *

- * // This scenario assumes xBacklightTimer has already been created.  When a

- * // key is pressed, an LCD back-light is switched on.  If 5 seconds pass

- * // without a key being pressed, then the LCD back-light is switched off.  In

- * // this case, the timer is a one-shot timer, and unlike the example given for

- * // the xTimerReset() function, the key press event handler is an interrupt

- * // service routine.

- *

- * // The callback function assigned to the one-shot timer.  In this case the

- * // parameter is not used.

- * void vBacklightTimerCallback( xTimerHandle pxTimer )

- * {

- *     // The timer expired, therefore 5 seconds must have passed since a key

- *     // was pressed.  Switch off the LCD back-light.

- *     vSetBacklightState( BACKLIGHT_OFF );

- * }

- *

- * // The key press interrupt service routine.

- * void vKeyPressEventInterruptHandler( void )

- * {

- * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;

- *

- *     // Ensure the LCD back-light is on, then restart the timer that is

- *     // responsible for turning the back-light off after 5 seconds of

- *     // key inactivity.  This is an interrupt service routine so can only

- *     // call FreeRTOS API functions that end in "FromISR".

- *     vSetBacklightState( BACKLIGHT_ON );

- *

- *     // xTimerStartFromISR() or xTimerResetFromISR() could be called here

- *     // as both cause the timer to re-calculate its expiry time.

- *     // xHigherPriorityTaskWoken was initialised to pdFALSE when it was

- *     // declared (in this function).

- *     if( xTimerStartFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS )

- *     {

- *         // The start command was not executed successfully.  Take appropriate

- *         // action here.

- *     }

- *

- *     // Perform the rest of the key processing here.

- *

- *     // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch

- *     // should be performed.  The syntax required to perform a context switch

- *     // from inside an ISR varies from port to port, and from compiler to

- *     // compiler.  Inspect the demos for the port you are using to find the

- *     // actual syntax required.

- *     if( xHigherPriorityTaskWoken != pdFALSE )

- *     {

- *         // Call the interrupt safe yield function here (actual function

- *         // depends on the FreeRTOS port being used.

- *     }

- * }

- */

-#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U )

-

-/**

- * portBASE_TYPE xTimerStopFromISR( 	xTimerHandle xTimer,

- *										portBASE_TYPE *pxHigherPriorityTaskWoken );

- *

- * A version of xTimerStop() that can be called from an interrupt service

- * routine.

- *

- * @param xTimer The handle of the timer being stopped.

- *

- * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most

- * of its time in the Blocked state, waiting for messages to arrive on the timer

- * command queue.  Calling xTimerStopFromISR() writes a message to the timer

- * command queue, so has the potential to transition the timer service/daemon

- * task out of the Blocked state.  If calling xTimerStopFromISR() causes the

- * timer service/daemon task to leave the Blocked state, and the timer service/

- * daemon task has a priority equal to or greater than the currently executing

- * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will

- * get set to pdTRUE internally within the xTimerStopFromISR() function.  If

- * xTimerStopFromISR() sets this value to pdTRUE then a context switch should

- * be performed before the interrupt exits.

- *

- * @return pdFAIL will be returned if the stop command could not be sent to

- * the timer command queue.  pdPASS will be returned if the command was

- * successfully sent to the timer command queue.  When the command is actually

- * processed will depend on the priority of the timer service/daemon task

- * relative to other tasks in the system.  The timer service/daemon task

- * priority is set by the configTIMER_TASK_PRIORITY configuration constant.

- *

- * Example usage:

- *

- * // This scenario assumes xTimer has already been created and started.  When

- * // an interrupt occurs, the timer should be simply stopped.

- *

- * // The interrupt service routine that stops the timer.

- * void vAnExampleInterruptServiceRoutine( void )

- * {

- * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;

- *

- *     // The interrupt has occurred - simply stop the timer.

- *     // xHigherPriorityTaskWoken was set to pdFALSE where it was defined

- *     // (within this function).  As this is an interrupt service routine, only

- *     // FreeRTOS API functions that end in "FromISR" can be used.

- *     if( xTimerStopFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS )

- *     {

- *         // The stop command was not executed successfully.  Take appropriate

- *         // action here.

- *     }

- *

- *     // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch

- *     // should be performed.  The syntax required to perform a context switch

- *     // from inside an ISR varies from port to port, and from compiler to

- *     // compiler.  Inspect the demos for the port you are using to find the

- *     // actual syntax required.

- *     if( xHigherPriorityTaskWoken != pdFALSE )

- *     {

- *         // Call the interrupt safe yield function here (actual function

- *         // depends on the FreeRTOS port being used.

- *     }

- * }

- */

-#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0, ( pxHigherPriorityTaskWoken ), 0U )

-

-/**

- * portBASE_TYPE xTimerChangePeriodFromISR( xTimerHandle xTimer,

- *											portTickType xNewPeriod,

- *											portBASE_TYPE *pxHigherPriorityTaskWoken );

- *

- * A version of xTimerChangePeriod() that can be called from an interrupt

- * service routine.

- *

- * @param xTimer The handle of the timer that is having its period changed.

- *

- * @param xNewPeriod The new period for xTimer. Timer periods are specified in

- * tick periods, so the constant portTICK_RATE_MS can be used to convert a time

- * that has been specified in milliseconds.  For example, if the timer must

- * expire after 100 ticks, then xNewPeriod should be set to 100.  Alternatively,

- * if the timer must expire after 500ms, then xNewPeriod can be set to

- * ( 500 / portTICK_RATE_MS ) provided configTICK_RATE_HZ is less than

- * or equal to 1000.

- *

- * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most

- * of its time in the Blocked state, waiting for messages to arrive on the timer

- * command queue.  Calling xTimerChangePeriodFromISR() writes a message to the

- * timer command queue, so has the potential to transition the timer service/

- * daemon task out of the Blocked state.  If calling xTimerChangePeriodFromISR()

- * causes the timer service/daemon task to leave the Blocked state, and the

- * timer service/daemon task has a priority equal to or greater than the

- * currently executing task (the task that was interrupted), then

- * *pxHigherPriorityTaskWoken will get set to pdTRUE internally within the

- * xTimerChangePeriodFromISR() function.  If xTimerChangePeriodFromISR() sets

- * this value to pdTRUE then a context switch should be performed before the

- * interrupt exits.

- *

- * @return pdFAIL will be returned if the command to change the timers period

- * could not be sent to the timer command queue.  pdPASS will be returned if the

- * command was successfully sent to the timer command queue.  When the command

- * is actually processed will depend on the priority of the timer service/daemon

- * task relative to other tasks in the system.  The timer service/daemon task

- * priority is set by the configTIMER_TASK_PRIORITY configuration constant.

- *

- * Example usage:

- *

- * // This scenario assumes xTimer has already been created and started.  When

- * // an interrupt occurs, the period of xTimer should be changed to 500ms.

- *

- * // The interrupt service routine that changes the period of xTimer.

- * void vAnExampleInterruptServiceRoutine( void )

- * {

- * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;

- *

- *     // The interrupt has occurred - change the period of xTimer to 500ms.

- *     // xHigherPriorityTaskWoken was set to pdFALSE where it was defined

- *     // (within this function).  As this is an interrupt service routine, only

- *     // FreeRTOS API functions that end in "FromISR" can be used.

- *     if( xTimerChangePeriodFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS )

- *     {

- *         // The command to change the timers period was not executed

- *         // successfully.  Take appropriate action here.

- *     }

- *

- *     // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch

- *     // should be performed.  The syntax required to perform a context switch

- *     // from inside an ISR varies from port to port, and from compiler to

- *     // compiler.  Inspect the demos for the port you are using to find the

- *     // actual syntax required.

- *     if( xHigherPriorityTaskWoken != pdFALSE )

- *     {

- *         // Call the interrupt safe yield function here (actual function

- *         // depends on the FreeRTOS port being used.

- *     }

- * }

- */

-#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U )

-

-/**

- * portBASE_TYPE xTimerResetFromISR( 	xTimerHandle xTimer,

- *										portBASE_TYPE *pxHigherPriorityTaskWoken );

- *

- * A version of xTimerReset() that can be called from an interrupt service

- * routine.

- *

- * @param xTimer The handle of the timer that is to be started, reset, or

- * restarted.

- *

- * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most

- * of its time in the Blocked state, waiting for messages to arrive on the timer

- * command queue.  Calling xTimerResetFromISR() writes a message to the timer

- * command queue, so has the potential to transition the timer service/daemon

- * task out of the Blocked state.  If calling xTimerResetFromISR() causes the

- * timer service/daemon task to leave the Blocked state, and the timer service/

- * daemon task has a priority equal to or greater than the currently executing

- * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will

- * get set to pdTRUE internally within the xTimerResetFromISR() function.  If

- * xTimerResetFromISR() sets this value to pdTRUE then a context switch should

- * be performed before the interrupt exits.

- *

- * @return pdFAIL will be returned if the reset command could not be sent to

- * the timer command queue.  pdPASS will be returned if the command was

- * successfully sent to the timer command queue.  When the command is actually

- * processed will depend on the priority of the timer service/daemon task

- * relative to other tasks in the system, although the timers expiry time is

- * relative to when xTimerResetFromISR() is actually called.  The timer service/daemon

- * task priority is set by the configTIMER_TASK_PRIORITY configuration constant.

- *

- * Example usage:

- *

- * // This scenario assumes xBacklightTimer has already been created.  When a

- * // key is pressed, an LCD back-light is switched on.  If 5 seconds pass

- * // without a key being pressed, then the LCD back-light is switched off.  In

- * // this case, the timer is a one-shot timer, and unlike the example given for

- * // the xTimerReset() function, the key press event handler is an interrupt

- * // service routine.

- *

- * // The callback function assigned to the one-shot timer.  In this case the

- * // parameter is not used.

- * void vBacklightTimerCallback( xTimerHandle pxTimer )

- * {

- *     // The timer expired, therefore 5 seconds must have passed since a key

- *     // was pressed.  Switch off the LCD back-light.

- *     vSetBacklightState( BACKLIGHT_OFF );

- * }

- *

- * // The key press interrupt service routine.

- * void vKeyPressEventInterruptHandler( void )

- * {

- * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;

- *

- *     // Ensure the LCD back-light is on, then reset the timer that is

- *     // responsible for turning the back-light off after 5 seconds of

- *     // key inactivity.  This is an interrupt service routine so can only

- *     // call FreeRTOS API functions that end in "FromISR".

- *     vSetBacklightState( BACKLIGHT_ON );

- *

- *     // xTimerStartFromISR() or xTimerResetFromISR() could be called here

- *     // as both cause the timer to re-calculate its expiry time.

- *     // xHigherPriorityTaskWoken was initialised to pdFALSE when it was

- *     // declared (in this function).

- *     if( xTimerResetFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS )

- *     {

- *         // The reset command was not executed successfully.  Take appropriate

- *         // action here.

- *     }

- *

- *     // Perform the rest of the key processing here.

- *

- *     // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch

- *     // should be performed.  The syntax required to perform a context switch

- *     // from inside an ISR varies from port to port, and from compiler to

- *     // compiler.  Inspect the demos for the port you are using to find the

- *     // actual syntax required.

- *     if( xHigherPriorityTaskWoken != pdFALSE )

- *     {

- *         // Call the interrupt safe yield function here (actual function

- *         // depends on the FreeRTOS port being used.

- *     }

- * }

- */

-#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U )

-

-/*

- * Functions beyond this part are not part of the public API and are intended

- * for use by the kernel only.

- */

-portBASE_TYPE xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION;

-portBASE_TYPE xTimerGenericCommand( xTimerHandle xTimer, portBASE_TYPE xCommandID, portTickType xOptionalValue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portTickType xBlockTime ) PRIVILEGED_FUNCTION;

-

-#ifdef __cplusplus

-}

-#endif

-#endif /* TIMERS_H */

-

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/list.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/list.c
deleted file mode 100644
index f4a4a0d..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/list.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-

-#include <stdlib.h>

-#include "FreeRTOS.h"

-#include "list.h"

-

-/*-----------------------------------------------------------

- * PUBLIC LIST API documented in list.h

- *----------------------------------------------------------*/

-

-void vListInitialise( xList *pxList )

-{

-	/* The list structure contains a list item which is used to mark the

-	end of the list.  To initialise the list the list end is inserted

-	as the only list entry. */

-	pxList->pxIndex = ( xListItem * ) &( pxList->xListEnd );

-

-	/* The list end value is the highest possible value in the list to

-	ensure it remains at the end of the list. */

-	pxList->xListEnd.xItemValue = portMAX_DELAY;

-

-	/* The list end next and previous pointers point to itself so we know

-	when the list is empty. */

-	pxList->xListEnd.pxNext = ( xListItem * ) &( pxList->xListEnd );

-	pxList->xListEnd.pxPrevious = ( xListItem * ) &( pxList->xListEnd );

-

-	pxList->uxNumberOfItems = ( unsigned portBASE_TYPE ) 0U;

-}

-/*-----------------------------------------------------------*/

-

-void vListInitialiseItem( xListItem *pxItem )

-{

-	/* Make sure the list item is not recorded as being on a list. */

-	pxItem->pvContainer = NULL;

-}

-/*-----------------------------------------------------------*/

-

-void vListInsertEnd( xList *pxList, xListItem *pxNewListItem )

-{

-volatile xListItem * pxIndex;

-

-	/* Insert a new list item into pxList, but rather than sort the list,

-	makes the new list item the last item to be removed by a call to

-	pvListGetOwnerOfNextEntry.  This means it has to be the item pointed to by

-	the pxIndex member. */

-	pxIndex = pxList->pxIndex;

-

-	pxNewListItem->pxNext = pxIndex->pxNext;

-	pxNewListItem->pxPrevious = pxList->pxIndex;

-	pxIndex->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;

-	pxIndex->pxNext = ( volatile xListItem * ) pxNewListItem;

-	pxList->pxIndex = ( volatile xListItem * ) pxNewListItem;

-

-	/* Remember which list the item is in. */

-	pxNewListItem->pvContainer = ( void * ) pxList;

-

-	( pxList->uxNumberOfItems )++;

-}

-/*-----------------------------------------------------------*/

-

-void vListInsert( xList *pxList, xListItem *pxNewListItem )

-{

-volatile xListItem *pxIterator;

-portTickType xValueOfInsertion;

-

-	/* Insert the new list item into the list, sorted in ulListItem order. */

-	xValueOfInsertion = pxNewListItem->xItemValue;

-

-	/* If the list already contains a list item with the same item value then

-	the new list item should be placed after it.  This ensures that TCB's which

-	are stored in ready lists (all of which have the same ulListItem value)

-	get an equal share of the CPU.  However, if the xItemValue is the same as

-	the back marker the iteration loop below will not end.  This means we need

-	to guard against this by checking the value first and modifying the

-	algorithm slightly if necessary. */

-	if( xValueOfInsertion == portMAX_DELAY )

-	{

-		pxIterator = pxList->xListEnd.pxPrevious;

-	}

-	else

-	{

-		/* *** NOTE ***********************************************************

-		If you find your application is crashing here then likely causes are:

-			1) Stack overflow -

-			   see http://www.freertos.org/Stacks-and-stack-overflow-checking.html

-			2) Incorrect interrupt priority assignment, especially on Cortex-M3

-			   parts where numerically high priority values denote low actual

-			   interrupt priories, which can seem counter intuitive.  See

-			   configMAX_SYSCALL_INTERRUPT_PRIORITY on http://www.freertos.org/a00110.html

-			3) Calling an API function from within a critical section or when

-			   the scheduler is suspended.

-			4) Using a queue or semaphore before it has been initialised or

-			   before the scheduler has been started (are interrupts firing

-			   before vTaskStartScheduler() has been called?).

-		See http://www.freertos.org/FAQHelp.html for more tips.

-		**********************************************************************/

-		

-		for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext )

-		{

-			/* There is nothing to do here, we are just iterating to the

-			wanted insertion position. */

-		}

-	}

-

-	pxNewListItem->pxNext = pxIterator->pxNext;

-	pxNewListItem->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;

-	pxNewListItem->pxPrevious = pxIterator;

-	pxIterator->pxNext = ( volatile xListItem * ) pxNewListItem;

-

-	/* Remember which list the item is in.  This allows fast removal of the

-	item later. */

-	pxNewListItem->pvContainer = ( void * ) pxList;

-

-	( pxList->uxNumberOfItems )++;

-}

-/*-----------------------------------------------------------*/

-

-void vListRemove( xListItem *pxItemToRemove )

-{

-xList * pxList;

-

-	pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;

-	pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;

-	

-	/* The list item knows which list it is in.  Obtain the list from the list

-	item. */

-	pxList = ( xList * ) pxItemToRemove->pvContainer;

-

-	/* Make sure the index is left pointing to a valid item. */

-	if( pxList->pxIndex == pxItemToRemove )

-	{

-		pxList->pxIndex = pxItemToRemove->pxPrevious;

-	}

-

-	pxItemToRemove->pvContainer = NULL;

-	( pxList->uxNumberOfItems )--;

-}

-/*-----------------------------------------------------------*/

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/portable/GCC/ARM_CM3/port.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/portable/GCC/ARM_CM3/port.c
deleted file mode 100644
index 344b381..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/portable/GCC/ARM_CM3/port.c
+++ /dev/null
@@ -1,300 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-/*-----------------------------------------------------------

- * Implementation of functions defined in portable.h for the ARM CM3 port.

- *----------------------------------------------------------*/

-

-/* Scheduler includes. */

-#include "FreeRTOS.h"

-#include "task.h"

-

-/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is

-defined.  The value should also ensure backward compatibility.

-FreeRTOS.org versions prior to V4.4.0 did not include this definition. */

-#ifndef configKERNEL_INTERRUPT_PRIORITY

-	#define configKERNEL_INTERRUPT_PRIORITY 255

-#endif

-

-#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0

-	#error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0.  See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html

-#endif

-

-/* Constants required to manipulate the NVIC. */

-#define portNVIC_SYSTICK_CTRL		( ( volatile unsigned long *) 0xe000e010 )

-#define portNVIC_SYSTICK_LOAD		( ( volatile unsigned long *) 0xe000e014 )

-#define portNVIC_INT_CTRL			( ( volatile unsigned long *) 0xe000ed04 )

-#define portNVIC_SYSPRI2			( ( volatile unsigned long *) 0xe000ed20 )

-#define portNVIC_SYSTICK_CLK		0x00000004

-#define portNVIC_SYSTICK_INT		0x00000002

-#define portNVIC_SYSTICK_ENABLE		0x00000001

-#define portNVIC_PENDSVSET			0x10000000

-#define portNVIC_PENDSV_PRI			( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 16 )

-#define portNVIC_SYSTICK_PRI		( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 24 )

-

-/* Constants required to set up the initial stack. */

-#define portINITIAL_XPSR			( 0x01000000 )

-

-/* The priority used by the kernel is assigned to a variable to make access

-from inline assembler easier. */

-const unsigned long ulKernelPriority = configKERNEL_INTERRUPT_PRIORITY;

-

-/* Each task maintains its own interrupt status in the critical nesting

-variable. */

-static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa;

-

-/*

- * Setup the timer to generate the tick interrupts.

- */

-static void prvSetupTimerInterrupt( void );

-

-/*

- * Exception handlers.

- */

-void xPortPendSVHandler( void ) __attribute__ (( naked ));

-void xPortSysTickHandler( void );

-void vPortSVCHandler( void ) __attribute__ (( naked ));

-

-/*

- * Start first task is a separate function so it can be tested in isolation.

- */

-static void prvPortStartFirstTask( void ) __attribute__ (( naked ));

-

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )

-{

-	/* Simulate the stack frame as it would be created by a context switch

-	interrupt. */

-	pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */

-	*pxTopOfStack = portINITIAL_XPSR;	/* xPSR */

-	pxTopOfStack--;

-	*pxTopOfStack = ( portSTACK_TYPE ) pxCode;	/* PC */

-	pxTopOfStack--;

-	*pxTopOfStack = 0;	/* LR */

-	pxTopOfStack -= 5;	/* R12, R3, R2 and R1. */

-	*pxTopOfStack = ( portSTACK_TYPE ) pvParameters;	/* R0 */

-	pxTopOfStack -= 8;	/* R11, R10, R9, R8, R7, R6, R5 and R4. */

-

-	return pxTopOfStack;

-}

-/*-----------------------------------------------------------*/

-

-void vPortSVCHandler( void )

-{

-	__asm volatile (

-					"	ldr	r3, pxCurrentTCBConst2		\n" /* Restore the context. */

-					"	ldr r1, [r3]					\n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */

-					"	ldr r0, [r1]					\n" /* The first item in pxCurrentTCB is the task top of stack. */

-					"	ldmia r0!, {r4-r11}				\n" /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */

-					"	msr psp, r0						\n" /* Restore the task stack pointer. */

-					"	mov r0, #0 						\n"

-					"	msr	basepri, r0					\n"

-					"	orr r14, #0xd					\n"

-					"	bx r14							\n"

-					"									\n"

-					"	.align 2						\n"

-					"pxCurrentTCBConst2: .word pxCurrentTCB				\n"

-				);

-}

-/*-----------------------------------------------------------*/

-

-static void prvPortStartFirstTask( void )

-{

-	__asm volatile(

-					" ldr r0, =0xE000ED08 	\n" /* Use the NVIC offset register to locate the stack. */

-					" ldr r0, [r0] 			\n"

-					" ldr r0, [r0] 			\n"

-					" msr msp, r0			\n" /* Set the msp back to the start of the stack. */

-					" cpsie i				\n" /* Globally enable interrupts. */

-					" svc 0					\n" /* System call to start first task. */

-					" nop					\n"

-				);

-}

-/*-----------------------------------------------------------*/

-

-/*

- * See header file for description.

- */

-portBASE_TYPE xPortStartScheduler( void )

-{

-	/* Make PendSV, CallSV and SysTick the same priroity as the kernel. */

-	*(portNVIC_SYSPRI2) |= portNVIC_PENDSV_PRI;

-	*(portNVIC_SYSPRI2) |= portNVIC_SYSTICK_PRI;

-

-	/* Start the timer that generates the tick ISR.  Interrupts are disabled

-	here already. */

-	prvSetupTimerInterrupt();

-

-	/* Initialise the critical nesting count ready for the first task. */

-	uxCriticalNesting = 0;

-

-	/* Start the first task. */

-	prvPortStartFirstTask();

-

-	/* Should not get here! */

-	return 0;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEndScheduler( void )

-{

-	/* It is unlikely that the CM3 port will require this function as there

-	is nothing to return to.  */

-}

-/*-----------------------------------------------------------*/

-

-void vPortYieldFromISR( void )

-{

-	/* Set a PendSV to request a context switch. */

-	*(portNVIC_INT_CTRL) = portNVIC_PENDSVSET;

-}

-/*-----------------------------------------------------------*/

-

-void vPortEnterCritical( void )

-{

-	portDISABLE_INTERRUPTS();

-	uxCriticalNesting++;

-}

-/*-----------------------------------------------------------*/

-

-void vPortExitCritical( void )

-{

-	uxCriticalNesting--;

-	if( uxCriticalNesting == 0 )

-	{

-		portENABLE_INTERRUPTS();

-	}

-}

-/*-----------------------------------------------------------*/

-

-void xPortPendSVHandler( void )

-{

-	/* This is a naked function. */

-

-	__asm volatile

-	(

-	"	mrs r0, psp							\n"

-	"										\n"

-	"	ldr	r3, pxCurrentTCBConst			\n" /* Get the location of the current TCB. */

-	"	ldr	r2, [r3]						\n"

-	"										\n"

-	"	stmdb r0!, {r4-r11}					\n" /* Save the remaining registers. */

-	"	str r0, [r2]						\n" /* Save the new top of stack into the first member of the TCB. */

-	"										\n"

-	"	stmdb sp!, {r3, r14}				\n"

-	"	mov r0, %0							\n"

-	"	msr basepri, r0						\n"

-	"	bl vTaskSwitchContext				\n"

-	"	mov r0, #0							\n"

-	"	msr basepri, r0						\n"

-	"	ldmia sp!, {r3, r14}				\n"

-	"										\n"	/* Restore the context, including the critical nesting count. */

-	"	ldr r1, [r3]						\n"

-	"	ldr r0, [r1]						\n" /* The first item in pxCurrentTCB is the task top of stack. */

-	"	ldmia r0!, {r4-r11}					\n" /* Pop the registers. */

-	"	msr psp, r0							\n"

-	"	bx r14								\n"

-	"										\n"

-	"	.align 2							\n"

-	"pxCurrentTCBConst: .word pxCurrentTCB	\n"

-	::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY)

-	);

-}

-/*-----------------------------------------------------------*/

-

-void xPortSysTickHandler( void )

-{

-unsigned long ulDummy;

-

-	/* If using preemption, also force a context switch. */

-	#if configUSE_PREEMPTION == 1

-		*(portNVIC_INT_CTRL) = portNVIC_PENDSVSET;

-	#endif

-

-	ulDummy = portSET_INTERRUPT_MASK_FROM_ISR();

-	{

-		vTaskIncrementTick();

-	}

-	portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy );

-}

-/*-----------------------------------------------------------*/

-

-/*

- * Setup the systick timer to generate the tick interrupts at the required

- * frequency.

- */

-void prvSetupTimerInterrupt( void )

-{

-	/* Configure SysTick to interrupt at the requested rate. */

-	*(portNVIC_SYSTICK_LOAD) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;

-	*(portNVIC_SYSTICK_CTRL) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE;

-}

-/*-----------------------------------------------------------*/

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/portable/GCC/ARM_CM3/portmacro.h b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/portable/GCC/ARM_CM3/portmacro.h
deleted file mode 100644
index 6220a2e..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/portable/GCC/ARM_CM3/portmacro.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-

-#ifndef PORTMACRO_H

-#define PORTMACRO_H

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/*-----------------------------------------------------------

- * Port specific definitions.  

- *

- * The settings in this file configure FreeRTOS correctly for the

- * given hardware and compiler.

- *

- * These settings should not be altered.

- *-----------------------------------------------------------

- */

-

-/* Type definitions. */

-#define portCHAR		char

-#define portFLOAT		float

-#define portDOUBLE		double

-#define portLONG		long

-#define portSHORT		short

-#define portSTACK_TYPE	unsigned portLONG

-#define portBASE_TYPE	long

-

-#if( configUSE_16_BIT_TICKS == 1 )

-	typedef unsigned portSHORT portTickType;

-	#define portMAX_DELAY ( portTickType ) 0xffff

-#else

-	typedef unsigned portLONG portTickType;

-	#define portMAX_DELAY ( portTickType ) 0xffffffff

-#endif

-/*-----------------------------------------------------------*/	

-

-/* Architecture specifics. */

-#define portSTACK_GROWTH			( -1 )

-#define portTICK_RATE_MS			( ( portTickType ) 1000 / configTICK_RATE_HZ )		

-#define portBYTE_ALIGNMENT			8

-/*-----------------------------------------------------------*/	

-

-

-/* Scheduler utilities. */

-extern void vPortYieldFromISR( void );

-

-#define portYIELD()					vPortYieldFromISR()

-

-#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) vPortYieldFromISR()

-/*-----------------------------------------------------------*/

-

-

-/* Critical section management. */

-

-/* 

- * Set basepri to portMAX_SYSCALL_INTERRUPT_PRIORITY without effecting other

- * registers.  r0 is clobbered.

- */ 

-#define portSET_INTERRUPT_MASK()						\

-	__asm volatile										\

-	(													\

-		"	mov r0, %0								\n"	\

-		"	msr basepri, r0							\n" \

-		::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY):"r0"	\

-	)

-	

-/*

- * Set basepri back to 0 without effective other registers.

- * r0 is clobbered.

- */

-#define portCLEAR_INTERRUPT_MASK()			\

-	__asm volatile							\

-	(										\

-		"	mov r0, #0					\n"	\

-		"	msr basepri, r0				\n"	\

-		:::"r0"								\

-	)

-

-#define portSET_INTERRUPT_MASK_FROM_ISR()		0;portSET_INTERRUPT_MASK()

-#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x)	portCLEAR_INTERRUPT_MASK();(void)x

-

-

-extern void vPortEnterCritical( void );

-extern void vPortExitCritical( void );

-

-#define portDISABLE_INTERRUPTS()	portSET_INTERRUPT_MASK()

-#define portENABLE_INTERRUPTS()		portCLEAR_INTERRUPT_MASK()

-#define portENTER_CRITICAL()		vPortEnterCritical()

-#define portEXIT_CRITICAL()			vPortExitCritical()

-/*-----------------------------------------------------------*/

-

-/* Task function macros as described on the FreeRTOS.org WEB site. */

-#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )

-#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

-

-#define portNOP()

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* PORTMACRO_H */

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/portable/MemMang/heap_2.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/portable/MemMang/heap_2.c
deleted file mode 100644
index bfad245..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/portable/MemMang/heap_2.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-/*

- * A sample implementation of pvPortMalloc() and vPortFree() that permits

- * allocated blocks to be freed, but does not combine adjacent free blocks

- * into a single larger block.

- *

- * See heap_1.c and heap_3.c for alternative implementations, and the memory

- * management pages of http://www.FreeRTOS.org for more information.

- */

-#include <stdlib.h>

-

-/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining

-all the API functions to use the MPU wrappers.  That should only be done when

-task.h is included from an application file. */

-#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE

-

-#include "FreeRTOS.h"

-#include "task.h"

-

-#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE

-

-/* Allocate the memory for the heap.  The struct is used to force byte

-alignment without using any non-portable code. */

-static union xRTOS_HEAP

-{

-	#if portBYTE_ALIGNMENT == 8

-		volatile portDOUBLE dDummy;

-	#else

-		volatile unsigned long ulDummy;

-	#endif

-	unsigned char ucHeap[ configTOTAL_HEAP_SIZE ];

-} xHeap;

-

-/* Define the linked list structure.  This is used to link free blocks in order

-of their size. */

-typedef struct A_BLOCK_LINK

-{

-	struct A_BLOCK_LINK *pxNextFreeBlock;	/*<< The next free block in the list. */

-	size_t xBlockSize;						/*<< The size of the free block. */

-} xBlockLink;

-

-

-static const unsigned short  heapSTRUCT_SIZE	= ( sizeof( xBlockLink ) + portBYTE_ALIGNMENT - ( sizeof( xBlockLink ) % portBYTE_ALIGNMENT ) );

-#define heapMINIMUM_BLOCK_SIZE	( ( size_t ) ( heapSTRUCT_SIZE * 2 ) )

-

-/* Create a couple of list links to mark the start and end of the list. */

-static xBlockLink xStart, xEnd;

-

-/* Keeps track of the number of free bytes remaining, but says nothing about

-fragmentation. */

-static size_t xFreeBytesRemaining = configTOTAL_HEAP_SIZE;

-

-/* STATIC FUNCTIONS ARE DEFINED AS MACROS TO MINIMIZE THE FUNCTION CALL DEPTH. */

-

-/*

- * Insert a block into the list of free blocks - which is ordered by size of

- * the block.  Small blocks at the start of the list and large blocks at the end

- * of the list.

- */

-#define prvInsertBlockIntoFreeList( pxBlockToInsert )								\

-{																					\

-xBlockLink *pxIterator;																\

-size_t xBlockSize;																	\

-																					\

-	xBlockSize = pxBlockToInsert->xBlockSize;										\

-																					\

-	/* Iterate through the list until a block is found that has a larger size */	\

-	/* than the block we are inserting. */											\

-	for( pxIterator = &xStart; pxIterator->pxNextFreeBlock->xBlockSize < xBlockSize; pxIterator = pxIterator->pxNextFreeBlock )	\

-	{																				\

-		/* There is nothing to do here - just iterate to the correct position. */	\

-	}																				\

-																					\

-	/* Update the list to include the block being inserted in the correct */		\

-	/* position. */																	\

-	pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;					\

-	pxIterator->pxNextFreeBlock = pxBlockToInsert;									\

-}

-/*-----------------------------------------------------------*/

-

-#define prvHeapInit()																\

-{																					\

-xBlockLink *pxFirstFreeBlock;														\

-																					\

-	/* xStart is used to hold a pointer to the first item in the list of free */	\

-	/* blocks.  The void cast is used to prevent compiler warnings. */				\

-	xStart.pxNextFreeBlock = ( void * ) xHeap.ucHeap;								\

-	xStart.xBlockSize = ( size_t ) 0;												\

-																					\

-	/* xEnd is used to mark the end of the list of free blocks. */					\

-	xEnd.xBlockSize = configTOTAL_HEAP_SIZE;										\

-	xEnd.pxNextFreeBlock = NULL;													\

-																					\

-	/* To start with there is a single free block that is sized to take up the		\

-	entire heap space. */															\

-	pxFirstFreeBlock = ( void * ) xHeap.ucHeap;										\

-	pxFirstFreeBlock->xBlockSize = configTOTAL_HEAP_SIZE;							\

-	pxFirstFreeBlock->pxNextFreeBlock = &xEnd;										\

-}

-/*-----------------------------------------------------------*/

-

-void *pvPortMalloc( size_t xWantedSize )

-{

-xBlockLink *pxBlock, *pxPreviousBlock, *pxNewBlockLink;

-static portBASE_TYPE xHeapHasBeenInitialised = pdFALSE;

-void *pvReturn = NULL;

-

-	vTaskSuspendAll();

-	{

-		/* If this is the first call to malloc then the heap will require

-		initialisation to setup the list of free blocks. */

-		if( xHeapHasBeenInitialised == pdFALSE )

-		{

-			prvHeapInit();

-			xHeapHasBeenInitialised = pdTRUE;

-		}

-

-		/* The wanted size is increased so it can contain a xBlockLink

-		structure in addition to the requested amount of bytes. */

-		if( xWantedSize > 0 )

-		{

-			xWantedSize += heapSTRUCT_SIZE;

-

-			/* Ensure that blocks are always aligned to the required number of bytes. */

-			if( xWantedSize & portBYTE_ALIGNMENT_MASK )

-			{

-				/* Byte alignment required. */

-				xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) );

-			}

-		}

-

-		if( ( xWantedSize > 0 ) && ( xWantedSize < configTOTAL_HEAP_SIZE ) )

-		{

-			/* Blocks are stored in byte order - traverse the list from the start

-			(smallest) block until one of adequate size is found. */

-			pxPreviousBlock = &xStart;

-			pxBlock = xStart.pxNextFreeBlock;

-			while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock ) )

-			{

-				pxPreviousBlock = pxBlock;

-				pxBlock = pxBlock->pxNextFreeBlock;

-			}

-

-			/* If we found the end marker then a block of adequate size was not found. */

-			if( pxBlock != &xEnd )

-			{

-				/* Return the memory space - jumping over the xBlockLink structure

-				at its start. */

-				pvReturn = ( void * ) ( ( ( unsigned char * ) pxPreviousBlock->pxNextFreeBlock ) + heapSTRUCT_SIZE );

-

-				/* This block is being returned for use so must be taken our of the

-				list of free blocks. */

-				pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;

-

-				/* If the block is larger than required it can be split into two. */

-				if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE )

-				{

-					/* This block is to be split into two.  Create a new block

-					following the number of bytes requested. The void cast is

-					used to prevent byte alignment warnings from the compiler. */

-					pxNewBlockLink = ( void * ) ( ( ( unsigned char * ) pxBlock ) + xWantedSize );

-

-					/* Calculate the sizes of two blocks split from the single

-					block. */

-					pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;

-					pxBlock->xBlockSize = xWantedSize;

-

-					/* Insert the new block into the list of free blocks. */

-					prvInsertBlockIntoFreeList( ( pxNewBlockLink ) );

-				}

-				

-				xFreeBytesRemaining -= pxBlock->xBlockSize;

-			}

-		}

-	}

-	xTaskResumeAll();

-

-	#if( configUSE_MALLOC_FAILED_HOOK == 1 )

-	{

-		if( pvReturn == NULL )

-		{

-			extern void vApplicationMallocFailedHook( void );

-			vApplicationMallocFailedHook();

-		}

-	}

-	#endif

-

-	return pvReturn;

-}

-/*-----------------------------------------------------------*/

-

-void vPortFree( void *pv )

-{

-unsigned char *puc = ( unsigned char * ) pv;

-xBlockLink *pxLink;

-

-	if( pv )

-	{

-		/* The memory being freed will have an xBlockLink structure immediately

-		before it. */

-		puc -= heapSTRUCT_SIZE;

-

-		/* This casting is to keep the compiler from issuing warnings. */

-		pxLink = ( void * ) puc;

-

-		vTaskSuspendAll();

-		{

-			/* Add this block to the list of free blocks. */

-			prvInsertBlockIntoFreeList( ( ( xBlockLink * ) pxLink ) );

-			xFreeBytesRemaining += pxLink->xBlockSize;

-		}

-		xTaskResumeAll();

-	}

-}

-/*-----------------------------------------------------------*/

-

-size_t xPortGetFreeHeapSize( void )

-{

-	return xFreeBytesRemaining;

-}

-/*-----------------------------------------------------------*/

-

-void vPortInitialiseBlocks( void )

-{

-	/* This just exists to keep the linker quiet. */

-}

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/queue.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/queue.c
deleted file mode 100644
index a546dcc..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/queue.c
+++ /dev/null
@@ -1,1682 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-#include <stdlib.h>

-#include <string.h>

-

-/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining

-all the API functions to use the MPU wrappers.  That should only be done when

-task.h is included from an application file. */

-#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE

-

-#include "FreeRTOS.h"

-#include "task.h"

-

-#if ( configUSE_CO_ROUTINES == 1 )

-	#include "croutine.h"

-#endif

-

-#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE

-

-/*-----------------------------------------------------------

- * PUBLIC LIST API documented in list.h

- *----------------------------------------------------------*/

-

-/* Constants used with the cRxLock and cTxLock structure members. */

-#define queueUNLOCKED					( ( signed portBASE_TYPE ) -1 )

-#define queueLOCKED_UNMODIFIED			( ( signed portBASE_TYPE ) 0 )

-

-#define queueERRONEOUS_UNBLOCK			( -1 )

-

-/* For internal use only. */

-#define	queueSEND_TO_BACK				( 0 )

-#define	queueSEND_TO_FRONT				( 1 )

-

-/* Effectively make a union out of the xQUEUE structure. */

-#define pxMutexHolder					pcTail

-#define uxQueueType						pcHead

-#define uxRecursiveCallCount			pcReadFrom

-#define queueQUEUE_IS_MUTEX				NULL

-

-/* Semaphores do not actually store or copy data, so have an items size of

-zero. */

-#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( ( unsigned portBASE_TYPE ) 0 )

-#define queueDONT_BLOCK					 ( ( portTickType ) 0U )

-#define queueMUTEX_GIVE_BLOCK_TIME		 ( ( portTickType ) 0U )

-

-/* These definitions *must* match those in queue.h. */

-#define queueQUEUE_TYPE_BASE				( 0U )

-#define queueQUEUE_TYPE_MUTEX 				( 1U )

-#define queueQUEUE_TYPE_COUNTING_SEMAPHORE	( 2U )

-#define queueQUEUE_TYPE_BINARY_SEMAPHORE	( 3U )

-#define queueQUEUE_TYPE_RECURSIVE_MUTEX		( 4U )

-

-/*

- * Definition of the queue used by the scheduler.

- * Items are queued by copy, not reference.

- */

-typedef struct QueueDefinition

-{

-	signed char *pcHead;				/*< Points to the beginning of the queue storage area. */

-	signed char *pcTail;				/*< Points to the byte at the end of the queue storage area.  Once more byte is allocated than necessary to store the queue items, this is used as a marker. */

-

-	signed char *pcWriteTo;				/*< Points to the free next place in the storage area. */

-	signed char *pcReadFrom;			/*< Points to the last place that a queued item was read from. */

-

-	xList xTasksWaitingToSend;				/*< List of tasks that are blocked waiting to post onto this queue.  Stored in priority order. */

-	xList xTasksWaitingToReceive;			/*< List of tasks that are blocked waiting to read from this queue.  Stored in priority order. */

-

-	volatile unsigned portBASE_TYPE uxMessagesWaiting;/*< The number of items currently in the queue. */

-	unsigned portBASE_TYPE uxLength;		/*< The length of the queue defined as the number of items it will hold, not the number of bytes. */

-	unsigned portBASE_TYPE uxItemSize;		/*< The size of each items that the queue will hold. */

-

-	signed portBASE_TYPE xRxLock;			/*< Stores the number of items received from the queue (removed from the queue) while the queue was locked.  Set to queueUNLOCKED when the queue is not locked. */

-	signed portBASE_TYPE xTxLock;			/*< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked.  Set to queueUNLOCKED when the queue is not locked. */

-	

-	#if ( configUSE_TRACE_FACILITY == 1 )

-		unsigned char ucQueueNumber;

-		unsigned char ucQueueType;

-	#endif

-

-} xQUEUE;

-/*-----------------------------------------------------------*/

-

-/*

- * Inside this file xQueueHandle is a pointer to a xQUEUE structure.

- * To keep the definition private the API header file defines it as a

- * pointer to void.

- */

-typedef xQUEUE * xQueueHandle;

-

-/*

- * Prototypes for public functions are included here so we don't have to

- * include the API header file (as it defines xQueueHandle differently).  These

- * functions are documented in the API header file.

- */

-xQueueHandle xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize, unsigned char ucQueueType ) PRIVILEGED_FUNCTION;

-signed portBASE_TYPE xQueueGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION;

-unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION;

-void vQueueDelete( xQueueHandle xQueue ) PRIVILEGED_FUNCTION;

-signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION;

-signed portBASE_TYPE xQueueGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) PRIVILEGED_FUNCTION;

-signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;

-xQueueHandle xQueueCreateMutex( unsigned char ucQueueType ) PRIVILEGED_FUNCTION;

-xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount ) PRIVILEGED_FUNCTION;

-portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime ) PRIVILEGED_FUNCTION;

-portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle xMutex ) PRIVILEGED_FUNCTION;

-signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION;

-signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) PRIVILEGED_FUNCTION;

-signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION;

-signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION;

-unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION;

-void vQueueWaitForMessageRestricted( xQueueHandle pxQueue, portTickType xTicksToWait ) PRIVILEGED_FUNCTION;

-unsigned char ucQueueGetQueueNumber( xQueueHandle pxQueue ) PRIVILEGED_FUNCTION;

-void vQueueSetQueueNumber( xQueueHandle pxQueue, unsigned char ucQueueNumber ) PRIVILEGED_FUNCTION;

-unsigned char ucQueueGetQueueType( xQueueHandle pxQueue ) PRIVILEGED_FUNCTION;

-portBASE_TYPE xQueueGenericReset( xQueueHandle pxQueue, portBASE_TYPE xNewQueue ) PRIVILEGED_FUNCTION;

-xTaskHandle xQueueGetMutexHolder( xQueueHandle xSemaphore ) PRIVILEGED_FUNCTION;

-

-/*

- * Co-routine queue functions differ from task queue functions.  Co-routines are

- * an optional component.

- */

-#if configUSE_CO_ROUTINES == 1

-	signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken ) PRIVILEGED_FUNCTION;

-	signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken ) PRIVILEGED_FUNCTION;

-	signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQueue, portTickType xTicksToWait ) PRIVILEGED_FUNCTION;

-	signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait ) PRIVILEGED_FUNCTION;

-#endif

-

-/*

- * The queue registry is just a means for kernel aware debuggers to locate

- * queue structures.  It has no other purpose so is an optional component.

- */

-#if configQUEUE_REGISTRY_SIZE > 0

-

-	/* The type stored within the queue registry array.  This allows a name

-	to be assigned to each queue making kernel aware debugging a little

-	more user friendly. */

-	typedef struct QUEUE_REGISTRY_ITEM

-	{

-		signed char *pcQueueName;

-		xQueueHandle xHandle;

-	} xQueueRegistryItem;

-

-	/* The queue registry is simply an array of xQueueRegistryItem structures.

-	The pcQueueName member of a structure being NULL is indicative of the

-	array position being vacant. */

-	xQueueRegistryItem xQueueRegistry[ configQUEUE_REGISTRY_SIZE ];

-

-	/* Removes a queue from the registry by simply setting the pcQueueName

-	member to NULL. */

-	static void vQueueUnregisterQueue( xQueueHandle xQueue ) PRIVILEGED_FUNCTION;

-	void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcQueueName ) PRIVILEGED_FUNCTION;

-#endif

-

-/*

- * Unlocks a queue locked by a call to prvLockQueue.  Locking a queue does not

- * prevent an ISR from adding or removing items to the queue, but does prevent

- * an ISR from removing tasks from the queue event lists.  If an ISR finds a

- * queue is locked it will instead increment the appropriate queue lock count

- * to indicate that a task may require unblocking.  When the queue in unlocked

- * these lock counts are inspected, and the appropriate action taken.

- */

-static void prvUnlockQueue( xQueueHandle pxQueue ) PRIVILEGED_FUNCTION;

-

-/*

- * Uses a critical section to determine if there is any data in a queue.

- *

- * @return pdTRUE if the queue contains no items, otherwise pdFALSE.

- */

-static signed portBASE_TYPE prvIsQueueEmpty( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION;

-

-/*

- * Uses a critical section to determine if there is any space in a queue.

- *

- * @return pdTRUE if there is no space, otherwise pdFALSE;

- */

-static signed portBASE_TYPE prvIsQueueFull( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION;

-

-/*

- * Copies an item into the queue, either at the front of the queue or the

- * back of the queue.

- */

-static void prvCopyDataToQueue( xQUEUE *pxQueue, const void *pvItemToQueue, portBASE_TYPE xPosition ) PRIVILEGED_FUNCTION;

-

-/*

- * Copies an item out of a queue.

- */

-static void prvCopyDataFromQueue( xQUEUE * const pxQueue, const void *pvBuffer ) PRIVILEGED_FUNCTION;

-/*-----------------------------------------------------------*/

-

-/*

- * Macro to mark a queue as locked.  Locking a queue prevents an ISR from

- * accessing the queue event lists.

- */

-#define prvLockQueue( pxQueue )								\

-	taskENTER_CRITICAL();									\

-	{														\

-		if( ( pxQueue )->xRxLock == queueUNLOCKED )			\

-		{													\

-			( pxQueue )->xRxLock = queueLOCKED_UNMODIFIED;	\

-		}													\

-		if( ( pxQueue )->xTxLock == queueUNLOCKED )			\

-		{													\

-			( pxQueue )->xTxLock = queueLOCKED_UNMODIFIED;	\

-		}													\

-	}														\

-	taskEXIT_CRITICAL()

-/*-----------------------------------------------------------*/

-

-

-/*-----------------------------------------------------------

- * PUBLIC QUEUE MANAGEMENT API documented in queue.h

- *----------------------------------------------------------*/

-

-portBASE_TYPE xQueueGenericReset( xQueueHandle pxQueue, portBASE_TYPE xNewQueue )

-{

-	configASSERT( pxQueue );

-

-	taskENTER_CRITICAL();

-	{

-		pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );

-		pxQueue->uxMessagesWaiting = ( unsigned portBASE_TYPE ) 0U;

-		pxQueue->pcWriteTo = pxQueue->pcHead;

-		pxQueue->pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( unsigned portBASE_TYPE ) 1U ) * pxQueue->uxItemSize );

-		pxQueue->xRxLock = queueUNLOCKED;

-		pxQueue->xTxLock = queueUNLOCKED;

-

-		if( xNewQueue == pdFALSE )

-		{

-			/* If there are tasks blocked waiting to read from the queue, then 

-			the tasks will remain blocked as after this function exits the queue 

-			will still be empty.  If there are tasks blocked waiting to	write to 

-			the queue, then one should be unblocked as after this function exits 

-			it will be possible to write to it. */

-			if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )

-			{

-				if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE )

-				{

-					portYIELD_WITHIN_API();

-				}

-			}

-		}

-		else

-		{

-			/* Ensure the event queues start in the correct state. */

-			vListInitialise( &( pxQueue->xTasksWaitingToSend ) );

-			vListInitialise( &( pxQueue->xTasksWaitingToReceive ) );		

-		}

-	}

-	taskEXIT_CRITICAL();

-

-	/* A value is returned for calling semantic consistency with previous

-	versions. */

-	return pdPASS;

-}

-/*-----------------------------------------------------------*/

-

-xQueueHandle xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize, unsigned char ucQueueType )

-{

-xQUEUE *pxNewQueue;

-size_t xQueueSizeInBytes;

-xQueueHandle xReturn = NULL;

-

-	/* Remove compiler warnings about unused parameters should

-	configUSE_TRACE_FACILITY not be set to 1. */

-	( void ) ucQueueType;

-

-	/* Allocate the new queue structure. */

-	if( uxQueueLength > ( unsigned portBASE_TYPE ) 0 )

-	{

-		pxNewQueue = ( xQUEUE * ) pvPortMalloc( sizeof( xQUEUE ) );

-		if( pxNewQueue != NULL )

-		{

-			/* Create the list of pointers to queue items.  The queue is one byte

-			longer than asked for to make wrap checking easier/faster. */

-			xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ) + ( size_t ) 1;

-

-			pxNewQueue->pcHead = ( signed char * ) pvPortMalloc( xQueueSizeInBytes );

-			if( pxNewQueue->pcHead != NULL )

-			{

-				/* Initialise the queue members as described above where the

-				queue type is defined. */

-				pxNewQueue->uxLength = uxQueueLength;

-				pxNewQueue->uxItemSize = uxItemSize;

-				xQueueGenericReset( pxNewQueue, pdTRUE );

-				#if ( configUSE_TRACE_FACILITY == 1 )

-				{

-					pxNewQueue->ucQueueType = ucQueueType;

-				}

-				#endif /* configUSE_TRACE_FACILITY */

-

-				traceQUEUE_CREATE( pxNewQueue );

-				xReturn = pxNewQueue;

-			}

-			else

-			{

-				traceQUEUE_CREATE_FAILED( ucQueueType );

-				vPortFree( pxNewQueue );

-			}

-		}

-	}

-

-	configASSERT( xReturn );

-

-	return xReturn;

-}

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_MUTEXES == 1 )

-

-	xQueueHandle xQueueCreateMutex( unsigned char ucQueueType )

-	{

-	xQUEUE *pxNewQueue;

-

-		/* Prevent compiler warnings about unused parameters if

-		configUSE_TRACE_FACILITY does not equal 1. */

-		( void ) ucQueueType;

-

-		/* Allocate the new queue structure. */

-		pxNewQueue = ( xQUEUE * ) pvPortMalloc( sizeof( xQUEUE ) );

-		if( pxNewQueue != NULL )

-		{

-			/* Information required for priority inheritance. */

-			pxNewQueue->pxMutexHolder = NULL;

-			pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX;

-

-			/* Queues used as a mutex no data is actually copied into or out

-			of the queue. */

-			pxNewQueue->pcWriteTo = NULL;

-			pxNewQueue->pcReadFrom = NULL;

-

-			/* Each mutex has a length of 1 (like a binary semaphore) and

-			an item size of 0 as nothing is actually copied into or out

-			of the mutex. */

-			pxNewQueue->uxMessagesWaiting = ( unsigned portBASE_TYPE ) 0U;

-			pxNewQueue->uxLength = ( unsigned portBASE_TYPE ) 1U;

-			pxNewQueue->uxItemSize = ( unsigned portBASE_TYPE ) 0U;

-			pxNewQueue->xRxLock = queueUNLOCKED;

-			pxNewQueue->xTxLock = queueUNLOCKED;

-

-			#if ( configUSE_TRACE_FACILITY == 1 )

-			{

-				pxNewQueue->ucQueueType = ucQueueType;

-			}

-			#endif

-

-			/* Ensure the event queues start with the correct state. */

-			vListInitialise( &( pxNewQueue->xTasksWaitingToSend ) );

-			vListInitialise( &( pxNewQueue->xTasksWaitingToReceive ) );

-

-			traceCREATE_MUTEX( pxNewQueue );

-

-			/* Start with the semaphore in the expected state. */

-			xQueueGenericSend( pxNewQueue, NULL, ( portTickType ) 0U, queueSEND_TO_BACK );

-		}

-		else

-		{

-			traceCREATE_MUTEX_FAILED();

-		}

-

-		configASSERT( pxNewQueue );

-		return pxNewQueue;

-	}

-

-#endif /* configUSE_MUTEXES */

-/*-----------------------------------------------------------*/

-

-#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xQueueGetMutexHolder == 1 ) )

-

-	void* xQueueGetMutexHolder( xQueueHandle xSemaphore )

-	{

-	void *pxReturn;

-

-		/* This function is called by xSemaphoreGetMutexHolder(), and should not

-		be called directly.  Note:  This is is a good way of determining if the

-		calling task is the mutex holder, but not a good way of determining the

-		identity of the mutex holder, as the holder may change between the 

-		following critical section exiting and the function returning. */

-		taskENTER_CRITICAL();

-		{

-			if( xSemaphore->uxQueueType == queueQUEUE_IS_MUTEX )

-			{

-				pxReturn = ( void * ) xSemaphore->pxMutexHolder;

-			}

-			else

-			{

-				pxReturn = NULL;

-			}

-		}

-		taskEXIT_CRITICAL();

-		

-		return pxReturn;

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_RECURSIVE_MUTEXES == 1 )

-

-	portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex )

-	{

-	portBASE_TYPE xReturn;

-

-		configASSERT( pxMutex );

-

-		/* If this is the task that holds the mutex then pxMutexHolder will not

-		change outside of this task.  If this task does not hold the mutex then

-		pxMutexHolder can never coincidentally equal the tasks handle, and as

-		this is the only condition we are interested in it does not matter if

-		pxMutexHolder is accessed simultaneously by another task.  Therefore no

-		mutual exclusion is required to test the pxMutexHolder variable. */

-		if( pxMutex->pxMutexHolder == xTaskGetCurrentTaskHandle() )

-		{

-			traceGIVE_MUTEX_RECURSIVE( pxMutex );

-

-			/* uxRecursiveCallCount cannot be zero if pxMutexHolder is equal to

-			the task handle, therefore no underflow check is required.  Also,

-			uxRecursiveCallCount is only modified by the mutex holder, and as

-			there can only be one, no mutual exclusion is required to modify the

-			uxRecursiveCallCount member. */

-			( pxMutex->uxRecursiveCallCount )--;

-

-			/* Have we unwound the call count? */

-			if( pxMutex->uxRecursiveCallCount == 0 )

-			{

-				/* Return the mutex.  This will automatically unblock any other

-				task that might be waiting to access the mutex. */

-				xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK );

-			}

-

-			xReturn = pdPASS;

-		}

-		else

-		{

-			/* We cannot give the mutex because we are not the holder. */

-			xReturn = pdFAIL;

-

-			traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex );

-		}

-

-		return xReturn;

-	}

-

-#endif /* configUSE_RECURSIVE_MUTEXES */

-/*-----------------------------------------------------------*/

-

-#if configUSE_RECURSIVE_MUTEXES == 1

-

-	portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle pxMutex, portTickType xBlockTime )

-	{

-	portBASE_TYPE xReturn;

-

-		configASSERT( pxMutex );

-

-		/* Comments regarding mutual exclusion as per those within

-		xQueueGiveMutexRecursive(). */

-

-		traceTAKE_MUTEX_RECURSIVE( pxMutex );

-

-		if( pxMutex->pxMutexHolder == xTaskGetCurrentTaskHandle() )

-		{

-			( pxMutex->uxRecursiveCallCount )++;

-			xReturn = pdPASS;

-		}

-		else

-		{

-			xReturn = xQueueGenericReceive( pxMutex, NULL, xBlockTime, pdFALSE );

-

-			/* pdPASS will only be returned if we successfully obtained the mutex,

-			we may have blocked to reach here. */

-			if( xReturn == pdPASS )

-			{

-				( pxMutex->uxRecursiveCallCount )++;

-			}

-			else

-			{

-				traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex );

-			}

-		}

-

-		return xReturn;

-	}

-

-#endif /* configUSE_RECURSIVE_MUTEXES */

-/*-----------------------------------------------------------*/

-

-#if configUSE_COUNTING_SEMAPHORES == 1

-

-	xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount )

-	{

-	xQueueHandle pxHandle;

-

-		pxHandle = xQueueGenericCreate( ( unsigned portBASE_TYPE ) uxCountValue, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE );

-

-		if( pxHandle != NULL )

-		{

-			pxHandle->uxMessagesWaiting = uxInitialCount;

-

-			traceCREATE_COUNTING_SEMAPHORE();

-		}

-		else

-		{

-			traceCREATE_COUNTING_SEMAPHORE_FAILED();

-		}

-

-		configASSERT( pxHandle );

-		return pxHandle;

-	}

-

-#endif /* configUSE_COUNTING_SEMAPHORES */

-/*-----------------------------------------------------------*/

-

-signed portBASE_TYPE xQueueGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition )

-{

-signed portBASE_TYPE xEntryTimeSet = pdFALSE;

-xTimeOutType xTimeOut;

-

-	configASSERT( pxQueue );

-	configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) );

-

-	/* This function relaxes the coding standard somewhat to allow return

-	statements within the function itself.  This is done in the interest

-	of execution time efficiency. */

-	for( ;; )

-	{

-		taskENTER_CRITICAL();

-		{

-			/* Is there room on the queue now?  To be running we must be

-			the highest priority task wanting to access the queue. */

-			if( pxQueue->uxMessagesWaiting < pxQueue->uxLength )

-			{

-				traceQUEUE_SEND( pxQueue );

-				prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );

-

-				/* If there was a task waiting for data to arrive on the

-				queue then unblock it now. */

-				if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )

-				{

-					if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) == pdTRUE )

-					{

-						/* The unblocked task has a priority higher than

-						our own so yield immediately.  Yes it is ok to do

-						this from within the critical section - the kernel

-						takes care of that. */

-						portYIELD_WITHIN_API();

-					}

-				}

-

-				taskEXIT_CRITICAL();

-

-				/* Return to the original privilege level before exiting the

-				function. */

-				return pdPASS;

-			}

-			else

-			{

-				if( xTicksToWait == ( portTickType ) 0 )

-				{

-					/* The queue was full and no block time is specified (or

-					the block time has expired) so leave now. */

-					taskEXIT_CRITICAL();

-

-					/* Return to the original privilege level before exiting

-					the function. */

-					traceQUEUE_SEND_FAILED( pxQueue );

-					return errQUEUE_FULL;

-				}

-				else if( xEntryTimeSet == pdFALSE )

-				{

-					/* The queue was full and a block time was specified so

-					configure the timeout structure. */

-					vTaskSetTimeOutState( &xTimeOut );

-					xEntryTimeSet = pdTRUE;

-				}

-			}

-		}

-		taskEXIT_CRITICAL();

-

-		/* Interrupts and other tasks can send to and receive from the queue

-		now the critical section has been exited. */

-

-		vTaskSuspendAll();

-		prvLockQueue( pxQueue );

-

-		/* Update the timeout state to see if it has expired yet. */

-		if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )

-		{

-			if( prvIsQueueFull( pxQueue ) != pdFALSE )

-			{

-				traceBLOCKING_ON_QUEUE_SEND( pxQueue );

-				vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait );

-

-				/* Unlocking the queue means queue events can effect the

-				event list.  It is possible	that interrupts occurring now

-				remove this task from the event	list again - but as the

-				scheduler is suspended the task will go onto the pending

-				ready last instead of the actual ready list. */

-				prvUnlockQueue( pxQueue );

-

-				/* Resuming the scheduler will move tasks from the pending

-				ready list into the ready list - so it is feasible that this

-				task is already in a ready list before it yields - in which

-				case the yield will not cause a context switch unless there

-				is also a higher priority task in the pending ready list. */

-				if( xTaskResumeAll() == pdFALSE )

-				{

-					portYIELD_WITHIN_API();

-				}

-			}

-			else

-			{

-				/* Try again. */

-				prvUnlockQueue( pxQueue );

-				( void ) xTaskResumeAll();

-			}

-		}

-		else

-		{

-			/* The timeout has expired. */

-			prvUnlockQueue( pxQueue );

-			( void ) xTaskResumeAll();

-

-			/* Return to the original privilege level before exiting the

-			function. */

-			traceQUEUE_SEND_FAILED( pxQueue );

-			return errQUEUE_FULL;

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-#if configUSE_ALTERNATIVE_API == 1

-

-	signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition )

-	{

-	signed portBASE_TYPE xEntryTimeSet = pdFALSE;

-	xTimeOutType xTimeOut;

-

-		configASSERT( pxQueue );

-		configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) );

-

-		for( ;; )

-		{

-			taskENTER_CRITICAL();

-			{

-				/* Is there room on the queue now?  To be running we must be

-				the highest priority task wanting to access the queue. */

-				if( pxQueue->uxMessagesWaiting < pxQueue->uxLength )

-				{

-					traceQUEUE_SEND( pxQueue );

-					prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );

-

-					/* If there was a task waiting for data to arrive on the

-					queue then unblock it now. */

-					if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )

-					{

-						if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) == pdTRUE )

-						{

-							/* The unblocked task has a priority higher than

-							our own so yield immediately. */

-							portYIELD_WITHIN_API();

-						}

-					}

-

-					taskEXIT_CRITICAL();

-					return pdPASS;

-				}

-				else

-				{

-					if( xTicksToWait == ( portTickType ) 0 )

-					{

-						taskEXIT_CRITICAL();

-						return errQUEUE_FULL;

-					}

-					else if( xEntryTimeSet == pdFALSE )

-					{

-						vTaskSetTimeOutState( &xTimeOut );

-						xEntryTimeSet = pdTRUE;

-					}

-				}

-			}

-			taskEXIT_CRITICAL();

-

-			taskENTER_CRITICAL();

-			{

-				if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )

-				{

-					if( prvIsQueueFull( pxQueue ) != pdFALSE )

-					{

-						traceBLOCKING_ON_QUEUE_SEND( pxQueue );

-						vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait );

-						portYIELD_WITHIN_API();

-					}

-				}

-				else

-				{

-					taskEXIT_CRITICAL();

-					traceQUEUE_SEND_FAILED( pxQueue );

-					return errQUEUE_FULL;

-				}

-			}

-			taskEXIT_CRITICAL();

-		}

-	}

-

-#endif /* configUSE_ALTERNATIVE_API */

-/*-----------------------------------------------------------*/

-

-#if configUSE_ALTERNATIVE_API == 1

-

-	signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking )

-	{

-	signed portBASE_TYPE xEntryTimeSet = pdFALSE;

-	xTimeOutType xTimeOut;

-	signed char *pcOriginalReadPosition;

-

-		configASSERT( pxQueue );

-		configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) );

-

-		for( ;; )

-		{

-			taskENTER_CRITICAL();

-			{

-				if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 )

-				{

-					/* Remember our read position in case we are just peeking. */

-					pcOriginalReadPosition = pxQueue->pcReadFrom;

-

-					prvCopyDataFromQueue( pxQueue, pvBuffer );

-

-					if( xJustPeeking == pdFALSE )

-					{

-						traceQUEUE_RECEIVE( pxQueue );

-

-						/* We are actually removing data. */

-						--( pxQueue->uxMessagesWaiting );

-

-						#if ( configUSE_MUTEXES == 1 )

-						{

-							if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )

-							{

-								/* Record the information required to implement

-								priority inheritance should it become necessary. */

-								pxQueue->pxMutexHolder = xTaskGetCurrentTaskHandle();

-							}

-						}

-						#endif

-

-						if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )

-						{

-							if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE )

-							{

-								portYIELD_WITHIN_API();

-							}

-						}

-					}

-					else

-					{

-						traceQUEUE_PEEK( pxQueue );

-

-						/* We are not removing the data, so reset our read

-						pointer. */

-						pxQueue->pcReadFrom = pcOriginalReadPosition;

-

-						/* The data is being left in the queue, so see if there are

-						any other tasks waiting for the data. */

-						if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )

-						{

-							/* Tasks that are removed from the event list will get added to

-							the pending ready list as the scheduler is still suspended. */

-							if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )

-							{

-								/* The task waiting has a higher priority than this task. */

-								portYIELD_WITHIN_API();

-							}

-						}

-

-					}

-

-					taskEXIT_CRITICAL();

-					return pdPASS;

-				}

-				else

-				{

-					if( xTicksToWait == ( portTickType ) 0 )

-					{

-						taskEXIT_CRITICAL();

-						traceQUEUE_RECEIVE_FAILED( pxQueue );

-						return errQUEUE_EMPTY;

-					}

-					else if( xEntryTimeSet == pdFALSE )

-					{

-						vTaskSetTimeOutState( &xTimeOut );

-						xEntryTimeSet = pdTRUE;

-					}

-				}

-			}

-			taskEXIT_CRITICAL();

-

-			taskENTER_CRITICAL();

-			{

-				if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )

-				{

-					if( prvIsQueueEmpty( pxQueue ) != pdFALSE )

-					{

-						traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue );

-

-						#if ( configUSE_MUTEXES == 1 )

-						{

-							if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )

-							{

-								portENTER_CRITICAL();

-									vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder );

-								portEXIT_CRITICAL();

-							}

-						}

-						#endif

-

-						vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );

-						portYIELD_WITHIN_API();

-					}

-				}

-				else

-				{

-					taskEXIT_CRITICAL();

-					traceQUEUE_RECEIVE_FAILED( pxQueue );

-					return errQUEUE_EMPTY;

-				}

-			}

-			taskEXIT_CRITICAL();

-		}

-	}

-

-

-#endif /* configUSE_ALTERNATIVE_API */

-/*-----------------------------------------------------------*/

-

-signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition )

-{

-signed portBASE_TYPE xReturn;

-unsigned portBASE_TYPE uxSavedInterruptStatus;

-

-	configASSERT( pxQueue );

-	configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) );

-

-	/* Similar to xQueueGenericSend, except we don't block if there is no room

-	in the queue.  Also we don't directly wake a task that was blocked on a

-	queue read, instead we return a flag to say whether a context switch is

-	required or not (i.e. has a task with a higher priority than us been woken

-	by this	post). */

-	uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();

-	{

-		if( pxQueue->uxMessagesWaiting < pxQueue->uxLength )

-		{

-			traceQUEUE_SEND_FROM_ISR( pxQueue );

-

-			prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );

-

-			/* If the queue is locked we do not alter the event list.  This will

-			be done when the queue is unlocked later. */

-			if( pxQueue->xTxLock == queueUNLOCKED )

-			{

-				if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )

-				{

-					if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )

-					{

-						/* The task waiting has a higher priority so record that a

-						context	switch is required. */

-						if( pxHigherPriorityTaskWoken != NULL )

-						{

-							*pxHigherPriorityTaskWoken = pdTRUE;

-						}

-					}

-				}

-			}

-			else

-			{

-				/* Increment the lock count so the task that unlocks the queue

-				knows that data was posted while it was locked. */

-				++( pxQueue->xTxLock );

-			}

-

-			xReturn = pdPASS;

-		}

-		else

-		{

-			traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue );

-			xReturn = errQUEUE_FULL;

-		}

-	}

-	portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );

-

-	return xReturn;

-}

-/*-----------------------------------------------------------*/

-

-signed portBASE_TYPE xQueueGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking )

-{

-signed portBASE_TYPE xEntryTimeSet = pdFALSE;

-xTimeOutType xTimeOut;

-signed char *pcOriginalReadPosition;

-

-	configASSERT( pxQueue );

-	configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) );

-

-	/* This function relaxes the coding standard somewhat to allow return

-	statements within the function itself.  This is done in the interest

-	of execution time efficiency. */

-

-	for( ;; )

-	{

-		taskENTER_CRITICAL();

-		{

-			/* Is there data in the queue now?  To be running we must be

-			the highest priority task wanting to access the queue. */

-			if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 )

-			{

-				/* Remember our read position in case we are just peeking. */

-				pcOriginalReadPosition = pxQueue->pcReadFrom;

-

-				prvCopyDataFromQueue( pxQueue, pvBuffer );

-

-				if( xJustPeeking == pdFALSE )

-				{

-					traceQUEUE_RECEIVE( pxQueue );

-

-					/* We are actually removing data. */

-					--( pxQueue->uxMessagesWaiting );

-

-					#if ( configUSE_MUTEXES == 1 )

-					{

-						if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )

-						{

-							/* Record the information required to implement

-							priority inheritance should it become necessary. */

-							pxQueue->pxMutexHolder = xTaskGetCurrentTaskHandle();

-						}

-					}

-					#endif

-

-					if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )

-					{

-						if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE )

-						{

-							portYIELD_WITHIN_API();

-						}

-					}

-				}

-				else

-				{

-					traceQUEUE_PEEK( pxQueue );

-

-					/* We are not removing the data, so reset our read

-					pointer. */

-					pxQueue->pcReadFrom = pcOriginalReadPosition;

-

-					/* The data is being left in the queue, so see if there are

-					any other tasks waiting for the data. */

-					if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )

-					{

-						/* Tasks that are removed from the event list will get added to

-						the pending ready list as the scheduler is still suspended. */

-						if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )

-						{

-							/* The task waiting has a higher priority than this task. */

-							portYIELD_WITHIN_API();

-						}

-					}

-				}

-

-				taskEXIT_CRITICAL();

-				return pdPASS;

-			}

-			else

-			{

-				if( xTicksToWait == ( portTickType ) 0 )

-				{

-					/* The queue was empty and no block time is specified (or

-					the block time has expired) so leave now. */

-					taskEXIT_CRITICAL();

-					traceQUEUE_RECEIVE_FAILED( pxQueue );

-					return errQUEUE_EMPTY;

-				}

-				else if( xEntryTimeSet == pdFALSE )

-				{

-					/* The queue was empty and a block time was specified so

-					configure the timeout structure. */

-					vTaskSetTimeOutState( &xTimeOut );

-					xEntryTimeSet = pdTRUE;

-				}

-			}

-		}

-		taskEXIT_CRITICAL();

-

-		/* Interrupts and other tasks can send to and receive from the queue

-		now the critical section has been exited. */

-

-		vTaskSuspendAll();

-		prvLockQueue( pxQueue );

-

-		/* Update the timeout state to see if it has expired yet. */

-		if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )

-		{

-			if( prvIsQueueEmpty( pxQueue ) != pdFALSE )

-			{

-				traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue );

-

-				#if ( configUSE_MUTEXES == 1 )

-				{

-					if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )

-					{

-						portENTER_CRITICAL();

-						{

-							vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder );

-						}

-						portEXIT_CRITICAL();

-					}

-				}

-				#endif

-

-				vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );

-				prvUnlockQueue( pxQueue );

-				if( xTaskResumeAll() == pdFALSE )

-				{

-					portYIELD_WITHIN_API();

-				}

-			}

-			else

-			{

-				/* Try again. */

-				prvUnlockQueue( pxQueue );

-				( void ) xTaskResumeAll();

-			}

-		}

-		else

-		{

-			prvUnlockQueue( pxQueue );

-			( void ) xTaskResumeAll();

-			traceQUEUE_RECEIVE_FAILED( pxQueue );

-			return errQUEUE_EMPTY;

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxHigherPriorityTaskWoken )

-{

-signed portBASE_TYPE xReturn;

-unsigned portBASE_TYPE uxSavedInterruptStatus;

-

-	configASSERT( pxQueue );

-	configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) );

-

-	uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();

-	{

-		/* We cannot block from an ISR, so check there is data available. */

-		if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 )

-		{

-			traceQUEUE_RECEIVE_FROM_ISR( pxQueue );

-

-			prvCopyDataFromQueue( pxQueue, pvBuffer );

-			--( pxQueue->uxMessagesWaiting );

-

-			/* If the queue is locked we will not modify the event list.  Instead

-			we update the lock count so the task that unlocks the queue will know

-			that an ISR has removed data while the queue was locked. */

-			if( pxQueue->xRxLock == queueUNLOCKED )

-			{

-				if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )

-				{

-					if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )

-					{

-						/* The task waiting has a higher priority than us so

-						force a context switch. */

-						if( pxHigherPriorityTaskWoken != NULL )

-						{

-							*pxHigherPriorityTaskWoken = pdTRUE;

-						}

-					}

-				}

-			}

-			else

-			{

-				/* Increment the lock count so the task that unlocks the queue

-				knows that data was removed while it was locked. */

-				++( pxQueue->xRxLock );

-			}

-

-			xReturn = pdPASS;

-		}

-		else

-		{

-			xReturn = pdFAIL;

-			traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue );

-		}

-	}

-	portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );

-

-	return xReturn;

-}

-/*-----------------------------------------------------------*/

-

-unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle pxQueue )

-{

-unsigned portBASE_TYPE uxReturn;

-

-	configASSERT( pxQueue );

-

-	taskENTER_CRITICAL();

-		uxReturn = pxQueue->uxMessagesWaiting;

-	taskEXIT_CRITICAL();

-

-	return uxReturn;

-}

-/*-----------------------------------------------------------*/

-

-unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle pxQueue )

-{

-unsigned portBASE_TYPE uxReturn;

-

-	configASSERT( pxQueue );

-

-	uxReturn = pxQueue->uxMessagesWaiting;

-

-	return uxReturn;

-}

-/*-----------------------------------------------------------*/

-

-void vQueueDelete( xQueueHandle pxQueue )

-{

-	configASSERT( pxQueue );

-

-	traceQUEUE_DELETE( pxQueue );

-	vQueueUnregisterQueue( pxQueue );

-	vPortFree( pxQueue->pcHead );

-	vPortFree( pxQueue );

-}

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_TRACE_FACILITY == 1 )

-

-	unsigned char ucQueueGetQueueNumber( xQueueHandle pxQueue )

-	{

-		return pxQueue->ucQueueNumber;

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_TRACE_FACILITY == 1 )

-

-	void vQueueSetQueueNumber( xQueueHandle pxQueue, unsigned char ucQueueNumber )

-	{

-		pxQueue->ucQueueNumber = ucQueueNumber;

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_TRACE_FACILITY == 1 )

-

-	unsigned char ucQueueGetQueueType( xQueueHandle pxQueue )

-	{

-		return pxQueue->ucQueueType;

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-static void prvCopyDataToQueue( xQUEUE *pxQueue, const void *pvItemToQueue, portBASE_TYPE xPosition )

-{

-	if( pxQueue->uxItemSize == ( unsigned portBASE_TYPE ) 0 )

-	{

-		#if ( configUSE_MUTEXES == 1 )

-		{

-			if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )

-			{

-				/* The mutex is no longer being held. */

-				vTaskPriorityDisinherit( ( void * ) pxQueue->pxMutexHolder );

-				pxQueue->pxMutexHolder = NULL;

-			}

-		}

-		#endif

-	}

-	else if( xPosition == queueSEND_TO_BACK )

-	{

-		memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( unsigned ) pxQueue->uxItemSize );

-		pxQueue->pcWriteTo += pxQueue->uxItemSize;

-		if( pxQueue->pcWriteTo >= pxQueue->pcTail )

-		{

-			pxQueue->pcWriteTo = pxQueue->pcHead;

-		}

-	}

-	else

-	{

-		memcpy( ( void * ) pxQueue->pcReadFrom, pvItemToQueue, ( unsigned ) pxQueue->uxItemSize );

-		pxQueue->pcReadFrom -= pxQueue->uxItemSize;

-		if( pxQueue->pcReadFrom < pxQueue->pcHead )

-		{

-			pxQueue->pcReadFrom = ( pxQueue->pcTail - pxQueue->uxItemSize );

-		}

-	}

-

-	++( pxQueue->uxMessagesWaiting );

-}

-/*-----------------------------------------------------------*/

-

-static void prvCopyDataFromQueue( xQUEUE * const pxQueue, const void *pvBuffer )

-{

-	if( pxQueue->uxQueueType != queueQUEUE_IS_MUTEX )

-	{

-		pxQueue->pcReadFrom += pxQueue->uxItemSize;

-		if( pxQueue->pcReadFrom >= pxQueue->pcTail )

-		{

-			pxQueue->pcReadFrom = pxQueue->pcHead;

-		}

-		memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize );

-	}

-}

-/*-----------------------------------------------------------*/

-

-static void prvUnlockQueue( xQueueHandle pxQueue )

-{

-	/* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */

-

-	/* The lock counts contains the number of extra data items placed or

-	removed from the queue while the queue was locked.  When a queue is

-	locked items can be added or removed, but the event lists cannot be

-	updated. */

-	taskENTER_CRITICAL();

-	{

-		/* See if data was added to the queue while it was locked. */

-		while( pxQueue->xTxLock > queueLOCKED_UNMODIFIED )

-		{

-			/* Data was posted while the queue was locked.  Are any tasks

-			blocked waiting for data to become available? */

-			if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )

-			{

-				/* Tasks that are removed from the event list will get added to

-				the pending ready list as the scheduler is still suspended. */

-				if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )

-				{

-					/* The task waiting has a higher priority so record that a

-					context	switch is required. */

-					vTaskMissedYield();

-				}

-

-				--( pxQueue->xTxLock );

-			}

-			else

-			{

-				break;

-			}

-		}

-

-		pxQueue->xTxLock = queueUNLOCKED;

-	}

-	taskEXIT_CRITICAL();

-

-	/* Do the same for the Rx lock. */

-	taskENTER_CRITICAL();

-	{

-		while( pxQueue->xRxLock > queueLOCKED_UNMODIFIED )

-		{

-			if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )

-			{

-				if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )

-				{

-					vTaskMissedYield();

-				}

-

-				--( pxQueue->xRxLock );

-			}

-			else

-			{

-				break;

-			}

-		}

-

-		pxQueue->xRxLock = queueUNLOCKED;

-	}

-	taskEXIT_CRITICAL();

-}

-/*-----------------------------------------------------------*/

-

-static signed portBASE_TYPE prvIsQueueEmpty( const xQueueHandle pxQueue )

-{

-signed portBASE_TYPE xReturn;

-

-	taskENTER_CRITICAL();

-		xReturn = ( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 );

-	taskEXIT_CRITICAL();

-

-	return xReturn;

-}

-/*-----------------------------------------------------------*/

-

-signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle pxQueue )

-{

-signed portBASE_TYPE xReturn;

-

-	configASSERT( pxQueue );

-	xReturn = ( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 );

-

-	return xReturn;

-}

-/*-----------------------------------------------------------*/

-

-static signed portBASE_TYPE prvIsQueueFull( const xQueueHandle pxQueue )

-{

-signed portBASE_TYPE xReturn;

-

-	taskENTER_CRITICAL();

-		xReturn = ( pxQueue->uxMessagesWaiting == pxQueue->uxLength );

-	taskEXIT_CRITICAL();

-

-	return xReturn;

-}

-/*-----------------------------------------------------------*/

-

-signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle pxQueue )

-{

-signed portBASE_TYPE xReturn;

-

-	configASSERT( pxQueue );

-	xReturn = ( pxQueue->uxMessagesWaiting == pxQueue->uxLength );

-

-	return xReturn;

-}

-/*-----------------------------------------------------------*/

-

-#if configUSE_CO_ROUTINES == 1

-signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQueue, portTickType xTicksToWait )

-{

-signed portBASE_TYPE xReturn;

-

-	/* If the queue is already full we may have to block.  A critical section

-	is required to prevent an interrupt removing something from the queue

-	between the check to see if the queue is full and blocking on the queue. */

-	portDISABLE_INTERRUPTS();

-	{

-		if( prvIsQueueFull( pxQueue ) != pdFALSE )

-		{

-			/* The queue is full - do we want to block or just leave without

-			posting? */

-			if( xTicksToWait > ( portTickType ) 0 )

-			{

-				/* As this is called from a coroutine we cannot block directly, but

-				return indicating that we need to block. */

-				vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToSend ) );

-				portENABLE_INTERRUPTS();

-				return errQUEUE_BLOCKED;

-			}

-			else

-			{

-				portENABLE_INTERRUPTS();

-				return errQUEUE_FULL;

-			}

-		}

-	}

-	portENABLE_INTERRUPTS();

-

-	portNOP();

-

-	portDISABLE_INTERRUPTS();

-	{

-		if( pxQueue->uxMessagesWaiting < pxQueue->uxLength )

-		{

-			/* There is room in the queue, copy the data into the queue. */

-			prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK );

-			xReturn = pdPASS;

-

-			/* Were any co-routines waiting for data to become available? */

-			if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )

-			{

-				/* In this instance the co-routine could be placed directly

-				into the ready list as we are within a critical section.

-				Instead the same pending ready list mechanism is used as if

-				the event were caused from within an interrupt. */

-				if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )

-				{

-					/* The co-routine waiting has a higher priority so record

-					that a yield might be appropriate. */

-					xReturn = errQUEUE_YIELD;

-				}

-			}

-		}

-		else

-		{

-			xReturn = errQUEUE_FULL;

-		}

-	}

-	portENABLE_INTERRUPTS();

-

-	return xReturn;

-}

-#endif

-/*-----------------------------------------------------------*/

-

-#if configUSE_CO_ROUTINES == 1

-signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait )

-{

-signed portBASE_TYPE xReturn;

-

-	/* If the queue is already empty we may have to block.  A critical section

-	is required to prevent an interrupt adding something to the queue

-	between the check to see if the queue is empty and blocking on the queue. */

-	portDISABLE_INTERRUPTS();

-	{

-		if( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 )

-		{

-			/* There are no messages in the queue, do we want to block or just

-			leave with nothing? */

-			if( xTicksToWait > ( portTickType ) 0 )

-			{

-				/* As this is a co-routine we cannot block directly, but return

-				indicating that we need to block. */

-				vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToReceive ) );

-				portENABLE_INTERRUPTS();

-				return errQUEUE_BLOCKED;

-			}

-			else

-			{

-				portENABLE_INTERRUPTS();

-				return errQUEUE_FULL;

-			}

-		}

-	}

-	portENABLE_INTERRUPTS();

-

-	portNOP();

-

-	portDISABLE_INTERRUPTS();

-	{

-		if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 )

-		{

-			/* Data is available from the queue. */

-			pxQueue->pcReadFrom += pxQueue->uxItemSize;

-			if( pxQueue->pcReadFrom >= pxQueue->pcTail )

-			{

-				pxQueue->pcReadFrom = pxQueue->pcHead;

-			}

-			--( pxQueue->uxMessagesWaiting );

-			memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize );

-

-			xReturn = pdPASS;

-

-			/* Were any co-routines waiting for space to become available? */

-			if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )

-			{

-				/* In this instance the co-routine could be placed directly

-				into the ready list as we are within a critical section.

-				Instead the same pending ready list mechanism is used as if

-				the event were caused from within an interrupt. */

-				if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )

-				{

-					xReturn = errQUEUE_YIELD;

-				}

-			}

-		}

-		else

-		{

-			xReturn = pdFAIL;

-		}

-	}

-	portENABLE_INTERRUPTS();

-

-	return xReturn;

-}

-#endif

-/*-----------------------------------------------------------*/

-

-

-

-#if configUSE_CO_ROUTINES == 1

-signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken )

-{

-	/* Cannot block within an ISR so if there is no space on the queue then

-	exit without doing anything. */

-	if( pxQueue->uxMessagesWaiting < pxQueue->uxLength )

-	{

-		prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK );

-

-		/* We only want to wake one co-routine per ISR, so check that a

-		co-routine has not already been woken. */

-		if( xCoRoutinePreviouslyWoken == pdFALSE )

-		{

-			if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )

-			{

-				if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )

-				{

-					return pdTRUE;

-				}

-			}

-		}

-	}

-

-	return xCoRoutinePreviouslyWoken;

-}

-#endif

-/*-----------------------------------------------------------*/

-

-#if configUSE_CO_ROUTINES == 1

-signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle pxQueue, void *pvBuffer, signed portBASE_TYPE *pxCoRoutineWoken )

-{

-signed portBASE_TYPE xReturn;

-

-	/* We cannot block from an ISR, so check there is data available. If

-	not then just leave without doing anything. */

-	if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 )

-	{

-		/* Copy the data from the queue. */

-		pxQueue->pcReadFrom += pxQueue->uxItemSize;

-		if( pxQueue->pcReadFrom >= pxQueue->pcTail )

-		{

-			pxQueue->pcReadFrom = pxQueue->pcHead;

-		}

-		--( pxQueue->uxMessagesWaiting );

-		memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->pcReadFrom, ( unsigned ) pxQueue->uxItemSize );

-

-		if( ( *pxCoRoutineWoken ) == pdFALSE )

-		{

-			if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )

-			{

-				if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )

-				{

-					*pxCoRoutineWoken = pdTRUE;

-				}

-			}

-		}

-

-		xReturn = pdPASS;

-	}

-	else

-	{

-		xReturn = pdFAIL;

-	}

-

-	return xReturn;

-}

-#endif

-/*-----------------------------------------------------------*/

-

-#if configQUEUE_REGISTRY_SIZE > 0

-

-	void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcQueueName )

-	{

-	unsigned portBASE_TYPE ux;

-

-		/* See if there is an empty space in the registry.  A NULL name denotes

-		a free slot. */

-		for( ux = ( unsigned portBASE_TYPE ) 0U; ux < ( unsigned portBASE_TYPE ) configQUEUE_REGISTRY_SIZE; ux++ )

-		{

-			if( xQueueRegistry[ ux ].pcQueueName == NULL )

-			{

-				/* Store the information on this queue. */

-				xQueueRegistry[ ux ].pcQueueName = pcQueueName;

-				xQueueRegistry[ ux ].xHandle = xQueue;

-				break;

-			}

-		}

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if configQUEUE_REGISTRY_SIZE > 0

-

-	static void vQueueUnregisterQueue( xQueueHandle xQueue )

-	{

-	unsigned portBASE_TYPE ux;

-

-		/* See if the handle of the queue being unregistered in actually in the

-		registry. */

-		for( ux = ( unsigned portBASE_TYPE ) 0U; ux < ( unsigned portBASE_TYPE ) configQUEUE_REGISTRY_SIZE; ux++ )

-		{

-			if( xQueueRegistry[ ux ].xHandle == xQueue )

-			{

-				/* Set the name to NULL to show that this slot if free again. */

-				xQueueRegistry[ ux ].pcQueueName = NULL;

-				break;

-			}

-		}

-

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if configUSE_TIMERS == 1

-

-	void vQueueWaitForMessageRestricted( xQueueHandle pxQueue, portTickType xTicksToWait )

-	{

-		/* This function should not be called by application code hence the

-		'Restricted' in its name.  It is not part of the public API.  It is

-		designed for use by kernel code, and has special calling requirements.

-		It can result in vListInsert() being called on a list that can only

-		possibly ever have one item in it, so the list will be fast, but even

-		so it should be called with the scheduler locked and not from a critical

-		section. */

-

-		/* Only do anything if there are no messages in the queue.  This function

-		will not actually cause the task to block, just place it on a blocked

-		list.  It will not block until the scheduler is unlocked - at which

-		time a yield will be performed.  If an item is added to the queue while

-		the queue is locked, and the calling task blocks on the queue, then the

-		calling task will be immediately unblocked when the queue is unlocked. */

-		prvLockQueue( pxQueue );

-		if( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0U )

-		{

-			/* There is nothing in the queue, block for the specified period. */

-			vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );

-		}

-		prvUnlockQueue( pxQueue );

-	}

-

-#endif

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/tasks.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/tasks.c
deleted file mode 100644
index 85e41a0..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/tasks.c
+++ /dev/null
@@ -1,2480 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-	

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-

-#include <stdio.h>

-#include <stdlib.h>

-#include <string.h>

-

-/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining

-all the API functions to use the MPU wrappers.  That should only be done when

-task.h is included from an application file. */

-#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE

-

-#include "FreeRTOS.h"

-#include "task.h"

-#include "timers.h"

-#include "StackMacros.h"

-

-#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE

-

-/*

- * Macro to define the amount of stack available to the idle task.

- */

-#define tskIDLE_STACK_SIZE	configMINIMAL_STACK_SIZE

-

-/*

- * Task control block.  A task control block (TCB) is allocated to each task,

- * and stores the context of the task.

- */

-typedef struct tskTaskControlBlock

-{

-	volatile portSTACK_TYPE	*pxTopOfStack;		/*< Points to the location of the last item placed on the tasks stack.  THIS MUST BE THE FIRST MEMBER OF THE STRUCT. */

-

-	#if ( portUSING_MPU_WRAPPERS == 1 )

-		xMPU_SETTINGS xMPUSettings;				/*< The MPU settings are defined as part of the port layer.  THIS MUST BE THE SECOND MEMBER OF THE STRUCT. */

-	#endif	

-	

-	xListItem				xGenericListItem;	/*< List item used to place the TCB in ready and blocked queues. */

-	xListItem				xEventListItem;		/*< List item used to place the TCB in event lists. */

-	unsigned portBASE_TYPE	uxPriority;			/*< The priority of the task where 0 is the lowest priority. */

-	portSTACK_TYPE			*pxStack;			/*< Points to the start of the stack. */

-	signed char				pcTaskName[ configMAX_TASK_NAME_LEN ];/*< Descriptive name given to the task when created.  Facilitates debugging only. */

-

-	#if ( portSTACK_GROWTH > 0 )

-		portSTACK_TYPE *pxEndOfStack;			/*< Used for stack overflow checking on architectures where the stack grows up from low memory. */

-	#endif

-

-	#if ( portCRITICAL_NESTING_IN_TCB == 1 )

-		unsigned portBASE_TYPE uxCriticalNesting;

-	#endif

-

-	#if ( configUSE_TRACE_FACILITY == 1 )

-		unsigned portBASE_TYPE	uxTCBNumber;	/*< This stores a number that increments each time a TCB is created.  It allows debuggers to determine when a task has been deleted and then recreated. */

-		unsigned portBASE_TYPE  uxTaskNumber;	/*< This stores a number specifically for use by third party trace code. */

-	#endif

-

-	#if ( configUSE_MUTEXES == 1 )

-		unsigned portBASE_TYPE uxBasePriority;	/*< The priority last assigned to the task - used by the priority inheritance mechanism. */

-	#endif

-

-	#if ( configUSE_APPLICATION_TASK_TAG == 1 )

-		pdTASK_HOOK_CODE pxTaskTag;

-	#endif

-

-	#if ( configGENERATE_RUN_TIME_STATS == 1 )

-		unsigned long ulRunTimeCounter;		/*< Used for calculating how much CPU time each task is utilising. */

-	#endif

-

-} tskTCB;

-

-

-/*

- * Some kernel aware debuggers require data to be viewed to be global, rather

- * than file scope.

- */

-#ifdef portREMOVE_STATIC_QUALIFIER

-	#define static

-#endif

-

-/*lint -e956 */

-PRIVILEGED_DATA tskTCB * volatile pxCurrentTCB = NULL;

-

-/* Lists for ready and blocked tasks. --------------------*/

-

-PRIVILEGED_DATA static xList pxReadyTasksLists[ configMAX_PRIORITIES ];	/*< Prioritised ready tasks. */

-PRIVILEGED_DATA static xList xDelayedTaskList1;							/*< Delayed tasks. */

-PRIVILEGED_DATA static xList xDelayedTaskList2;							/*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */

-PRIVILEGED_DATA static xList * volatile pxDelayedTaskList ;				/*< Points to the delayed task list currently being used. */

-PRIVILEGED_DATA static xList * volatile pxOverflowDelayedTaskList;		/*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */

-PRIVILEGED_DATA static xList xPendingReadyList;							/*< Tasks that have been readied while the scheduler was suspended.  They will be moved to the ready queue when the scheduler is resumed. */

-

-#if ( INCLUDE_vTaskDelete == 1 )

-

-	PRIVILEGED_DATA static xList xTasksWaitingTermination;				/*< Tasks that have been deleted - but the their memory not yet freed. */

-	PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxTasksDeleted = ( unsigned portBASE_TYPE ) 0U;

-

-#endif

-

-#if ( INCLUDE_vTaskSuspend == 1 )

-

-	PRIVILEGED_DATA static xList xSuspendedTaskList;					/*< Tasks that are currently suspended. */

-

-#endif

-

-#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )

-	

-	PRIVILEGED_DATA static xTaskHandle xIdleTaskHandle = NULL;

-	

-#endif

-

-/* File private variables. --------------------------------*/

-PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxCurrentNumberOfTasks 	= ( unsigned portBASE_TYPE ) 0U;

-PRIVILEGED_DATA static volatile portTickType xTickCount 						= ( portTickType ) 0U;

-PRIVILEGED_DATA static unsigned portBASE_TYPE uxTopUsedPriority	 				= tskIDLE_PRIORITY;

-PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxTopReadyPriority 		= tskIDLE_PRIORITY;

-PRIVILEGED_DATA static volatile signed portBASE_TYPE xSchedulerRunning 			= pdFALSE;

-PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxSchedulerSuspended	 	= ( unsigned portBASE_TYPE ) pdFALSE;

-PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxMissedTicks 			= ( unsigned portBASE_TYPE ) 0U;

-PRIVILEGED_DATA static volatile portBASE_TYPE xMissedYield 						= ( portBASE_TYPE ) pdFALSE;

-PRIVILEGED_DATA static volatile portBASE_TYPE xNumOfOverflows 					= ( portBASE_TYPE ) 0;

-PRIVILEGED_DATA static unsigned portBASE_TYPE uxTaskNumber 						= ( unsigned portBASE_TYPE ) 0U;

-PRIVILEGED_DATA static portTickType xNextTaskUnblockTime						= ( portTickType ) portMAX_DELAY;

-

-#if ( configGENERATE_RUN_TIME_STATS == 1 )

-

-	PRIVILEGED_DATA static char pcStatsString[ 50 ] ;

-	PRIVILEGED_DATA static unsigned long ulTaskSwitchedInTime = 0UL;	/*< Holds the value of a timer/counter the last time a task was switched in. */

-	static void prvGenerateRunTimeStatsForTasksInList( const signed char *pcWriteBuffer, xList *pxList, unsigned long ulTotalRunTime ) PRIVILEGED_FUNCTION;

-

-#endif

-

-/* Debugging and trace facilities private variables and macros. ------------*/

-

-/*

- * The value used to fill the stack of a task when the task is created.  This

- * is used purely for checking the high water mark for tasks.

- */

-#define tskSTACK_FILL_BYTE	( 0xa5U )

-

-/*

- * Macros used by vListTask to indicate which state a task is in.

- */

-#define tskBLOCKED_CHAR		( ( signed char ) 'B' )

-#define tskREADY_CHAR		( ( signed char ) 'R' )

-#define tskDELETED_CHAR		( ( signed char ) 'D' )

-#define tskSUSPENDED_CHAR	( ( signed char ) 'S' )

-

-/*-----------------------------------------------------------*/

-

-/*

- * Place the task represented by pxTCB into the appropriate ready queue for

- * the task.  It is inserted at the end of the list.  One quirk of this is

- * that if the task being inserted is at the same priority as the currently

- * executing task, then it will only be rescheduled after the currently

- * executing task has been rescheduled.

- */

-#define prvAddTaskToReadyQueue( pxTCB )																					\

-	traceMOVED_TASK_TO_READY_STATE( pxTCB )																				\

-	if( ( pxTCB )->uxPriority > uxTopReadyPriority )																	\

-	{																													\

-		uxTopReadyPriority = ( pxTCB )->uxPriority;																		\

-	}																													\

-	vListInsertEnd( ( xList * ) &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xGenericListItem ) )

-/*-----------------------------------------------------------*/

-

-/*

- * Macro that looks at the list of tasks that are currently delayed to see if

- * any require waking.

- *

- * Tasks are stored in the queue in the order of their wake time - meaning

- * once one tasks has been found whose timer has not expired we need not look

- * any further down the list.

- */

-#define prvCheckDelayedTasks()															\

-{																						\

-portTickType xItemValue;																\

-																						\

-	/* Is the tick count greater than or equal to the wake time of the first			\

-	task referenced from the delayed tasks list? */										\

-	if( xTickCount >= xNextTaskUnblockTime )											\

-	{																					\

-		for( ;; )																		\

-		{																				\

-			if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )						\

-			{																			\

-				/* The delayed list is empty.  Set xNextTaskUnblockTime to the			\

-				maximum possible value so it is extremely unlikely that the				\

-				if( xTickCount >= xNextTaskUnblockTime ) test will pass next			\

-				time through. */														\

-				xNextTaskUnblockTime = portMAX_DELAY;									\

-				break;																	\

-			}																			\

-			else																		\

-			{																			\

-				/* The delayed list is not empty, get the value of the item at			\

-				the head of the delayed list.  This is the time at which the			\

-				task at the head of the delayed list should be removed from				\

-				the Blocked state. */													\

-				pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );	\

-				xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xGenericListItem ) );	\

-																						\

-				if( xTickCount < xItemValue )											\

-				{																		\

-					/* It is not time to unblock this item yet, but the item			\

-					value is the time at which the task at the head of the				\

-					blocked list should be removed from the Blocked state -				\

-					so record the item value in xNextTaskUnblockTime. */				\

-					xNextTaskUnblockTime = xItemValue;									\

-					break;																\

-				}																		\

-																						\

-				/* It is time to remove the item from the Blocked state. */				\

-				vListRemove( &( pxTCB->xGenericListItem ) );							\

-																						\

-				/* Is the task waiting on an event also? */								\

-				if( pxTCB->xEventListItem.pvContainer != NULL )							\

-				{																		\

-					vListRemove( &( pxTCB->xEventListItem ) );							\

-				}																		\

-				prvAddTaskToReadyQueue( pxTCB );										\

-			}																			\

-		}																				\

-	}																					\

-}

-/*-----------------------------------------------------------*/

-

-/*

- * Several functions take an xTaskHandle parameter that can optionally be NULL,

- * where NULL is used to indicate that the handle of the currently executing

- * task should be used in place of the parameter.  This macro simply checks to

- * see if the parameter is NULL and returns a pointer to the appropriate TCB.

- */

-#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? ( tskTCB * ) pxCurrentTCB : ( tskTCB * ) ( pxHandle ) )

-

-/* Callback function prototypes. --------------------------*/

-extern void vApplicationStackOverflowHook( xTaskHandle pxTask, signed char *pcTaskName );

-extern void vApplicationTickHook( void );

-		

-/* File private functions. --------------------------------*/

-

-/*

- * Utility to ready a TCB for a given task.  Mainly just copies the parameters

- * into the TCB structure.

- */

-static void prvInitialiseTCBVariables( tskTCB *pxTCB, const signed char * const pcName, unsigned portBASE_TYPE uxPriority, const xMemoryRegion * const xRegions, unsigned short usStackDepth ) PRIVILEGED_FUNCTION;

-

-/*

- * Utility to ready all the lists used by the scheduler.  This is called

- * automatically upon the creation of the first task.

- */

-static void prvInitialiseTaskLists( void ) PRIVILEGED_FUNCTION;

-

-/*

- * The idle task, which as all tasks is implemented as a never ending loop.

- * The idle task is automatically created and added to the ready lists upon

- * creation of the first user task.

- *

- * The portTASK_FUNCTION_PROTO() macro is used to allow port/compiler specific

- * language extensions.  The equivalent prototype for this function is:

- *

- * void prvIdleTask( void *pvParameters );

- *

- */

-static portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters );

-

-/*

- * Utility to free all memory allocated by the scheduler to hold a TCB,

- * including the stack pointed to by the TCB.

- *

- * This does not free memory allocated by the task itself (i.e. memory

- * allocated by calls to pvPortMalloc from within the tasks application code).

- */

-#if ( INCLUDE_vTaskDelete == 1 )

-

-	static void prvDeleteTCB( tskTCB *pxTCB ) PRIVILEGED_FUNCTION;

-

-#endif

-

-/*

- * Used only by the idle task.  This checks to see if anything has been placed

- * in the list of tasks waiting to be deleted.  If so the task is cleaned up

- * and its TCB deleted.

- */

-static void prvCheckTasksWaitingTermination( void ) PRIVILEGED_FUNCTION;

-

-/*

- * The currently executing task is entering the Blocked state.  Add the task to

- * either the current or the overflow delayed task list.

- */

-static void prvAddCurrentTaskToDelayedList( portTickType xTimeToWake ) PRIVILEGED_FUNCTION;

-

-/*

- * Allocates memory from the heap for a TCB and associated stack.  Checks the

- * allocation was successful.

- */

-static tskTCB *prvAllocateTCBAndStack( unsigned short usStackDepth, portSTACK_TYPE *puxStackBuffer ) PRIVILEGED_FUNCTION;

-

-/*

- * Called from vTaskList.  vListTasks details all the tasks currently under

- * control of the scheduler.  The tasks may be in one of a number of lists.

- * prvListTaskWithinSingleList accepts a list and details the tasks from

- * within just that list.

- *

- * THIS FUNCTION IS INTENDED FOR DEBUGGING ONLY, AND SHOULD NOT BE CALLED FROM

- * NORMAL APPLICATION CODE.

- */

-#if ( configUSE_TRACE_FACILITY == 1 )

-

-	static void prvListTaskWithinSingleList( const signed char *pcWriteBuffer, xList *pxList, signed char cStatus ) PRIVILEGED_FUNCTION;

-

-#endif

-

-/*

- * When a task is created, the stack of the task is filled with a known value.

- * This function determines the 'high water mark' of the task stack by

- * determining how much of the stack remains at the original preset value.

- */

-#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) )

-

-	static unsigned short usTaskCheckFreeStackSpace( const unsigned char * pucStackByte ) PRIVILEGED_FUNCTION;

-

-#endif

-

-

-/*lint +e956 */

-

-

-

-/*-----------------------------------------------------------

- * TASK CREATION API documented in task.h

- *----------------------------------------------------------*/

-

-signed portBASE_TYPE xTaskGenericCreate( pdTASK_CODE pxTaskCode, const signed char * const pcName, unsigned short usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask, portSTACK_TYPE *puxStackBuffer, const xMemoryRegion * const xRegions )

-{

-signed portBASE_TYPE xReturn;

-tskTCB * pxNewTCB;

-

-	configASSERT( pxTaskCode );

-	configASSERT( ( uxPriority < configMAX_PRIORITIES ) );

-

-	/* Allocate the memory required by the TCB and stack for the new task,

-	checking that the allocation was successful. */

-	pxNewTCB = prvAllocateTCBAndStack( usStackDepth, puxStackBuffer );

-

-	if( pxNewTCB != NULL )

-	{

-		portSTACK_TYPE *pxTopOfStack;

-

-		#if( portUSING_MPU_WRAPPERS == 1 )

-			/* Should the task be created in privileged mode? */

-			portBASE_TYPE xRunPrivileged;

-			if( ( uxPriority & portPRIVILEGE_BIT ) != 0U )

-			{

-				xRunPrivileged = pdTRUE;

-			}

-			else

-			{

-				xRunPrivileged = pdFALSE;

-			}

-			uxPriority &= ~portPRIVILEGE_BIT;

-		#endif /* portUSING_MPU_WRAPPERS == 1 */

-

-		/* Calculate the top of stack address.  This depends on whether the

-		stack grows from high memory to low (as per the 80x86) or visa versa.

-		portSTACK_GROWTH is used to make the result positive or negative as

-		required by the port. */

-		#if( portSTACK_GROWTH < 0 )

-		{

-			pxTopOfStack = pxNewTCB->pxStack + ( usStackDepth - ( unsigned short ) 1 );

-			pxTopOfStack = ( portSTACK_TYPE * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ( portPOINTER_SIZE_TYPE ) ~portBYTE_ALIGNMENT_MASK  ) );

-

-			/* Check the alignment of the calculated top of stack is correct. */

-			configASSERT( ( ( ( unsigned long ) pxTopOfStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) );

-		}

-		#else

-		{

-			pxTopOfStack = pxNewTCB->pxStack;

-			

-			/* Check the alignment of the stack buffer is correct. */

-			configASSERT( ( ( ( unsigned long ) pxNewTCB->pxStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) );

-

-			/* If we want to use stack checking on architectures that use

-			a positive stack growth direction then we also need to store the

-			other extreme of the stack space. */

-			pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( usStackDepth - 1 );

-		}

-		#endif

-

-		/* Setup the newly allocated TCB with the initial state of the task. */

-		prvInitialiseTCBVariables( pxNewTCB, pcName, uxPriority, xRegions, usStackDepth );

-

-		/* Initialize the TCB stack to look as if the task was already running,

-		but had been interrupted by the scheduler.  The return address is set

-		to the start of the task function. Once the stack has been initialised

-		the	top of stack variable is updated. */

-		#if( portUSING_MPU_WRAPPERS == 1 )

-		{

-			pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged );

-		}

-		#else

-		{

-			pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters );

-		}

-		#endif

-

-		/* Check the alignment of the initialised stack. */

-		portALIGNMENT_ASSERT_pxCurrentTCB( ( ( ( unsigned long ) pxNewTCB->pxTopOfStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) );

-

-		if( ( void * ) pxCreatedTask != NULL )

-		{

-			/* Pass the TCB out - in an anonymous way.  The calling function/

-			task can use this as a handle to delete the task later if

-			required.*/

-			*pxCreatedTask = ( xTaskHandle ) pxNewTCB;

-		}

-		

-		/* We are going to manipulate the task queues to add this task to a

-		ready list, so must make sure no interrupts occur. */

-		taskENTER_CRITICAL();

-		{

-			uxCurrentNumberOfTasks++;

-			if( pxCurrentTCB == NULL )

-			{

-				/* There are no other tasks, or all the other tasks are in

-				the suspended state - make this the current task. */

-				pxCurrentTCB =  pxNewTCB;

-

-				if( uxCurrentNumberOfTasks == ( unsigned portBASE_TYPE ) 1 )

-				{

-					/* This is the first task to be created so do the preliminary

-					initialisation required.  We will not recover if this call

-					fails, but we will report the failure. */

-					prvInitialiseTaskLists();

-				}

-			}

-			else

-			{

-				/* If the scheduler is not already running, make this task the

-				current task if it is the highest priority task to be created

-				so far. */

-				if( xSchedulerRunning == pdFALSE )

-				{

-					if( pxCurrentTCB->uxPriority <= uxPriority )

-					{

-						pxCurrentTCB = pxNewTCB;

-					}

-				}

-			}

-

-			/* Remember the top priority to make context switching faster.  Use

-			the priority in pxNewTCB as this has been capped to a valid value. */

-			if( pxNewTCB->uxPriority > uxTopUsedPriority )

-			{

-				uxTopUsedPriority = pxNewTCB->uxPriority;

-			}

-

-			#if ( configUSE_TRACE_FACILITY == 1 )

-			{

-				/* Add a counter into the TCB for tracing only. */

-				pxNewTCB->uxTCBNumber = uxTaskNumber;

-			}

-			#endif

-			uxTaskNumber++;

-

-			prvAddTaskToReadyQueue( pxNewTCB );

-

-			xReturn = pdPASS;

-			portSETUP_TCB( pxNewTCB );

-			traceTASK_CREATE( pxNewTCB );

-		}

-		taskEXIT_CRITICAL();

-	}

-	else

-	{

-		xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;

-		traceTASK_CREATE_FAILED();

-	}

-

-	if( xReturn == pdPASS )

-	{

-		if( xSchedulerRunning != pdFALSE )

-		{

-			/* If the created task is of a higher priority than the current task

-			then it should run now. */

-			if( pxCurrentTCB->uxPriority < uxPriority )

-			{

-				portYIELD_WITHIN_API();

-			}

-		}

-	}

-

-	return xReturn;

-}

-/*-----------------------------------------------------------*/

-

-#if ( INCLUDE_vTaskDelete == 1 )

-

-	void vTaskDelete( xTaskHandle pxTaskToDelete )

-	{

-	tskTCB *pxTCB;

-

-		taskENTER_CRITICAL();

-		{

-			/* Ensure a yield is performed if the current task is being

-			deleted. */

-			if( pxTaskToDelete == pxCurrentTCB )

-			{

-				pxTaskToDelete = NULL;

-			}

-

-			/* If null is passed in here then we are deleting ourselves. */

-			pxTCB = prvGetTCBFromHandle( pxTaskToDelete );

-

-			/* Remove task from the ready list and place in the	termination list.

-			This will stop the task from be scheduled.  The idle task will check

-			the termination list and free up any memory allocated by the

-			scheduler for the TCB and stack. */

-			vListRemove( &( pxTCB->xGenericListItem ) );

-

-			/* Is the task waiting on an event also? */

-			if( pxTCB->xEventListItem.pvContainer != NULL )

-			{

-				vListRemove( &( pxTCB->xEventListItem ) );

-			}

-

-			vListInsertEnd( ( xList * ) &xTasksWaitingTermination, &( pxTCB->xGenericListItem ) );

-

-			/* Increment the ucTasksDeleted variable so the idle task knows

-			there is a task that has been deleted and that it should therefore

-			check the xTasksWaitingTermination list. */

-			++uxTasksDeleted;

-

-			/* Increment the uxTaskNumberVariable also so kernel aware debuggers

-			can detect that the task lists need re-generating. */

-			uxTaskNumber++;

-

-			traceTASK_DELETE( pxTCB );

-		}

-		taskEXIT_CRITICAL();

-

-		/* Force a reschedule if we have just deleted the current task. */

-		if( xSchedulerRunning != pdFALSE )

-		{

-			if( ( void * ) pxTaskToDelete == NULL )

-			{

-				portYIELD_WITHIN_API();

-			}

-		}

-	}

-

-#endif

-

-

-

-

-

-

-/*-----------------------------------------------------------

- * TASK CONTROL API documented in task.h

- *----------------------------------------------------------*/

-

-#if ( INCLUDE_vTaskDelayUntil == 1 )

-

-	void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement )

-	{

-	portTickType xTimeToWake;

-	portBASE_TYPE xAlreadyYielded, xShouldDelay = pdFALSE;

-

-		configASSERT( pxPreviousWakeTime );

-		configASSERT( ( xTimeIncrement > 0U ) );

-

-		vTaskSuspendAll();

-		{

-			/* Generate the tick time at which the task wants to wake. */

-			xTimeToWake = *pxPreviousWakeTime + xTimeIncrement;

-

-			if( xTickCount < *pxPreviousWakeTime )

-			{

-				/* The tick count has overflowed since this function was

-				lasted called.  In this case the only time we should ever

-				actually delay is if the wake time has also	overflowed,

-				and the wake time is greater than the tick time.  When this

-				is the case it is as if neither time had overflowed. */

-				if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xTickCount ) )

-				{

-					xShouldDelay = pdTRUE;

-				}

-			}

-			else

-			{

-				/* The tick time has not overflowed.  In this case we will

-				delay if either the wake time has overflowed, and/or the

-				tick time is less than the wake time. */

-				if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xTickCount ) )

-				{

-					xShouldDelay = pdTRUE;

-				}

-			}

-

-			/* Update the wake time ready for the next call. */

-			*pxPreviousWakeTime = xTimeToWake;

-

-			if( xShouldDelay != pdFALSE )

-			{

-				traceTASK_DELAY_UNTIL();

-

-				/* We must remove ourselves from the ready list before adding

-				ourselves to the blocked list as the same list item is used for

-				both lists. */

-				vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );

-				prvAddCurrentTaskToDelayedList( xTimeToWake );

-			}

-		}

-		xAlreadyYielded = xTaskResumeAll();

-

-		/* Force a reschedule if xTaskResumeAll has not already done so, we may

-		have put ourselves to sleep. */

-		if( xAlreadyYielded == pdFALSE )

-		{

-			portYIELD_WITHIN_API();

-		}

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( INCLUDE_vTaskDelay == 1 )

-

-	void vTaskDelay( portTickType xTicksToDelay )

-	{

-	portTickType xTimeToWake;

-	signed portBASE_TYPE xAlreadyYielded = pdFALSE;

-

-		/* A delay time of zero just forces a reschedule. */

-		if( xTicksToDelay > ( portTickType ) 0U )

-		{

-			vTaskSuspendAll();

-			{

-				traceTASK_DELAY();

-

-				/* A task that is removed from the event list while the

-				scheduler is suspended will not get placed in the ready

-				list or removed from the blocked list until the scheduler

-				is resumed.

-

-				This task cannot be in an event list as it is the currently

-				executing task. */

-

-				/* Calculate the time to wake - this may overflow but this is

-				not a problem. */

-				xTimeToWake = xTickCount + xTicksToDelay;

-

-				/* We must remove ourselves from the ready list before adding

-				ourselves to the blocked list as the same list item is used for

-				both lists. */

-				vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );

-				prvAddCurrentTaskToDelayedList( xTimeToWake );

-			}

-			xAlreadyYielded = xTaskResumeAll();

-		}

-

-		/* Force a reschedule if xTaskResumeAll has not already done so, we may

-		have put ourselves to sleep. */

-		if( xAlreadyYielded == pdFALSE )

-		{

-			portYIELD_WITHIN_API();

-		}

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( INCLUDE_uxTaskPriorityGet == 1 )

-

-	unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask )

-	{

-	tskTCB *pxTCB;

-	unsigned portBASE_TYPE uxReturn;

-

-		taskENTER_CRITICAL();

-		{

-			/* If null is passed in here then we are changing the

-			priority of the calling function. */

-			pxTCB = prvGetTCBFromHandle( pxTask );

-			uxReturn = pxTCB->uxPriority;

-		}

-		taskEXIT_CRITICAL();

-

-		return uxReturn;

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( INCLUDE_vTaskPrioritySet == 1 )

-

-	void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority )

-	{

-	tskTCB *pxTCB;

-	unsigned portBASE_TYPE uxCurrentPriority;

-	portBASE_TYPE xYieldRequired = pdFALSE;

-

-		configASSERT( ( uxNewPriority < configMAX_PRIORITIES ) );

-

-		/* Ensure the new priority is valid. */

-		if( uxNewPriority >= configMAX_PRIORITIES )

-		{

-			uxNewPriority = configMAX_PRIORITIES - ( unsigned portBASE_TYPE ) 1U;

-		}

-

-		taskENTER_CRITICAL();

-		{

-			if( pxTask == pxCurrentTCB )

-			{

-				pxTask = NULL;

-			}

-

-			/* If null is passed in here then we are changing the

-			priority of the calling function. */

-			pxTCB = prvGetTCBFromHandle( pxTask );

-

-			traceTASK_PRIORITY_SET( pxTCB, uxNewPriority );

-

-			#if ( configUSE_MUTEXES == 1 )

-			{

-				uxCurrentPriority = pxTCB->uxBasePriority;

-			}

-			#else

-			{

-				uxCurrentPriority = pxTCB->uxPriority;

-			}

-			#endif

-

-			if( uxCurrentPriority != uxNewPriority )

-			{

-				/* The priority change may have readied a task of higher

-				priority than the calling task. */

-				if( uxNewPriority > uxCurrentPriority )

-				{

-					if( pxTask != NULL )

-					{

-						/* The priority of another task is being raised.  If we

-						were raising the priority of the currently running task

-						there would be no need to switch as it must have already

-						been the highest priority task. */

-						xYieldRequired = pdTRUE;

-					}

-				}

-				else if( pxTask == NULL )

-				{

-					/* Setting our own priority down means there may now be another

-					task of higher priority that is ready to execute. */

-					xYieldRequired = pdTRUE;

-				}

-

-

-

-				#if ( configUSE_MUTEXES == 1 )

-				{

-					/* Only change the priority being used if the task is not

-					currently using an inherited priority. */

-					if( pxTCB->uxBasePriority == pxTCB->uxPriority )

-					{

-						pxTCB->uxPriority = uxNewPriority;

-					}

-

-					/* The base priority gets set whatever. */

-					pxTCB->uxBasePriority = uxNewPriority;

-				}

-				#else

-				{

-					pxTCB->uxPriority = uxNewPriority;

-				}

-				#endif

-

-				listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( configMAX_PRIORITIES - ( portTickType ) uxNewPriority ) );

-

-				/* If the task is in the blocked or suspended list we need do

-				nothing more than change it's priority variable. However, if

-				the task is in a ready list it needs to be removed and placed

-				in the queue appropriate to its new priority. */

-				if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxCurrentPriority ] ), &( pxTCB->xGenericListItem ) ) )

-				{

-					/* The task is currently in its ready list - remove before adding

-					it to it's new ready list.  As we are in a critical section we

-					can do this even if the scheduler is suspended. */

-					vListRemove( &( pxTCB->xGenericListItem ) );

-					prvAddTaskToReadyQueue( pxTCB );

-				}

-

-				if( xYieldRequired == pdTRUE )

-				{

-					portYIELD_WITHIN_API();

-				}

-			}

-		}

-		taskEXIT_CRITICAL();

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( INCLUDE_vTaskSuspend == 1 )

-

-	void vTaskSuspend( xTaskHandle pxTaskToSuspend )

-	{

-	tskTCB *pxTCB;

-

-		taskENTER_CRITICAL();

-		{

-			/* Ensure a yield is performed if the current task is being

-			suspended. */

-			if( pxTaskToSuspend == pxCurrentTCB )

-			{

-				pxTaskToSuspend = NULL;

-			}

-

-			/* If null is passed in here then we are suspending ourselves. */

-			pxTCB = prvGetTCBFromHandle( pxTaskToSuspend );

-

-			traceTASK_SUSPEND( pxTCB );

-

-			/* Remove task from the ready/delayed list and place in the	suspended list. */

-			vListRemove( &( pxTCB->xGenericListItem ) );

-

-			/* Is the task waiting on an event also? */

-			if( pxTCB->xEventListItem.pvContainer != NULL )

-			{

-				vListRemove( &( pxTCB->xEventListItem ) );

-			}

-

-			vListInsertEnd( ( xList * ) &xSuspendedTaskList, &( pxTCB->xGenericListItem ) );

-		}

-		taskEXIT_CRITICAL();

-

-		if( ( void * ) pxTaskToSuspend == NULL )

-		{

-			if( xSchedulerRunning != pdFALSE )

-			{

-				/* We have just suspended the current task. */

-				portYIELD_WITHIN_API();

-			}

-			else

-			{

-				/* The scheduler is not running, but the task that was pointed

-				to by pxCurrentTCB has just been suspended and pxCurrentTCB

-				must be adjusted to point to a different task. */

-				if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks )

-				{

-					/* No other tasks are ready, so set pxCurrentTCB back to

-					NULL so when the next task is created pxCurrentTCB will

-					be set to point to it no matter what its relative priority

-					is. */

-					pxCurrentTCB = NULL;

-				}

-				else

-				{

-					vTaskSwitchContext();

-				}

-			}

-		}

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( INCLUDE_vTaskSuspend == 1 )

-

-	signed portBASE_TYPE xTaskIsTaskSuspended( xTaskHandle xTask )

-	{

-	portBASE_TYPE xReturn = pdFALSE;

-	const tskTCB * const pxTCB = ( tskTCB * ) xTask;

-

-		/* It does not make sense to check if the calling task is suspended. */

-		configASSERT( xTask );

-

-		/* Is the task we are attempting to resume actually in the

-		suspended list? */

-		if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xGenericListItem ) ) != pdFALSE )

-		{

-			/* Has the task already been resumed from within an ISR? */

-			if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) != pdTRUE )

-			{

-				/* Is it in the suspended list because it is in the

-				Suspended state?  It is possible to be in the suspended

-				list because it is blocked on a task with no timeout

-				specified. */

-				if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) == pdTRUE )

-				{

-					xReturn = pdTRUE;

-				}

-			}

-		}

-

-		return xReturn;

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( INCLUDE_vTaskSuspend == 1 )

-

-	void vTaskResume( xTaskHandle pxTaskToResume )

-	{

-	tskTCB *pxTCB;

-

-		/* It does not make sense to resume the calling task. */

-		configASSERT( pxTaskToResume );

-

-		/* Remove the task from whichever list it is currently in, and place

-		it in the ready list. */

-		pxTCB = ( tskTCB * ) pxTaskToResume;

-

-		/* The parameter cannot be NULL as it is impossible to resume the

-		currently executing task. */

-		if( ( pxTCB != NULL ) && ( pxTCB != pxCurrentTCB ) )

-		{

-			taskENTER_CRITICAL();

-			{

-				if( xTaskIsTaskSuspended( pxTCB ) == pdTRUE )

-				{

-					traceTASK_RESUME( pxTCB );

-

-					/* As we are in a critical section we can access the ready

-					lists even if the scheduler is suspended. */

-					vListRemove(  &( pxTCB->xGenericListItem ) );

-					prvAddTaskToReadyQueue( pxTCB );

-

-					/* We may have just resumed a higher priority task. */

-					if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )

-					{

-						/* This yield may not cause the task just resumed to run, but

-						will leave the lists in the correct state for the next yield. */

-						portYIELD_WITHIN_API();

-					}

-				}

-			}

-			taskEXIT_CRITICAL();

-		}

-	}

-

-#endif

-

-/*-----------------------------------------------------------*/

-

-#if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) )

-

-	portBASE_TYPE xTaskResumeFromISR( xTaskHandle pxTaskToResume )

-	{

-	portBASE_TYPE xYieldRequired = pdFALSE;

-	tskTCB *pxTCB;

-	unsigned portBASE_TYPE uxSavedInterruptStatus;

-

-		configASSERT( pxTaskToResume );

-

-		pxTCB = ( tskTCB * ) pxTaskToResume;

-

-		uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();

-		{

-			if( xTaskIsTaskSuspended( pxTCB ) == pdTRUE )

-			{

-				traceTASK_RESUME_FROM_ISR( pxTCB );

-

-				if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE )

-				{

-					xYieldRequired = ( pxTCB->uxPriority >= pxCurrentTCB->uxPriority );

-					vListRemove(  &( pxTCB->xGenericListItem ) );

-					prvAddTaskToReadyQueue( pxTCB );

-				}

-				else

-				{

-					/* We cannot access the delayed or ready lists, so will hold this

-					task pending until the scheduler is resumed, at which point a

-					yield will be performed if necessary. */

-					vListInsertEnd( ( xList * ) &( xPendingReadyList ), &( pxTCB->xEventListItem ) );

-				}

-			}

-		}

-		portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );

-

-		return xYieldRequired;

-	}

-

-#endif

-

-

-

-

-/*-----------------------------------------------------------

- * PUBLIC SCHEDULER CONTROL documented in task.h

- *----------------------------------------------------------*/

-

-

-void vTaskStartScheduler( void )

-{

-portBASE_TYPE xReturn;

-

-	/* Add the idle task at the lowest priority. */

-	#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )

-	{

-		/* Create the idle task, storing its handle in xIdleTaskHandle so it can

-		be returned by the xTaskGetIdleTaskHandle() function. */

-		xReturn = xTaskCreate( prvIdleTask, ( signed char * ) "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), &xIdleTaskHandle );

-	}

-	#else

-	{

-		/* Create the idle task without storing its handle. */

-		xReturn = xTaskCreate( prvIdleTask, ( signed char * ) "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), NULL );

-	}

-	#endif

-

-	#if ( configUSE_TIMERS == 1 )

-	{

-		if( xReturn == pdPASS )

-		{

-			xReturn = xTimerCreateTimerTask();

-		}

-	}

-	#endif

-

-	if( xReturn == pdPASS )

-	{

-		/* Interrupts are turned off here, to ensure a tick does not occur

-		before or during the call to xPortStartScheduler().  The stacks of

-		the created tasks contain a status word with interrupts switched on

-		so interrupts will automatically get re-enabled when the first task

-		starts to run.

-

-		STEPPING THROUGH HERE USING A DEBUGGER CAN CAUSE BIG PROBLEMS IF THE

-		DEBUGGER ALLOWS INTERRUPTS TO BE PROCESSED. */

-		portDISABLE_INTERRUPTS();

-

-		xSchedulerRunning = pdTRUE;

-		xTickCount = ( portTickType ) 0U;

-

-		/* If configGENERATE_RUN_TIME_STATS is defined then the following

-		macro must be defined to configure the timer/counter used to generate

-		the run time counter time base. */

-		portCONFIGURE_TIMER_FOR_RUN_TIME_STATS();

-		

-		/* Setting up the timer tick is hardware specific and thus in the

-		portable interface. */

-		if( xPortStartScheduler() != pdFALSE )

-		{

-			/* Should not reach here as if the scheduler is running the

-			function will not return. */

-		}

-		else

-		{

-			/* Should only reach here if a task calls xTaskEndScheduler(). */

-		}

-	}

-

-	/* This line will only be reached if the kernel could not be started. */

-	configASSERT( xReturn );

-}

-/*-----------------------------------------------------------*/

-

-void vTaskEndScheduler( void )

-{

-	/* Stop the scheduler interrupts and call the portable scheduler end

-	routine so the original ISRs can be restored if necessary.  The port

-	layer must ensure interrupts enable	bit is left in the correct state. */

-	portDISABLE_INTERRUPTS();

-	xSchedulerRunning = pdFALSE;

-	vPortEndScheduler();

-}

-/*----------------------------------------------------------*/

-

-void vTaskSuspendAll( void )

-{

-	/* A critical section is not required as the variable is of type

-	portBASE_TYPE. */

-	++uxSchedulerSuspended;

-}

-/*----------------------------------------------------------*/

-

-signed portBASE_TYPE xTaskResumeAll( void )

-{

-register tskTCB *pxTCB;

-signed portBASE_TYPE xAlreadyYielded = pdFALSE;

-

-	/* If uxSchedulerSuspended is zero then this function does not match a

-	previous call to vTaskSuspendAll(). */

-	configASSERT( uxSchedulerSuspended );

-

-	/* It is possible that an ISR caused a task to be removed from an event

-	list while the scheduler was suspended.  If this was the case then the

-	removed task will have been added to the xPendingReadyList.  Once the

-	scheduler has been resumed it is safe to move all the pending ready

-	tasks from this list into their appropriate ready list. */

-	taskENTER_CRITICAL();

-	{

-		--uxSchedulerSuspended;

-

-		if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE )

-		{

-			if( uxCurrentNumberOfTasks > ( unsigned portBASE_TYPE ) 0U )

-			{

-				portBASE_TYPE xYieldRequired = pdFALSE;

-

-				/* Move any readied tasks from the pending list into the

-				appropriate ready list. */

-				while( listLIST_IS_EMPTY( ( xList * ) &xPendingReadyList ) == pdFALSE )

-				{

-					pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY(  ( ( xList * ) &xPendingReadyList ) );

-					vListRemove( &( pxTCB->xEventListItem ) );

-					vListRemove( &( pxTCB->xGenericListItem ) );

-					prvAddTaskToReadyQueue( pxTCB );

-

-					/* If we have moved a task that has a priority higher than

-					the current task then we should yield. */

-					if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )

-					{

-						xYieldRequired = pdTRUE;

-					}

-				}

-

-				/* If any ticks occurred while the scheduler was suspended then

-				they should be processed now.  This ensures the tick count does not

-				slip, and that any delayed tasks are resumed at the correct time. */

-				if( uxMissedTicks > ( unsigned portBASE_TYPE ) 0U )

-				{

-					while( uxMissedTicks > ( unsigned portBASE_TYPE ) 0U )

-					{

-						vTaskIncrementTick();

-						--uxMissedTicks;

-					}

-

-					/* As we have processed some ticks it is appropriate to yield

-					to ensure the highest priority task that is ready to run is

-					the task actually running. */

-					#if configUSE_PREEMPTION == 1

-					{

-						xYieldRequired = pdTRUE;

-					}

-					#endif

-				}

-

-				if( ( xYieldRequired == pdTRUE ) || ( xMissedYield == pdTRUE ) )

-				{

-					xAlreadyYielded = pdTRUE;

-					xMissedYield = pdFALSE;

-					portYIELD_WITHIN_API();

-				}

-			}

-		}

-	}

-	taskEXIT_CRITICAL();

-

-	return xAlreadyYielded;

-}

-

-

-

-

-

-

-/*-----------------------------------------------------------

- * PUBLIC TASK UTILITIES documented in task.h

- *----------------------------------------------------------*/

-

-

-

-portTickType xTaskGetTickCount( void )

-{

-portTickType xTicks;

-

-	/* Critical section required if running on a 16 bit processor. */

-	taskENTER_CRITICAL();

-	{

-		xTicks = xTickCount;

-	}

-	taskEXIT_CRITICAL();

-

-	return xTicks;

-}

-/*-----------------------------------------------------------*/

-

-portTickType xTaskGetTickCountFromISR( void )

-{

-portTickType xReturn;

-unsigned portBASE_TYPE uxSavedInterruptStatus;

-

-	uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();

-	xReturn = xTickCount;

-	portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );

-

-	return xReturn;

-}

-/*-----------------------------------------------------------*/

-

-unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void )

-{

-	/* A critical section is not required because the variables are of type

-	portBASE_TYPE. */

-	return uxCurrentNumberOfTasks;

-}

-/*-----------------------------------------------------------*/

-

-#if ( INCLUDE_pcTaskGetTaskName == 1 )

-

-	signed char *pcTaskGetTaskName( xTaskHandle xTaskToQuery )

-	{

-	tskTCB *pxTCB;

-

-		/* If null is passed in here then the name of the calling task is being queried. */

-		pxTCB = prvGetTCBFromHandle( xTaskToQuery );

-		configASSERT( pxTCB );

-		return &( pxTCB->pcTaskName[ 0 ] );

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_TRACE_FACILITY == 1 )

-

-	void vTaskList( signed char *pcWriteBuffer )

-	{

-	unsigned portBASE_TYPE uxQueue;

-

-		/* This is a VERY costly function that should be used for debug only.

-		It leaves interrupts disabled for a LONG time. */

-

-		vTaskSuspendAll();

-		{

-			/* Run through all the lists that could potentially contain a TCB and

-			report the task name, state and stack high water mark. */

-

-			*pcWriteBuffer = ( signed char ) 0x00;

-			strcat( ( char * ) pcWriteBuffer, ( const char * ) "\r\n" );

-

-			uxQueue = uxTopUsedPriority + ( unsigned portBASE_TYPE ) 1U;

-

-			do

-			{

-				uxQueue--;

-

-				if( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxQueue ] ) ) == pdFALSE )

-				{

-					prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) &( pxReadyTasksLists[ uxQueue ] ), tskREADY_CHAR );

-				}

-			}while( uxQueue > ( unsigned short ) tskIDLE_PRIORITY );

-

-			if( listLIST_IS_EMPTY( pxDelayedTaskList ) == pdFALSE )

-			{

-				prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) pxDelayedTaskList, tskBLOCKED_CHAR );

-			}

-

-			if( listLIST_IS_EMPTY( pxOverflowDelayedTaskList ) == pdFALSE )

-			{

-				prvListTaskWithinSingleList( pcWriteBuffer, ( xList * ) pxOverflowDelayedTaskList, tskBLOCKED_CHAR );

-			}

-

-			#if( INCLUDE_vTaskDelete == 1 )

-			{

-				if( listLIST_IS_EMPTY( &xTasksWaitingTermination ) == pdFALSE )

-				{

-					prvListTaskWithinSingleList( pcWriteBuffer, &xTasksWaitingTermination, tskDELETED_CHAR );

-				}

-			}

-			#endif

-

-			#if ( INCLUDE_vTaskSuspend == 1 )

-			{

-				if( listLIST_IS_EMPTY( &xSuspendedTaskList ) == pdFALSE )

-				{

-					prvListTaskWithinSingleList( pcWriteBuffer, &xSuspendedTaskList, tskSUSPENDED_CHAR );

-				}

-			}

-			#endif

-		}

-		xTaskResumeAll();

-	}

-

-#endif

-/*----------------------------------------------------------*/

-

-#if ( configGENERATE_RUN_TIME_STATS == 1 )

-

-	void vTaskGetRunTimeStats( signed char *pcWriteBuffer )

-	{

-	unsigned portBASE_TYPE uxQueue;

-	unsigned long ulTotalRunTime;

-

-		/* This is a VERY costly function that should be used for debug only.

-		It leaves interrupts disabled for a LONG time. */

-

-		vTaskSuspendAll();

-		{

-			#ifdef portALT_GET_RUN_TIME_COUNTER_VALUE

-				portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime );

-			#else

-				ulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE();

-			#endif

-

-			/* Divide ulTotalRunTime by 100 to make the percentage caluclations

-			simpler in the prvGenerateRunTimeStatsForTasksInList() function. */

-			ulTotalRunTime /= 100UL;

-			

-			/* Run through all the lists that could potentially contain a TCB,

-			generating a table of run timer percentages in the provided

-			buffer. */

-

-			*pcWriteBuffer = ( signed char ) 0x00;

-			strcat( ( char * ) pcWriteBuffer, ( const char * ) "\r\n" );

-

-			uxQueue = uxTopUsedPriority + ( unsigned portBASE_TYPE ) 1U;

-

-			do

-			{

-				uxQueue--;

-

-				if( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxQueue ] ) ) == pdFALSE )

-				{

-					prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) &( pxReadyTasksLists[ uxQueue ] ), ulTotalRunTime );

-				}

-			}while( uxQueue > ( unsigned short ) tskIDLE_PRIORITY );

-

-			if( listLIST_IS_EMPTY( pxDelayedTaskList ) == pdFALSE )

-			{

-				prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) pxDelayedTaskList, ulTotalRunTime );

-			}

-

-			if( listLIST_IS_EMPTY( pxOverflowDelayedTaskList ) == pdFALSE )

-			{

-				prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, ( xList * ) pxOverflowDelayedTaskList, ulTotalRunTime );

-			}

-

-			#if ( INCLUDE_vTaskDelete == 1 )

-			{

-				if( listLIST_IS_EMPTY( &xTasksWaitingTermination ) == pdFALSE )

-				{

-					prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, &xTasksWaitingTermination, ulTotalRunTime );

-				}

-			}

-			#endif

-

-			#if ( INCLUDE_vTaskSuspend == 1 )

-			{

-				if( listLIST_IS_EMPTY( &xSuspendedTaskList ) == pdFALSE )

-				{

-					prvGenerateRunTimeStatsForTasksInList( pcWriteBuffer, &xSuspendedTaskList, ulTotalRunTime );

-				}

-			}

-			#endif

-		}

-		xTaskResumeAll();

-	}

-

-#endif

-/*----------------------------------------------------------*/

-

-#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )

-

-	xTaskHandle xTaskGetIdleTaskHandle( void )

-	{

-		/* If xTaskGetIdleTaskHandle() is called before the scheduler has been

-		started, then xIdleTaskHandle will be NULL. */

-		configASSERT( ( xIdleTaskHandle != NULL ) );

-		return xIdleTaskHandle;

-	}

-	

-#endif

-

-/*-----------------------------------------------------------

- * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES

- * documented in task.h

- *----------------------------------------------------------*/

-

-void vTaskIncrementTick( void )

-{

-tskTCB * pxTCB;

-

-	/* Called by the portable layer each time a tick interrupt occurs.

-	Increments the tick then checks to see if the new tick value will cause any

-	tasks to be unblocked. */

-	if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE )

-	{

-		++xTickCount;

-		if( xTickCount == ( portTickType ) 0U )

-		{

-			xList *pxTemp;

-

-			/* Tick count has overflowed so we need to swap the delay lists.

-			If there are any items in pxDelayedTaskList here then there is

-			an error! */

-			configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) );

-			

-			pxTemp = pxDelayedTaskList;

-			pxDelayedTaskList = pxOverflowDelayedTaskList;

-			pxOverflowDelayedTaskList = pxTemp;

-			xNumOfOverflows++;

-	

-			if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )

-			{

-				/* The new current delayed list is empty.  Set

-				xNextTaskUnblockTime to the maximum possible value so it is

-				extremely unlikely that the	

-				if( xTickCount >= xNextTaskUnblockTime ) test will pass until

-				there is an item in the delayed list. */

-				xNextTaskUnblockTime = portMAX_DELAY;

-			}

-			else

-			{

-				/* The new current delayed list is not empty, get the value of

-				the item at the head of the delayed list.  This is the time at

-				which the task at the head of the delayed list should be removed

-				from the Blocked state. */

-				pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );

-				xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( pxTCB->xGenericListItem ) );

-			}

-		}

-

-		/* See if this tick has made a timeout expire. */

-		prvCheckDelayedTasks();

-	}

-	else

-	{

-		++uxMissedTicks;

-

-		/* The tick hook gets called at regular intervals, even if the

-		scheduler is locked. */

-		#if ( configUSE_TICK_HOOK == 1 )

-		{

-			vApplicationTickHook();

-		}

-		#endif

-	}

-

-	#if ( configUSE_TICK_HOOK == 1 )

-	{

-		/* Guard against the tick hook being called when the missed tick

-		count is being unwound (when the scheduler is being unlocked. */

-		if( uxMissedTicks == ( unsigned portBASE_TYPE ) 0U )

-		{

-			vApplicationTickHook();

-		}

-	}

-	#endif

-

-	traceTASK_INCREMENT_TICK( xTickCount );

-}

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_APPLICATION_TASK_TAG == 1 )

-

-	void vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction )

-	{

-	tskTCB *xTCB;

-

-		/* If xTask is NULL then we are setting our own task hook. */

-		if( xTask == NULL )

-		{

-			xTCB = ( tskTCB * ) pxCurrentTCB;

-		}

-		else

-		{

-			xTCB = ( tskTCB * ) xTask;

-		}

-

-		/* Save the hook function in the TCB.  A critical section is required as

-		the value can be accessed from an interrupt. */

-		taskENTER_CRITICAL();

-			xTCB->pxTaskTag = pxHookFunction;

-		taskEXIT_CRITICAL();

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_APPLICATION_TASK_TAG == 1 )

-

-	pdTASK_HOOK_CODE xTaskGetApplicationTaskTag( xTaskHandle xTask )

-	{

-	tskTCB *xTCB;

-	pdTASK_HOOK_CODE xReturn;

-

-		/* If xTask is NULL then we are setting our own task hook. */

-		if( xTask == NULL )

-		{

-			xTCB = ( tskTCB * ) pxCurrentTCB;

-		}

-		else

-		{

-			xTCB = ( tskTCB * ) xTask;

-		}

-

-		/* Save the hook function in the TCB.  A critical section is required as

-		the value can be accessed from an interrupt. */

-		taskENTER_CRITICAL();

-			xReturn = xTCB->pxTaskTag;

-		taskEXIT_CRITICAL();

-

-		return xReturn;

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_APPLICATION_TASK_TAG == 1 )

-

-	portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, void *pvParameter )

-	{

-	tskTCB *xTCB;

-	portBASE_TYPE xReturn;

-

-		/* If xTask is NULL then we are calling our own task hook. */

-		if( xTask == NULL )

-		{

-			xTCB = ( tskTCB * ) pxCurrentTCB;

-		}

-		else

-		{

-			xTCB = ( tskTCB * ) xTask;

-		}

-

-		if( xTCB->pxTaskTag != NULL )

-		{

-			xReturn = xTCB->pxTaskTag( pvParameter );

-		}

-		else

-		{

-			xReturn = pdFAIL;

-		}

-

-		return xReturn;

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-void vTaskSwitchContext( void )

-{

-	if( uxSchedulerSuspended != ( unsigned portBASE_TYPE ) pdFALSE )

-	{

-		/* The scheduler is currently suspended - do not allow a context

-		switch. */

-		xMissedYield = pdTRUE;

-	}

-	else

-	{

-		traceTASK_SWITCHED_OUT();

-	

-		#if ( configGENERATE_RUN_TIME_STATS == 1 )

-		{

-			unsigned long ulTempCounter;

-			

-				#ifdef portALT_GET_RUN_TIME_COUNTER_VALUE

-					portALT_GET_RUN_TIME_COUNTER_VALUE( ulTempCounter );

-				#else

-					ulTempCounter = portGET_RUN_TIME_COUNTER_VALUE();

-				#endif

-	

-				/* Add the amount of time the task has been running to the accumulated

-				time so far.  The time the task started running was stored in

-				ulTaskSwitchedInTime.  Note that there is no overflow protection here

-				so count values are only valid until the timer overflows.  Generally

-				this will be about 1 hour assuming a 1uS timer increment. */

-				pxCurrentTCB->ulRunTimeCounter += ( ulTempCounter - ulTaskSwitchedInTime );

-				ulTaskSwitchedInTime = ulTempCounter;

-		}

-		#endif

-	

-		taskFIRST_CHECK_FOR_STACK_OVERFLOW();

-		taskSECOND_CHECK_FOR_STACK_OVERFLOW();

-	

-		/* Find the highest priority queue that contains ready tasks. */

-		while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopReadyPriority ] ) ) )

-		{

-			configASSERT( uxTopReadyPriority );

-			--uxTopReadyPriority;

-		}

-	

-		/* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the tasks of the

-		same priority get an equal share of the processor time. */

-		listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopReadyPriority ] ) );

-	

-		traceTASK_SWITCHED_IN();

-	}

-}

-/*-----------------------------------------------------------*/

-

-void vTaskPlaceOnEventList( const xList * const pxEventList, portTickType xTicksToWait )

-{

-portTickType xTimeToWake;

-

-	configASSERT( pxEventList );

-

-	/* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE

-	SCHEDULER SUSPENDED. */

-

-	/* Place the event list item of the TCB in the appropriate event list.

-	This is placed in the list in priority order so the highest priority task

-	is the first to be woken by the event. */

-	vListInsert( ( xList * ) pxEventList, ( xListItem * ) &( pxCurrentTCB->xEventListItem ) );

-

-	/* We must remove ourselves from the ready list before adding ourselves

-	to the blocked list as the same list item is used for both lists.  We have

-	exclusive access to the ready lists as the scheduler is locked. */

-	vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );

-

-

-	#if ( INCLUDE_vTaskSuspend == 1 )

-	{

-		if( xTicksToWait == portMAX_DELAY )

-		{

-			/* Add ourselves to the suspended task list instead of a delayed task

-			list to ensure we are not woken by a timing event.  We will block

-			indefinitely. */

-			vListInsertEnd( ( xList * ) &xSuspendedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );

-		}

-		else

-		{

-			/* Calculate the time at which the task should be woken if the event does

-			not occur.  This may overflow but this doesn't matter. */

-			xTimeToWake = xTickCount + xTicksToWait;

-			prvAddCurrentTaskToDelayedList( xTimeToWake );

-		}

-	}

-	#else

-	{

-			/* Calculate the time at which the task should be woken if the event does

-			not occur.  This may overflow but this doesn't matter. */

-			xTimeToWake = xTickCount + xTicksToWait;

-			prvAddCurrentTaskToDelayedList( xTimeToWake );

-	}

-	#endif

-}

-/*-----------------------------------------------------------*/

-

-#if configUSE_TIMERS == 1

-

-	void vTaskPlaceOnEventListRestricted( const xList * const pxEventList, portTickType xTicksToWait )

-	{

-	portTickType xTimeToWake;

-

-		configASSERT( pxEventList );

-

-		/* This function should not be called by application code hence the

-		'Restricted' in its name.  It is not part of the public API.  It is

-		designed for use by kernel code, and has special calling requirements -

-		it should be called from a critical section. */

-

-	

-		/* Place the event list item of the TCB in the appropriate event list.

-		In this case it is assume that this is the only task that is going to

-		be waiting on this event list, so the faster vListInsertEnd() function

-		can be used in place of vListInsert. */

-		vListInsertEnd( ( xList * ) pxEventList, ( xListItem * ) &( pxCurrentTCB->xEventListItem ) );

-

-		/* We must remove this task from the ready list before adding it to the

-		blocked list as the same list item is used for both lists.  This

-		function is called form a critical section. */

-		vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );

-

-		/* Calculate the time at which the task should be woken if the event does

-		not occur.  This may overflow but this doesn't matter. */

-		xTimeToWake = xTickCount + xTicksToWait;

-		prvAddCurrentTaskToDelayedList( xTimeToWake );

-	}

-	

-#endif /* configUSE_TIMERS */

-/*-----------------------------------------------------------*/

-

-signed portBASE_TYPE xTaskRemoveFromEventList( const xList * const pxEventList )

-{

-tskTCB *pxUnblockedTCB;

-portBASE_TYPE xReturn;

-

-	/* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE

-	SCHEDULER SUSPENDED.  It can also be called from within an ISR. */

-

-	/* The event list is sorted in priority order, so we can remove the

-	first in the list, remove the TCB from the delayed list, and add

-	it to the ready list.

-

-	If an event is for a queue that is locked then this function will never

-	get called - the lock count on the queue will get modified instead.  This

-	means we can always expect exclusive access to the event list here.

-	

-	This function assumes that a check has already been made to ensure that

-	pxEventList is not empty. */

-	pxUnblockedTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList );

-	configASSERT( pxUnblockedTCB );

-	vListRemove( &( pxUnblockedTCB->xEventListItem ) );

-

-	if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE )

-	{

-		vListRemove( &( pxUnblockedTCB->xGenericListItem ) );

-		prvAddTaskToReadyQueue( pxUnblockedTCB );

-	}

-	else

-	{

-		/* We cannot access the delayed or ready lists, so will hold this

-		task pending until the scheduler is resumed. */

-		vListInsertEnd( ( xList * ) &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) );

-	}

-

-	if( pxUnblockedTCB->uxPriority >= pxCurrentTCB->uxPriority )

-	{

-		/* Return true if the task removed from the event list has

-		a higher priority than the calling task.  This allows

-		the calling task to know if it should force a context

-		switch now. */

-		xReturn = pdTRUE;

-	}

-	else

-	{

-		xReturn = pdFALSE;

-	}

-

-	return xReturn;

-}

-/*-----------------------------------------------------------*/

-

-void vTaskSetTimeOutState( xTimeOutType * const pxTimeOut )

-{

-	configASSERT( pxTimeOut );

-	pxTimeOut->xOverflowCount = xNumOfOverflows;

-	pxTimeOut->xTimeOnEntering = xTickCount;

-}

-/*-----------------------------------------------------------*/

-

-portBASE_TYPE xTaskCheckForTimeOut( xTimeOutType * const pxTimeOut, portTickType * const pxTicksToWait )

-{

-portBASE_TYPE xReturn;

-

-	configASSERT( pxTimeOut );

-	configASSERT( pxTicksToWait );

-

-	taskENTER_CRITICAL();

-	{

-		#if ( INCLUDE_vTaskSuspend == 1 )

-			/* If INCLUDE_vTaskSuspend is set to 1 and the block time specified is

-			the maximum block time then the task should block indefinitely, and

-			therefore never time out. */

-			if( *pxTicksToWait == portMAX_DELAY )

-			{

-				xReturn = pdFALSE;

-			}

-			else /* We are not blocking indefinitely, perform the checks below. */

-		#endif

-

-		if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( ( portTickType ) xTickCount >= ( portTickType ) pxTimeOut->xTimeOnEntering ) )

-		{

-			/* The tick count is greater than the time at which vTaskSetTimeout()

-			was called, but has also overflowed since vTaskSetTimeOut() was called.

-			It must have wrapped all the way around and gone past us again. This

-			passed since vTaskSetTimeout() was called. */

-			xReturn = pdTRUE;

-		}

-		else if( ( ( portTickType ) ( ( portTickType ) xTickCount - ( portTickType ) pxTimeOut->xTimeOnEntering ) ) < ( portTickType ) *pxTicksToWait )

-		{

-			/* Not a genuine timeout. Adjust parameters for time remaining. */

-			*pxTicksToWait -= ( ( portTickType ) xTickCount - ( portTickType ) pxTimeOut->xTimeOnEntering );

-			vTaskSetTimeOutState( pxTimeOut );

-			xReturn = pdFALSE;

-		}

-		else

-		{

-			xReturn = pdTRUE;

-		}

-	}

-	taskEXIT_CRITICAL();

-

-	return xReturn;

-}

-/*-----------------------------------------------------------*/

-

-void vTaskMissedYield( void )

-{

-	xMissedYield = pdTRUE;

-}

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_TRACE_FACILITY == 1 )

-	unsigned portBASE_TYPE uxTaskGetTaskNumber( xTaskHandle xTask )

-	{

-	unsigned portBASE_TYPE uxReturn;

-	tskTCB *pxTCB;

-	

-		if( xTask != NULL )

-		{

-			pxTCB = ( tskTCB * ) xTask;

-			uxReturn = pxTCB->uxTaskNumber;

-		}

-		else

-		{

-			uxReturn = 0U;

-		}

-		

-		return uxReturn;

-	}

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_TRACE_FACILITY == 1 )

-	void vTaskSetTaskNumber( xTaskHandle xTask, unsigned portBASE_TYPE uxHandle )

-	{

-	tskTCB *pxTCB;

-	

-		if( xTask != NULL )

-		{

-			pxTCB = ( tskTCB * ) xTask;

-			pxTCB->uxTaskNumber = uxHandle;

-		}

-	}

-#endif

-

-

-/*

- * -----------------------------------------------------------

- * The Idle task.

- * ----------------------------------------------------------

- *

- * The portTASK_FUNCTION() macro is used to allow port/compiler specific

- * language extensions.  The equivalent prototype for this function is:

- *

- * void prvIdleTask( void *pvParameters );

- *

- */

-static portTASK_FUNCTION( prvIdleTask, pvParameters )

-{

-	/* Stop warnings. */

-	( void ) pvParameters;

-

-	for( ;; )

-	{

-		/* See if any tasks have been deleted. */

-		prvCheckTasksWaitingTermination();

-

-		#if ( configUSE_PREEMPTION == 0 )

-		{

-			/* If we are not using preemption we keep forcing a task switch to

-			see if any other task has become available.  If we are using

-			preemption we don't need to do this as any task becoming available

-			will automatically get the processor anyway. */

-			taskYIELD();

-		}

-		#endif

-

-		#if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) )

-		{

-			/* When using preemption tasks of equal priority will be

-			timesliced.  If a task that is sharing the idle priority is ready

-			to run then the idle task should yield before the end of the

-			timeslice.

-

-			A critical region is not required here as we are just reading from

-			the list, and an occasional incorrect value will not matter.  If

-			the ready list at the idle priority contains more than one task

-			then a task other than the idle task is ready to execute. */

-			if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( unsigned portBASE_TYPE ) 1 )

-			{

-				taskYIELD();

-			}

-		}

-		#endif

-

-		#if ( configUSE_IDLE_HOOK == 1 )

-		{

-			extern void vApplicationIdleHook( void );

-

-			/* Call the user defined function from within the idle task.  This

-			allows the application designer to add background functionality

-			without the overhead of a separate task.

-			NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES,

-			CALL A FUNCTION THAT MIGHT BLOCK. */

-			vApplicationIdleHook();

-		}

-		#endif

-	}

-} /*lint !e715 pvParameters is not accessed but all task functions require the same prototype. */

-

-

-

-

-

-

-

-/*-----------------------------------------------------------

- * File private functions documented at the top of the file.

- *----------------------------------------------------------*/

-

-

-

-static void prvInitialiseTCBVariables( tskTCB *pxTCB, const signed char * const pcName, unsigned portBASE_TYPE uxPriority, const xMemoryRegion * const xRegions, unsigned short usStackDepth )

-{

-	/* Store the function name in the TCB. */

-	#if configMAX_TASK_NAME_LEN > 1

-	{

-		/* Don't bring strncpy into the build unnecessarily. */

-		strncpy( ( char * ) pxTCB->pcTaskName, ( const char * ) pcName, ( unsigned short ) configMAX_TASK_NAME_LEN );

-	}

-	#endif

-	pxTCB->pcTaskName[ ( unsigned short ) configMAX_TASK_NAME_LEN - ( unsigned short ) 1 ] = ( signed char ) '\0';

-

-	/* This is used as an array index so must ensure it's not too large.  First

-	remove the privilege bit if one is present. */

-	if( uxPriority >= configMAX_PRIORITIES )

-	{

-		uxPriority = configMAX_PRIORITIES - ( unsigned portBASE_TYPE ) 1U;

-	}

-

-	pxTCB->uxPriority = uxPriority;

-	#if ( configUSE_MUTEXES == 1 )

-	{

-		pxTCB->uxBasePriority = uxPriority;

-	}

-	#endif

-

-	vListInitialiseItem( &( pxTCB->xGenericListItem ) );

-	vListInitialiseItem( &( pxTCB->xEventListItem ) );

-

-	/* Set the pxTCB as a link back from the xListItem.  This is so we can get

-	back to	the containing TCB from a generic item in a list. */

-	listSET_LIST_ITEM_OWNER( &( pxTCB->xGenericListItem ), pxTCB );

-

-	/* Event lists are always in priority order. */

-	listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) uxPriority );

-	listSET_LIST_ITEM_OWNER( &( pxTCB->xEventListItem ), pxTCB );

-

-	#if ( portCRITICAL_NESTING_IN_TCB == 1 )

-	{

-		pxTCB->uxCriticalNesting = ( unsigned portBASE_TYPE ) 0U;

-	}

-	#endif

-

-	#if ( configUSE_APPLICATION_TASK_TAG == 1 )

-	{

-		pxTCB->pxTaskTag = NULL;

-	}

-	#endif

-

-	#if ( configGENERATE_RUN_TIME_STATS == 1 )

-	{

-		pxTCB->ulRunTimeCounter = 0UL;

-	}

-	#endif

-

-	#if ( portUSING_MPU_WRAPPERS == 1 )

-	{

-		vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, pxTCB->pxStack, usStackDepth );

-	}

-	#else

-	{

-		( void ) xRegions;

-		( void ) usStackDepth;

-	}

-	#endif

-}

-/*-----------------------------------------------------------*/

-

-#if ( portUSING_MPU_WRAPPERS == 1 )

-

-	void vTaskAllocateMPURegions( xTaskHandle xTaskToModify, const xMemoryRegion * const xRegions )

-	{

-	tskTCB *pxTCB;

-	

-		if( xTaskToModify == pxCurrentTCB )

-		{

-			xTaskToModify = NULL;

-		}

-

-		/* If null is passed in here then we are deleting ourselves. */

-		pxTCB = prvGetTCBFromHandle( xTaskToModify );

-

-        vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, NULL, 0 );

-	}

-	/*-----------------------------------------------------------*/

-#endif

-

-static void prvInitialiseTaskLists( void )

-{

-unsigned portBASE_TYPE uxPriority;

-

-	for( uxPriority = ( unsigned portBASE_TYPE ) 0U; uxPriority < configMAX_PRIORITIES; uxPriority++ )

-	{

-		vListInitialise( ( xList * ) &( pxReadyTasksLists[ uxPriority ] ) );

-	}

-

-	vListInitialise( ( xList * ) &xDelayedTaskList1 );

-	vListInitialise( ( xList * ) &xDelayedTaskList2 );

-	vListInitialise( ( xList * ) &xPendingReadyList );

-

-	#if ( INCLUDE_vTaskDelete == 1 )

-	{

-		vListInitialise( ( xList * ) &xTasksWaitingTermination );

-	}

-	#endif

-

-	#if ( INCLUDE_vTaskSuspend == 1 )

-	{

-		vListInitialise( ( xList * ) &xSuspendedTaskList );

-	}

-	#endif

-

-	/* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList

-	using list2. */

-	pxDelayedTaskList = &xDelayedTaskList1;

-	pxOverflowDelayedTaskList = &xDelayedTaskList2;

-}

-/*-----------------------------------------------------------*/

-

-static void prvCheckTasksWaitingTermination( void )

-{

-	#if ( INCLUDE_vTaskDelete == 1 )

-	{

-		portBASE_TYPE xListIsEmpty;

-

-		/* ucTasksDeleted is used to prevent vTaskSuspendAll() being called

-		too often in the idle task. */

-		if( uxTasksDeleted > ( unsigned portBASE_TYPE ) 0U )

-		{

-			vTaskSuspendAll();

-				xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination );

-			xTaskResumeAll();

-

-			if( xListIsEmpty == pdFALSE )

-			{

-				tskTCB *pxTCB;

-

-				taskENTER_CRITICAL();

-				{

-					pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( ( ( xList * ) &xTasksWaitingTermination ) );

-					vListRemove( &( pxTCB->xGenericListItem ) );

-					--uxCurrentNumberOfTasks;

-					--uxTasksDeleted;

-				}

-				taskEXIT_CRITICAL();

-

-				prvDeleteTCB( pxTCB );

-			}

-		}

-	}

-	#endif

-}

-/*-----------------------------------------------------------*/

-

-static void prvAddCurrentTaskToDelayedList( portTickType xTimeToWake )

-{

-	/* The list item will be inserted in wake time order. */

-	listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );

-

-	if( xTimeToWake < xTickCount )

-	{

-		/* Wake time has overflowed.  Place this item in the overflow list. */

-		vListInsert( ( xList * ) pxOverflowDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );

-	}

-	else

-	{

-		/* The wake time has not overflowed, so we can use the current block list. */

-		vListInsert( ( xList * ) pxDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );

-

-		/* If the task entering the blocked state was placed at the head of the

-		list of blocked tasks then xNextTaskUnblockTime needs to be updated

-		too. */

-		if( xTimeToWake < xNextTaskUnblockTime )

-		{

-			xNextTaskUnblockTime = xTimeToWake;

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-static tskTCB *prvAllocateTCBAndStack( unsigned short usStackDepth, portSTACK_TYPE *puxStackBuffer )

-{

-tskTCB *pxNewTCB;

-

-	/* Allocate space for the TCB.  Where the memory comes from depends on

-	the implementation of the port malloc function. */

-	pxNewTCB = ( tskTCB * ) pvPortMalloc( sizeof( tskTCB ) );

-

-	if( pxNewTCB != NULL )

-	{

-		/* Allocate space for the stack used by the task being created.

-		The base of the stack memory stored in the TCB so the task can

-		be deleted later if required. */

-		pxNewTCB->pxStack = ( portSTACK_TYPE * ) pvPortMallocAligned( ( ( ( size_t )usStackDepth ) * sizeof( portSTACK_TYPE ) ), puxStackBuffer );

-

-		if( pxNewTCB->pxStack == NULL )

-		{

-			/* Could not allocate the stack.  Delete the allocated TCB. */

-			vPortFree( pxNewTCB );

-			pxNewTCB = NULL;

-		}

-		else

-		{

-			/* Just to help debugging. */

-			memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) usStackDepth * sizeof( portSTACK_TYPE ) );

-		}

-	}

-

-	return pxNewTCB;

-}

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_TRACE_FACILITY == 1 )

-

-	static void prvListTaskWithinSingleList( const signed char *pcWriteBuffer, xList *pxList, signed char cStatus )

-	{

-	volatile tskTCB *pxNextTCB, *pxFirstTCB;

-	unsigned short usStackRemaining;

-	PRIVILEGED_DATA static char pcStatusString[ configMAX_TASK_NAME_LEN + 30 ];

-

-		/* Write the details of all the TCB's in pxList into the buffer. */

-		listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList );

-		do

-		{

-			listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList );

-			#if ( portSTACK_GROWTH > 0 )

-			{

-				usStackRemaining = usTaskCheckFreeStackSpace( ( unsigned char * ) pxNextTCB->pxEndOfStack );

-			}

-			#else

-			{

-				usStackRemaining = usTaskCheckFreeStackSpace( ( unsigned char * ) pxNextTCB->pxStack );

-			}

-			#endif			

-			

-			sprintf( pcStatusString, ( char * ) "%s\t\t%c\t%u\t%u\t%u\r\n", pxNextTCB->pcTaskName, cStatus, ( unsigned int ) pxNextTCB->uxPriority, usStackRemaining, ( unsigned int ) pxNextTCB->uxTCBNumber );

-			strcat( ( char * ) pcWriteBuffer, ( char * ) pcStatusString );

-

-		} while( pxNextTCB != pxFirstTCB );

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( configGENERATE_RUN_TIME_STATS == 1 )

-

-	static void prvGenerateRunTimeStatsForTasksInList( const signed char *pcWriteBuffer, xList *pxList, unsigned long ulTotalRunTime )

-	{

-	volatile tskTCB *pxNextTCB, *pxFirstTCB;

-	unsigned long ulStatsAsPercentage;

-

-		/* Write the run time stats of all the TCB's in pxList into the buffer. */

-		listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList );

-		do

-		{

-			/* Get next TCB in from the list. */

-			listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList );

-

-			/* Divide by zero check. */

-			if( ulTotalRunTime > 0UL )

-			{

-				/* Has the task run at all? */

-				if( pxNextTCB->ulRunTimeCounter == 0UL )

-				{

-					/* The task has used no CPU time at all. */

-					sprintf( pcStatsString, ( char * ) "%s\t\t0\t\t0%%\r\n", pxNextTCB->pcTaskName );

-				}

-				else

-				{

-					/* What percentage of the total run time has the task used?

-					This will always be rounded down to the nearest integer.

-					ulTotalRunTime has already been divided by 100. */

-					ulStatsAsPercentage = pxNextTCB->ulRunTimeCounter / ulTotalRunTime;

-

-					if( ulStatsAsPercentage > 0UL )

-					{

-						#ifdef portLU_PRINTF_SPECIFIER_REQUIRED

-						{

-							sprintf( pcStatsString, ( char * ) "%s\t\t%lu\t\t%lu%%\r\n", pxNextTCB->pcTaskName, pxNextTCB->ulRunTimeCounter, ulStatsAsPercentage );							

-						}

-						#else

-						{

-							/* sizeof( int ) == sizeof( long ) so a smaller

-							printf() library can be used. */

-							sprintf( pcStatsString, ( char * ) "%s\t\t%u\t\t%u%%\r\n", pxNextTCB->pcTaskName, ( unsigned int ) pxNextTCB->ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage );

-						}

-						#endif

-					}

-					else

-					{

-						/* If the percentage is zero here then the task has

-						consumed less than 1% of the total run time. */

-						#ifdef portLU_PRINTF_SPECIFIER_REQUIRED

-						{

-							sprintf( pcStatsString, ( char * ) "%s\t\t%lu\t\t<1%%\r\n", pxNextTCB->pcTaskName, pxNextTCB->ulRunTimeCounter );							

-						}

-						#else

-						{

-							/* sizeof( int ) == sizeof( long ) so a smaller

-							printf() library can be used. */

-							sprintf( pcStatsString, ( char * ) "%s\t\t%u\t\t<1%%\r\n", pxNextTCB->pcTaskName, ( unsigned int ) pxNextTCB->ulRunTimeCounter );

-						}

-						#endif

-					}

-				}

-

-				strcat( ( char * ) pcWriteBuffer, ( char * ) pcStatsString );

-			}

-

-		} while( pxNextTCB != pxFirstTCB );

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) )

-

-	static unsigned short usTaskCheckFreeStackSpace( const unsigned char * pucStackByte )

-	{

-	register unsigned short usCount = 0U;

-

-		while( *pucStackByte == tskSTACK_FILL_BYTE )

-		{

-			pucStackByte -= portSTACK_GROWTH;

-			usCount++;

-		}

-

-		usCount /= sizeof( portSTACK_TYPE );

-

-		return usCount;

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 )

-

-	unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask )

-	{

-	tskTCB *pxTCB;

-	unsigned char *pcEndOfStack;

-	unsigned portBASE_TYPE uxReturn;

-

-		pxTCB = prvGetTCBFromHandle( xTask );

-

-		#if portSTACK_GROWTH < 0

-		{

-			pcEndOfStack = ( unsigned char * ) pxTCB->pxStack;

-		}

-		#else

-		{

-			pcEndOfStack = ( unsigned char * ) pxTCB->pxEndOfStack;

-		}

-		#endif

-

-		uxReturn = ( unsigned portBASE_TYPE ) usTaskCheckFreeStackSpace( pcEndOfStack );

-

-		return uxReturn;

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( INCLUDE_vTaskDelete == 1 )

-

-	static void prvDeleteTCB( tskTCB *pxTCB )

-	{

-		/* This call is required specifically for the TriCore port.  It must be

-		above the vPortFree() calls.  The call is also used by ports/demos that

-		want to allocate and clean RAM statically. */

-		portCLEAN_UP_TCB( pxTCB );

-

-		/* Free up the memory allocated by the scheduler for the task.  It is up to

-		the task to free any memory allocated at the application level. */

-		vPortFreeAligned( pxTCB->pxStack );

-		vPortFree( pxTCB );

-	}

-

-#endif

-

-

-/*-----------------------------------------------------------*/

-

-#if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) )

-

-	xTaskHandle xTaskGetCurrentTaskHandle( void )

-	{

-	xTaskHandle xReturn;

-

-		/* A critical section is not required as this is not called from

-		an interrupt and the current TCB will always be the same for any

-		individual execution thread. */

-		xReturn = pxCurrentTCB;

-

-		return xReturn;

-	}

-

-#endif

-

-/*-----------------------------------------------------------*/

-

-#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )

-

-	portBASE_TYPE xTaskGetSchedulerState( void )

-	{

-	portBASE_TYPE xReturn;

-

-		if( xSchedulerRunning == pdFALSE )

-		{

-			xReturn = taskSCHEDULER_NOT_STARTED;

-		}

-		else

-		{

-			if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE )

-			{

-				xReturn = taskSCHEDULER_RUNNING;

-			}

-			else

-			{

-				xReturn = taskSCHEDULER_SUSPENDED;

-			}

-		}

-

-		return xReturn;

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_MUTEXES == 1 )

-

-	void vTaskPriorityInherit( xTaskHandle * const pxMutexHolder )

-	{

-	tskTCB * const pxTCB = ( tskTCB * ) pxMutexHolder;

-

-		configASSERT( pxMutexHolder );

-

-		if( pxTCB->uxPriority < pxCurrentTCB->uxPriority )

-		{

-			/* Adjust the mutex holder state to account for its new priority. */

-			listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) pxCurrentTCB->uxPriority );

-

-			/* If the task being modified is in the ready state it will need to

-			be moved in to a new list. */

-			if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xGenericListItem ) ) != pdFALSE )

-			{

-				vListRemove( &( pxTCB->xGenericListItem ) );

-

-				/* Inherit the priority before being moved into the new list. */

-				pxTCB->uxPriority = pxCurrentTCB->uxPriority;

-				prvAddTaskToReadyQueue( pxTCB );

-			}

-			else

-			{

-				/* Just inherit the priority. */

-				pxTCB->uxPriority = pxCurrentTCB->uxPriority;

-			}

-

-			traceTASK_PRIORITY_INHERIT( pxTCB, pxCurrentTCB->uxPriority );

-		}

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( configUSE_MUTEXES == 1 )

-

-	void vTaskPriorityDisinherit( xTaskHandle * const pxMutexHolder )

-	{

-	tskTCB * const pxTCB = ( tskTCB * ) pxMutexHolder;

-

-		if( pxMutexHolder != NULL )

-		{

-			if( pxTCB->uxPriority != pxTCB->uxBasePriority )

-			{

-				/* We must be the running task to be able to give the mutex back.

-				Remove ourselves from the ready list we currently appear in. */

-				vListRemove( &( pxTCB->xGenericListItem ) );

-

-				/* Disinherit the priority before adding the task into the new

-				ready list. */

-				traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority );

-				pxTCB->uxPriority = pxTCB->uxBasePriority;

-				listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) pxTCB->uxPriority );

-				prvAddTaskToReadyQueue( pxTCB );

-			}

-		}

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( portCRITICAL_NESTING_IN_TCB == 1 )

-

-	void vTaskEnterCritical( void )

-	{

-		portDISABLE_INTERRUPTS();

-

-		if( xSchedulerRunning != pdFALSE )

-		{

-			( pxCurrentTCB->uxCriticalNesting )++;

-		}

-	}

-

-#endif

-/*-----------------------------------------------------------*/

-

-#if ( portCRITICAL_NESTING_IN_TCB == 1 )

-

-void vTaskExitCritical( void )

-{

-	if( xSchedulerRunning != pdFALSE )

-	{

-		if( pxCurrentTCB->uxCriticalNesting > 0U )

-		{

-			( pxCurrentTCB->uxCriticalNesting )--;

-

-			if( pxCurrentTCB->uxCriticalNesting == 0U )

-			{

-				portENABLE_INTERRUPTS();

-			}

-		}

-	}

-}

-

-#endif

-/*-----------------------------------------------------------*/

-

-

-

-

diff --git a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/timers.c b/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/timers.c
deleted file mode 100644
index 2dd68db..0000000
--- a/FreeRTOS/Demo/CORTEX_M4_ATSAM4S_Atmel_Studio/src/asf/thirdparty/FreeRTOS/timers.c
+++ /dev/null
@@ -1,686 +0,0 @@
-/*

-    FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.

-

-

-    ***************************************************************************

-     *                                                                       *

-     *    FreeRTOS tutorial books are available in pdf and paperback.        *

-     *    Complete, revised, and edited pdf reference manuals are also       *

-     *    available.                                                         *

-     *                                                                       *

-     *    Purchasing FreeRTOS documentation will not only help you, by       *

-     *    ensuring you get running as quickly as possible and with an        *

-     *    in-depth knowledge of how to use FreeRTOS, it will also help       *

-     *    the FreeRTOS project to continue with its mission of providing     *

-     *    professional grade, cross platform, de facto standard solutions    *

-     *    for microcontrollers - completely free of charge!                  *

-     *                                                                       *

-     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *

-     *                                                                       *

-     *    Thank you for using FreeRTOS, and thank you for your support!      *

-     *                                                                       *

-    ***************************************************************************

-

-

-    This file is part of the FreeRTOS distribution.

-

-    FreeRTOS is free software; you can redistribute it and/or modify it under

-    the terms of the GNU General Public License (version 2) as published by the

-    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.

-    >>>NOTE<<< The modification to the GPL is included to allow you to

-    distribute a combined work that includes FreeRTOS without being obliged to

-    provide the source code for proprietary components outside of the FreeRTOS

-    kernel.  FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it

-    can be viewed here: http://www.freertos.org/a00114.html and also obtained

-    by writing to Richard Barry, contact details for whom are available on the

-    FreeRTOS WEB site.

-

-    1 tab == 4 spaces!

-    

-    ***************************************************************************

-     *                                                                       *

-     *    Having a problem?  Start by reading the FAQ "My application does   *

-     *    not run, what could be wrong?                                      *

-     *                                                                       *

-     *    http://www.FreeRTOS.org/FAQHelp.html                               *

-     *                                                                       *

-    ***************************************************************************

-

-    

-    http://www.FreeRTOS.org - Documentation, training, latest information, 

-    license and contact details.

-    

-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,

-    including FreeRTOS+Trace - an indispensable productivity tool.

-

-    Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell 

-    the code with commercial support, indemnification, and middleware, under 

-    the OpenRTOS brand: http://www.OpenRTOS.com.  High Integrity Systems also

-    provide a safety engineered and independently SIL3 certified version under 

-    the SafeRTOS brand: http://www.SafeRTOS.com.

-*/

-

-/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining

-all the API functions to use the MPU wrappers.  That should only be done when

-task.h is included from an application file. */

-#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE

-

-#include "FreeRTOS.h"

-#include "task.h"

-#include "queue.h"

-#include "timers.h"

-

-#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE

-

-/* This entire source file will be skipped if the application is not configured

-to include software timer functionality.  This #if is closed at the very bottom

-of this file.  If you want to include software timer functionality then ensure

-configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */

-#if ( configUSE_TIMERS == 1 )

-

-/* Misc definitions. */

-#define tmrNO_DELAY		( portTickType ) 0U

-

-/* The definition of the timers themselves. */

-typedef struct tmrTimerControl

-{

-	const signed char		*pcTimerName;		/*<< Text name.  This is not used by the kernel, it is included simply to make debugging easier. */

-	xListItem				xTimerListItem;		/*<< Standard linked list item as used by all kernel features for event management. */

-	portTickType			xTimerPeriodInTicks;/*<< How quickly and often the timer expires. */

-	unsigned portBASE_TYPE	uxAutoReload;		/*<< Set to pdTRUE if the timer should be automatically restarted once expired.  Set to pdFALSE if the timer is, in effect, a one shot timer. */

-	void 					*pvTimerID;			/*<< An ID to identify the timer.  This allows the timer to be identified when the same callback is used for multiple timers. */

-	tmrTIMER_CALLBACK		pxCallbackFunction;	/*<< The function that will be called when the timer expires. */

-} xTIMER;

-

-/* The definition of messages that can be sent and received on the timer

-queue. */

-typedef struct tmrTimerQueueMessage

-{

-	portBASE_TYPE			xMessageID;			/*<< The command being sent to the timer service task. */

-	portTickType			xMessageValue;		/*<< An optional value used by a subset of commands, for example, when changing the period of a timer. */

-	xTIMER *				pxTimer;			/*<< The timer to which the command will be applied. */

-} xTIMER_MESSAGE;

-

-

-/* The list in which active timers are stored.  Timers are referenced in expire

-time order, with the nearest expiry time at the front of the list.  Only the

-timer service task is allowed to access xActiveTimerList. */

-PRIVILEGED_DATA static xList xActiveTimerList1;

-PRIVILEGED_DATA static xList xActiveTimerList2;

-PRIVILEGED_DATA static xList *pxCurrentTimerList;

-PRIVILEGED_DATA static xList *pxOverflowTimerList;

-

-/* A queue that is used to send commands to the timer service task. */

-PRIVILEGED_DATA static xQueueHandle xTimerQueue = NULL;

-

-#if ( INCLUDE_xTimerGetTimerDaemonTaskHandle == 1 )

-	

-	PRIVILEGED_DATA static xTaskHandle xTimerTaskHandle = NULL;

-	

-#endif

-

-/*-----------------------------------------------------------*/

-

-/*

- * Initialise the infrastructure used by the timer service task if it has not

- * been initialised already.

- */

-static void prvCheckForValidListAndQueue( void ) PRIVILEGED_FUNCTION;

-

-/*

- * The timer service task (daemon).  Timer functionality is controlled by this

- * task.  Other tasks communicate with the timer service task using the

- * xTimerQueue queue.

- */

-static void prvTimerTask( void *pvParameters ) PRIVILEGED_FUNCTION;

-

-/*

- * Called by the timer service task to interpret and process a command it

- * received on the timer queue.

- */

-static void	prvProcessReceivedCommands( void ) PRIVILEGED_FUNCTION;

-

-/*

- * Insert the timer into either xActiveTimerList1, or xActiveTimerList2,

- * depending on if the expire time causes a timer counter overflow.

- */

-static portBASE_TYPE prvInsertTimerInActiveList( xTIMER *pxTimer, portTickType xNextExpiryTime, portTickType xTimeNow, portTickType xCommandTime ) PRIVILEGED_FUNCTION;

-

-/*

- * An active timer has reached its expire time.  Reload the timer if it is an

- * auto reload timer, then call its callback.

- */

-static void prvProcessExpiredTimer( portTickType xNextExpireTime, portTickType xTimeNow ) PRIVILEGED_FUNCTION;

-

-/*

- * The tick count has overflowed.  Switch the timer lists after ensuring the

- * current timer list does not still reference some timers.

- */

-static void prvSwitchTimerLists( portTickType xLastTime ) PRIVILEGED_FUNCTION;

-

-/*

- * Obtain the current tick count, setting *pxTimerListsWereSwitched to pdTRUE

- * if a tick count overflow occurred since prvSampleTimeNow() was last called.

- */

-static portTickType prvSampleTimeNow( portBASE_TYPE *pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION;

-

-/*

- * If the timer list contains any active timers then return the expire time of

- * the timer that will expire first and set *pxListWasEmpty to false.  If the

- * timer list does not contain any timers then return 0 and set *pxListWasEmpty

- * to pdTRUE.

- */

-static portTickType prvGetNextExpireTime( portBASE_TYPE *pxListWasEmpty ) PRIVILEGED_FUNCTION;

-

-/*

- * If a timer has expired, process it.  Otherwise, block the timer service task

- * until either a timer does expire or a command is received.

- */

-static void prvProcessTimerOrBlockTask( portTickType xNextExpireTime, portBASE_TYPE xListWasEmpty ) PRIVILEGED_FUNCTION;

-

-/*-----------------------------------------------------------*/

-

-portBASE_TYPE xTimerCreateTimerTask( void )

-{

-portBASE_TYPE xReturn = pdFAIL;

-

-	/* This function is called when the scheduler is started if

-	configUSE_TIMERS is set to 1.  Check that the infrastructure used by the

-	timer service task has been created/initialised.  If timers have already

-	been created then the initialisation will already have been performed. */

-	prvCheckForValidListAndQueue();

-

-	if( xTimerQueue != NULL )

-	{

-		#if ( INCLUDE_xTimerGetTimerDaemonTaskHandle == 1 )

-		{

-			/* Create the timer task, storing its handle in xTimerTaskHandle so

-			it can be returned by the xTimerGetTimerDaemonTaskHandle() function. */

-			xReturn = xTaskCreate( prvTimerTask, ( const signed char * ) "Tmr Svc", ( unsigned short ) configTIMER_TASK_STACK_DEPTH, NULL, ( unsigned portBASE_TYPE ) configTIMER_TASK_PRIORITY, &xTimerTaskHandle );	

-		}

-		#else

-		{

-			/* Create the timer task without storing its handle. */

-			xReturn = xTaskCreate( prvTimerTask, ( const signed char * ) "Tmr Svc", ( unsigned short ) configTIMER_TASK_STACK_DEPTH, NULL, ( unsigned portBASE_TYPE ) configTIMER_TASK_PRIORITY, NULL);

-		}

-		#endif

-	}

-

-	configASSERT( xReturn );

-	return xReturn;

-}

-/*-----------------------------------------------------------*/

-

-xTimerHandle xTimerCreate( const signed char *pcTimerName, portTickType xTimerPeriodInTicks, unsigned portBASE_TYPE uxAutoReload, void *pvTimerID, tmrTIMER_CALLBACK pxCallbackFunction )

-{

-xTIMER *pxNewTimer;

-

-	/* Allocate the timer structure. */

-	if( xTimerPeriodInTicks == ( portTickType ) 0U )

-	{

-		pxNewTimer = NULL;

-		configASSERT( ( xTimerPeriodInTicks > 0 ) );

-	}

-	else

-	{

-		pxNewTimer = ( xTIMER * ) pvPortMalloc( sizeof( xTIMER ) );

-		if( pxNewTimer != NULL )

-		{

-			/* Ensure the infrastructure used by the timer service task has been

-			created/initialised. */

-			prvCheckForValidListAndQueue();

-	

-			/* Initialise the timer structure members using the function parameters. */

-			pxNewTimer->pcTimerName = pcTimerName;

-			pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks;

-			pxNewTimer->uxAutoReload = uxAutoReload;

-			pxNewTimer->pvTimerID = pvTimerID;

-			pxNewTimer->pxCallbackFunction = pxCallbackFunction;

-			vListInitialiseItem( &( pxNewTimer->xTimerListItem ) );

-			

-			traceTIMER_CREATE( pxNewTimer );

-		}

-		else

-		{

-			traceTIMER_CREATE_FAILED();

-		}

-	}

-	

-	return ( xTimerHandle ) pxNewTimer;

-}

-/*-----------------------------------------------------------*/

-

-portBASE_TYPE xTimerGenericCommand( xTimerHandle xTimer, portBASE_TYPE xCommandID, portTickType xOptionalValue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portTickType xBlockTime )

-{

-portBASE_TYPE xReturn = pdFAIL;

-xTIMER_MESSAGE xMessage;

-

-	/* Send a message to the timer service task to perform a particular action

-	on a particular timer definition. */

-	if( xTimerQueue != NULL )

-	{

-		/* Send a command to the timer service task to start the xTimer timer. */

-		xMessage.xMessageID = xCommandID;

-		xMessage.xMessageValue = xOptionalValue;

-		xMessage.pxTimer = ( xTIMER * ) xTimer;

-

-		if( pxHigherPriorityTaskWoken == NULL )

-		{

-			if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING )

-			{

-				xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xBlockTime );

-			}

-			else

-			{

-				xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY );

-			}

-		}

-		else

-		{

-			xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken );

-		}

-		

-		traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn );

-	}

-	

-	return xReturn;

-}

-/*-----------------------------------------------------------*/

-

-#if ( INCLUDE_xTimerGetTimerDaemonTaskHandle == 1 )

-

-	xTaskHandle xTimerGetTimerDaemonTaskHandle( void )

-	{

-		/* If xTimerGetTimerDaemonTaskHandle() is called before the scheduler has been

-		started, then xTimerTaskHandle will be NULL. */

-		configASSERT( ( xTimerTaskHandle != NULL ) );

-		return xTimerTaskHandle;

-	}

-	

-#endif

-/*-----------------------------------------------------------*/

-

-static void prvProcessExpiredTimer( portTickType xNextExpireTime, portTickType xTimeNow )

-{

-xTIMER *pxTimer;

-portBASE_TYPE xResult;

-

-	/* Remove the timer from the list of active timers.  A check has already

-	been performed to ensure the list is not empty. */

-	pxTimer = ( xTIMER * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList );

-	vListRemove( &( pxTimer->xTimerListItem ) );

-	traceTIMER_EXPIRED( pxTimer );

-

-	/* If the timer is an auto reload timer then calculate the next

-	expiry time and re-insert the timer in the list of active timers. */

-	if( pxTimer->uxAutoReload == ( unsigned portBASE_TYPE ) pdTRUE )

-	{

-		/* This is the only time a timer is inserted into a list using

-		a time relative to anything other than the current time.  It

-		will therefore be inserted into the correct list relative to

-		the time this task thinks it is now, even if a command to

-		switch lists due to a tick count overflow is already waiting in

-		the timer queue. */

-		if( prvInsertTimerInActiveList( pxTimer, ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xNextExpireTime ) == pdTRUE )

-		{

-			/* The timer expired before it was added to the active timer

-			list.  Reload it now.  */

-			xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START, xNextExpireTime, NULL, tmrNO_DELAY );

-			configASSERT( xResult );

-			( void ) xResult;

-		}

-	}

-

-	/* Call the timer callback. */

-	pxTimer->pxCallbackFunction( ( xTimerHandle ) pxTimer );

-}

-/*-----------------------------------------------------------*/

-

-static void prvTimerTask( void *pvParameters )

-{

-portTickType xNextExpireTime;

-portBASE_TYPE xListWasEmpty;

-

-	/* Just to avoid compiler warnings. */

-	( void ) pvParameters;

-

-	for( ;; )

-	{

-		/* Query the timers list to see if it contains any timers, and if so,

-		obtain the time at which the next timer will expire. */

-		xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty );

-

-		/* If a timer has expired, process it.  Otherwise, block this task

-		until either a timer does expire, or a command is received. */

-		prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty );

-		

-		/* Empty the command queue. */

-		prvProcessReceivedCommands();		

-	}

-}

-/*-----------------------------------------------------------*/

-

-static void prvProcessTimerOrBlockTask( portTickType xNextExpireTime, portBASE_TYPE xListWasEmpty )

-{

-portTickType xTimeNow;

-portBASE_TYPE xTimerListsWereSwitched;

-

-	vTaskSuspendAll();

-	{

-		/* Obtain the time now to make an assessment as to whether the timer

-		has expired or not.  If obtaining the time causes the lists to switch

-		then don't process this timer as any timers that remained in the list

-		when the lists were switched will have been processed within the

-		prvSampelTimeNow() function. */

-		xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );

-		if( xTimerListsWereSwitched == pdFALSE )

-		{

-			/* The tick count has not overflowed, has the timer expired? */

-			if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) )

-			{

-				xTaskResumeAll();

-				prvProcessExpiredTimer( xNextExpireTime, xTimeNow );

-			}

-			else

-			{

-				/* The tick count has not overflowed, and the next expire

-				time has not been reached yet.  This task should therefore

-				block to wait for the next expire time or a command to be

-				received - whichever comes first.  The following line cannot

-				be reached unless xNextExpireTime > xTimeNow, except in the

-				case when the current timer list is empty. */

-				vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ) );

-

-				if( xTaskResumeAll() == pdFALSE )

-				{

-					/* Yield to wait for either a command to arrive, or the block time

-					to expire.  If a command arrived between the critical section being

-					exited and this yield then the yield will not cause the task

-					to block. */

-					portYIELD_WITHIN_API();

-				}

-			}

-		}

-		else

-		{

-			xTaskResumeAll();

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-static portTickType prvGetNextExpireTime( portBASE_TYPE *pxListWasEmpty )

-{

-portTickType xNextExpireTime;

-

-	/* Timers are listed in expiry time order, with the head of the list

-	referencing the task that will expire first.  Obtain the time at which

-	the timer with the nearest expiry time will expire.  If there are no

-	active timers then just set the next expire time to 0.  That will cause

-	this task to unblock when the tick count overflows, at which point the

-	timer lists will be switched and the next expiry time can be

-	re-assessed.  */

-	*pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList );

-	if( *pxListWasEmpty == pdFALSE )

-	{

-		xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList );

-	}

-	else

-	{

-		/* Ensure the task unblocks when the tick count rolls over. */

-		xNextExpireTime = ( portTickType ) 0U;

-	}

-

-	return xNextExpireTime;

-}

-/*-----------------------------------------------------------*/

-

-static portTickType prvSampleTimeNow( portBASE_TYPE *pxTimerListsWereSwitched )

-{

-portTickType xTimeNow;

-static portTickType xLastTime = ( portTickType ) 0U;

-

-	xTimeNow = xTaskGetTickCount();

-	

-	if( xTimeNow < xLastTime )

-	{

-		prvSwitchTimerLists( xLastTime );

-		*pxTimerListsWereSwitched = pdTRUE;

-	}

-	else

-	{

-		*pxTimerListsWereSwitched = pdFALSE;

-	}

-	

-	xLastTime = xTimeNow;

-	

-	return xTimeNow;

-}

-/*-----------------------------------------------------------*/

-

-static portBASE_TYPE prvInsertTimerInActiveList( xTIMER *pxTimer, portTickType xNextExpiryTime, portTickType xTimeNow, portTickType xCommandTime )

-{

-portBASE_TYPE xProcessTimerNow = pdFALSE;

-

-	listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime );

-	listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );

-	

-	if( xNextExpiryTime <= xTimeNow )

-	{

-		/* Has the expiry time elapsed between the command to start/reset a

-		timer was issued, and the time the command was processed? */

-		if( ( ( portTickType ) ( xTimeNow - xCommandTime ) ) >= pxTimer->xTimerPeriodInTicks )

-		{

-			/* The time between a command being issued and the command being

-			processed actually exceeds the timers period.  */

-			xProcessTimerNow = pdTRUE;

-		}

-		else

-		{

-			vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) );

-		}

-	}

-	else

-	{

-		if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) )

-		{

-			/* If, since the command was issued, the tick count has overflowed

-			but the expiry time has not, then the timer must have already passed

-			its expiry time and should be processed immediately. */

-			xProcessTimerNow = pdTRUE;

-		}

-		else

-		{

-			vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );

-		}

-	}

-

-	return xProcessTimerNow;

-}

-/*-----------------------------------------------------------*/

-

-static void	prvProcessReceivedCommands( void )

-{

-xTIMER_MESSAGE xMessage;

-xTIMER *pxTimer;

-portBASE_TYPE xTimerListsWereSwitched, xResult;

-portTickType xTimeNow;

-

-	/* In this case the xTimerListsWereSwitched parameter is not used, but it

-	must be present in the function call. */

-	xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );

-

-	while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL )

-	{

-		pxTimer = xMessage.pxTimer;

-

-		/* Is the timer already in a list of active timers?  When the command

-		is trmCOMMAND_PROCESS_TIMER_OVERFLOW, the timer will be NULL as the

-		command is to the task rather than to an individual timer. */

-		if( pxTimer != NULL )

-		{

-			if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE )

-			{

-				/* The timer is in a list, remove it. */

-				vListRemove( &( pxTimer->xTimerListItem ) );

-			}

-		}

-

-		traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.xMessageValue );

-		

-		switch( xMessage.xMessageID )

-		{

-			case tmrCOMMAND_START :	

-				/* Start or restart a timer. */

-				if( prvInsertTimerInActiveList( pxTimer,  xMessage.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.xMessageValue ) == pdTRUE )

-				{

-					/* The timer expired before it was added to the active timer

-					list.  Process it now. */

-					pxTimer->pxCallbackFunction( ( xTimerHandle ) pxTimer );

-

-					if( pxTimer->uxAutoReload == ( unsigned portBASE_TYPE ) pdTRUE )

-					{

-						xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START, xMessage.xMessageValue + pxTimer->xTimerPeriodInTicks, NULL, tmrNO_DELAY );

-						configASSERT( xResult );

-						( void ) xResult;

-					}

-				}

-				break;

-

-			case tmrCOMMAND_STOP :	

-				/* The timer has already been removed from the active list.

-				There is nothing to do here. */

-				break;

-

-			case tmrCOMMAND_CHANGE_PERIOD :

-				pxTimer->xTimerPeriodInTicks = xMessage.xMessageValue;

-				configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) );

-				prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow );

-				break;

-

-			case tmrCOMMAND_DELETE :

-				/* The timer has already been removed from the active list,

-				just free up the memory. */

-				vPortFree( pxTimer );

-				break;

-

-			default	:			

-				/* Don't expect to get here. */

-				break;

-		}

-	}

-}

-/*-----------------------------------------------------------*/

-

-static void prvSwitchTimerLists( portTickType xLastTime )

-{

-portTickType xNextExpireTime, xReloadTime;

-xList *pxTemp;

-xTIMER *pxTimer;

-portBASE_TYPE xResult;

-

-	/* Remove compiler warnings if configASSERT() is not defined. */

-	( void ) xLastTime;

-	

-	/* The tick count has overflowed.  The timer lists must be switched.

-	If there are any timers still referenced from the current timer list

-	then they must have expired and should be processed before the lists

-	are switched. */

-	while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE )

-	{

-		xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList );

-

-		/* Remove the timer from the list. */

-		pxTimer = ( xTIMER * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList );

-		vListRemove( &( pxTimer->xTimerListItem ) );

-

-		/* Execute its callback, then send a command to restart the timer if

-		it is an auto-reload timer.  It cannot be restarted here as the lists

-		have not yet been switched. */

-		pxTimer->pxCallbackFunction( ( xTimerHandle ) pxTimer );

-

-		if( pxTimer->uxAutoReload == ( unsigned portBASE_TYPE ) pdTRUE )

-		{

-			/* Calculate the reload value, and if the reload value results in

-			the timer going into the same timer list then it has already expired

-			and the timer should be re-inserted into the current list so it is

-			processed again within this loop.  Otherwise a command should be sent

-			to restart the timer to ensure it is only inserted into a list after

-			the lists have been swapped. */

-			xReloadTime = ( xNextExpireTime + pxTimer->xTimerPeriodInTicks );

-			if( xReloadTime > xNextExpireTime )

-			{

-				listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xReloadTime );

-				listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );

-				vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );

-			}

-			else

-			{

-				xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START, xNextExpireTime, NULL, tmrNO_DELAY );

-				configASSERT( xResult );

-				( void ) xResult;

-			}

-		}

-	}

-

-	pxTemp = pxCurrentTimerList;

-	pxCurrentTimerList = pxOverflowTimerList;

-	pxOverflowTimerList = pxTemp;

-}

-/*-----------------------------------------------------------*/

-

-static void prvCheckForValidListAndQueue( void )

-{

-	/* Check that the list from which active timers are referenced, and the

-	queue used to communicate with the timer service, have been

-	initialised. */

-	taskENTER_CRITICAL();

-	{

-		if( xTimerQueue == NULL )

-		{

-			vListInitialise( &xActiveTimerList1 );

-			vListInitialise( &xActiveTimerList2 );

-			pxCurrentTimerList = &xActiveTimerList1;

-			pxOverflowTimerList = &xActiveTimerList2;

-			xTimerQueue = xQueueCreate( ( unsigned portBASE_TYPE ) configTIMER_QUEUE_LENGTH, sizeof( xTIMER_MESSAGE ) );

-		}

-	}

-	taskEXIT_CRITICAL();

-}

-/*-----------------------------------------------------------*/

-

-portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer )

-{

-portBASE_TYPE xTimerIsInActiveList;

-xTIMER *pxTimer = ( xTIMER * ) xTimer;

-

-	/* Is the timer in the list of active timers? */

-	taskENTER_CRITICAL();

-	{

-		/* Checking to see if it is in the NULL list in effect checks to see if

-		it is referenced from either the current or the overflow timer lists in

-		one go, but the logic has to be reversed, hence the '!'. */

-		xTimerIsInActiveList = !( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) );

-	}

-	taskEXIT_CRITICAL();

-

-	return xTimerIsInActiveList;

-}

-/*-----------------------------------------------------------*/

-

-void *pvTimerGetTimerID( xTimerHandle xTimer )

-{

-xTIMER *pxTimer = ( xTIMER * ) xTimer;

-

-	return pxTimer->pvTimerID;

-}

-/*-----------------------------------------------------------*/

-

-/* This entire source file will be skipped if the application is not configured

-to include software timer functionality.  If you want to include software timer

-functionality then ensure configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */

-#endif /* configUSE_TIMERS == 1 */