Merge branch 'main' into main

This commit is contained in:
Joseph Julicher 2024-05-14 08:56:24 -07:00 committed by GitHub
commit 3a9b028465
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 22 additions and 37 deletions

4
list.c
View file

@ -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.
*/
} }
} }

View file

@ -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