@@ -109,16 +109,22 @@ static void update_present_time(const ticker_data_t *const ticker)
109
109
static void schedule_interrupt (const ticker_data_t * const ticker )
110
110
{
111
111
update_present_time (ticker );
112
- uint32_t duration = MBED_TICKER_INTERRUPT_TIMESTAMP_MAX_DELTA ;
112
+ uint32_t relative_timeout = MBED_TICKER_INTERRUPT_TIMESTAMP_MAX_DELTA ;
113
113
114
114
if (ticker -> queue -> head ) {
115
- us_timestamp_t event_interval = (ticker -> queue -> head -> timestamp - ticker -> queue -> present_time );
116
- if (event_interval < MBED_TICKER_INTERRUPT_TIMESTAMP_MAX_DELTA ) {
117
- duration = event_interval ;
115
+ us_timestamp_t present = ticker -> queue -> present_time ;
116
+ us_timestamp_t next_event_timestamp = ticker -> queue -> head -> timestamp ;
117
+
118
+ // if the event at the head of the queue is in the past then schedule
119
+ // it immediately.
120
+ if (next_event_timestamp < present ) {
121
+ relative_timeout = 0 ;
122
+ } else if ((next_event_timestamp - present ) < MBED_TICKER_INTERRUPT_TIMESTAMP_MAX_DELTA ) {
123
+ relative_timeout = next_event_timestamp - present ;
118
124
}
119
125
}
120
126
121
- ticker -> interface -> set_interrupt (ticker -> queue -> present_time + duration );
127
+ ticker -> interface -> set_interrupt (ticker -> queue -> present_time + relative_timeout );
122
128
}
123
129
124
130
void ticker_set_handler (const ticker_data_t * const ticker , ticker_event_handler handler )
@@ -184,12 +190,6 @@ void ticker_insert_event_us(const ticker_data_t *const ticker, ticker_event_t *o
184
190
// update the current timestamp
185
191
update_present_time (ticker );
186
192
187
- // filter out timestamp in the past
188
- if (timestamp < ticker -> queue -> present_time ) {
189
- schedule_interrupt (ticker );
190
- return ;
191
- }
192
-
193
193
// initialise our data
194
194
obj -> timestamp = timestamp ;
195
195
obj -> id = id ;
0 commit comments