cortex_m_systick: fix _timer_cycle_get_32() race

We need to account for the interrupt happening in the middle
of the calculation.

Issue: ZEP-1546
Change-Id: I193534856d7521cac7ca354d3e5b65e93b984bb1
Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
This commit is contained in:
Andrew Boie 2017-02-16 14:12:55 -08:00
commit b8d57738b8

View file

@ -28,7 +28,7 @@
#include <arch/arm/cortex_m/cmsis.h>
/* running total of timer count */
static uint32_t clock_accumulated_count;
static volatile uint32_t clock_accumulated_count;
/*
* A board support package's board.h header must provide definitions for the
@ -559,7 +559,14 @@ int _sys_clock_driver_init(struct device *device)
*/
uint32_t _timer_cycle_get_32(void)
{
return clock_accumulated_count + (SysTick->LOAD - SysTick->VAL);
uint32_t cac, count;
do {
cac = clock_accumulated_count;
count = SysTick->LOAD - SysTick->VAL;
} while (cac != clock_accumulated_count);
return cac + count;
}
#ifdef CONFIG_SYSTEM_CLOCK_DISABLE