From 6eec108bdd417783bf8e68a18472fd0bc4690321 Mon Sep 17 00:00:00 2001 From: Richard Barry Date: Thu, 14 Aug 2008 11:04:54 +0000 Subject: [PATCH] Ensure a yield cannot be pended simultaneously with a critical section being entered. --- Source/portable/GCC/ColdFire_V2/port.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/Source/portable/GCC/ColdFire_V2/port.c b/Source/portable/GCC/ColdFire_V2/port.c index d55e25630..986e85c4f 100644 --- a/Source/portable/GCC/ColdFire_V2/port.c +++ b/Source/portable/GCC/ColdFire_V2/port.c @@ -143,7 +143,20 @@ void vPortEndScheduler( void ) void vPortEnterCritical( void ) { - portDISABLE_INTERRUPTS(); + if( ulCriticalNesting == 0UL ) + { + do + { + portDISABLE_INTERRUPTS(); + if( MCF_INTC0_INTFRCH == 0UL ) + { + break; + } + + portENABLE_INTERRUPTS(); + + } while( 1 ); + } ulCriticalNesting++; } /*-----------------------------------------------------------*/ @@ -162,10 +175,10 @@ void vPortYieldHandler( void ) { 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(); + /* -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(); portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); }