@@ -162,25 +162,16 @@ static void update_present_time(const ticker_data_t *const ticker)
162162 // Optimized for 1MHz
163163
164164 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- }
176165 } else {
177- // General case
178-
179166 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+ }
184175 if (queue -> tick_remainder >= queue -> frequency ) {
185176 elapsed_us += 1 ;
186177 queue -> tick_remainder -= queue -> frequency ;
@@ -205,30 +196,57 @@ static timestamp_t compute_tick_round_up(const ticker_data_t *const ticker, us_t
205196
206197 if (1000000 == queue -> frequency ) {
207198 // Optimized for 1MHz
208-
209199 delta = delta_us ;
210- if (delta > ticker -> queue -> max_delta ) {
211- delta = ticker -> queue -> max_delta ;
212- }
213200 } else if (0 != queue -> frequency_shifts ) {
214201 // Optimized frequencies divisible by 2
215-
216202 delta = ((delta_us << ticker -> queue -> frequency_shifts ) + 1000000 - 1 ) / 1000000 ;
217- if (delta > ticker -> queue -> max_delta ) {
218- delta = ticker -> queue -> max_delta ;
219- }
220203 } else {
221204 // General case
222-
223205 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 ;
227209 }
228210 }
229211 return (queue -> tick_last_read + delta ) & queue -> bitmask ;
230212}
231213
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+
232250/**
233251 * Return 1 if the tick has incremented to or past match_tick, otherwise 0.
234252 */
@@ -345,6 +363,7 @@ void ticker_irq_handler(const ticker_data_t *const ticker)
345363 core_util_critical_section_exit ();
346364}
347365
366+
348367void ticker_insert_event (const ticker_data_t * const ticker , ticker_event_t * obj , timestamp_t timestamp , uint32_t id )
349368{
350369 core_util_critical_section_enter ();
@@ -356,11 +375,7 @@ void ticker_insert_event(const ticker_data_t *const ticker, ticker_event_t *obj,
356375 timestamp
357376 );
358377
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 );
364379
365380 core_util_critical_section_exit ();
366381}
@@ -372,37 +387,7 @@ void ticker_insert_event_us(const ticker_data_t *const ticker, ticker_event_t *o
372387 // update the current timestamp
373388 update_present_time (ticker );
374389
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 );
406391
407392 core_util_critical_section_exit ();
408393}
0 commit comments