mirror of https://github.com/ARMmbed/mbed-os.git
Provide fix for issue #5835 - Tickers update should be atomic
Synchronise only (and all) the public functions.pull/5889/head
parent
c59c400093
commit
6d3ba94f98
|
@ -110,7 +110,6 @@ static us_timestamp_t convert_timestamp(us_timestamp_t ref, timestamp_t timestam
|
||||||
*/
|
*/
|
||||||
static void update_present_time(const ticker_data_t *const ticker)
|
static void update_present_time(const ticker_data_t *const ticker)
|
||||||
{
|
{
|
||||||
|
|
||||||
ticker_event_queue_t *queue = ticker->queue;
|
ticker_event_queue_t *queue = ticker->queue;
|
||||||
uint32_t ticker_time = ticker->interface->read();
|
uint32_t ticker_time = ticker->interface->read();
|
||||||
if (ticker_time == ticker->queue->tick_last_read) {
|
if (ticker_time == ticker->queue->tick_last_read) {
|
||||||
|
@ -252,11 +251,16 @@ static void schedule_interrupt(const ticker_data_t *const ticker)
|
||||||
void ticker_set_handler(const ticker_data_t *const ticker, ticker_event_handler handler)
|
void ticker_set_handler(const ticker_data_t *const ticker, ticker_event_handler handler)
|
||||||
{
|
{
|
||||||
initialize(ticker);
|
initialize(ticker);
|
||||||
|
|
||||||
|
core_util_critical_section_enter();
|
||||||
set_handler(ticker, handler);
|
set_handler(ticker, handler);
|
||||||
|
core_util_critical_section_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ticker_irq_handler(const ticker_data_t *const ticker)
|
void ticker_irq_handler(const ticker_data_t *const ticker)
|
||||||
{
|
{
|
||||||
|
core_util_critical_section_enter();
|
||||||
|
|
||||||
ticker->interface->clear_interrupt();
|
ticker->interface->clear_interrupt();
|
||||||
|
|
||||||
/* Go through all the pending TimerEvents */
|
/* Go through all the pending TimerEvents */
|
||||||
|
@ -284,6 +288,8 @@ void ticker_irq_handler(const ticker_data_t *const ticker)
|
||||||
}
|
}
|
||||||
|
|
||||||
schedule_interrupt(ticker);
|
schedule_interrupt(ticker);
|
||||||
|
|
||||||
|
core_util_critical_section_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ticker_insert_event(const ticker_data_t *const ticker, ticker_event_t *obj, timestamp_t timestamp, uint32_t id)
|
void ticker_insert_event(const ticker_data_t *const ticker, ticker_event_t *obj, timestamp_t timestamp, uint32_t id)
|
||||||
|
@ -296,13 +302,14 @@ void ticker_insert_event(const ticker_data_t *const ticker, ticker_event_t *obj,
|
||||||
ticker->queue->present_time,
|
ticker->queue->present_time,
|
||||||
timestamp
|
timestamp
|
||||||
);
|
);
|
||||||
core_util_critical_section_exit();
|
|
||||||
|
|
||||||
// defer to ticker_insert_event_us
|
// defer to ticker_insert_event_us
|
||||||
ticker_insert_event_us(
|
ticker_insert_event_us(
|
||||||
ticker,
|
ticker,
|
||||||
obj, absolute_timestamp, id
|
obj, absolute_timestamp, id
|
||||||
);
|
);
|
||||||
|
|
||||||
|
core_util_critical_section_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ticker_insert_event_us(const ticker_data_t *const ticker, ticker_event_t *obj, us_timestamp_t timestamp, uint32_t id)
|
void ticker_insert_event_us(const ticker_data_t *const ticker, ticker_event_t *obj, us_timestamp_t timestamp, uint32_t id)
|
||||||
|
@ -343,6 +350,7 @@ void ticker_insert_event_us(const ticker_data_t *const ticker, ticker_event_t *o
|
||||||
schedule_interrupt(ticker);
|
schedule_interrupt(ticker);
|
||||||
|
|
||||||
core_util_critical_section_exit();
|
core_util_critical_section_exit();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ticker_remove_event(const ticker_data_t *const ticker, ticker_event_t *obj)
|
void ticker_remove_event(const ticker_data_t *const ticker, ticker_event_t *obj)
|
||||||
|
@ -377,7 +385,11 @@ timestamp_t ticker_read(const ticker_data_t *const ticker)
|
||||||
us_timestamp_t ticker_read_us(const ticker_data_t *const ticker)
|
us_timestamp_t ticker_read_us(const ticker_data_t *const ticker)
|
||||||
{
|
{
|
||||||
initialize(ticker);
|
initialize(ticker);
|
||||||
|
|
||||||
|
core_util_critical_section_enter();
|
||||||
update_present_time(ticker);
|
update_present_time(ticker);
|
||||||
|
core_util_critical_section_exit();
|
||||||
|
|
||||||
return ticker->queue->present_time;
|
return ticker->queue->present_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue