mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-12-08 20:55:14 -05:00
Fix prvSelectHighestPriorityTask list iteration
- Use listGET_OWNER_OF_NEXT_ENTRY to iterate through the ready task list instead of iterating from the head of the list. vListInsertEnd appends a node such that, when using listGET_OWNER_OF_NEXT_ENTRY, it is the last node returned, but it isn't inserted at the tail of the list.
This commit is contained in:
parent
4d34700bcc
commit
9d59571c30
1 changed files with 56 additions and 51 deletions
107
tasks.c
107
tasks.c
|
|
@ -1030,76 +1030,81 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
if( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxCurrentPriority ] ) ) == pdFALSE )
|
if( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxCurrentPriority ] ) ) == pdFALSE )
|
||||||
{
|
{
|
||||||
const List_t * const pxReadyList = &( pxReadyTasksLists[ uxCurrentPriority ] );
|
List_t * const pxReadyList = &( pxReadyTasksLists[ uxCurrentPriority ] );
|
||||||
const ListItem_t * pxEndMarker = listGET_END_MARKER( pxReadyList );
|
configLIST_VOLATILE TCB_t * pxFirstTCB;
|
||||||
ListItem_t * pxIterator;
|
|
||||||
|
|
||||||
/* The ready task list for uxCurrentPriority is not empty, so uxTopReadyPriority
|
/* The ready task list for uxCurrentPriority is not empty, so uxTopReadyPriority
|
||||||
* must not be decremented any further. */
|
* must not be decremented any further. */
|
||||||
xDecrementTopPriority = pdFALSE;
|
xDecrementTopPriority = pdFALSE;
|
||||||
|
|
||||||
for( pxIterator = listGET_HEAD_ENTRY( pxReadyList ); pxIterator != pxEndMarker; pxIterator = listGET_NEXT( pxIterator ) )
|
if( listCURRENT_LIST_LENGTH( pxReadyList ) )
|
||||||
{
|
{
|
||||||
/* MISRA Ref 11.5.3 [Void pointer assignment] */
|
configLIST_VOLATILE TCB_t * pxTCB;
|
||||||
/* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */
|
|
||||||
/* coverity[misra_c_2012_rule_11_5_violation] */
|
|
||||||
TCB_t * pxTCB = ( TCB_t * ) listGET_LIST_ITEM_OWNER( pxIterator );
|
|
||||||
|
|
||||||
#if ( configRUN_MULTIPLE_PRIORITIES == 0 )
|
listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxReadyList );
|
||||||
|
pxTCB = pxFirstTCB;
|
||||||
|
|
||||||
|
do
|
||||||
{
|
{
|
||||||
/* When falling back to the idle priority because only one priority
|
#if ( configRUN_MULTIPLE_PRIORITIES == 0 )
|
||||||
* level is allowed to run at a time, we should ONLY schedule the true
|
|
||||||
* idle tasks, not user tasks at the idle priority. */
|
|
||||||
if( uxCurrentPriority < uxTopReadyPriority )
|
|
||||||
{
|
{
|
||||||
if( ( pxTCB->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) == 0U )
|
/* When falling back to the idle priority because only one priority
|
||||||
|
* level is allowed to run at a time, we should ONLY schedule the true
|
||||||
|
* idle tasks, not user tasks at the idle priority. */
|
||||||
|
if( uxCurrentPriority < uxTopReadyPriority )
|
||||||
{
|
{
|
||||||
continue;
|
if( ( pxTCB->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) == 0U )
|
||||||
|
{
|
||||||
|
listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxReadyList );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
#endif /* #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) */
|
||||||
#endif /* #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) */
|
|
||||||
|
|
||||||
if( pxTCB->xTaskRunState == taskTASK_NOT_RUNNING )
|
if( pxTCB->xTaskRunState == taskTASK_NOT_RUNNING )
|
||||||
{
|
|
||||||
#if ( configUSE_CORE_AFFINITY == 1 )
|
|
||||||
if( ( pxTCB->uxCoreAffinityMask & ( ( UBaseType_t ) 1U << ( UBaseType_t ) xCoreID ) ) != 0U )
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
/* If the task is not being executed by any core swap it in. */
|
|
||||||
pxCurrentTCBs[ xCoreID ]->xTaskRunState = taskTASK_NOT_RUNNING;
|
|
||||||
#if ( configUSE_CORE_AFFINITY == 1 )
|
#if ( configUSE_CORE_AFFINITY == 1 )
|
||||||
pxPreviousTCB = pxCurrentTCBs[ xCoreID ];
|
if( ( pxTCB->uxCoreAffinityMask & ( ( UBaseType_t ) 1U << ( UBaseType_t ) xCoreID ) ) != 0U )
|
||||||
#endif
|
#endif
|
||||||
pxTCB->xTaskRunState = xCoreID;
|
{
|
||||||
pxCurrentTCBs[ xCoreID ] = pxTCB;
|
/* If the task is not being executed by any core swap it in. */
|
||||||
xTaskScheduled = pdTRUE;
|
pxCurrentTCBs[ xCoreID ]->xTaskRunState = taskTASK_NOT_RUNNING;
|
||||||
|
#if ( configUSE_CORE_AFFINITY == 1 )
|
||||||
|
pxPreviousTCB = pxCurrentTCBs[ xCoreID ];
|
||||||
|
#endif
|
||||||
|
pxTCB->xTaskRunState = xCoreID;
|
||||||
|
pxCurrentTCBs[ xCoreID ] = pxTCB;
|
||||||
|
xTaskScheduled = pdTRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
else if( pxTCB == pxCurrentTCBs[ xCoreID ] )
|
||||||
else if( pxTCB == pxCurrentTCBs[ xCoreID ] )
|
|
||||||
{
|
|
||||||
configASSERT( ( pxTCB->xTaskRunState == xCoreID ) || ( pxTCB->xTaskRunState == taskTASK_SCHEDULED_TO_YIELD ) );
|
|
||||||
|
|
||||||
#if ( configUSE_CORE_AFFINITY == 1 )
|
|
||||||
if( ( pxTCB->uxCoreAffinityMask & ( ( UBaseType_t ) 1U << ( UBaseType_t ) xCoreID ) ) != 0U )
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
/* The task is already running on this core, mark it as scheduled. */
|
configASSERT( ( pxTCB->xTaskRunState == xCoreID ) || ( pxTCB->xTaskRunState == taskTASK_SCHEDULED_TO_YIELD ) );
|
||||||
pxTCB->xTaskRunState = xCoreID;
|
|
||||||
xTaskScheduled = pdTRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* This task is running on the core other than xCoreID. */
|
|
||||||
mtCOVERAGE_TEST_MARKER();
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xTaskScheduled != pdFALSE )
|
#if ( configUSE_CORE_AFFINITY == 1 )
|
||||||
{
|
if( ( pxTCB->uxCoreAffinityMask & ( ( UBaseType_t ) 1U << ( UBaseType_t ) xCoreID ) ) != 0U )
|
||||||
/* A task has been selected to run on this core. */
|
#endif
|
||||||
break;
|
{
|
||||||
}
|
/* The task is already running on this core, mark it as scheduled. */
|
||||||
|
pxTCB->xTaskRunState = xCoreID;
|
||||||
|
xTaskScheduled = pdTRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* This task is running on the core other than xCoreID. */
|
||||||
|
mtCOVERAGE_TEST_MARKER();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( xTaskScheduled != pdFALSE )
|
||||||
|
{
|
||||||
|
/* A task has been selected to run on this core. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxReadyList );
|
||||||
|
} while( pxTCB != pxFirstTCB );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue