]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c
Add additional critical section to the default tickless implementations.
[freertos] / FreeRTOS / Source / portable / RVDS / ARM_CM4F / port.c
index b8be8e5827ad514b75c9bef782814218327cf538..8abc48bafccab0771c996914afa45639807e892d 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-    FreeRTOS V7.5.1 - Copyright (C) 2013 Real Time Engineers Ltd.\r
+    FreeRTOS V7.5.2 - Copyright (C) 2013 Real Time Engineers Ltd.\r
 \r
     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
 \r
@@ -583,15 +583,17 @@ void xPortSysTickHandler( void )
 \r
                        /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG\r
                        again, then set portNVIC_SYSTICK_LOAD_REG back to its standard\r
-                       value. */\r
+                       value.  The critical section is used to ensure the tick interrupt\r
+                       can only execute once in the case that the reload register is near\r
+                       zero. */\r
                        portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;\r
-                       portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;\r
-\r
-                       vTaskStepTick( ulCompleteTickPeriods );\r
-\r
-                       /* The counter must start by the time the reload value is reset. */\r
-                       configASSERT( portNVIC_SYSTICK_CURRENT_VALUE_REG );\r
-                       portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;\r
+                       portENTER_CRITICAL();\r
+                       {\r
+                               portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;\r
+                               vTaskStepTick( ulCompleteTickPeriods );\r
+                               portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;\r
+                       }\r
+                       portEXIT_CRITICAL();\r
                }\r
        }\r
 \r