mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-09-10 08:07:46 -04:00
Merge branch 'main' into main
This commit is contained in:
commit
3a9b028465
2 changed files with 22 additions and 37 deletions
4
list.c
4
list.c
|
@ -192,7 +192,9 @@ void vListInsert( List_t * const pxList,
|
||||||
for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext )
|
for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext )
|
||||||
{
|
{
|
||||||
/* There is nothing to do here, just iterating to the wanted
|
/* There is nothing to do here, just iterating to the wanted
|
||||||
* insertion position. */
|
* insertion position.
|
||||||
|
* IF YOU FIND YOUR CODE STUCK HERE, SEE THE NOTE JUST ABOVE.
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -435,32 +435,13 @@ static void prvProcessSimulatedInterrupts( void )
|
||||||
|
|
||||||
if( ulSwitchRequired != pdFALSE )
|
if( ulSwitchRequired != pdFALSE )
|
||||||
{
|
{
|
||||||
void * pvOldCurrentTCB;
|
/* Suspend the old thread. */
|
||||||
|
pxThreadState = ( ThreadState_t * ) *( ( size_t * ) pxCurrentTCB );
|
||||||
pvOldCurrentTCB = pxCurrentTCB;
|
|
||||||
|
|
||||||
/* Select the next task to run. */
|
|
||||||
vTaskSwitchContext();
|
|
||||||
|
|
||||||
/* If the task selected to enter the running state is not the task
|
|
||||||
* that is already in the running state. */
|
|
||||||
if( pvOldCurrentTCB != pxCurrentTCB )
|
|
||||||
{
|
|
||||||
/* Suspend the old thread. In the cases where the (simulated)
|
|
||||||
* interrupt is asynchronous (tick event swapping a task out rather
|
|
||||||
* than a task blocking or yielding) it doesn't matter if the
|
|
||||||
* 'suspend' operation doesn't take effect immediately - if it
|
|
||||||
* doesn't it would just be like the interrupt occurring slightly
|
|
||||||
* later. In cases where the yield was caused by a task blocking
|
|
||||||
* or yielding then the task will block on a yield event after the
|
|
||||||
* yield operation in case the 'suspend' operation doesn't take
|
|
||||||
* effect immediately. */
|
|
||||||
pxThreadState = ( ThreadState_t * ) *( ( size_t * ) pvOldCurrentTCB );
|
|
||||||
SuspendThread( pxThreadState->pvThread );
|
SuspendThread( pxThreadState->pvThread );
|
||||||
|
|
||||||
/* Ensure the thread is actually suspended by performing a
|
/* Ensure the thread is actually suspended by performing a
|
||||||
* synchronous operation that can only complete when the thread is
|
* synchronous operation that can only complete when the thread
|
||||||
* actually suspended. The below code asks for dummy register
|
* is actually suspended. The below code asks for dummy register
|
||||||
* data. Experimentation shows that these two lines don't appear
|
* data. Experimentation shows that these two lines don't appear
|
||||||
* to do anything now, but according to
|
* to do anything now, but according to
|
||||||
* https://devblogs.microsoft.com/oldnewthing/20150205-00/?p=44743
|
* https://devblogs.microsoft.com/oldnewthing/20150205-00/?p=44743
|
||||||
|
@ -468,6 +449,9 @@ static void prvProcessSimulatedInterrupts( void )
|
||||||
xContext.ContextFlags = CONTEXT_INTEGER;
|
xContext.ContextFlags = CONTEXT_INTEGER;
|
||||||
( void ) GetThreadContext( pxThreadState->pvThread, &xContext );
|
( void ) GetThreadContext( pxThreadState->pvThread, &xContext );
|
||||||
|
|
||||||
|
/* Select the next task to run. */
|
||||||
|
vTaskSwitchContext();
|
||||||
|
|
||||||
/* Obtain the state of the task now selected to enter the
|
/* Obtain the state of the task now selected to enter the
|
||||||
* Running state. */
|
* Running state. */
|
||||||
pxThreadState = ( ThreadState_t * ) ( *( size_t * ) pxCurrentTCB );
|
pxThreadState = ( ThreadState_t * ) ( *( size_t * ) pxCurrentTCB );
|
||||||
|
@ -477,7 +461,6 @@ static void prvProcessSimulatedInterrupts( void )
|
||||||
configASSERT( pxThreadState->pvThread != NULL );
|
configASSERT( pxThreadState->pvThread != NULL );
|
||||||
ResumeThread( pxThreadState->pvThread );
|
ResumeThread( pxThreadState->pvThread );
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* If the thread that is about to be resumed stopped running
|
/* If the thread that is about to be resumed stopped running
|
||||||
* because it yielded then it will wait on an event when it resumed
|
* because it yielded then it will wait on an event when it resumed
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue