| /* |
| FreeRTOS V6.0.4 - Copyright (C) 2010 Real Time Engineers Ltd. |
| |
| *************************************************************************** |
| * * |
| * If you are: * |
| * * |
| * + New to FreeRTOS, * |
| * + Wanting to learn FreeRTOS or multitasking in general quickly * |
| * + Looking for basic training, * |
| * + Wanting to improve your FreeRTOS skills and productivity * |
| * * |
| * then take a look at the FreeRTOS eBook * |
| * * |
| * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * |
| * http://www.FreeRTOS.org/Documentation * |
| * * |
| * A pdf reference manual is also available. Both are usually delivered * |
| * to your inbox within 20 minutes to two hours when purchased between 8am * |
| * and 8pm GMT (although please allow up to 24 hours in case of * |
| * exceptional circumstances). 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 exception 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! |
| |
| http://www.FreeRTOS.org - Documentation, latest information, license and |
| contact details. |
| |
| http://www.SafeRTOS.com - A version that is certified for use in safety |
| critical systems. |
| |
| http://www.OpenRTOS.com - Commercial support, development, porting, |
| licensing and training services. |
| */ |
| |
| /* |
| * Creates all the demo application tasks, then starts the scheduler. |
| * |
| * Main.c also creates a task called "Check". This only executes every three |
| * seconds but has the highest priority so is guaranteed to get processor time. |
| * Its main function is to check that all the other tasks are still operational. |
| * Each task (other than the "flash" tasks) maintains a unique count that is |
| * incremented each time the task successfully completes its function. Should |
| * any error occur within such a task the count is permanently halted. The |
| * check task inspects the count of each task to ensure it has changed since |
| * the last time the check task executed. If all the count variables have |
| * changed all the tasks are still executing error free, and the check task |
| * toggles the on board LED. Should any task contain an error at any time |
| * the LED toggle rate will change from 3 seconds to 500ms. |
| * |
| * NOTE: The demo application includes tasks that send and receive characters |
| * over the UART. The characters sent by one task are received by another - |
| * with an error condition being flagged should any characters be missed or |
| * received out of order. A loopback connector is required on the 9way D socket |
| * for this mechanism to operation (pins 2 and 3 the socket should be connected |
| * together - a paper clip is normally sufficient). |
| * |
| */ |
| |
| /* Standard includes. */ |
| #include <stdlib.h> |
| #include <string.h> |
| |
| /* Scheduler includes. */ |
| #include "FreeRTOS.h" |
| #include "task.h" |
| |
| /* Demo application includes. */ |
| #include "partest.h" |
| #include "flash.h" |
| #include "integer.h" |
| #include "PollQ.h" |
| #include "comtest2.h" |
| #include "semtest.h" |
| #include "flop.h" |
| #include "dynamic.h" |
| #include "BlockQ.h" |
| #include "serial.h" |
| #include "demoGpio.h" |
| #include "7seg.h" |
| #include "RegTest.h" |
| |
| /*-----------------------------------------------------------*/ |
| |
| /* Constants for the ComTest tasks. */ |
| #define mainCOM_TEST_BAUD_RATE ( ( unsigned long ) 115200 ) |
| #define mainCOM_TEST_LED ( 5 ) |
| |
| /* Priorities for the demo application tasks. */ |
| #define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) |
| #define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 ) |
| #define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) |
| #define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 ) |
| #define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) |
| #define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) |
| #define main7SEG_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 ) |
| |
| /* The rate at which the on board LED will toggle when there is/is not an |
| error. */ |
| #define mainNO_ERROR_FLASH_PERIOD ( ( portTickType ) 3000 / portTICK_RATE_MS ) |
| #define mainERROR_FLASH_PERIOD ( ( portTickType ) 500 / portTICK_RATE_MS ) |
| #define mainON_BOARD_LED_BIT ( ( unsigned long ) 7 ) |
| |
| /* The size of the memory blocks allocated by the vMemCheckTask() task. */ |
| #define mainMEM_CHECK_SIZE_1 ( ( size_t ) 51 ) |
| #define mainMEM_CHECK_SIZE_2 ( ( size_t ) 52 ) |
| #define mainMEM_CHECK_SIZE_3 ( ( size_t ) 151 ) |
| |
| /*-----------------------------------------------------------*/ |
| |
| /* |
| * Checks that all the demo application tasks are still executing without error |
| * - as described at the top of the file. |
| */ |
| static long prvCheckOtherTasksAreStillRunning( void ); |
| |
| /* |
| * The task that executes at the highest priority and calls |
| * prvCheckOtherTasksAreStillRunning(). See the description at the top |
| * of the file. |
| */ |
| static void vErrorChecks( void *pvParameters ); |
| |
| /* |
| * Configure the processor for use with the Olimex demo board. This includes |
| * setup for the I/O, system clock, and access timings. |
| */ |
| static void prvSetupHardware( void ); |
| |
| |
| /*-----------------------------------------------------------*/ |
| |
| /* |
| * Starts all the other tasks, then starts the scheduler. |
| */ |
| int main( void ) |
| { |
| /* Setup the hardware for use with the Xilinx evaluation board. */ |
| prvSetupHardware(); |
| |
| /* Start the demo/test application tasks. */ |
| vStartIntegerMathTasks( tskIDLE_PRIORITY ); |
| vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED ); |
| vStartLEDFlashTasks( mainLED_TASK_PRIORITY ); |
| vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); |
| vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); |
| vStartDynamicPriorityTasks(); |
| vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); |
| vStart7SegTasks( main7SEG_TASK_PRIORITY ); |
| vStartRegTestTasks(); |
| |
| /* Start the check task - which is defined in this file. */ |
| xTaskCreate( vErrorChecks, ( signed char * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); |
| |
| /* Now all the tasks have been started - start the scheduler. */ |
| vTaskStartScheduler(); |
| |
| /* Should never reach here! */ |
| for( ;; ); |
| } |
| /*-----------------------------------------------------------*/ |
| |
| static void vErrorChecks( void *pvParameters ) |
| { |
| portTickType xDelayPeriod = mainNO_ERROR_FLASH_PERIOD; |
| |
| /* Just to stop compiler warnings. */ |
| ( void ) pvParameters; |
| |
| /* Cycle for ever, delaying then checking all the other tasks are still |
| operating without error. If an error is detected then the delay period |
| is decreased from mainNO_ERROR_FLASH_PERIOD to mainERROR_FLASH_PERIOD so |
| the on board LED flash rate will increase. */ |
| |
| for( ;; ) |
| { |
| /* Delay until it is time to execute again. */ |
| vTaskDelay( xDelayPeriod ); |
| |
| /* Check all the standard demo application tasks are executing without |
| error. */ |
| if( prvCheckOtherTasksAreStillRunning() != pdPASS ) |
| { |
| /* An error has been detected in one of the tasks - flash faster. */ |
| xDelayPeriod = mainERROR_FLASH_PERIOD; |
| } |
| |
| /* The toggle rate of the LED depends on how long this task delays for. |
| An error reduces the delay period and so increases the toggle rate. */ |
| vParTestToggleLED( mainON_BOARD_LED_BIT ); |
| } |
| } |
| /*-----------------------------------------------------------*/ |
| |
| static void prvSetupHardware( void ) |
| { |
| /* Initialise LED outputs. */ |
| vParTestInitialise(); |
| } |
| /*-----------------------------------------------------------*/ |
| |
| static long prvCheckOtherTasksAreStillRunning( void ) |
| { |
| long lReturn = pdPASS; |
| |
| /* Check all the demo tasks (other than the flash tasks) to ensure |
| that they are all still running, and that none of them have detected |
| an error. */ |
| |
| if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) |
| { |
| lReturn = pdFAIL; |
| } |
| |
| if( xAreComTestTasksStillRunning() != pdTRUE ) |
| { |
| lReturn = pdFAIL; |
| } |
| |
| if( xArePollingQueuesStillRunning() != pdTRUE ) |
| { |
| lReturn = pdFAIL; |
| } |
| |
| if( xAreSemaphoreTasksStillRunning() != pdTRUE ) |
| { |
| lReturn = pdFAIL; |
| } |
| |
| if( xAreDynamicPriorityTasksStillRunning() != pdTRUE ) |
| { |
| lReturn = pdFAIL; |
| } |
| |
| if( xAreBlockingQueuesStillRunning() != pdTRUE ) |
| { |
| lReturn = pdFAIL; |
| } |
| |
| if( xAreRegTestTasksStillRunning() != pdTRUE ) |
| { |
| lReturn = pdFAIL; |
| } |
| |
| return lReturn; |
| } |
| /*-----------------------------------------------------------*/ |
| |
| void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName ) |
| { |
| /* This function will be called if a task overflows its stack. Inspect |
| pxCurrentTCB to find the offending task if the overflow was sever enough |
| to corrupt the pcTaskName parameter. */ |
| vParTestSetLED( 4, 1 ); |
| for( ;; ); |
| } |
| /*-----------------------------------------------------------*/ |
| |
| void vApplicationMallocFailedHook( void ) |
| { |
| /* This function will be called if a call to pvPortMalloc() fails to return |
| the requested memory. pvPortMalloc() is called internally by the scheduler |
| whenever a task, queue or semaphore is created. */ |
| vParTestSetLED( 4, 1 ); |
| for( ;; ); |
| } |
| /*-----------------------------------------------------------*/ |
| |
| /* Provide an exit function to prevent a whole load of standard library functions |
| being brought into the build. */ |
| void exit( int status ) |
| { |
| for( ;; ); |
| } |
| |
| |