Skip to content

Commit 93b1ae2

Browse files
authored
Merge branch 'FreeRTOS:main' into posixPortUpdate
2 parents 5eef7bf + 15ec8b8 commit 93b1ae2

File tree

2 files changed

+74
-18
lines changed

2 files changed

+74
-18
lines changed

portable/ThirdParty/GCC/Posix/port.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,10 @@ static void prvPortYieldFromISR( void )
384384

385385
void vPortYield( void )
386386
{
387+
/* This must never be called from outside of a FreeRTOS-owned thread, or
388+
* the thread could get stuck in a suspended state. */
389+
configASSERT( prvIsFreeRTOSThread() == pdTRUE );
390+
387391
vPortEnterCritical();
388392

389393
prvPortYieldFromISR();

tasks.c

Lines changed: 70 additions & 18 deletions
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)