Skip to content

Commit 6d3ba94

Browse files
committed
Provide fix for issue #5835 - Tickers update should be atomic
Synchronise only (and all) the public functions.
1 parent c59c400 commit 6d3ba94

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

hal/mbed_ticker_api.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ static us_timestamp_t convert_timestamp(us_timestamp_t ref, timestamp_t timestam
110110
*/
111111
static void update_present_time(const ticker_data_t *const ticker)
112112
{
113-
114113
ticker_event_queue_t *queue = ticker->queue;
115114
uint32_t ticker_time = ticker->interface->read();
116115
if (ticker_time == ticker->queue->tick_last_read) {
@@ -252,11 +251,16 @@ static void schedule_interrupt(const ticker_data_t *const ticker)
252251
void ticker_set_handler(const ticker_data_t *const ticker, ticker_event_handler handler)
253252
{
254253
initialize(ticker);
254+
255+
core_util_critical_section_enter();
255256
set_handler(ticker, handler);
257+
core_util_critical_section_exit();
256258
}
257259

258260
void ticker_irq_handler(const ticker_data_t *const ticker)
259261
{
262+
core_util_critical_section_enter();
263+
260264
ticker->interface->clear_interrupt();
261265

262266
/* Go through all the pending TimerEvents */
@@ -284,6 +288,8 @@ void ticker_irq_handler(const ticker_data_t *const ticker)
284288
}
285289

286290
schedule_interrupt(ticker);
291+
292+
core_util_critical_section_exit();
287293
}
288294

289295
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,
296302
ticker->queue->present_time,
297303
timestamp
298304
);
299-
core_util_critical_section_exit();
300305

301306
// defer to ticker_insert_event_us
302307
ticker_insert_event_us(
303308
ticker,
304309
obj, absolute_timestamp, id
305310
);
311+
312+
core_util_critical_section_exit();
306313
}
307314

308315
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
343350
schedule_interrupt(ticker);
344351

345352
core_util_critical_section_exit();
353+
346354
}
347355

348356
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)
377385
us_timestamp_t ticker_read_us(const ticker_data_t *const ticker)
378386
{
379387
initialize(ticker);
388+
389+
core_util_critical_section_enter();
380390
update_present_time(ticker);
391+
core_util_critical_section_exit();
392+
381393
return ticker->queue->present_time;
382394
}
383395

0 commit comments

Comments
 (0)