diff --git a/hal/mbed_ticker_api.c b/hal/mbed_ticker_api.c index c9bf84e682..f1dcf3bf10 100644 --- a/hal/mbed_ticker_api.c +++ b/hal/mbed_ticker_api.c @@ -69,6 +69,7 @@ static void initialize(const ticker_data_t *ticker) ticker->queue->max_delta = max_delta; ticker->queue->max_delta_us = max_delta_us; ticker->queue->present_time = 0; + ticker->queue->dispatching = false; ticker->queue->initialized = true; update_present_time(ticker); @@ -229,6 +230,12 @@ int _ticker_match_interval_passed(timestamp_t prev_tick, timestamp_t cur_tick, t static void schedule_interrupt(const ticker_data_t *const ticker) { ticker_event_queue_t *queue = ticker->queue; + if (ticker->queue->dispatching) { + // Don't schedule the next interrupt until dispatching is + // finished. This prevents repeated calls to interface->set_interrupt + return; + } + update_present_time(ticker); if (ticker->queue->head) { @@ -280,6 +287,7 @@ void ticker_irq_handler(const ticker_data_t *const ticker) ticker->interface->clear_interrupt(); /* Go through all the pending TimerEvents */ + ticker->queue->dispatching = true; while (1) { if (ticker->queue->head == NULL) { break; @@ -302,6 +310,7 @@ void ticker_irq_handler(const ticker_data_t *const ticker) break; } } + ticker->queue->dispatching = false; schedule_interrupt(ticker); diff --git a/hal/ticker_api.h b/hal/ticker_api.h index 661bd80995..ff418f1b10 100644 --- a/hal/ticker_api.h +++ b/hal/ticker_api.h @@ -80,6 +80,7 @@ typedef struct { uint64_t tick_remainder; /**< Ticks that have not been added to base_time */ us_timestamp_t present_time; /**< Store the timestamp used for present time */ bool initialized; /**< Indicate if the instance is initialized */ + bool dispatching; /**< The function ticker_irq_handler is dispatching */ uint8_t frequency_shifts; /**< If frequency is a value of 2^n, this is n, otherwise 0 */ } ticker_event_queue_t;