summaryrefslogtreecommitdiff
path: root/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c
diff options
context:
space:
mode:
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>2013-07-24 09:45:17 +0000
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>2013-07-24 09:45:17 +0000
commitac8797b49c9db2e208783cb31d33fa5ce9c35e90 (patch)
tree4d30d2b9224694d28a7abb612a42b23801ab5714 /FreeRTOS/Source/portable/GCC/ARM_CM3/port.c
parent9587ef8e5c4347db3a2c8fd9c05479242b1f2d15 (diff)
downloadfreertos-ac8797b49c9db2e208783cb31d33fa5ce9c35e90.tar.gz
Add additional critical section to the default tickless implementations.
Update version number for maintenance release. git-svn-id: http://svn.code.sf.net/p/freertos/code/trunk@1998 1d2547de-c912-0410-9cb9-b8ca96c0e9e2
Diffstat (limited to 'FreeRTOS/Source/portable/GCC/ARM_CM3/port.c')
-rw-r--r--FreeRTOS/Source/portable/GCC/ARM_CM3/port.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c b/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c
index 8b0997440..741fb64b5 100644
--- a/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c
+++ b/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c
@@ -1,5 +1,5 @@
/*
- FreeRTOS V7.5.1 - Copyright (C) 2013 Real Time Engineers Ltd.
+ FreeRTOS V7.5.2 - Copyright (C) 2013 Real Time Engineers Ltd.
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
@@ -543,15 +543,17 @@ void xPortSysTickHandler( void )
/* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG
again, then set portNVIC_SYSTICK_LOAD_REG back to its standard
- value. */
+ value. The critical section is used to ensure the tick interrupt
+ can only execute once in the case that the reload register is near
+ zero. */
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
- portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
-
- vTaskStepTick( ulCompleteTickPeriods );
-
- /* The counter must start by the time the reload value is reset. */
- configASSERT( portNVIC_SYSTICK_CURRENT_VALUE_REG );
- portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
+ portENTER_CRITICAL();
+ {
+ portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
+ vTaskStepTick( ulCompleteTickPeriods );
+ portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
+ }
+ portEXIT_CRITICAL();
}
}