Added a critical section around the call to vTaskIncrementTick() in all the RX ports.

pull/4/head
Richard Barry 15 years ago
parent 9f83e74cb1
commit c1dca1a069

@ -72,6 +72,14 @@ PSW is set with U and I set, and PM and IPL clear. */
#define portINITIAL_PSW ( ( portSTACK_TYPE ) 0x00030000 )
#define portINITIAL_FPSW ( ( portSTACK_TYPE ) 0x00000100 )
/* These macros allow a critical section to be added around the call to
vTaskIncrementTick(), which is only ever called from interrupts at the kernel
priority - ie a known priority. Therefore these local macros are a slight
optimisation compared to calling the global SET/CLEAR_INTERRUPT_MASK macros,
which would require the old IPL to be read first and stored in a local variable. */
#define portDISABLE_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) )
#define portENABLE_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configKERNEL_INTERRUPT_PRIORITY) )
/*-----------------------------------------------------------*/
/*
@ -201,8 +209,12 @@ void vTickISR( void )
__asm volatile( "SETPSW I" );
/* Increment the tick, and perform any processing the new tick value
necessitates. */
vTaskIncrementTick();
necessitates. Ensure IPL is at the max syscall value first. */
portDISABLE_INTERRUPTS_FROM_KERNEL_ISR();
{
vTaskIncrementTick();
}
portENABLE_INTERRUPTS_FROM_KERNEL_ISR();
/* Only select a new task if the preemptive scheduler is being used. */
#if( configUSE_PREEMPTION == 1 )

@ -196,7 +196,11 @@ __interrupt void vTickISR( void )
/* Increment the tick, and perform any processing the new tick value
necessitates. */
vTaskIncrementTick();
__set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY );
{
vTaskIncrementTick();
}
__set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY );
/* Only select a new task if the preemptive scheduler is being used. */
#if( configUSE_PREEMPTION == 1 )

@ -237,7 +237,11 @@ void vTickISR( void )
{
/* Increment the tick, and perform any processing the new tick value
necessitates. */
vTaskIncrementTick();
set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY );
{
vTaskIncrementTick();
}
set_ipl( configKERNEL_INTERRUPT_PRIORITY );
/* Only select a new task if the preemptive scheduler is being used. */
#if( configUSE_PREEMPTION == 1 )

Loading…
Cancel
Save