]> git.sur5r.net Git - freertos/commitdiff
Added a critical section around the call to vTaskIncrementTick() in all the RX ports.
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 29 Aug 2010 17:57:32 +0000 (17:57 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 29 Aug 2010 17:57:32 +0000 (17:57 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1072 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

Source/portable/GCC/RX600/port.c
Source/portable/IAR/RX600/port.c
Source/portable/Renesas/RX600/port.c

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