static void prvErrorChecks( void *pvParameters ) { portTickType xDelay = mainNO_ERROR_DELAY; /* The parameters are not used. */ ( void ) pvParameters; for( ;; ) { /* How long we delay depends on whether an error has been detected or not. Therefore the flash rate of the on board LED indicates whether or not an error has occurred. */ vTaskDelay( xDelay ); /* Update the lErrorInTask flag. */ prvMainCheckOtherTasksAreStillRunning(); if( lErrorInTask ) { /* An error has been found so reduce the delay period and in so doing speed up the flash rate of the on board LED. */ xDelay = mainERROR_DELAY; } prvToggleOnBoardLED(); } }
void vParTestToggleLED( unsigned portBASE_TYPE uxLED ) { if( uxLED < ( portBASE_TYPE ) partstNUM_LEDS ) { vTaskSuspendAll(); { /* If the '*' is already showing - hide it. If it is not already showing then show it. */ if( *( ucRHSSegments[ uxLED ] ) ) { *( ucRHSSegments[ uxLED ] ) = partstSEGMENTS_OFF; *( ucLHSSegments[ uxLED ] ) = partstSEGMENTS_OFF; } else { *( ucRHSSegments[ uxLED ] ) = partstSEGMENTS_ON; *( ucLHSSegments[ uxLED ] ) = partstSEGMENTS_ON; } } xTaskResumeAll(); } else { if( uxLED == partstON_BOARD_LED ) { /* The request related to the genuine on board LED. */ prvToggleOnBoardLED(); } } }
static void vErrorChecks( void *pvParameters ) { TickType_t xDelayPeriod = mainNO_ERROR_FLASH_PERIOD; unsigned long ulMemCheckTaskRunningCount; TaskHandle_t xCreatedTask; /* The parameters are not used in this function. */ ( 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. In addition to the standard tests the memory allocator is tested through the dynamic creation and deletion of a task each cycle. Each time the task is created memory must be allocated for its stack. When the task is deleted this memory is returned to the heap. If the task cannot be created then it is likely that the memory allocation failed. */ for( ;; ) { /* Dynamically create a task - passing ulMemCheckTaskRunningCount as a parameter. */ ulMemCheckTaskRunningCount = mainCOUNT_INITIAL_VALUE; xCreatedTask = mainNO_TASK; if( xTaskCreate( vMemCheckTask, "MEM_CHECK", configMINIMAL_STACK_SIZE, ( void * ) &ulMemCheckTaskRunningCount, tskIDLE_PRIORITY, &xCreatedTask ) != pdPASS ) { /* Could not create the task - we have probably run out of heap. */ xDelayPeriod = mainERROR_FLASH_PERIOD; } /* Delay until it is time to execute again. */ vTaskDelay( xDelayPeriod ); /* Delete the dynamically created task. */ if( xCreatedTask != mainNO_TASK ) { vTaskDelete( xCreatedTask ); } /* Check all the standard demo application tasks are executing without error. ulMemCheckTaskRunningCount is checked to ensure it was modified by the task just deleted. */ if( prvCheckOtherTasksAreStillRunning( ulMemCheckTaskRunningCount ) != pdPASS ) { /* An error has been detected in one of the tasks - flash faster. */ xDelayPeriod = mainERROR_FLASH_PERIOD; } prvToggleOnBoardLED(); } }
static void vErrorChecks( void *pvParameters ) { TickType_t xDelayPeriod = mainNO_ERROR_FLASH_PERIOD; /* 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; } prvToggleOnBoardLED(); } }
/* * See the documentation at the top of this file. */ static void vErrorChecks( void *pvParameters ) { portBASE_TYPE xErrorHasOccurred = pdFALSE; /* Just to prevent compiler warnings. */ ( void ) pvParameters; /* Cycle for ever, delaying then checking all the other tasks are still operating without error. The delay period depends on whether an error has ever been detected. */ for( ;; ) { if( xLatchedError == pdFALSE ) { /* No errors have been detected so delay for a longer period. The on board LED will get toggled every mainNO_ERROR_FLASH_PERIOD ms. */ vTaskDelay( mainNO_ERROR_FLASH_PERIOD ); } else { /* We have at some time recognised an error in one of the demo application tasks, delay for a shorter period. The on board LED will get toggled every mainERROR_FLASH_PERIOD ms. */ vTaskDelay( mainERROR_FLASH_PERIOD ); } /* Check the demo application tasks for errors. */ if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) { xErrorHasOccurred = pdTRUE; } if( xArePollingQueuesStillRunning() != pdTRUE ) { xErrorHasOccurred = pdTRUE; } if( xAreComTestTasksStillRunning() != pdTRUE ) { xErrorHasOccurred = pdTRUE; } if( xAreSemaphoreTasksStillRunning() != pdTRUE ) { xErrorHasOccurred = pdTRUE; } /* If an error has occurred, latch it to cause the LED flash rate to increase. */ if( xErrorHasOccurred == pdTRUE ) { xLatchedError = pdTRUE; } /* Toggle the LED to indicate the completion of a check cycle. The frequency of check cycles is dependent on whether or not we have latched an error. */ prvToggleOnBoardLED(); } }