From 6e6e9347bc030997fa3d04cd4f85a958405a263a Mon Sep 17 00:00:00 2001 From: Gaurav Aggarwal Date: Thu, 30 Jan 2025 11:55:02 +0000 Subject: [PATCH 1/5] 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 --- tasks.c | 45 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/tasks.c b/tasks.c index 518c9e87f1..cf8f396967 100644 --- a/tasks.c +++ b/tasks.c @@ -8411,15 +8411,36 @@ TickType_t uxTaskResetEventItemValue( void ) configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimeCounter( const TaskHandle_t xTask ) { TCB_t * pxTCB; + configRUN_TIME_COUNTER_TYPE ulCurrentRunTimeCounter = 0, ulTimeSinceLastSwitchedIn = 0, ulTotalRunTime = 0; traceENTER_ulTaskGetRunTimeCounter( xTask ); pxTCB = prvGetTCBFromHandle( xTask ); 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( ulCurrentRunTimeCounter ); + #else + ulCurrentRunTimeCounter = portGET_RUN_TIME_COUNTER_VALUE(); + #endif - return pxTCB->ulRunTimeCounter; + #if( configNUMBER_OF_CORES == 1 ) + ulTimeSinceLastSwitchedIn = ulCurrentRunTimeCounter - ulTaskSwitchedInTime[ 0 ]; + #else + ulTimeSinceLastSwitchedIn = ulCurrentRunTimeCounter - ulTaskSwitchedInTime[ pxTCB->xTaskRunState ]; + #endif + } + ulTotalRunTime = pxTCB->ulRunTimeCounter + ulTimeSinceLastSwitchedIn; + } + taskEXIT_CRITICAL(); + + traceRETURN_ulTaskGetRunTimeCounter( ulTotalRunTime ); + + return ulTotalRunTime; } #endif /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */ @@ -8430,11 +8451,17 @@ TickType_t uxTaskResetEventItemValue( void ) configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimePercent( const TaskHandle_t xTask ) { TCB_t * pxTCB; - configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn; + configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn, ulTaskRunTimeCounter; traceENTER_ulTaskGetRunTimePercent( xTask ); - ulTotalTime = ( configRUN_TIME_COUNTER_TYPE ) portGET_RUN_TIME_COUNTER_VALUE(); + ulTaskRunTimeCounter = 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(); + #endif /* For percentage calculations. */ ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100; @@ -8445,7 +8472,7 @@ TickType_t uxTaskResetEventItemValue( void ) pxTCB = prvGetTCBFromHandle( xTask ); configASSERT( pxTCB != NULL ); - ulReturn = pxTCB->ulRunTimeCounter / ulTotalTime; + ulReturn = ulTaskRunTimeCounter/ ulTotalTime; } else { @@ -8492,7 +8519,13 @@ TickType_t uxTaskResetEventItemValue( void ) 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 = ulTotalTime * configNUMBER_OF_CORES; /* For percentage calculations. */ ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100; From b736fc8c2d8867a0959f5f924d379e47f4c1b354 Mon Sep 17 00:00:00 2001 From: Gaurav Aggarwal Date: Thu, 30 Jan 2025 12:12:07 +0000 Subject: [PATCH 2/5] Fix CI formatting check Signed-off-by: Gaurav Aggarwal --- tasks.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tasks.c b/tasks.c index cf8f396967..c04a3afd81 100644 --- a/tasks.c +++ b/tasks.c @@ -8428,12 +8428,13 @@ TickType_t uxTaskResetEventItemValue( void ) ulCurrentRunTimeCounter = portGET_RUN_TIME_COUNTER_VALUE(); #endif - #if( configNUMBER_OF_CORES == 1 ) + #if ( configNUMBER_OF_CORES == 1 ) ulTimeSinceLastSwitchedIn = ulCurrentRunTimeCounter - ulTaskSwitchedInTime[ 0 ]; #else ulTimeSinceLastSwitchedIn = ulCurrentRunTimeCounter - ulTaskSwitchedInTime[ pxTCB->xTaskRunState ]; #endif } + ulTotalRunTime = pxTCB->ulRunTimeCounter + ulTimeSinceLastSwitchedIn; } taskEXIT_CRITICAL(); @@ -8472,7 +8473,7 @@ TickType_t uxTaskResetEventItemValue( void ) pxTCB = prvGetTCBFromHandle( xTask ); configASSERT( pxTCB != NULL ); - ulReturn = ulTaskRunTimeCounter/ ulTotalTime; + ulReturn = ulTaskRunTimeCounter / ulTotalTime; } else { From 3712f5191adf4199f7c5bf18dc2aed09d0fd0a42 Mon Sep 17 00:00:00 2001 From: Gaurav Aggarwal Date: Wed, 12 Feb 2025 09:24:19 +0000 Subject: [PATCH 3/5] Update Idle task runtime calculations Signed-off-by: Gaurav Aggarwal --- tasks.c | 63 ++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/tasks.c b/tasks.c index 4476414680..e46f52ca22 100644 --- a/tasks.c +++ b/tasks.c @@ -8415,7 +8415,7 @@ TickType_t uxTaskResetEventItemValue( void ) configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimeCounter( const TaskHandle_t xTask ) { TCB_t * pxTCB; - configRUN_TIME_COUNTER_TYPE ulCurrentRunTimeCounter = 0, ulTimeSinceLastSwitchedIn = 0, ulTotalRunTime = 0; + configRUN_TIME_COUNTER_TYPE ulTotalTime = 0, ulTimeSinceLastSwitchedIn = 0, ulTaskRunTime = 0; traceENTER_ulTaskGetRunTimeCounter( xTask ); @@ -8427,25 +8427,25 @@ TickType_t uxTaskResetEventItemValue( void ) if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE ) { #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE - portALT_GET_RUN_TIME_COUNTER_VALUE( ulCurrentRunTimeCounter ); + portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalTime ); #else - ulCurrentRunTimeCounter = portGET_RUN_TIME_COUNTER_VALUE(); + ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE(); #endif #if ( configNUMBER_OF_CORES == 1 ) - ulTimeSinceLastSwitchedIn = ulCurrentRunTimeCounter - ulTaskSwitchedInTime[ 0 ]; + ulTimeSinceLastSwitchedIn = ulTotalTime - ulTaskSwitchedInTime[ 0 ]; #else - ulTimeSinceLastSwitchedIn = ulCurrentRunTimeCounter - ulTaskSwitchedInTime[ pxTCB->xTaskRunState ]; + ulTimeSinceLastSwitchedIn = ulTotalTime - ulTaskSwitchedInTime[ pxTCB->xTaskRunState ]; #endif } - ulTotalRunTime = pxTCB->ulRunTimeCounter + ulTimeSinceLastSwitchedIn; + ulTaskRunTime = pxTCB->ulRunTimeCounter + ulTimeSinceLastSwitchedIn; } taskEXIT_CRITICAL(); - traceRETURN_ulTaskGetRunTimeCounter( ulTotalRunTime ); + traceRETURN_ulTaskGetRunTimeCounter( ulTaskRunTime ); - return ulTotalRunTime; + return ulTaskRunTime; } #endif /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */ @@ -8456,11 +8456,11 @@ TickType_t uxTaskResetEventItemValue( void ) configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimePercent( const TaskHandle_t xTask ) { TCB_t * pxTCB; - configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn, ulTaskRunTimeCounter; + configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn, ulTaskRunTime; traceENTER_ulTaskGetRunTimePercent( xTask ); - ulTaskRunTimeCounter = ulTaskGetRunTimeCounter( xTask ); + ulTaskRunTime = ulTaskGetRunTimeCounter( xTask ); #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalTime ); @@ -8477,7 +8477,7 @@ TickType_t uxTaskResetEventItemValue( void ) pxTCB = prvGetTCBFromHandle( xTask ); configASSERT( pxTCB != NULL ); - ulReturn = ulTaskRunTimeCounter / ulTotalTime; + ulReturn = ulTaskRunTime / ulTotalTime; } else { @@ -8496,19 +8496,41 @@ TickType_t uxTaskResetEventItemValue( 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; traceENTER_ulTaskGetIdleRunTimeCounter(); - for( i = 0; i < ( BaseType_t ) configNUMBER_OF_CORES; i++ ) + taskENTER_CRITICAL(); { - ulReturn += xIdleTaskHandles[ i ]->ulRunTimeCounter; + #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++ ) + { + 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 ) ) */ @@ -8520,7 +8542,6 @@ TickType_t uxTaskResetEventItemValue( void ) { configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn; configRUN_TIME_COUNTER_TYPE ulRunTimeCounter = 0; - BaseType_t i; traceENTER_ulTaskGetIdleRunTimePercent(); @@ -8530,7 +8551,7 @@ TickType_t uxTaskResetEventItemValue( void ) ulTotalTime = ( configRUN_TIME_COUNTER_TYPE ) portGET_RUN_TIME_COUNTER_VALUE(); #endif - ulTotalTime = ulTotalTime * configNUMBER_OF_CORES; + ulTotalTime *= configNUMBER_OF_CORES; /* For percentage calculations. */ ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100; @@ -8538,11 +8559,7 @@ TickType_t uxTaskResetEventItemValue( void ) /* Avoid divide by zero errors. */ if( ulTotalTime > ( configRUN_TIME_COUNTER_TYPE ) 0 ) { - for( i = 0; i < ( BaseType_t ) configNUMBER_OF_CORES; i++ ) - { - ulRunTimeCounter += xIdleTaskHandles[ i ]->ulRunTimeCounter; - } - + ulRunTimeCounter = ulTaskGetIdleRunTimeCounter(); ulReturn = ulRunTimeCounter / ulTotalTime; } else From 99d376740971f784d28045f6c0bf62fc449afcb2 Mon Sep 17 00:00:00 2001 From: Gaurav Aggarwal Date: Wed, 12 Feb 2025 09:31:23 +0000 Subject: [PATCH 4/5] Update vTaskGetInfo Signed-off-by: Gaurav Aggarwal --- tasks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks.c b/tasks.c index e46f52ca22..f481e7a352 100644 --- a/tasks.c +++ b/tasks.c @@ -6215,7 +6215,7 @@ static void prvCheckTasksWaitingTermination( void ) #if ( configGENERATE_RUN_TIME_STATS == 1 ) { - pxTaskStatus->ulRunTimeCounter = pxTCB->ulRunTimeCounter; + pxTaskStatus->ulRunTimeCounter = ulTaskGetRunTimeCounter( xTask ); } #else { From 76f639c8f3b25e6b85017e3d28eb37ef96989bf7 Mon Sep 17 00:00:00 2001 From: Gaurav Aggarwal Date: Wed, 12 Feb 2025 10:32:54 +0000 Subject: [PATCH 5/5] Fix formatting check Signed-off-by: Gaurav Aggarwal --- tasks.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tasks.c b/tasks.c index f481e7a352..def843fe6a 100644 --- a/tasks.c +++ b/tasks.c @@ -8523,6 +8523,7 @@ TickType_t uxTaskResetEventItemValue( void ) { ulTimeSinceLastSwitchedIn = 0; } + ulIdleTaskRunTime += ( xIdleTaskHandles[ i ]->ulRunTimeCounter + ulTimeSinceLastSwitchedIn ); } }