mirror of https://github.com/ARMmbed/mbed-os.git
mbed_ticker_api remove specific case for 32768 in favor of all frequencies divisible by 2
parent
ff39a9874a
commit
1aaef7bc12
|
@ -42,6 +42,14 @@ static void initialize(const ticker_data_t *ticker)
|
||||||
frequency = 1000000;
|
frequency = 1000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t frequency_shifts = 0;
|
||||||
|
for (int i = 31; i > 0; --i) {
|
||||||
|
if ((1 << i) == frequency) {
|
||||||
|
frequency_shifts = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t bits = info->bits;
|
uint32_t bits = info->bits;
|
||||||
if ((info->bits > 32) || (info->bits < 4)) {
|
if ((info->bits > 32) || (info->bits < 4)) {
|
||||||
MBED_ASSERT(0);
|
MBED_ASSERT(0);
|
||||||
|
@ -56,6 +64,7 @@ static void initialize(const ticker_data_t *ticker)
|
||||||
ticker->queue->tick_last_read = ticker->interface->read();
|
ticker->queue->tick_last_read = ticker->interface->read();
|
||||||
ticker->queue->tick_remainder = 0;
|
ticker->queue->tick_remainder = 0;
|
||||||
ticker->queue->frequency = frequency;
|
ticker->queue->frequency = frequency;
|
||||||
|
ticker->queue->frequency_shifts = frequency_shifts;
|
||||||
ticker->queue->bitmask = ((uint64_t)1 << bits) - 1;
|
ticker->queue->bitmask = ((uint64_t)1 << bits) - 1;
|
||||||
ticker->queue->max_delta = max_delta;
|
ticker->queue->max_delta = max_delta;
|
||||||
ticker->queue->max_delta_us = max_delta_us;
|
ticker->queue->max_delta_us = max_delta_us;
|
||||||
|
@ -125,14 +134,13 @@ static void update_present_time(const ticker_data_t *const ticker)
|
||||||
// Optimized for 1MHz
|
// Optimized for 1MHz
|
||||||
|
|
||||||
elapsed_us = elapsed_ticks;
|
elapsed_us = elapsed_ticks;
|
||||||
} else if (32768 == queue->frequency) {
|
} else if (0 != queue->frequency_shifts) {
|
||||||
// Optimized for 32KHz
|
// Optimized for frequencies divisible by 2
|
||||||
|
|
||||||
uint64_t us_x_ticks = elapsed_ticks * 1000000;
|
uint64_t us_x_ticks = elapsed_ticks * 1000000;
|
||||||
elapsed_us = us_x_ticks >> 15;
|
elapsed_us = us_x_ticks >> queue->frequency_shifts;
|
||||||
|
|
||||||
// Update remainder
|
// 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) {
|
if (queue->tick_remainder >= queue->frequency) {
|
||||||
elapsed_us += 1;
|
elapsed_us += 1;
|
||||||
queue->tick_remainder -= queue->frequency;
|
queue->tick_remainder -= queue->frequency;
|
||||||
|
@ -174,10 +182,10 @@ static timestamp_t compute_tick(const ticker_data_t *const ticker, us_timestamp_
|
||||||
if (delta > ticker->queue->max_delta) {
|
if (delta > ticker->queue->max_delta) {
|
||||||
delta = ticker->queue->max_delta;
|
delta = ticker->queue->max_delta;
|
||||||
}
|
}
|
||||||
} else if (32768 == queue->frequency) {
|
} else if (0 != queue->frequency_shifts) {
|
||||||
// Optimized for 32KHz
|
// Optimized frequencies divisible by 2
|
||||||
|
|
||||||
delta = (delta_us << 15) / 1000000;
|
delta = (delta_us << ticker->queue->frequency_shifts) / 1000000;
|
||||||
if (delta > ticker->queue->max_delta) {
|
if (delta > ticker->queue->max_delta) {
|
||||||
delta = ticker->queue->max_delta;
|
delta = ticker->queue->max_delta;
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,7 @@ typedef struct {
|
||||||
ticker_event_handler event_handler; /**< Event handler */
|
ticker_event_handler event_handler; /**< Event handler */
|
||||||
ticker_event_t *head; /**< A pointer to head */
|
ticker_event_t *head; /**< A pointer to head */
|
||||||
uint32_t frequency; /**< Frequency of the timer in Hz */
|
uint32_t frequency; /**< Frequency of the timer in Hz */
|
||||||
|
uint32_t frequency_shifts; /**< Frequency shift if divisible by 2, ohterwise 0 */
|
||||||
uint32_t bitmask; /**< Mask to be applied to time values read */
|
uint32_t bitmask; /**< Mask to be applied to time values read */
|
||||||
uint32_t max_delta; /**< Largest delta in ticks that can be used when scheduling */
|
uint32_t max_delta; /**< Largest delta in ticks that can be used when scheduling */
|
||||||
uint64_t max_delta_us; /**< Largest delta in us that can be used when scheduling */
|
uint64_t max_delta_us; /**< Largest delta in us that can be used when scheduling */
|
||||||
|
|
Loading…
Reference in New Issue