ticker api: Schedule immediately event in the past.

pull/4094/head
Vincent Coubard 2017-05-16 10:31:07 +01:00
parent aeffd738c7
commit ab09a1722f
2 changed files with 18 additions and 17 deletions

View File

@ -905,9 +905,9 @@ static void test_insert_event_us_in_overflow_range() {
* When an event is inserted with ticker_insert_event_us and a timestamp less
* than timestamp value in the ticker interface.
* Then
* - The event should not be in the queue
* - The interrupt timestamp should be set to
* interface_stub.timestamp + TIMESTAMP_MAX_DELTA.
* - The event should be in the queue
* - The interrupt timestamp should be set to interface_stub.timestamp so it
* is scheduled immediately.
*/
static void test_insert_event_us_underflow() {
ticker_set_handler(&ticker_stub, NULL);
@ -922,15 +922,16 @@ static void test_insert_event_us_underflow() {
const uint32_t expected_id = 0xDEADDEAF;
ticker_insert_event_us(
&ticker_stub,
&ticker_stub,
&event, expected_timestamp, expected_id
);
TEST_ASSERT_EQUAL_PTR(NULL, queue_stub.head);
TEST_ASSERT_EQUAL_PTR(&event, queue_stub.head);
TEST_ASSERT_EQUAL_UINT32(
interface_stub.timestamp + TIMESTAMP_MAX_DELTA,
interface_stub.timestamp,
interface_stub.interrupt_timestamp
);
TEST_ASSERT_EQUAL(1, interface_stub.set_interrupt_call);
TEST_ASSERT_EQUAL(0, interface_stub.disable_interrupt_call);
}

View File

@ -109,16 +109,22 @@ static void update_present_time(const ticker_data_t *const ticker)
static void schedule_interrupt(const ticker_data_t *const ticker)
{
update_present_time(ticker);
uint32_t duration = MBED_TICKER_INTERRUPT_TIMESTAMP_MAX_DELTA;
uint32_t relative_timeout = MBED_TICKER_INTERRUPT_TIMESTAMP_MAX_DELTA;
if (ticker->queue->head) {
us_timestamp_t event_interval = (ticker->queue->head->timestamp - ticker->queue->present_time);
if (event_interval < MBED_TICKER_INTERRUPT_TIMESTAMP_MAX_DELTA) {
duration = event_interval;
us_timestamp_t present = ticker->queue->present_time;
us_timestamp_t next_event_timestamp = ticker->queue->head->timestamp;
// if the event at the head of the queue is in the past then schedule
// it immediately.
if (next_event_timestamp < present) {
relative_timeout = 0;
} else if ((next_event_timestamp - present) < MBED_TICKER_INTERRUPT_TIMESTAMP_MAX_DELTA) {
relative_timeout = next_event_timestamp - present;
}
}
ticker->interface->set_interrupt(ticker->queue->present_time + duration);
ticker->interface->set_interrupt(ticker->queue->present_time + relative_timeout);
}
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
// update the current timestamp
update_present_time(ticker);
// filter out timestamp in the past
if (timestamp < ticker->queue->present_time) {
schedule_interrupt(ticker);
return;
}
// initialise our data
obj->timestamp = timestamp;
obj->id = id;