Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove unnecessary low power ticker rescheduling #7600

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions hal/mbed_ticker_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand All @@ -302,6 +310,7 @@ void ticker_irq_handler(const ticker_data_t *const ticker)
break;
}
}
ticker->queue->dispatching = false;

schedule_interrupt(ticker);

Expand Down
1 change: 1 addition & 0 deletions hal/ticker_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
1 change: 1 addition & 0 deletions rtos/TARGET_CORTEX/SysTimer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ void SysTimer::handler()
} else {
_set_irq_pending();
_increment_tick();
schedule_tick();
}

core_util_critical_section_exit();
Expand Down
2 changes: 1 addition & 1 deletion rtos/TARGET_CORTEX/mbed_rtx_idle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ void OS_Tick_Disable (void)
/// Acknowledge System Timer IRQ.
void OS_Tick_AcknowledgeIRQ (void)
{
os_timer->schedule_tick();

}

/// Get System Timer count.
Expand Down