mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
Added a critical section around the call to vTaskIncrementTick() in all the RX ports.
This commit is contained in:
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…
Reference in a new issue