Skip to content

Commit 0d3714e

Browse files
committed
Optimize 1MHz and 32KHz use cases
Add optimizations for the most common use cases of the us ticker, 1MHz, and the lp ticker, 32KHz.
1 parent ec55b82 commit 0d3714e

File tree

1 file changed

+51
-11
lines changed

1 file changed

+51
-11
lines changed

hal/mbed_ticker_api.c

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -121,14 +121,35 @@ static void update_present_time(const ticker_data_t *const ticker)
121121
uint64_t elapsed_ticks = (ticker_time - queue->tick_last_read) & queue->bitmask;
122122
queue->tick_last_read = ticker_time;
123123

124-
uint64_t us_x_ticks = elapsed_ticks * 1000000;
125-
uint64_t elapsed_us = us_x_ticks / queue->frequency;
126-
127-
// Update remainder
128-
queue->tick_remainder += us_x_ticks - elapsed_us * queue->frequency;
129-
if (queue->tick_remainder >= queue->frequency) {
130-
elapsed_us += 1;
131-
queue->tick_remainder -= queue->frequency;
124+
uint64_t elapsed_us;
125+
if (1000000 == queue->frequency) {
126+
// Optimized for 1MHz
127+
128+
elapsed_us = elapsed_ticks;
129+
} else if (32768 == queue->frequency) {
130+
// Optimized for 32KHz
131+
132+
uint64_t us_x_ticks = elapsed_ticks * 1000000;
133+
elapsed_us = us_x_ticks >> 15;
134+
135+
// Update remainder
136+
queue->tick_remainder += us_x_ticks - (elapsed_us << 15);
137+
if (queue->tick_remainder >= queue->frequency) {
138+
elapsed_us += 1;
139+
queue->tick_remainder -= queue->frequency;
140+
}
141+
} else {
142+
// General case
143+
144+
uint64_t us_x_ticks = elapsed_ticks * 1000000;
145+
elapsed_us = us_x_ticks / queue->frequency;
146+
147+
// Update remainder
148+
queue->tick_remainder += us_x_ticks - elapsed_us * queue->frequency;
149+
if (queue->tick_remainder >= queue->frequency) {
150+
elapsed_us += 1;
151+
queue->tick_remainder -= queue->frequency;
152+
}
132153
}
133154

134155
// Update current time
@@ -146,9 +167,28 @@ static timestamp_t compute_tick(const ticker_data_t *const ticker, us_timestamp_
146167
timestamp_t delta = ticker->queue->max_delta;
147168
if (delta_us <= ticker->queue->max_delta_us) {
148169
// Checking max_delta_us ensures the operation will not overflow
149-
delta = delta_us * queue->frequency / 1000000;
150-
if (delta > ticker->queue->max_delta) {
151-
delta = ticker->queue->max_delta;
170+
171+
if (1000000 == queue->frequency) {
172+
// Optimized for 1MHz
173+
174+
delta = delta_us;
175+
if (delta > ticker->queue->max_delta) {
176+
delta = ticker->queue->max_delta;
177+
}
178+
} else if (32768 == queue->frequency) {
179+
// Optimized for 32KHz
180+
181+
delta = (delta_us << 15) / 1000000;
182+
if (delta > ticker->queue->max_delta) {
183+
delta = ticker->queue->max_delta;
184+
}
185+
} else {
186+
// General case
187+
188+
delta = delta_us * queue->frequency / 1000000;
189+
if (delta > ticker->queue->max_delta) {
190+
delta = ticker->queue->max_delta;
191+
}
152192
}
153193
}
154194
return (queue->tick_last_read + delta) & queue->bitmask;

0 commit comments

Comments
 (0)