@@ -121,14 +121,35 @@ static void update_present_time(const ticker_data_t *const ticker)
121
121
uint64_t elapsed_ticks = (ticker_time - queue -> tick_last_read ) & queue -> bitmask ;
122
122
queue -> tick_last_read = ticker_time ;
123
123
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
+ }
132
153
}
133
154
134
155
// Update current time
@@ -146,9 +167,28 @@ static timestamp_t compute_tick(const ticker_data_t *const ticker, us_timestamp_
146
167
timestamp_t delta = ticker -> queue -> max_delta ;
147
168
if (delta_us <= ticker -> queue -> max_delta_us ) {
148
169
// 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
+ }
152
192
}
153
193
}
154
194
return (queue -> tick_last_read + delta ) & queue -> bitmask ;
0 commit comments