mbed library sources. Supersedes mbed-src.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
Diff: hal/mbed_ticker_api.c
- Revision:
- 186:707f6e361f3e
- Parent:
- 182:a56a73fd2a6f
- Child:
- 187:0387e8f68319
--- a/hal/mbed_ticker_api.c Thu Apr 19 17:12:19 2018 +0100 +++ b/hal/mbed_ticker_api.c Fri Jun 22 16:45:37 2018 +0100 @@ -42,6 +42,14 @@ frequency = 1000000; } + uint8_t frequency_shifts = 0; + for (uint8_t i = 31; i > 0; --i) { + if ((1 << i) == frequency) { + frequency_shifts = i; + break; + } + } + uint32_t bits = info->bits; if ((info->bits > 32) || (info->bits < 4)) { MBED_ASSERT(0); @@ -56,6 +64,7 @@ ticker->queue->tick_last_read = ticker->interface->read(); ticker->queue->tick_remainder = 0; ticker->queue->frequency = frequency; + ticker->queue->frequency_shifts = frequency_shifts; ticker->queue->bitmask = ((uint64_t)1 << bits) - 1; ticker->queue->max_delta = max_delta; ticker->queue->max_delta_us = max_delta_us; @@ -125,14 +134,13 @@ // Optimized for 1MHz elapsed_us = elapsed_ticks; - } else if (32768 == queue->frequency) { - // Optimized for 32KHz - + } else if (0 != queue->frequency_shifts) { + // Optimized for frequencies divisible by 2 uint64_t us_x_ticks = elapsed_ticks * 1000000; - elapsed_us = us_x_ticks >> 15; + elapsed_us = us_x_ticks >> queue->frequency_shifts; // Update remainder - queue->tick_remainder += us_x_ticks - (elapsed_us << 15); + queue->tick_remainder += us_x_ticks - (elapsed_us << queue->frequency_shifts); if (queue->tick_remainder >= queue->frequency) { elapsed_us += 1; queue->tick_remainder -= queue->frequency; @@ -174,10 +182,10 @@ if (delta > ticker->queue->max_delta) { delta = ticker->queue->max_delta; } - } else if (32768 == queue->frequency) { - // Optimized for 32KHz + } else if (0 != queue->frequency_shifts) { + // Optimized frequencies divisible by 2 - delta = (delta_us << 15) / 1000000; + delta = (delta_us << ticker->queue->frequency_shifts) / 1000000; if (delta > ticker->queue->max_delta) { delta = ticker->queue->max_delta; } @@ -351,14 +359,12 @@ /* if prev is NULL we're at the head */ if (prev == NULL) { ticker->queue->head = obj; + schedule_interrupt(ticker); } else { prev->next = obj; } - schedule_interrupt(ticker); - core_util_critical_section_exit(); - } void ticker_remove_event(const ticker_data_t *const ticker, ticker_event_t *obj)