@@ -6215,7 +6215,7 @@ static void prvCheckTasksWaitingTermination( void )
6215
6215
6216
6216
#if ( configGENERATE_RUN_TIME_STATS == 1 )
6217
6217
{
6218
- pxTaskStatus -> ulRunTimeCounter = pxTCB -> ulRunTimeCounter ;
6218
+ pxTaskStatus -> ulRunTimeCounter = ulTaskGetRunTimeCounter ( xTask ) ;
6219
6219
}
6220
6220
#else
6221
6221
{
@@ -8415,15 +8415,37 @@ TickType_t uxTaskResetEventItemValue( void )
8415
8415
configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimeCounter ( const TaskHandle_t xTask )
8416
8416
{
8417
8417
TCB_t * pxTCB ;
8418
+ configRUN_TIME_COUNTER_TYPE ulTotalTime = 0 , ulTimeSinceLastSwitchedIn = 0 , ulTaskRunTime = 0 ;
8418
8419
8419
8420
traceENTER_ulTaskGetRunTimeCounter ( xTask );
8420
8421
8421
8422
pxTCB = prvGetTCBFromHandle ( xTask );
8422
8423
configASSERT ( pxTCB != NULL );
8423
8424
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
+ }
8425
8441
8426
- return pxTCB -> ulRunTimeCounter ;
8442
+ ulTaskRunTime = pxTCB -> ulRunTimeCounter + ulTimeSinceLastSwitchedIn ;
8443
+ }
8444
+ taskEXIT_CRITICAL ();
8445
+
8446
+ traceRETURN_ulTaskGetRunTimeCounter ( ulTaskRunTime );
8447
+
8448
+ return ulTaskRunTime ;
8427
8449
}
8428
8450
8429
8451
#endif /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */
@@ -8434,11 +8456,17 @@ TickType_t uxTaskResetEventItemValue( void )
8434
8456
configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimePercent ( const TaskHandle_t xTask )
8435
8457
{
8436
8458
TCB_t * pxTCB ;
8437
- configRUN_TIME_COUNTER_TYPE ulTotalTime , ulReturn ;
8459
+ configRUN_TIME_COUNTER_TYPE ulTotalTime , ulReturn , ulTaskRunTime ;
8438
8460
8439
8461
traceENTER_ulTaskGetRunTimePercent ( xTask );
8440
8462
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
8442
8470
8443
8471
/* For percentage calculations. */
8444
8472
ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100 ;
@@ -8449,7 +8477,7 @@ TickType_t uxTaskResetEventItemValue( void )
8449
8477
pxTCB = prvGetTCBFromHandle ( xTask );
8450
8478
configASSERT ( pxTCB != NULL );
8451
8479
8452
- ulReturn = pxTCB -> ulRunTimeCounter / ulTotalTime ;
8480
+ ulReturn = ulTaskRunTime / ulTotalTime ;
8453
8481
}
8454
8482
else
8455
8483
{
@@ -8468,19 +8496,42 @@ TickType_t uxTaskResetEventItemValue( void )
8468
8496
8469
8497
configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter ( void )
8470
8498
{
8471
- configRUN_TIME_COUNTER_TYPE ulReturn = 0 ;
8499
+ configRUN_TIME_COUNTER_TYPE ulTotalTime = 0 , ulTimeSinceLastSwitchedIn = 0 , ulIdleTaskRunTime = 0 ;
8472
8500
BaseType_t i ;
8473
8501
8474
8502
traceENTER_ulTaskGetIdleRunTimeCounter ();
8475
8503
8476
- for ( i = 0 ; i < ( BaseType_t ) configNUMBER_OF_CORES ; i ++ )
8504
+ taskENTER_CRITICAL ();
8477
8505
{
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
+ }
8479
8529
}
8530
+ taskEXIT_CRITICAL ();
8480
8531
8481
- traceRETURN_ulTaskGetIdleRunTimeCounter ( ulReturn );
8532
+ traceRETURN_ulTaskGetIdleRunTimeCounter ( ulIdleTaskRunTime );
8482
8533
8483
- return ulReturn ;
8534
+ return ulIdleTaskRunTime ;
8484
8535
}
8485
8536
8486
8537
#endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */
@@ -8492,23 +8543,24 @@ TickType_t uxTaskResetEventItemValue( void )
8492
8543
{
8493
8544
configRUN_TIME_COUNTER_TYPE ulTotalTime , ulReturn ;
8494
8545
configRUN_TIME_COUNTER_TYPE ulRunTimeCounter = 0 ;
8495
- BaseType_t i ;
8496
8546
8497
8547
traceENTER_ulTaskGetIdleRunTimePercent ();
8498
8548
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 ;
8500
8556
8501
8557
/* For percentage calculations. */
8502
8558
ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100 ;
8503
8559
8504
8560
/* Avoid divide by zero errors. */
8505
8561
if ( ulTotalTime > ( configRUN_TIME_COUNTER_TYPE ) 0 )
8506
8562
{
8507
- for ( i = 0 ; i < ( BaseType_t ) configNUMBER_OF_CORES ; i ++ )
8508
- {
8509
- ulRunTimeCounter += xIdleTaskHandles [ i ]-> ulRunTimeCounter ;
8510
- }
8511
-
8563
+ ulRunTimeCounter = ulTaskGetIdleRunTimeCounter ();
8512
8564
ulReturn = ulRunTimeCounter / ulTotalTime ;
8513
8565
}
8514
8566
else
0 commit comments