@@ -162,25 +162,16 @@ static void update_present_time(const ticker_data_t *const ticker)
162
162
// Optimized for 1MHz
163
163
164
164
elapsed_us = elapsed_ticks ;
165
- } else if (0 != queue -> frequency_shifts ) {
166
- // Optimized for frequencies divisible by 2
167
- uint64_t us_x_ticks = elapsed_ticks * 1000000 ;
168
- elapsed_us = us_x_ticks >> queue -> frequency_shifts ;
169
-
170
- // Update remainder
171
- queue -> tick_remainder += us_x_ticks - (elapsed_us << queue -> frequency_shifts );
172
- if (queue -> tick_remainder >= queue -> frequency ) {
173
- elapsed_us += 1 ;
174
- queue -> tick_remainder -= queue -> frequency ;
175
- }
176
165
} else {
177
- // General case
178
-
179
166
uint64_t us_x_ticks = elapsed_ticks * 1000000 ;
180
- elapsed_us = us_x_ticks / queue -> frequency ;
181
-
182
- // Update remainder
183
- queue -> tick_remainder += us_x_ticks - elapsed_us * queue -> frequency ;
167
+ if (0 != queue -> frequency_shifts ) {
168
+ // Optimized for frequencies divisible by 2
169
+ elapsed_us = us_x_ticks >> queue -> frequency_shifts ;
170
+ queue -> tick_remainder += us_x_ticks - (elapsed_us << queue -> frequency_shifts );
171
+ } else {
172
+ elapsed_us = us_x_ticks / queue -> frequency ;
173
+ queue -> tick_remainder += us_x_ticks - elapsed_us * queue -> frequency ;
174
+ }
184
175
if (queue -> tick_remainder >= queue -> frequency ) {
185
176
elapsed_us += 1 ;
186
177
queue -> tick_remainder -= queue -> frequency ;
@@ -205,30 +196,57 @@ static timestamp_t compute_tick_round_up(const ticker_data_t *const ticker, us_t
205
196
206
197
if (1000000 == queue -> frequency ) {
207
198
// Optimized for 1MHz
208
-
209
199
delta = delta_us ;
210
- if (delta > ticker -> queue -> max_delta ) {
211
- delta = ticker -> queue -> max_delta ;
212
- }
213
200
} else if (0 != queue -> frequency_shifts ) {
214
201
// Optimized frequencies divisible by 2
215
-
216
202
delta = ((delta_us << ticker -> queue -> frequency_shifts ) + 1000000 - 1 ) / 1000000 ;
217
- if (delta > ticker -> queue -> max_delta ) {
218
- delta = ticker -> queue -> max_delta ;
219
- }
220
203
} else {
221
204
// General case
222
-
223
205
delta = (delta_us * queue -> frequency + 1000000 - 1 ) / 1000000 ;
224
- if ( delta > ticker -> queue -> max_delta ) {
225
- delta = ticker -> queue -> max_delta ;
226
- }
206
+ }
207
+ if ( delta > ticker -> queue -> max_delta ) {
208
+ delta = ticker -> queue -> max_delta ;
227
209
}
228
210
}
229
211
return (queue -> tick_last_read + delta ) & queue -> bitmask ;
230
212
}
231
213
214
+ //NOTE: Must be called from critical section!
215
+ static void insert_event (const ticker_data_t * const ticker , ticker_event_t * obj , us_timestamp_t timestamp , uint32_t id )
216
+ {
217
+ // initialise our data
218
+ obj -> timestamp = timestamp ;
219
+ obj -> id = id ;
220
+
221
+ /* Go through the list until we either reach the end, or find
222
+ an element this should come before (which is possibly the
223
+ head). */
224
+ ticker_event_t * prev = NULL , * p = ticker -> queue -> head ;
225
+ while (p != NULL ) {
226
+ /* check if we come before p */
227
+ if (timestamp < p -> timestamp ) {
228
+ break ;
229
+ }
230
+ /* go to the next element */
231
+ prev = p ;
232
+ p = p -> next ;
233
+ }
234
+
235
+ /* if we're at the end p will be NULL, which is correct */
236
+ obj -> next = p ;
237
+
238
+ /* if prev is NULL we're at the head */
239
+ if (prev == NULL ) {
240
+ ticker -> queue -> head = obj ;
241
+ } else {
242
+ prev -> next = obj ;
243
+ }
244
+
245
+ if (prev == NULL || timestamp <= ticker -> queue -> present_time ) {
246
+ schedule_interrupt (ticker );
247
+ }
248
+ }
249
+
232
250
/**
233
251
* Return 1 if the tick has incremented to or past match_tick, otherwise 0.
234
252
*/
@@ -345,6 +363,7 @@ void ticker_irq_handler(const ticker_data_t *const ticker)
345
363
core_util_critical_section_exit ();
346
364
}
347
365
366
+
348
367
void ticker_insert_event (const ticker_data_t * const ticker , ticker_event_t * obj , timestamp_t timestamp , uint32_t id )
349
368
{
350
369
core_util_critical_section_enter ();
@@ -356,11 +375,7 @@ void ticker_insert_event(const ticker_data_t *const ticker, ticker_event_t *obj,
356
375
timestamp
357
376
);
358
377
359
- // defer to ticker_insert_event_us
360
- ticker_insert_event_us (
361
- ticker ,
362
- obj , absolute_timestamp , id
363
- );
378
+ insert_event (ticker , obj , absolute_timestamp , id );
364
379
365
380
core_util_critical_section_exit ();
366
381
}
@@ -372,37 +387,7 @@ void ticker_insert_event_us(const ticker_data_t *const ticker, ticker_event_t *o
372
387
// update the current timestamp
373
388
update_present_time (ticker );
374
389
375
- // initialise our data
376
- obj -> timestamp = timestamp ;
377
- obj -> id = id ;
378
-
379
- /* Go through the list until we either reach the end, or find
380
- an element this should come before (which is possibly the
381
- head). */
382
- ticker_event_t * prev = NULL , * p = ticker -> queue -> head ;
383
- while (p != NULL ) {
384
- /* check if we come before p */
385
- if (timestamp < p -> timestamp ) {
386
- break ;
387
- }
388
- /* go to the next element */
389
- prev = p ;
390
- p = p -> next ;
391
- }
392
-
393
- /* if we're at the end p will be NULL, which is correct */
394
- obj -> next = p ;
395
-
396
- /* if prev is NULL we're at the head */
397
- if (prev == NULL ) {
398
- ticker -> queue -> head = obj ;
399
- } else {
400
- prev -> next = obj ;
401
- }
402
-
403
- if (prev == NULL || timestamp <= ticker -> queue -> present_time ) {
404
- schedule_interrupt (ticker );
405
- }
390
+ insert_event (ticker , obj , timestamp , id );
406
391
407
392
core_util_critical_section_exit ();
408
393
}
0 commit comments