text: /*
      FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. 
      All rights reserved
  
      VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
  
      ***************************************************************************
       *                                                                       *
       *    FreeRTOS provides completely free yet professionally developed,    *
       *    robust, strictly quality controlled, supported, and cross          *
       *    platform software that has become a de facto standard.             *
       *                                                                       *
       *    Help yourself get started quickly and support the FreeRTOS         *
       *    project by purchasing a FreeRTOS tutorial book, reference          *
       *    manual, or both from: http://www.FreeRTOS.org/Documentation        *
       *                                                                       *
       *    Thank you!                                                         *
       *                                                                       *
      ***************************************************************************
  
      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.  Full license text is available from the following
      link: http://www.freertos.org/a00114.html
  
      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, books, training, latest versions,
      license and Real Time Engineers Ltd. contact details.
  
      http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
      including FreeRTOS+Trace - an indispensable productivity tool, a DOS
      compatible FAT file system, and our tiny thread aware UDP/IP stack.
  
      http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
      Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS
      licenses offer ticketed support, indemnification and middleware.
  
      http://www.SafeRTOS.com - High Integrity Systems also provide a safety
      engineered and independently SIL3 certified version for use in safety and
      mission critical applications that require provable dependability.
  
      1 tab == 4 spaces!
  */
  
  /*
   *******************************************************************************
   * -NOTE- The Win32 port is a simulation (or is that emulation?) only!  Do not
   * expect to get real time behaviour from the Win32 port or this demo
   * application.  It is provided as a convenient development and demonstration
   * test bed only.  This was tested using Windows XP on a dual core laptop.
   *
   * - READ THE WEB DOCUMENTATION FOR THIS PORT FOR MORE INFORMATION ON USING IT -
   *******************************************************************************
   *
   * main() creates all the demo application tasks, then starts the scheduler.  
   * The web documentation provides more details of the standard demo application 
   * tasks, which provide no particular functionality but do provide a good 
   * example of how to use the FreeRTOS API.
   *
   * In addition to the standard demo tasks, the following tasks and tests are
   * defined and/or created within this file:
   *
   * "Check" task - This only executes every five seconds but has a high priority
   * to ensure it gets processor time.  Its main function is to check that all the
   * standard demo tasks are still operational.  While no errors have been
   * discovered the check task will print out "OK" and the current simulated tick
   * time.  If an error is discovered in the execution of a task then the check
   * task will print out an appropriate error message.
   *
   */
  
  
  /* Standard includes. */
  #include <stdio.h>
  
  /* Kernel includes. */
  #include <FreeRTOS.h>
  #include "task.h"
  #include "queue.h"
  
  /* Standard demo includes. */
  #include "BlockQ.h"
  #include "integer.h"
  #include "semtest.h"
  #include "PollQ.h"
  #include "GenQTest.h"
  #include "QPeek.h"
  #include "recmutex.h"
  #include "flop.h"
  
  /* Priorities at which the tasks are created. */
  #define mainCHECK_TASK_PRIORITY		( configMAX_PRIORITIES - 1 )
  #define mainQUEUE_POLL_PRIORITY		( tskIDLE_PRIORITY + 1 )
  #define mainSEM_TEST_PRIORITY		( tskIDLE_PRIORITY + 1 )
  #define mainBLOCK_Q_PRIORITY		( tskIDLE_PRIORITY + 2 )
  #define mainCREATOR_TASK_PRIORITY   ( tskIDLE_PRIORITY + 3 )
  #define mainFLASH_TASK_PRIORITY		( tskIDLE_PRIORITY + 1 )
  #define mainuIP_TASK_PRIORITY		( tskIDLE_PRIORITY + 2 )
  #define mainINTEGER_TASK_PRIORITY   ( tskIDLE_PRIORITY )
  #define mainGEN_QUEUE_TASK_PRIORITY	( tskIDLE_PRIORITY )
  #define mainFLOP_TASK_PRIORITY		( tskIDLE_PRIORITY )
  
  /* Task function prototypes. */
  static void prvCheckTask( void *pvParameters );
  
  /*-----------------------------------------------------------*/
  
  int main( void )
  {
  	/* Start the check task as described at the top of this file. */
  	xTaskCreate( prvCheckTask, ( signed char * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
  
  	/* Create the standard demo tasks. */
  	vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
  	vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
  	vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
  	vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY );
  	vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY );
  	vStartQueuePeekTasks();
  	vStartMathTasks( mainFLOP_TASK_PRIORITY );
  	vStartRecursiveMutexTasks();
  
  	/* Start the scheduler itself. */
  	vTaskStartScheduler();
  
      /* Should never get here unless there was not enough heap space to create 
  	the idle and other system tasks. */
      return 0;
  }
  /*-----------------------------------------------------------*/
  
  static void prvCheckTask( void *pvParameters )
  {
  portTickType xNextWakeTime;
  const portTickType xCycleFrequency = 2500 / portTICK_RATE_MS;
  char *pcStatusMessage = "OK";
  
  	/* Just to remove compiler warning. */
  	( void ) pvParameters;
  
  	/* Initialise xNextWakeTime - this only needs to be done once. */
  	xNextWakeTime = xTaskGetTickCount();
  
  	for( ;; )
  	{
  		/* Place this task in the blocked state until it is time to run again. */
  		vTaskDelayUntil( &xNextWakeTime, xCycleFrequency );
  
  		/* Check the standard demo tasks are running without error. */
  	    if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
  	    {
  			pcStatusMessage = "Error: IntMath";
  	    }	
  		else if( xAreGenericQueueTasksStillRunning() != pdTRUE )
  		{			
  			pcStatusMessage = "Error: GenQueue";
  		}
  		else if( xAreQueuePeekTasksStillRunning() != pdTRUE )
  		{
  			pcStatusMessage = "Error: QueuePeek";
  		}
  		else if( xAreBlockingQueuesStillRunning() != pdTRUE )
  		{
  			pcStatusMessage = "Error: BlockQueue";
  		}
  	    else if( xAreSemaphoreTasksStillRunning() != pdTRUE )
  	    {
  			pcStatusMessage = "Error: SemTest";
  	    }
  	    else if( xArePollingQueuesStillRunning() != pdTRUE )
  	    {
  			pcStatusMessage = "Error: PollQueue";
  	    }
  		else if( xAreMathsTaskStillRunning() != pdPASS )
  		{
  			pcStatusMessage = "Error: Flop";
  		}
  	    else if( xAreRecursiveMutexTasksStillRunning() != pdTRUE )
  	    {
  			pcStatusMessage = "Error: RecMutex";
  		}
  
  		/* This is the only task that uses stdout so its ok to call printf() 
  		directly. */
  		printf( "%s - %d\r\n", pcStatusMessage, ( int ) xTaskGetTickCount() );
  		fflush( stdout ); /* Required by Eclipse console. */
  	}
  }
  /*-----------------------------------------------------------*/
  
  void vApplicationIdleHook( void )
  {
  const unsigned long ulMSToSleep = 5;
  
  	/* Sleep to reduce CPU load, but don't sleep indefinitely in case there are
  	tasks waiting to be terminated by the idle task. */
  	Sleep( ulMSToSleep );
  }
  /*-----------------------------------------------------------*/
  
  void vApplicationMallocFailedHook( void )
  {
  	/* Can be implemented if required, but probably not required in this 
  	environment and running this demo. */
  }
  /*-----------------------------------------------------------*/
  
  void vApplicationStackOverflowHook( void )
  {
  	/* Can be implemented if required, but not required in this 
  	environment and running this demo. */
  }
  
  