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.master microbit_hfclk+mb5
parent
0918819fd0
commit
1fb8ab4c19
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue