summaryrefslogtreecommitdiff
path: root/FreeRTOS/Source
diff options
context:
space:
mode:
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>2013-06-06 15:46:40 +0000
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>2013-06-06 15:46:40 +0000
commit05eeb9ddc5e8ac16a2cbad3d3e7b79348b9ae420 (patch)
tree9e6eb41c0d7a40d7725ca2e081a81e0870274d9f /FreeRTOS/Source
parentacc8e5dba9b86d4857c64d82c22c52dfc1653e26 (diff)
downloadfreertos-05eeb9ddc5e8ac16a2cbad3d3e7b79348b9ae420.tar.gz
Convert some ports to use xTaskIncrementTick() in place of vTaskIncrementTick().
Move DSB instructions to before WFI instructions in line with ARM recommendations. git-svn-id: http://svn.code.sf.net/p/freertos/code/trunk@1915 1d2547de-c912-0410-9cb9-b8ca96c0e9e2
Diffstat (limited to 'FreeRTOS/Source')
-rw-r--r--FreeRTOS/Source/portable/BCC/16BitDOS/Flsh186/port.c11
-rw-r--r--FreeRTOS/Source/portable/BCC/16BitDOS/PC/port.c11
-rw-r--r--FreeRTOS/Source/portable/CCS/MSP430X/portext.asm6
-rw-r--r--FreeRTOS/Source/portable/CodeWarrior/ColdFire_V1/port.c13
-rw-r--r--FreeRTOS/Source/portable/CodeWarrior/HCS12/port.c11
-rw-r--r--FreeRTOS/Source/portable/GCC/ARM7_AT91FR40008/portISR.c8
-rw-r--r--FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/portISR.c11
-rw-r--r--FreeRTOS/Source/portable/GCC/ARM7_LPC2000/portISR.c2
-rw-r--r--FreeRTOS/Source/portable/GCC/ARM7_LPC23xx/portISR.c4
-rw-r--r--FreeRTOS/Source/portable/GCC/ARM_CM0/port.c12
-rw-r--r--FreeRTOS/Source/portable/GCC/ARM_CM3/port.c18
-rw-r--r--FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/port.c12
-rw-r--r--FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c14
-rw-r--r--FreeRTOS/Source/portable/GCC/ATMega323/port.c8
-rw-r--r--FreeRTOS/Source/portable/GCC/AVR32_UC3/port.c2
-rw-r--r--FreeRTOS/Source/portable/GCC/CORTUS_APS3/port.c9
-rw-r--r--FreeRTOS/Source/portable/GCC/H8S2329/port.c8
-rw-r--r--FreeRTOS/Source/portable/GCC/HCS12/port.c12
-rw-r--r--FreeRTOS/Source/portable/GCC/MCF5235/port.c8
-rw-r--r--FreeRTOS/Source/portable/GCC/MicroBlaze/port.c11
-rw-r--r--FreeRTOS/Source/portable/GCC/MicroBlazeV8/port.c10
-rw-r--r--FreeRTOS/Source/portable/IAR/ARM_CM3/port.c12
-rw-r--r--FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c2
-rw-r--r--FreeRTOS/Source/portable/IAR/RX600/port.c38
-rw-r--r--FreeRTOS/Source/portable/MSVC-MingW/port.c13
-rw-r--r--FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c2
-rw-r--r--FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c2
27 files changed, 128 insertions, 142 deletions
diff --git a/FreeRTOS/Source/portable/BCC/16BitDOS/Flsh186/port.c b/FreeRTOS/Source/portable/BCC/16BitDOS/Flsh186/port.c
index 52b9bdeb4..6d7effbfc 100644
--- a/FreeRTOS/Source/portable/BCC/16BitDOS/Flsh186/port.c
+++ b/FreeRTOS/Source/portable/BCC/16BitDOS/Flsh186/port.c
@@ -195,10 +195,11 @@ is being used. */
static void __interrupt __far prvPreemptiveTick( void )
{
/* Get the scheduler to update the task states following the tick. */
- vTaskIncrementTick();
-
- /* Switch in the context of the next task to be run. */
- portSWITCH_CONTEXT();
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ /* Switch in the context of the next task to be run. */
+ portSWITCH_CONTEXT();
+ }
/* Reset the PIC ready for the next time. */
portRESET_PIC();
@@ -208,7 +209,7 @@ is being used. */
{
/* Same as preemptive tick, but the cooperative scheduler is being used
so we don't have to switch in the context of the next task. */
- vTaskIncrementTick();
+ xTaskIncrementTick();
portRESET_PIC();
}
#endif
diff --git a/FreeRTOS/Source/portable/BCC/16BitDOS/PC/port.c b/FreeRTOS/Source/portable/BCC/16BitDOS/PC/port.c
index a5874f999..4e9f8650f 100644
--- a/FreeRTOS/Source/portable/BCC/16BitDOS/PC/port.c
+++ b/FreeRTOS/Source/portable/BCC/16BitDOS/PC/port.c
@@ -216,10 +216,11 @@ scheduler is being used. */
static void __interrupt __far prvPreemptiveTick( void )
{
/* Get the scheduler to update the task states following the tick. */
- vTaskIncrementTick();
-
- /* Switch in the context of the next task to be run. */
- portSWITCH_CONTEXT();
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ /* Switch in the context of the next task to be run. */
+ portSWITCH_CONTEXT();
+ }
/* Reset the PIC ready for the next time. */
prvPortResetPIC();
@@ -229,7 +230,7 @@ scheduler is being used. */
{
/* Same as preemptive tick, but the cooperative scheduler is being used
so we don't have to switch in the context of the next task. */
- vTaskIncrementTick();
+ xTaskIncrementTick();
prvPortResetPIC();
}
#endif
diff --git a/FreeRTOS/Source/portable/CCS/MSP430X/portext.asm b/FreeRTOS/Source/portable/CCS/MSP430X/portext.asm
index 8e89f9b67..1d5d79e1d 100644
--- a/FreeRTOS/Source/portable/CCS/MSP430X/portext.asm
+++ b/FreeRTOS/Source/portable/CCS/MSP430X/portext.asm
@@ -57,7 +57,7 @@
.include data_model.h
- .global vTaskIncrementTick
+ .global xTaskIncrementTick
.global vTaskSwitchContext
.global vPortSetupTimerInterrupt
.global pxCurrentTCB
@@ -112,7 +112,7 @@ vPortPreemptiveTickISR: .asmfunc
push.w sr
portSAVE_CONTEXT
- call_x #vTaskIncrementTick
+ call_x #xTaskIncrementTick
call_x #vTaskSwitchContext
portRESTORE_CONTEXT
@@ -128,7 +128,7 @@ vPortCooperativeTickISR: .asmfunc
push.w sr
portSAVE_CONTEXT
- call_x #vTaskIncrementTick
+ call_x #xTaskIncrementTick
portRESTORE_CONTEXT
diff --git a/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V1/port.c b/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V1/port.c
index 2f4ae0fd6..b048b53e8 100644
--- a/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V1/port.c
+++ b/FreeRTOS/Source/portable/CodeWarrior/ColdFire_V1/port.c
@@ -220,16 +220,11 @@ unsigned long ulSavedInterruptMask;
/* Increment the RTOS tick. */
ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR();
{
- vTaskIncrementTick();
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ taskYIELD();
+ }
}
portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask );
-
- /* If we are using the pre-emptive scheduler then also request a
- context switch as incrementing the tick could have unblocked a task. */
- #if configUSE_PREEMPTION == 1
- {
- taskYIELD();
- }
- #endif
}
diff --git a/FreeRTOS/Source/portable/CodeWarrior/HCS12/port.c b/FreeRTOS/Source/portable/CodeWarrior/HCS12/port.c
index e1bbe7ae7..5dd8a8ec0 100644
--- a/FreeRTOS/Source/portable/CodeWarrior/HCS12/port.c
+++ b/FreeRTOS/Source/portable/CodeWarrior/HCS12/port.c
@@ -260,11 +260,10 @@ void interrupt vPortTickInterrupt( void )
portSAVE_CONTEXT();
/* Increment the tick ... */
- vTaskIncrementTick();
-
- /* ... then see if the new tick value has necessitated a
- context switch. */
- vTaskSwitchContext();
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ vTaskSwitchContext();
+ }
TFLG1 = 1;
@@ -274,7 +273,7 @@ void interrupt vPortTickInterrupt( void )
}
#else
{
- vTaskIncrementTick();
+ xTaskIncrementTick();
TFLG1 = 1;
}
#endif
diff --git a/FreeRTOS/Source/portable/GCC/ARM7_AT91FR40008/portISR.c b/FreeRTOS/Source/portable/GCC/ARM7_AT91FR40008/portISR.c
index 60a0d214a..ef503e61c 100644
--- a/FreeRTOS/Source/portable/GCC/ARM7_AT91FR40008/portISR.c
+++ b/FreeRTOS/Source/portable/GCC/ARM7_AT91FR40008/portISR.c
@@ -161,7 +161,7 @@ void vPortYieldProcessor( void )
/* Clear tick timer interrupt indication. */
ulDummy = portTIMER_REG_BASE_PTR->TC_SR;
- vTaskIncrementTick();
+ xTaskIncrementTick();
/* Acknowledge the interrupt at AIC level... */
AT91C_BASE_AIC->AIC_EOICR = portCLEAR_AIC_INTERRUPT;
@@ -186,8 +186,10 @@ void vPortYieldProcessor( void )
/* Increment the RTOS tick count, then look for the highest priority
task that is ready to run. */
- vTaskIncrementTick();
- vTaskSwitchContext();
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ vTaskSwitchContext();
+ }
/* Acknowledge the interrupt at AIC level... */
AT91C_BASE_AIC->AIC_EOICR = portCLEAR_AIC_INTERRUPT;
diff --git a/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/portISR.c b/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/portISR.c
index ac40e1ded..7eed8348c 100644
--- a/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/portISR.c
+++ b/FreeRTOS/Source/portable/GCC/ARM7_AT91SAM7S/portISR.c
@@ -163,7 +163,7 @@ void vPortYieldProcessor( void )
/* Increment the tick count - which may wake some tasks but as the
preemptive scheduler is not being used any woken task is not given
processor time no matter what its priority. */
- vTaskIncrementTick();
+ xTaskIncrementTick();
/* Clear the PIT interrupt. */
ulDummy = AT91C_BASE_PITC->PITC_PIVR;
@@ -183,10 +183,11 @@ void vPortYieldProcessor( void )
portSAVE_CONTEXT();
/* Increment the tick count - this may wake a task. */
- vTaskIncrementTick();
-
- /* Find the highest priority task that is ready to run. */
- vTaskSwitchContext();
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ /* Find the highest priority task that is ready to run. */
+ vTaskSwitchContext();
+ }
/* End the interrupt in the AIC. */
AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_PITC->PITC_PIVR;;
diff --git a/FreeRTOS/Source/portable/GCC/ARM7_LPC2000/portISR.c b/FreeRTOS/Source/portable/GCC/ARM7_LPC2000/portISR.c
index f4b15b176..02dbf8eee 100644
--- a/FreeRTOS/Source/portable/GCC/ARM7_LPC2000/portISR.c
+++ b/FreeRTOS/Source/portable/GCC/ARM7_LPC2000/portISR.c
@@ -166,7 +166,7 @@ void vTickISR( void )
/* Increment the RTOS tick count, then look for the highest priority
task that is ready to run. */
- __asm volatile( "bl vTaskIncrementTick" );
+ __asm volatile( "bl xTaskIncrementTick" );
#if configUSE_PREEMPTION == 1
__asm volatile( "bl vTaskSwitchContext" );
diff --git a/FreeRTOS/Source/portable/GCC/ARM7_LPC23xx/portISR.c b/FreeRTOS/Source/portable/GCC/ARM7_LPC23xx/portISR.c
index 3f89bd5c5..e39026f1c 100644
--- a/FreeRTOS/Source/portable/GCC/ARM7_LPC23xx/portISR.c
+++ b/FreeRTOS/Source/portable/GCC/ARM7_LPC23xx/portISR.c
@@ -150,7 +150,7 @@ void vPortYieldProcessor( void )
void vNonPreemptiveTick( void ) __attribute__ ((interrupt ("IRQ")));
void vNonPreemptiveTick( void )
{
- vTaskIncrementTick();
+ xTaskIncrementTick();
T0IR = 2;
VICVectAddr = portCLEAR_VIC_INTERRUPT;
}
@@ -167,7 +167,7 @@ void vPortYieldProcessor( void )
/* Increment the RTOS tick count, then look for the highest priority
task that is ready to run. */
- __asm volatile( "bl vTaskIncrementTick" );
+ __asm volatile( "bl xTaskIncrementTick" );
__asm volatile( "bl vTaskSwitchContext" );
/* Ready for the next interrupt. */
diff --git a/FreeRTOS/Source/portable/GCC/ARM_CM0/port.c b/FreeRTOS/Source/portable/GCC/ARM_CM0/port.c
index 6b8a8a84f..d0540db2f 100644
--- a/FreeRTOS/Source/portable/GCC/ARM_CM0/port.c
+++ b/FreeRTOS/Source/portable/GCC/ARM_CM0/port.c
@@ -293,14 +293,14 @@ void xPortSysTickHandler( void )
{
unsigned long ulDummy;
- /* If using preemption, also force a context switch. */
- #if configUSE_PREEMPTION == 1
- *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET;
- #endif
-
ulDummy = portSET_INTERRUPT_MASK_FROM_ISR();
{
- vTaskIncrementTick();
+ /* Increment the RTOS tick. */
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ /* Pend a context switch. */
+ *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET;
+ }
}
portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy );
}
diff --git a/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c b/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c
index a0bfe1d39..8acc0a53f 100644
--- a/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c
+++ b/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c
@@ -354,11 +354,6 @@ void xPortPendSVHandler( void )
void xPortSysTickHandler( void )
{
- /* If using preemption, also force a context switch. */
- #if configUSE_PREEMPTION == 1
- portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
- #endif
-
/* Only reset the systick load register if configUSE_TICKLESS_IDLE is set to
1. If it is set to 0 tickless idle is not being used. If it is set to a
value other than 0 or 1 then a timer other than the SysTick is being used
@@ -367,9 +362,18 @@ void xPortSysTickHandler( void )
portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick;
#endif
+ /* The SysTick runs at the lowest interrupt priority, so when this interrupt
+ executes all interrupts must be unmasked. There is therefore no need to
+ save and then restore the interrupt mask value as its value is already
+ known. */
( void ) portSET_INTERRUPT_MASK_FROM_ISR();
{
- vTaskIncrementTick();
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ /* A context switch is required. Context switching is performed in
+ the PendSV interrupt. Pend the PendSV interrupt. */
+ portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
+ }
}
portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 );
}
@@ -444,8 +448,8 @@ void xPortSysTickHandler( void )
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
if( xModifiableIdleTime > 0 )
{
- __asm volatile( "wfi" );
__asm volatile( "dsb" );
+ __asm volatile( "wfi" );
__asm volatile( "isb" );
}
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
diff --git a/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/port.c b/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/port.c
index 4d4870136..ffc58598a 100644
--- a/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/port.c
+++ b/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/port.c
@@ -452,14 +452,14 @@ void xPortSysTickHandler( void )
{
unsigned long ulDummy;
- /* If using preemption, also force a context switch. */
- #if configUSE_PREEMPTION == 1
- *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET;
- #endif
-
ulDummy = portSET_INTERRUPT_MASK_FROM_ISR();
{
- vTaskIncrementTick();
+ /* Increment the RTOS tick. */
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ /* Pend a context switch. */
+ *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET;
+ }
}
portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy );
}
diff --git a/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c b/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c
index 56ec249bb..23e194bbe 100644
--- a/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c
+++ b/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c
@@ -387,11 +387,6 @@ void xPortPendSVHandler( void )
void xPortSysTickHandler( void )
{
- /* If using preemption, also force a context switch. */
- #if configUSE_PREEMPTION == 1
- portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
- #endif
-
/* Only reset the systick load register if configUSE_TICKLESS_IDLE is set to
1. If it is set to 0 tickless idle is not being used. If it is set to a
value other than 0 or 1 then a timer other than the SysTick is being used
@@ -402,7 +397,12 @@ void xPortSysTickHandler( void )
( void ) portSET_INTERRUPT_MASK_FROM_ISR();
{
- vTaskIncrementTick();
+ /* Increment the RTOS tick count. */
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ /* Pend a context switch. */
+ portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
+ }
}
portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 );
}
@@ -477,8 +477,8 @@ void xPortSysTickHandler( void )
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
if( xModifiableIdleTime > 0 )
{
- __asm volatile( "wfi" );
__asm volatile( "dsb" );
+ __asm volatile( "wfi" );
__asm volatile( "isb" );
}
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
diff --git a/FreeRTOS/Source/portable/GCC/ATMega323/port.c b/FreeRTOS/Source/portable/GCC/ATMega323/port.c
index d53607a67..29f40d4c2 100644
--- a/FreeRTOS/Source/portable/GCC/ATMega323/port.c
+++ b/FreeRTOS/Source/portable/GCC/ATMega323/port.c
@@ -393,8 +393,10 @@ void vPortYieldFromTick( void ) __attribute__ ( ( naked ) );
void vPortYieldFromTick( void )
{
portSAVE_CONTEXT();
- vTaskIncrementTick();
- vTaskSwitchContext();
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ vTaskSwitchContext();
+ }
portRESTORE_CONTEXT();
asm volatile ( "ret" );
@@ -463,7 +465,7 @@ unsigned char ucHighByte, ucLowByte;
void SIG_OUTPUT_COMPARE1A( void ) __attribute__ ( ( signal ) );
void SIG_OUTPUT_COMPARE1A( void )
{
- vTaskIncrementTick();
+ xTaskIncrementTick();
}
#endif
diff --git a/FreeRTOS/Source/portable/GCC/AVR32_UC3/port.c b/FreeRTOS/Source/portable/GCC/AVR32_UC3/port.c
index 691b71201..43cbc4b4c 100644
--- a/FreeRTOS/Source/portable/GCC/AVR32_UC3/port.c
+++ b/FreeRTOS/Source/portable/GCC/AVR32_UC3/port.c
@@ -254,7 +254,7 @@ __attribute__((__naked__)) static void vTick( void )
/* Because FreeRTOS is not supposed to run with nested interrupts, put all OS
calls in a critical section . */
portENTER_CRITICAL();
- vTaskIncrementTick();
+ xTaskIncrementTick();
portEXIT_CRITICAL();
/* Restore the context of the "elected task". */
diff --git a/FreeRTOS/Source/portable/GCC/CORTUS_APS3/port.c b/FreeRTOS/Source/portable/GCC/CORTUS_APS3/port.c
index 9e5b31564..bfed6932f 100644
--- a/FreeRTOS/Source/portable/GCC/CORTUS_APS3/port.c
+++ b/FreeRTOS/Source/portable/GCC/CORTUS_APS3/port.c
@@ -170,12 +170,11 @@ void interrupt31_handler( void )
static void prvProcessTick( void ) __attribute__((noinline));
static void prvProcessTick( void )
{
- vTaskIncrementTick();
-
- #if configUSE_PREEMPTION == 1
+ if( xTaskIncrementTick() != pdFALSE )
+ {
vTaskSwitchContext();
- #endif
-
+ }
+
/* Clear the Tick Interrupt. */
counter1->expired = 0;
}
diff --git a/FreeRTOS/Source/portable/GCC/H8S2329/port.c b/FreeRTOS/Source/portable/GCC/H8S2329/port.c
index ce1e53abc..d30499231 100644
--- a/FreeRTOS/Source/portable/GCC/H8S2329/port.c
+++ b/FreeRTOS/Source/portable/GCC/H8S2329/port.c
@@ -293,8 +293,10 @@ void vPortYield( void )
{
portSAVE_STACK_POINTER();
- vTaskIncrementTick();
- vTaskSwitchContext();
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ vTaskSwitchContext();
+ }
/* Clear the interrupt. */
TSR1 &= ~0x01;
@@ -312,7 +314,7 @@ void vPortYield( void )
void vTickISR( void ) __attribute__ ( ( interrupt_handler ) );
void vTickISR( void )
{
- vTaskIncrementTick();
+ xTaskIncrementTick();
/* Clear the interrupt. */
TSR1 &= ~0x01;
diff --git a/FreeRTOS/Source/portable/GCC/HCS12/port.c b/FreeRTOS/Source/portable/GCC/HCS12/port.c
index 8835eb118..c551de1bf 100644
--- a/FreeRTOS/Source/portable/GCC/HCS12/port.c
+++ b/FreeRTOS/Source/portable/GCC/HCS12/port.c
@@ -263,11 +263,11 @@ void vPortTickInterrupt( void )
portSAVE_CONTEXT();
/* Increment the tick ... */
- vTaskIncrementTick();
-
- /* ... then see if the new tick value has necessitated a
- context switch. */
- vTaskSwitchContext();
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ /* A context switch is necessary. */
+ vTaskSwitchContext();
+ }
/* Restore the context of a task - which may be a different task
to that interrupted. */
@@ -275,7 +275,7 @@ void vPortTickInterrupt( void )
}
#else
{
- vTaskIncrementTick();
+ xTaskIncrementTick();
}
#endif
diff --git a/FreeRTOS/Source/portable/GCC/MCF5235/port.c b/FreeRTOS/Source/portable/GCC/MCF5235/port.c
index 837ad44bb..f5b6e4f68 100644
--- a/FreeRTOS/Source/portable/GCC/MCF5235/port.c
+++ b/FreeRTOS/Source/portable/GCC/MCF5235/port.c
@@ -194,7 +194,7 @@ prvPortPreemptiveTick ( void )
* simply increment the system tick.
*/
- vTaskIncrementTick( );
+ xTaskIncrementTick();
MCF_PIT_PCSR0 |= MCF_PIT_PCSR_PIF;
}
@@ -209,8 +209,10 @@ prvPortPreemptiveTick( void )
#endif
portSAVE_CONTEXT( );
MCF_PIT_PCSR0 |= MCF_PIT_PCSR_PIF;
- vTaskIncrementTick( );
- vTaskSwitchContext( );
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ vTaskSwitchContext( );
+ }
portRESTORE_CONTEXT( );
}
#endif
diff --git a/FreeRTOS/Source/portable/GCC/MicroBlaze/port.c b/FreeRTOS/Source/portable/GCC/MicroBlaze/port.c
index d2c552905..4d796f741 100644
--- a/FreeRTOS/Source/portable/GCC/MicroBlaze/port.c
+++ b/FreeRTOS/Source/portable/GCC/MicroBlaze/port.c
@@ -359,17 +359,14 @@ void vTickISR( void *pvBaseAddress )
unsigned long ulCSR;
/* Increment the RTOS tick - this might cause a task to unblock. */
- vTaskIncrementTick();
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ vTaskSwitchContext();
+ }
/* Clear the timer interrupt */
ulCSR = XTmrCtr_mGetControlStatusReg(XPAR_OPB_TIMER_1_BASEADDR, 0);
XTmrCtr_mSetControlStatusReg( XPAR_OPB_TIMER_1_BASEADDR, portCOUNTER_0, ulCSR );
-
- /* If we are using the preemptive scheduler then we also need to determine
- if this tick should cause a context switch. */
- #if configUSE_PREEMPTION == 1
- vTaskSwitchContext();
- #endif
}
/*-----------------------------------------------------------*/
diff --git a/FreeRTOS/Source/portable/GCC/MicroBlazeV8/port.c b/FreeRTOS/Source/portable/GCC/MicroBlazeV8/port.c
index f3f5a95a0..d85a428fc 100644
--- a/FreeRTOS/Source/portable/GCC/MicroBlazeV8/port.c
+++ b/FreeRTOS/Source/portable/GCC/MicroBlazeV8/port.c
@@ -433,15 +433,11 @@ extern void vApplicationClearTimerInterrupt( void );
vApplicationClearTimerInterrupt();
/* Increment the RTOS tick - this might cause a task to unblock. */
- vTaskIncrementTick();
-
- /* If the preemptive scheduler is being used then a context switch should be
- requested in case incrementing the tick unblocked a task, or a time slice
- should cause another task to enter the Running state. */
- #if configUSE_PREEMPTION == 1
+ if( xTaskIncrementTick() != pdFALSE )
+ {
/* Force vTaskSwitchContext() to be called as the interrupt exits. */
ulTaskSwitchRequested = 1;
- #endif
+ }
}
/*-----------------------------------------------------------*/
diff --git a/FreeRTOS/Source/portable/IAR/ARM_CM3/port.c b/FreeRTOS/Source/portable/IAR/ARM_CM3/port.c
index c8104c6be..d2ea44745 100644
--- a/FreeRTOS/Source/portable/IAR/ARM_CM3/port.c
+++ b/FreeRTOS/Source/portable/IAR/ARM_CM3/port.c
@@ -250,11 +250,6 @@ void vPortExitCritical( void )
void xPortSysTickHandler( void )
{
- /* If using preemption, also force a context switch. */
- #if configUSE_PREEMPTION == 1
- portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
- #endif
-
/* Only reset the systick load register if configUSE_TICKLESS_IDLE is set to
1. If it is set to 0 tickless idle is not being used. If it is set to a
value other than 0 or 1 then a timer other than the SysTick is being used
@@ -265,7 +260,10 @@ void xPortSysTickHandler( void )
( void ) portSET_INTERRUPT_MASK_FROM_ISR();
{
- vTaskIncrementTick();
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
+ }
}
portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 );
}
@@ -340,8 +338,8 @@ void xPortSysTickHandler( void )
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
if( xModifiableIdleTime > 0 )
{
- __WFI();
__DSB();
+ __WFI();
__ISB();
}
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
diff --git a/FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c b/FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c
index 3d55afae4..a9264f3fc 100644
--- a/FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c
+++ b/FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c
@@ -365,8 +365,8 @@ void xPortSysTickHandler( void )
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
if( xModifiableIdleTime > 0 )
{
- __WFI();
__DSB();
+ __WFI();
__ISB();
}
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
diff --git a/FreeRTOS/Source/portable/IAR/RX600/port.c b/FreeRTOS/Source/portable/IAR/RX600/port.c
index 86bfbd436..0306bb7de 100644
--- a/FreeRTOS/Source/portable/IAR/RX600/port.c
+++ b/FreeRTOS/Source/portable/IAR/RX600/port.c
@@ -56,19 +56,19 @@
***************************************************************************
- http://www.FreeRTOS.org - Documentation, books, training, latest versions,
+ http://www.FreeRTOS.org - Documentation, books, training, latest versions,
license and Real Time Engineers Ltd. contact details.
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
including FreeRTOS+Trace - an indispensable productivity tool, and our new
fully thread aware and reentrant UDP/IP stack.
- http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
- Integrity Systems, who sell the code with commercial support,
+ http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
+ Integrity Systems, who sell the code with commercial support,
indemnification and middleware, under the OpenRTOS brand.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
+
+ http://www.SafeRTOS.com - High Integrity Systems also provide a safety
+ engineered and independently SIL3 certified version for use in safety and
mission critical applications that require provable dependability.
*/
@@ -119,13 +119,13 @@ extern void *pxCurrentTCB;
portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )
{
/* R0 is not included as it is the stack pointer. */
-
+
*pxTopOfStack = 0x00;
pxTopOfStack--;
*pxTopOfStack = portINITIAL_PSW;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) pxCode;
-
+
/* When debugging it can be useful if every register is set to a known
value. Otherwise code space can be saved by just setting the registers
that need to be set. */
@@ -166,9 +166,9 @@ portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE
pxTopOfStack -= 15;
}
#endif
-
+
*pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R1 */
- pxTopOfStack--;
+ pxTopOfStack--;
*pxTopOfStack = portINITIAL_FPSW;
pxTopOfStack--;
*pxTopOfStack = 0x12345678; /* Accumulator. */
@@ -191,12 +191,12 @@ extern void vApplicationSetupTimerInterrupt( void );
use. A demo application is provided to show a suitable example. */
vApplicationSetupTimerInterrupt();
- /* Enable the software interrupt. */
+ /* Enable the software interrupt. */
_IEN( _ICU_SWINT ) = 1;
-
+
/* Ensure the software interrupt is clear. */
_IR( _ICU_SWINT ) = 0;
-
+
/* Ensure the software interrupt is set to the kernel priority. */
_IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY;
@@ -214,19 +214,17 @@ __interrupt void vTickISR( void )
{
/* Re-enable interrupts. */
__enable_interrupt();
-
+
/* Increment the tick, and perform any processing the new tick value
necessitates. */
__set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY );
{
- vTaskIncrementTick();
+ if( xTaskIncrementTick() != pdFALSE )
+ {
+ taskYIELD();
+ }
}
__set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY );
-
- /* Only select a new task if the preemptive scheduler is being used. */
- #if( configUSE_PREEMPTION == 1 )
- taskYIELD();
- #endif
}
/*-----------------------------------------------------------*/
diff --git a/FreeRTOS/Source/portable/MSVC-MingW/port.c b/FreeRTOS/Source/portable/MSVC-MingW/port.c
index 8b82a8c96..a19858de5 100644
--- a/FreeRTOS/Source/portable/MSVC-MingW/port.c
+++ b/FreeRTOS/Source/portable/MSVC-MingW/port.c
@@ -301,18 +301,7 @@ static unsigned long prvProcessTickInterrupt( void )
unsigned long ulSwitchRequired;
/* Process the tick itself. */
- vTaskIncrementTick();
- #if( configUSE_PREEMPTION != 0 )
- {
- /* A context switch is only automatically performed from the tick
- interrupt if the pre-emptive scheduler is being used. */
- ulSwitchRequired = pdTRUE;
- }
- #else
- {
- ulSwitchRequired = pdFALSE;
- }
- #endif
+ ulSwitchRequired = ( unsigned long ) xTaskIncrementTick();
return ulSwitchRequired;
}
diff --git a/FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c b/FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c
index f1a982aca..c721f1fe3 100644
--- a/FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c
+++ b/FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c
@@ -417,8 +417,8 @@ void xPortSysTickHandler( void )
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
if( xModifiableIdleTime > 0 )
{
- __wfi();
__dsb( portSY_FULL_READ_WRITE );
+ __wfi();
__isb( portSY_FULL_READ_WRITE );
}
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
diff --git a/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c b/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c
index d935dedfc..345f386bf 100644
--- a/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c
+++ b/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c
@@ -480,8 +480,8 @@ void xPortSysTickHandler( void )
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
if( xModifiableIdleTime > 0 )
{
- __wfi();
__dsb( portSY_FULL_READ_WRITE );
+ __wfi();
__isb( portSY_FULL_READ_WRITE );
}
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );