From ac8797b49c9db2e208783cb31d33fa5ce9c35e90 Mon Sep 17 00:00:00 2001 From: richardbarry Date: Wed, 24 Jul 2013 09:45:17 +0000 Subject: 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 --- FreeRTOS/Source/portable/GCC/ARM_CM3/port.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'FreeRTOS/Source/portable/GCC/ARM_CM3/port.c') 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(); } } -- cgit v1.2.1