static portTASK_FUNCTION( vCompetingMathTask2, pvParameters ) { volatile portDOUBLE d1, d2, d3, d4; volatile unsigned long *pulTaskCheckVariable; volatile portDOUBLE dAnswer; short sError = pdFALSE; /* Must be called before any hardware floating point operations are performed to let the RTOS portable layer know that this task requires a floating point context. */ #if __TI_VFP_SUPPORT__ vPortTaskUsesFPU(); #endif d1 = -389.38; d2 = 32498.2; d3 = -2.0001; dAnswer = ( d1 / d2 ) * d3; /* The variable this task increments to show it is still running is passed in as the parameter. */ pulTaskCheckVariable = ( unsigned long * ) pvParameters; /* Keep performing a calculation and checking the result against a constant. */ for( ;; ) { d1 = -389.38; d2 = 32498.2; d3 = -2.0001; d4 = ( d1 / d2 ) * d3; #if configUSE_PREEMPTION == 0 taskYIELD(); #endif /* If the calculation does not match the expected constant, stop the increment of the check variable. */ if( fabs( d4 - dAnswer ) > 0.001 ) { sError = pdTRUE; } if( sError == pdFALSE ) { /* If the calculation has always been correct, increment the check variable so we know this task is still running okay. */ ( *pulTaskCheckVariable )++; } #if configUSE_PREEMPTION == 0 taskYIELD(); #endif } }
static void prvRegTestTaskEntry2( void *pvParameters ) { /* Although the regtest task is written in assembler, its entry point is written in C for convenience of checking the task parameter is being passed in correctly. */ if( pvParameters == mainREG_TEST_TASK_2_PARAMETER ) { /* The reg test task also tests the floating point registers. Tasks that use the floating point unit must call vPortTaskUsesFPU() before any floating point instructions are executed. */ vPortTaskUsesFPU(); /* Start the part of the test that is written in assembler. */ vRegTest2Implementation(); } /* The following line will only execute if the task parameter is found to be incorrect. The check timer will detect that the regtest loop counter is not being incremented and flag an error. */ vTaskDelete( NULL ); }
static portTASK_FUNCTION( vCompetingMathTask4, pvParameters ) { volatile portDOUBLE *pdArray, dTotal1, dTotal2, dDifference; volatile unsigned long *pulTaskCheckVariable; const size_t xArraySize = 10; size_t xPosition; short sError = pdFALSE; /* Must be called before any hardware floating point operations are performed to let the RTOS portable layer know that this task requires a floating point context. */ #if __TI_VFP_SUPPORT__ vPortTaskUsesFPU(); #endif /* The variable this task increments to show it is still running is passed in as the parameter. */ pulTaskCheckVariable = ( unsigned long * ) pvParameters; pdArray = ( portDOUBLE * ) pvPortMalloc( xArraySize * sizeof( portDOUBLE ) ); /* Keep filling an array, keeping a running total of the values placed in the array. Then run through the array adding up all the values. If the two totals do not match, stop the check variable from incrementing. */ for( ;; ) { dTotal1 = 0.0; dTotal2 = 0.0; for( xPosition = 0; xPosition < xArraySize; xPosition++ ) { pdArray[ xPosition ] = ( portDOUBLE ) xPosition * 12.123; dTotal1 += ( portDOUBLE ) xPosition * 12.123; } #if configUSE_PREEMPTION == 0 taskYIELD(); #endif for( xPosition = 0; xPosition < xArraySize; xPosition++ ) { dTotal2 += pdArray[ xPosition ]; } dDifference = dTotal1 - dTotal2; if( fabs( dDifference ) > 0.001 ) { sError = pdTRUE; } #if configUSE_PREEMPTION == 0 taskYIELD(); #endif if( sError == pdFALSE ) { /* If the calculation has always been correct, increment the check variable so we know this task is still running okay. */ ( *pulTaskCheckVariable )++; } } }