Fix 1 millisecond backwards time leap in time measured by micros()

This race condition caused periodic flight instability when micros() was
called precisely on a 1000 nanosecond boundary.
This commit is contained in:
Nicholas Sherlock 2015-09-04 23:44:41 +12:00
parent 1a15e5aa08
commit f7530df974
1 changed files with 6 additions and 0 deletions

View File

@ -99,6 +99,12 @@ uint32_t micros(void)
do {
ms = sysTickUptime;
cycle_cnt = SysTick->VAL;
/*
* If the SysTick timer expired during the previous instruction, we need to give it a little time for that
* interrupt to be delivered before we can recheck sysTickUptime:
*/
asm volatile("\tnop\n");
} while (ms != sysTickUptime);
return (ms * 1000) + (usTicks * 1000 - cycle_cnt) / usTicks;
}