mirror of https://github.com/ARMmbed/mbed-os.git
events: Added better handling of desynchronized timers in platform layer
An odd bug (c0951c9
) in the NCS36510 ticker code caused the timer/ticker
classes to become desynchronized. Updated the handling to not assume the
timers are perfectly in synch. This will increase the event's tolerance of
less robust platforms.
pull/3779/head
parent
c0951c9035
commit
0949164422
|
@ -26,15 +26,15 @@
|
|||
|
||||
// Ticker operations
|
||||
static bool equeue_tick_inited = false;
|
||||
static unsigned equeue_minutes = 0;
|
||||
static volatile unsigned equeue_minutes = 0;
|
||||
static unsigned equeue_timer[
|
||||
(sizeof(Timer)+sizeof(unsigned)-1)/sizeof(unsigned)];
|
||||
static unsigned equeue_ticker[
|
||||
(sizeof(Ticker)+sizeof(unsigned)-1)/sizeof(unsigned)];
|
||||
|
||||
static void equeue_tick_update() {
|
||||
equeue_minutes += reinterpret_cast<Timer*>(equeue_timer)->read_ms();
|
||||
reinterpret_cast<Timer*>(equeue_timer)->reset();
|
||||
equeue_minutes += 1;
|
||||
}
|
||||
|
||||
static void equeue_tick_init() {
|
||||
|
@ -48,7 +48,7 @@ static void equeue_tick_init() {
|
|||
equeue_minutes = 0;
|
||||
reinterpret_cast<Timer*>(equeue_timer)->start();
|
||||
reinterpret_cast<Ticker*>(equeue_ticker)
|
||||
->attach_us(equeue_tick_update, (1 << 16)*1000);
|
||||
->attach_us(equeue_tick_update, 1000 << 16);
|
||||
|
||||
equeue_tick_inited = true;
|
||||
}
|
||||
|
@ -58,8 +58,15 @@ unsigned equeue_tick() {
|
|||
equeue_tick_init();
|
||||
}
|
||||
|
||||
unsigned equeue_ms = reinterpret_cast<Timer*>(equeue_timer)->read_ms();
|
||||
return (equeue_minutes << 16) + equeue_ms;
|
||||
unsigned minutes;
|
||||
unsigned ms;
|
||||
|
||||
do {
|
||||
minutes = equeue_minutes;
|
||||
ms = reinterpret_cast<Timer*>(equeue_timer)->read_ms();
|
||||
} while (minutes != equeue_minutes);
|
||||
|
||||
return minutes + ms;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue