mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

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)