mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-20 05:21:59 -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_PSW ( ( portSTACK_TYPE ) 0x00030000 )
|
||||||
#define portINITIAL_FPSW ( ( portSTACK_TYPE ) 0x00000100 )
|
#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" );
|
__asm volatile( "SETPSW I" );
|
||||||
|
|
||||||
/* Increment the tick, and perform any processing the new tick value
|
/* Increment the tick, and perform any processing the new tick value
|
||||||
necessitates. */
|
necessitates. Ensure IPL is at the max syscall value first. */
|
||||||
|
portDISABLE_INTERRUPTS_FROM_KERNEL_ISR();
|
||||||
|
{
|
||||||
vTaskIncrementTick();
|
vTaskIncrementTick();
|
||||||
|
}
|
||||||
|
portENABLE_INTERRUPTS_FROM_KERNEL_ISR();
|
||||||
|
|
||||||
/* Only select a new task if the preemptive scheduler is being used. */
|
/* Only select a new task if the preemptive scheduler is being used. */
|
||||||
#if( configUSE_PREEMPTION == 1 )
|
#if( configUSE_PREEMPTION == 1 )
|
||||||
|
|
|
@ -196,7 +196,11 @@ __interrupt void vTickISR( void )
|
||||||
|
|
||||||
/* Increment the tick, and perform any processing the new tick value
|
/* Increment the tick, and perform any processing the new tick value
|
||||||
necessitates. */
|
necessitates. */
|
||||||
|
__set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY );
|
||||||
|
{
|
||||||
vTaskIncrementTick();
|
vTaskIncrementTick();
|
||||||
|
}
|
||||||
|
__set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY );
|
||||||
|
|
||||||
/* Only select a new task if the preemptive scheduler is being used. */
|
/* Only select a new task if the preemptive scheduler is being used. */
|
||||||
#if( configUSE_PREEMPTION == 1 )
|
#if( configUSE_PREEMPTION == 1 )
|
||||||
|
|
|
@ -237,7 +237,11 @@ void vTickISR( void )
|
||||||
{
|
{
|
||||||
/* Increment the tick, and perform any processing the new tick value
|
/* Increment the tick, and perform any processing the new tick value
|
||||||
necessitates. */
|
necessitates. */
|
||||||
|
set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY );
|
||||||
|
{
|
||||||
vTaskIncrementTick();
|
vTaskIncrementTick();
|
||||||
|
}
|
||||||
|
set_ipl( configKERNEL_INTERRUPT_PRIORITY );
|
||||||
|
|
||||||
/* Only select a new task if the preemptive scheduler is being used. */
|
/* Only select a new task if the preemptive scheduler is being used. */
|
||||||
#if( configUSE_PREEMPTION == 1 )
|
#if( configUSE_PREEMPTION == 1 )
|
||||||
|
|
Loading…
Reference in a new issue