Ensure a yield cannot be pended simultaneously with a critical section being entered.

This commit is contained in:
Richard Barry 2008-08-14 11:04:54 +00:00
parent d427489391
commit 6eec108bdd

View file

@ -143,7 +143,20 @@ void vPortEndScheduler( void )
void vPortEnterCritical( void ) void vPortEnterCritical( void )
{ {
portDISABLE_INTERRUPTS(); if( ulCriticalNesting == 0UL )
{
do
{
portDISABLE_INTERRUPTS();
if( MCF_INTC0_INTFRCH == 0UL )
{
break;
}
portENABLE_INTERRUPTS();
} while( 1 );
}
ulCriticalNesting++; ulCriticalNesting++;
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
@ -162,10 +175,10 @@ void vPortYieldHandler( void )
{ {
unsigned portLONG ulSavedInterruptMask; unsigned portLONG ulSavedInterruptMask;
/* -32 as we are using the high word of the 64bit mask. */
MCF_INTC0_INTFRCH &= ~( 1UL << ( configYIELD_INTERRUPT_VECTOR - 32UL ) );
ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR();
/* -32 as we are using the high word of the 64bit mask. */
/* Note this will clear all forced interrupts - this is done for speed. */
MCF_INTC0_INTFRCH = 0;
vTaskSwitchContext(); vTaskSwitchContext();
portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask );
} }