From c7da76627c4c5479ed91bd6709e17abc22691b84 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Mon, 1 Dec 2014 10:29:36 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7551 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/rt/include/chvt.h | 24 +++++++++++++++++++----- os/rt/src/chvt.c | 11 ++++++++--- test/rt/testsem.c | 6 +++--- test/rt/testthd.c | 16 ++++++++++++---- 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/os/rt/include/chvt.h b/os/rt/include/chvt.h index 9538474c9..1d7c8c545 100644 --- a/os/rt/include/chvt.h +++ b/os/rt/include/chvt.h @@ -464,11 +464,21 @@ static inline void chVTDoTickI(void) { } #else /* CH_CFG_ST_TIMEDELTA > 0 */ virtual_timer_t *vtp; - systime_t now = chVTGetSystemTimeX(); - systime_t delta = now - ch.vtlist.vt_lasttime; + systime_t now; - while ((vtp = ch.vtlist.vt_next)->vt_delta <= delta) { + while (true) { vtfunc_t fn; + systime_t delta; + + /* Getting the current system time and calculating the time window since + the last time has expired.*/ + now = chVTGetSystemTimeX(); + delta = now - ch.vtlist.vt_lasttime; + + /* The next element is outside the current time window, the loop + is stopped here.*/ + if ((vtp = ch.vtlist.vt_next)->vt_delta > delta) + break; /* The "last time" becomes this timer's expiration time.*/ delta -= vtp->vt_delta; @@ -491,8 +501,12 @@ static inline void chVTDoTickI(void) { port_timer_stop_alarm(); } else { - /* Updating the alarm to the next deadline.*/ - port_timer_set_alarm(now + vtp->vt_delta); + /* Updating the alarm to the next deadline, deadline that must not be + closer in time than the minimum time delta.*/ + if (vtp->vt_delta >= CH_CFG_ST_TIMEDELTA) + port_timer_set_alarm(now + vtp->vt_delta); + else + port_timer_set_alarm(now + CH_CFG_ST_TIMEDELTA); } #endif /* CH_CFG_ST_TIMEDELTA > 0 */ } diff --git a/os/rt/src/chvt.c b/os/rt/src/chvt.c index 4fd154e57..de33e7b9c 100644 --- a/os/rt/src/chvt.c +++ b/os/rt/src/chvt.c @@ -180,9 +180,14 @@ void chVTDoResetI(virtual_timer_t *vtp) { port_timer_stop_alarm(); } else { - /* The alarm is set to the next element in the delta list.*/ - port_timer_set_alarm(ch.vtlist.vt_lasttime + - ch.vtlist.vt_next->vt_delta); + /* Updating the alarm to the next deadline, deadline that must not be + closer in time than the minimum time delta.*/ + if (ch.vtlist.vt_next->vt_delta >= CH_CFG_ST_TIMEDELTA) + port_timer_set_alarm(ch.vtlist.vt_lasttime + + ch.vtlist.vt_next->vt_delta); + else + port_timer_set_alarm(ch.vtlist.vt_lasttime + + CH_CFG_ST_TIMEDELTA); } } #endif /* CH_CFG_ST_TIMEDELTA > 0 */ diff --git a/test/rt/testsem.c b/test/rt/testsem.c index cb7f13bc2..87e9b187f 100644 --- a/test/rt/testsem.c +++ b/test/rt/testsem.c @@ -49,7 +49,7 @@ #if CH_CFG_USE_SEMAPHORES || defined(__DOXYGEN__) -#define ALLOWED_DELAY MS2ST(5) +#define ALLOWED_DELAY MS2ST(2) /* * Note, the static initializers are not really required because the @@ -170,10 +170,10 @@ static void sem2_execute(void) { * Testing timeout condition. */ test_wait_tick(); - target_time = chVTGetSystemTime() + MS2ST(5 * 500); + target_time = chVTGetSystemTime() + MS2ST(5 * 50); for (i = 0; i < 5; i++) { test_emit_token('A' + i); - msg = chSemWaitTimeout(&sem1, MS2ST(500)); + msg = chSemWaitTimeout(&sem1, MS2ST(50)); test_assert(7, msg == MSG_TIMEOUT, "wrong wake-up message"); test_assert(8, queue_isempty(&sem1.s_queue), "queue not empty"); test_assert(9, sem1.s_cnt == 0, "counter not zero"); diff --git a/test/rt/testthd.c b/test/rt/testthd.c index 522e54b9b..d4d148169 100644 --- a/test/rt/testthd.c +++ b/test/rt/testthd.c @@ -194,22 +194,30 @@ static void thd4_execute(void) { /* Timeouts in microseconds.*/ time = chVTGetSystemTime(); chThdSleepMicroseconds(100000); - test_assert_time_window(1, time + US2ST(100000), time + US2ST(100000) + 1); + test_assert_time_window(1, + time + US2ST(100000), + time + US2ST(100000) + CH_CFG_ST_TIMEDELTA); /* Timeouts in milliseconds.*/ time = chVTGetSystemTime(); chThdSleepMilliseconds(100); - test_assert_time_window(2, time + MS2ST(100), time + MS2ST(100) + 1); + test_assert_time_window(2, + time + MS2ST(100), + time + MS2ST(100) + CH_CFG_ST_TIMEDELTA); /* Timeouts in seconds.*/ time = chVTGetSystemTime(); chThdSleepSeconds(1); - test_assert_time_window(3, time + S2ST(1), time + S2ST(1) + 1); + test_assert_time_window(3, + time + S2ST(1), + time + S2ST(1) + CH_CFG_ST_TIMEDELTA); /* Absolute timelines.*/ time = chVTGetSystemTime() + MS2ST(100); chThdSleepUntil(time); - test_assert_time_window(4, time, time + 1); + test_assert_time_window(4, + time, + time + CH_CFG_ST_TIMEDELTA); } ROMCONST struct testcase testthd4 = {