mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
Remove prvSelectHighestPriorityTask call in vTaskSuspend (#610)
* Remove prvSelectHighestPriorityTask call in vTaskSuspend * Every core starts with an idle task in SMP implementation and taskTASK_IS_RUNNING only return ture when the task is idle task before scheduler started. So prvSelectHighestPriorityTask won't be called in vTaskSuspend before scheduler started. * Update prvSelectHighestPriorityTask to ensure that this function is called only when scheduler started. * Fix kernel checker error
This commit is contained in:
parent
8128208bde
commit
0f9e6e5b52
2
.github/workflows/kernel-checks.yml
vendored
2
.github/workflows/kernel-checks.yml
vendored
|
@ -11,7 +11,7 @@ jobs:
|
||||||
- name: Tool Setup
|
- name: Tool Setup
|
||||||
uses: actions/setup-python@v2
|
uses: actions/setup-python@v2
|
||||||
with:
|
with:
|
||||||
python-version: 3.7.10
|
python-version: 3.11.0
|
||||||
architecture: x64
|
architecture: x64
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
62
tasks.c
62
tasks.c
|
@ -438,7 +438,7 @@ static void prvYieldForTask( TCB_t * pxTCB,
|
||||||
/*
|
/*
|
||||||
* Selects the highest priority available task
|
* Selects the highest priority available task
|
||||||
*/
|
*/
|
||||||
static BaseType_t prvSelectHighestPriorityTask( const BaseType_t xCoreID );
|
static void prvSelectHighestPriorityTask( const BaseType_t xCoreID );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility task that simply returns pdTRUE if the task referenced by xTask is
|
* Utility task that simply returns pdTRUE if the task referenced by xTask is
|
||||||
|
@ -819,7 +819,7 @@ static void prvYieldForTask( TCB_t * pxTCB,
|
||||||
|
|
||||||
#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 )
|
#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 )
|
||||||
|
|
||||||
static BaseType_t prvSelectHighestPriorityTask( const BaseType_t xCoreID )
|
static void prvSelectHighestPriorityTask( const BaseType_t xCoreID )
|
||||||
{
|
{
|
||||||
UBaseType_t uxCurrentPriority = uxTopReadyPriority;
|
UBaseType_t uxCurrentPriority = uxTopReadyPriority;
|
||||||
BaseType_t xTaskScheduled = pdFALSE;
|
BaseType_t xTaskScheduled = pdFALSE;
|
||||||
|
@ -832,6 +832,9 @@ static void prvYieldForTask( TCB_t * pxTCB,
|
||||||
BaseType_t xPriorityDropped = pdFALSE;
|
BaseType_t xPriorityDropped = pdFALSE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* This function should be called when scheduler is running. */
|
||||||
|
configASSERT( xSchedulerRunning == pdTRUE );
|
||||||
|
|
||||||
while( xTaskScheduled == pdFALSE )
|
while( xTaskScheduled == pdFALSE )
|
||||||
{
|
{
|
||||||
#if ( ( configRUN_MULTIPLE_PRIORITIES == 0 ) && ( configNUM_CORES > 1 ) )
|
#if ( ( configRUN_MULTIPLE_PRIORITIES == 0 ) && ( configNUM_CORES > 1 ) )
|
||||||
|
@ -947,14 +950,9 @@ static void prvYieldForTask( TCB_t * pxTCB,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function can get called by vTaskSuspend() before the scheduler is started.
|
/* Theare are configNUMBER_OF_CORES Idle tasks created when scheduler started.
|
||||||
* In that case, since the idle tasks have not yet been created it is possible that we
|
* The scheduler should be able to select a task to run when uxCurrentPriority
|
||||||
* won't find a new task to schedule. Return pdFALSE in this case. */
|
* is tskIDLE_PRIORITY. */
|
||||||
if( ( xSchedulerRunning == pdFALSE ) && ( uxCurrentPriority == tskIDLE_PRIORITY ) && ( xTaskScheduled == pdFALSE ) )
|
|
||||||
{
|
|
||||||
return pdFALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
configASSERT( ( uxCurrentPriority > tskIDLE_PRIORITY ) || ( xTaskScheduled == pdTRUE ) );
|
configASSERT( ( uxCurrentPriority > tskIDLE_PRIORITY ) || ( xTaskScheduled == pdTRUE ) );
|
||||||
uxCurrentPriority--;
|
uxCurrentPriority--;
|
||||||
}
|
}
|
||||||
|
@ -1034,8 +1032,6 @@ static void prvYieldForTask( TCB_t * pxTCB,
|
||||||
}
|
}
|
||||||
#endif /* if ( configUSE_CORE_AFFINITY == 1 ) */
|
#endif /* if ( configUSE_CORE_AFFINITY == 1 ) */
|
||||||
#endif /* if ( configNUM_CORES > 1 ) */
|
#endif /* if ( configNUM_CORES > 1 ) */
|
||||||
|
|
||||||
return pdTRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
|
#else /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
|
||||||
|
@ -2480,45 +2476,23 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB )
|
||||||
{
|
{
|
||||||
prvYieldCore( xTaskRunningOnCore );
|
prvYieldCore( xTaskRunningOnCore );
|
||||||
}
|
}
|
||||||
|
|
||||||
taskEXIT_CRITICAL();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
taskEXIT_CRITICAL();
|
/* This code path is not possible because only Idle tasks are
|
||||||
|
* assigned a core before the scheduler is started ( i.e.
|
||||||
configASSERT( pxTCB == pxCurrentTCBs[ xTaskRunningOnCore ] );
|
* taskTASK_IS_RUNNING is only true for idle tasks before
|
||||||
|
* the scheduler is started ) and idle tasks cannot be
|
||||||
/* The scheduler is not running, but the task that was pointed
|
* suspended. */
|
||||||
* to by pxCurrentTCB has just been suspended and pxCurrentTCB
|
mtCOVERAGE_TEST_MARKER();
|
||||||
* must be adjusted to point to a different task. */
|
|
||||||
if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) /*lint !e931 Right has no side effect, just volatile. */
|
|
||||||
{
|
|
||||||
/* No other tasks are ready, so set the core's TCB back to
|
|
||||||
* NULL so when the next task is created the core's TCB will
|
|
||||||
* be able to be set to point to it no matter what its relative
|
|
||||||
* priority is. */
|
|
||||||
pxTCB->xTaskRunState = taskTASK_NOT_RUNNING;
|
|
||||||
pxCurrentTCBs[ xTaskRunningOnCore ] = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Attempt to switch in a new task. This could fail since the idle tasks
|
|
||||||
* haven't been created yet. If it does then set the core's TCB back to
|
|
||||||
* NULL. */
|
|
||||||
if( prvSelectHighestPriorityTask( xTaskRunningOnCore ) == pdFALSE )
|
|
||||||
{
|
|
||||||
pxTCB->xTaskRunState = taskTASK_NOT_RUNNING;
|
|
||||||
pxCurrentTCBs[ xTaskRunningOnCore ] = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
taskEXIT_CRITICAL();
|
mtCOVERAGE_TEST_MARKER();
|
||||||
}
|
}
|
||||||
} /* taskEXIT_CRITICAL() - already exited in one of three cases above */
|
}
|
||||||
|
taskEXIT_CRITICAL();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* INCLUDE_vTaskSuspend */
|
#endif /* INCLUDE_vTaskSuspend */
|
||||||
|
@ -3940,7 +3914,7 @@ void vTaskSwitchContext( BaseType_t xCoreID )
|
||||||
|
|
||||||
/* Select a new task to run using either the generic C or port
|
/* Select a new task to run using either the generic C or port
|
||||||
* optimised asm code. */
|
* optimised asm code. */
|
||||||
( void ) prvSelectHighestPriorityTask( xCoreID );
|
prvSelectHighestPriorityTask( xCoreID );
|
||||||
traceTASK_SWITCHED_IN();
|
traceTASK_SWITCHED_IN();
|
||||||
|
|
||||||
/* After the new task is switched in, update the global errno. */
|
/* After the new task is switched in, update the global errno. */
|
||||||
|
|
Loading…
Reference in a new issue