Skip to content

Commit 29e817b

Browse files
authoredFeb 12, 2025··
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>
1 parent 51a1598 commit 29e817b

File tree

1 file changed

+70
-18
lines changed

1 file changed

+70
-18
lines changed
 

‎tasks.c

+70-18
Original file line numberDiff line numberDiff line change
@@ -6215,7 +6215,7 @@ static void prvCheckTasksWaitingTermination( void )
62156215

62166216
#if ( configGENERATE_RUN_TIME_STATS == 1 )
62176217
{
6218-
pxTaskStatus->ulRunTimeCounter = pxTCB->ulRunTimeCounter;
6218+
pxTaskStatus->ulRunTimeCounter = ulTaskGetRunTimeCounter( xTask );
62196219
}
62206220
#else
62216221
{
@@ -8415,15 +8415,37 @@ TickType_t uxTaskResetEventItemValue( void )
84158415
configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimeCounter( const TaskHandle_t xTask )
84168416
{
84178417
TCB_t * pxTCB;
8418+
configRUN_TIME_COUNTER_TYPE ulTotalTime = 0, ulTimeSinceLastSwitchedIn = 0, ulTaskRunTime = 0;
84188419

84198420
traceENTER_ulTaskGetRunTimeCounter( xTask );
84208421

84218422
pxTCB = prvGetTCBFromHandle( xTask );
84228423
configASSERT( pxTCB != NULL );
84238424

8424-
traceRETURN_ulTaskGetRunTimeCounter( pxTCB->ulRunTimeCounter );
8425+
taskENTER_CRITICAL();
8426+
{
8427+
if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE )
8428+
{
8429+
#ifdef portALT_GET_RUN_TIME_COUNTER_VALUE
8430+
portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalTime );
8431+
#else
8432+
ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE();
8433+
#endif
8434+
8435+
#if ( configNUMBER_OF_CORES == 1 )
8436+
ulTimeSinceLastSwitchedIn = ulTotalTime - ulTaskSwitchedInTime[ 0 ];
8437+
#else
8438+
ulTimeSinceLastSwitchedIn = ulTotalTime - ulTaskSwitchedInTime[ pxTCB->xTaskRunState ];
8439+
#endif
8440+
}
84258441

8426-
return pxTCB->ulRunTimeCounter;
8442+
ulTaskRunTime = pxTCB->ulRunTimeCounter + ulTimeSinceLastSwitchedIn;
8443+
}
8444+
taskEXIT_CRITICAL();
8445+
8446+
traceRETURN_ulTaskGetRunTimeCounter( ulTaskRunTime );
8447+
8448+
return ulTaskRunTime;
84278449
}
84288450

84298451
#endif /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */
@@ -8434,11 +8456,17 @@ TickType_t uxTaskResetEventItemValue( void )
84348456
configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimePercent( const TaskHandle_t xTask )
84358457
{
84368458
TCB_t * pxTCB;
8437-
configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn;
8459+
configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn, ulTaskRunTime;
84388460

84398461
traceENTER_ulTaskGetRunTimePercent( xTask );
84408462

8441-
ulTotalTime = ( configRUN_TIME_COUNTER_TYPE ) portGET_RUN_TIME_COUNTER_VALUE();
8463+
ulTaskRunTime = ulTaskGetRunTimeCounter( xTask );
8464+
8465+
#ifdef portALT_GET_RUN_TIME_COUNTER_VALUE
8466+
portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalTime );
8467+
#else
8468+
ulTotalTime = ( configRUN_TIME_COUNTER_TYPE ) portGET_RUN_TIME_COUNTER_VALUE();
8469+
#endif
84428470

84438471
/* For percentage calculations. */
84448472
ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100;
@@ -8449,7 +8477,7 @@ TickType_t uxTaskResetEventItemValue( void )
84498477
pxTCB = prvGetTCBFromHandle( xTask );
84508478
configASSERT( pxTCB != NULL );
84518479

8452-
ulReturn = pxTCB->ulRunTimeCounter / ulTotalTime;
8480+
ulReturn = ulTaskRunTime / ulTotalTime;
84538481
}
84548482
else
84558483
{
@@ -8468,19 +8496,42 @@ TickType_t uxTaskResetEventItemValue( void )
84688496

84698497
configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter( void )
84708498
{
8471-
configRUN_TIME_COUNTER_TYPE ulReturn = 0;
8499+
configRUN_TIME_COUNTER_TYPE ulTotalTime = 0, ulTimeSinceLastSwitchedIn = 0, ulIdleTaskRunTime = 0;
84728500
BaseType_t i;
84738501

84748502
traceENTER_ulTaskGetIdleRunTimeCounter();
84758503

8476-
for( i = 0; i < ( BaseType_t ) configNUMBER_OF_CORES; i++ )
8504+
taskENTER_CRITICAL();
84778505
{
8478-
ulReturn += xIdleTaskHandles[ i ]->ulRunTimeCounter;
8506+
#ifdef portALT_GET_RUN_TIME_COUNTER_VALUE
8507+
portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalTime );
8508+
#else
8509+
ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE();
8510+
#endif
8511+
8512+
for( i = 0; i < ( BaseType_t ) configNUMBER_OF_CORES; i++ )
8513+
{
8514+
if( taskTASK_IS_RUNNING( xIdleTaskHandles[ i ] ) == pdTRUE )
8515+
{
8516+
#if ( configNUMBER_OF_CORES == 1 )
8517+
ulTimeSinceLastSwitchedIn = ulTotalTime - ulTaskSwitchedInTime[ 0 ];
8518+
#else
8519+
ulTimeSinceLastSwitchedIn = ulTotalTime - ulTaskSwitchedInTime[ xIdleTaskHandles[ i ]->xTaskRunState ];
8520+
#endif
8521+
}
8522+
else
8523+
{
8524+
ulTimeSinceLastSwitchedIn = 0;
8525+
}
8526+
8527+
ulIdleTaskRunTime += ( xIdleTaskHandles[ i ]->ulRunTimeCounter + ulTimeSinceLastSwitchedIn );
8528+
}
84798529
}
8530+
taskEXIT_CRITICAL();
84808531

8481-
traceRETURN_ulTaskGetIdleRunTimeCounter( ulReturn );
8532+
traceRETURN_ulTaskGetIdleRunTimeCounter( ulIdleTaskRunTime );
84828533

8483-
return ulReturn;
8534+
return ulIdleTaskRunTime;
84848535
}
84858536

84868537
#endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */
@@ -8492,23 +8543,24 @@ TickType_t uxTaskResetEventItemValue( void )
84928543
{
84938544
configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn;
84948545
configRUN_TIME_COUNTER_TYPE ulRunTimeCounter = 0;
8495-
BaseType_t i;
84968546

84978547
traceENTER_ulTaskGetIdleRunTimePercent();
84988548

8499-
ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE() * configNUMBER_OF_CORES;
8549+
#ifdef portALT_GET_RUN_TIME_COUNTER_VALUE
8550+
portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalTime );
8551+
#else
8552+
ulTotalTime = ( configRUN_TIME_COUNTER_TYPE ) portGET_RUN_TIME_COUNTER_VALUE();
8553+
#endif
8554+
8555+
ulTotalTime *= configNUMBER_OF_CORES;
85008556

85018557
/* For percentage calculations. */
85028558
ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100;
85038559

85048560
/* Avoid divide by zero errors. */
85058561
if( ulTotalTime > ( configRUN_TIME_COUNTER_TYPE ) 0 )
85068562
{
8507-
for( i = 0; i < ( BaseType_t ) configNUMBER_OF_CORES; i++ )
8508-
{
8509-
ulRunTimeCounter += xIdleTaskHandles[ i ]->ulRunTimeCounter;
8510-
}
8511-
8563+
ulRunTimeCounter = ulTaskGetIdleRunTimeCounter();
85128564
ulReturn = ulRunTimeCounter / ulTotalTime;
85138565
}
85148566
else

0 commit comments

Comments
 (0)
Please sign in to comment.