Include current task runtime in ulTaskGetRunTimeCounter (#1234)

* Include current task runtime in ulTaskGetRunTimeCounter

Update ulTaskGetRunTimeCounter to include elapsed time since the last
context switch when called for the currently running task. Previously,
this time was not included in the calculation.

Fixes #1202.

Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com>
pull/1247/head
Gaurav-Aggarwal-AWS 2 weeks ago committed by GitHub
parent 51a1598e4e
commit 29e817b70e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -6215,7 +6215,7 @@ static void prvCheckTasksWaitingTermination( void )
#if ( configGENERATE_RUN_TIME_STATS == 1 ) #if ( configGENERATE_RUN_TIME_STATS == 1 )
{ {
pxTaskStatus->ulRunTimeCounter = pxTCB->ulRunTimeCounter; pxTaskStatus->ulRunTimeCounter = ulTaskGetRunTimeCounter( xTask );
} }
#else #else
{ {
@ -8415,15 +8415,37 @@ TickType_t uxTaskResetEventItemValue( void )
configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimeCounter( const TaskHandle_t xTask ) configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimeCounter( const TaskHandle_t xTask )
{ {
TCB_t * pxTCB; TCB_t * pxTCB;
configRUN_TIME_COUNTER_TYPE ulTotalTime = 0, ulTimeSinceLastSwitchedIn = 0, ulTaskRunTime = 0;
traceENTER_ulTaskGetRunTimeCounter( xTask ); traceENTER_ulTaskGetRunTimeCounter( xTask );
pxTCB = prvGetTCBFromHandle( xTask ); pxTCB = prvGetTCBFromHandle( xTask );
configASSERT( pxTCB != NULL ); configASSERT( pxTCB != NULL );
traceRETURN_ulTaskGetRunTimeCounter( pxTCB->ulRunTimeCounter ); taskENTER_CRITICAL();
{
if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE )
{
#ifdef portALT_GET_RUN_TIME_COUNTER_VALUE
portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalTime );
#else
ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE();
#endif
return pxTCB->ulRunTimeCounter; #if ( configNUMBER_OF_CORES == 1 )
ulTimeSinceLastSwitchedIn = ulTotalTime - ulTaskSwitchedInTime[ 0 ];
#else
ulTimeSinceLastSwitchedIn = ulTotalTime - ulTaskSwitchedInTime[ pxTCB->xTaskRunState ];
#endif
}
ulTaskRunTime = pxTCB->ulRunTimeCounter + ulTimeSinceLastSwitchedIn;
}
taskEXIT_CRITICAL();
traceRETURN_ulTaskGetRunTimeCounter( ulTaskRunTime );
return ulTaskRunTime;
} }
#endif /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */ #endif /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */
@ -8434,11 +8456,17 @@ TickType_t uxTaskResetEventItemValue( void )
configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimePercent( const TaskHandle_t xTask ) configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimePercent( const TaskHandle_t xTask )
{ {
TCB_t * pxTCB; TCB_t * pxTCB;
configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn; configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn, ulTaskRunTime;
traceENTER_ulTaskGetRunTimePercent( xTask ); traceENTER_ulTaskGetRunTimePercent( xTask );
ulTaskRunTime = ulTaskGetRunTimeCounter( xTask );
#ifdef portALT_GET_RUN_TIME_COUNTER_VALUE
portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalTime );
#else
ulTotalTime = ( configRUN_TIME_COUNTER_TYPE ) portGET_RUN_TIME_COUNTER_VALUE(); ulTotalTime = ( configRUN_TIME_COUNTER_TYPE ) portGET_RUN_TIME_COUNTER_VALUE();
#endif
/* For percentage calculations. */ /* For percentage calculations. */
ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100; ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100;
@ -8449,7 +8477,7 @@ TickType_t uxTaskResetEventItemValue( void )
pxTCB = prvGetTCBFromHandle( xTask ); pxTCB = prvGetTCBFromHandle( xTask );
configASSERT( pxTCB != NULL ); configASSERT( pxTCB != NULL );
ulReturn = pxTCB->ulRunTimeCounter / ulTotalTime; ulReturn = ulTaskRunTime / ulTotalTime;
} }
else else
{ {
@ -8468,19 +8496,42 @@ TickType_t uxTaskResetEventItemValue( void )
configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter( void ) configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter( void )
{ {
configRUN_TIME_COUNTER_TYPE ulReturn = 0; configRUN_TIME_COUNTER_TYPE ulTotalTime = 0, ulTimeSinceLastSwitchedIn = 0, ulIdleTaskRunTime = 0;
BaseType_t i; BaseType_t i;
traceENTER_ulTaskGetIdleRunTimeCounter(); traceENTER_ulTaskGetIdleRunTimeCounter();
taskENTER_CRITICAL();
{
#ifdef portALT_GET_RUN_TIME_COUNTER_VALUE
portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalTime );
#else
ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE();
#endif
for( i = 0; i < ( BaseType_t ) configNUMBER_OF_CORES; i++ ) for( i = 0; i < ( BaseType_t ) configNUMBER_OF_CORES; i++ )
{ {
ulReturn += xIdleTaskHandles[ i ]->ulRunTimeCounter; if( taskTASK_IS_RUNNING( xIdleTaskHandles[ i ] ) == pdTRUE )
{
#if ( configNUMBER_OF_CORES == 1 )
ulTimeSinceLastSwitchedIn = ulTotalTime - ulTaskSwitchedInTime[ 0 ];
#else
ulTimeSinceLastSwitchedIn = ulTotalTime - ulTaskSwitchedInTime[ xIdleTaskHandles[ i ]->xTaskRunState ];
#endif
}
else
{
ulTimeSinceLastSwitchedIn = 0;
}
ulIdleTaskRunTime += ( xIdleTaskHandles[ i ]->ulRunTimeCounter + ulTimeSinceLastSwitchedIn );
}
} }
taskEXIT_CRITICAL();
traceRETURN_ulTaskGetIdleRunTimeCounter( ulReturn ); traceRETURN_ulTaskGetIdleRunTimeCounter( ulIdleTaskRunTime );
return ulReturn; return ulIdleTaskRunTime;
} }
#endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */ #endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */
@ -8492,11 +8543,16 @@ TickType_t uxTaskResetEventItemValue( void )
{ {
configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn; configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn;
configRUN_TIME_COUNTER_TYPE ulRunTimeCounter = 0; configRUN_TIME_COUNTER_TYPE ulRunTimeCounter = 0;
BaseType_t i;
traceENTER_ulTaskGetIdleRunTimePercent(); traceENTER_ulTaskGetIdleRunTimePercent();
ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE() * configNUMBER_OF_CORES; #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE
portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalTime );
#else
ulTotalTime = ( configRUN_TIME_COUNTER_TYPE ) portGET_RUN_TIME_COUNTER_VALUE();
#endif
ulTotalTime *= configNUMBER_OF_CORES;
/* For percentage calculations. */ /* For percentage calculations. */
ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100; ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100;
@ -8504,11 +8560,7 @@ TickType_t uxTaskResetEventItemValue( void )
/* Avoid divide by zero errors. */ /* Avoid divide by zero errors. */
if( ulTotalTime > ( configRUN_TIME_COUNTER_TYPE ) 0 ) if( ulTotalTime > ( configRUN_TIME_COUNTER_TYPE ) 0 )
{ {
for( i = 0; i < ( BaseType_t ) configNUMBER_OF_CORES; i++ ) ulRunTimeCounter = ulTaskGetIdleRunTimeCounter();
{
ulRunTimeCounter += xIdleTaskHandles[ i ]->ulRunTimeCounter;
}
ulReturn = ulRunTimeCounter / ulTotalTime; ulReturn = ulRunTimeCounter / ulTotalTime;
} }
else else

Loading…
Cancel
Save