From 1fb8ab4c1942d7eaa265e032e203c01a3bd71019 Mon Sep 17 00:00:00 2001 From: James Devine Date: Fri, 13 May 2016 16:39:15 +0100 Subject: [PATCH] mbed-classic: BUGFIX for timer when using wait_ms from interrupt context Previously if a user used wait[_ms,_us] in interrupt context the device would hang indefinitely. This was due to incrementing overflowCount from interrupt context only. This meant that if a user used wait[_ms,_us] in an ISR with the same or greater interrupt priority, it would result in an infinite loop as the overflowCount variable would never be incremented, and wait[_ms,_us] would never return. This patch simply applies a better solution for the race condition mentioned in the previous commit. It instead disables the timer1 interrupt and increments the overflowCount variable, preventing the race condition whilst supporting wait[_ms,_us] in interrupt context. --- .../TARGET_NORDIC/TARGET_MCU_NRF51822/us_ticker.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/us_ticker.c b/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/us_ticker.c index 73b2523..c389619 100644 --- a/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/us_ticker.c +++ b/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/us_ticker.c @@ -141,14 +141,19 @@ void tmr1_stop(void) */ static inline uint64_t tmr1_getCounter64(void) { - int o = 0; - NRF_TIMER1->TASKS_CAPTURE[2] = 1; - if (NRF_TIMER1->EVENTS_COMPARE[3]) - o++; + NVIC_DisableIRQ(TIMER1_IRQn); - return (((uint64_t)(overflowCount+o)) << 16) | (NRF_TIMER1->CC[2] & MAX_TMR1_COUNTER_VAL); + if (NRF_TIMER1->EVENTS_COMPARE[3]) + { + NRF_TIMER1->EVENTS_COMPARE[3] = 0; + overflowCount++; + } + + NVIC_EnableIRQ(TIMER1_IRQn); + + return (((uint64_t)(overflowCount)) << 16) | (NRF_TIMER1->CC[2] & MAX_TMR1_COUNTER_VAL); } /**