@@ -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