From 5f8df8485c77d69e7d72cc0c14c8fe423bf3d543 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Thu, 9 Apr 2015 09:59:15 +0000 Subject: Fixed bugs 573 and 574. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7876 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/rt/include/ch.h | 2 +- os/rt/include/chvt.h | 2 +- os/rt/src/chvt.c | 39 ++++++++++++++++++--------------------- 3 files changed, 20 insertions(+), 23 deletions(-) (limited to 'os/rt') diff --git a/os/rt/include/ch.h b/os/rt/include/ch.h index 8f5d0a1c4..155734ff4 100644 --- a/os/rt/include/ch.h +++ b/os/rt/include/ch.h @@ -48,7 +48,7 @@ /** * @brief Kernel version string. */ -#define CH_KERNEL_VERSION "3.0.0p1" +#define CH_KERNEL_VERSION "3.0.0p2" /** * @brief Kernel version major number. diff --git a/os/rt/include/chvt.h b/os/rt/include/chvt.h index fe70aef03..de5ee765d 100644 --- a/os/rt/include/chvt.h +++ b/os/rt/include/chvt.h @@ -498,7 +498,7 @@ static inline void chVTDoTickI(void) { note that the loop is stopped by the timers header having "ch.vtlist.vt_delta == (systime_t)-1" which is greater than all deltas.*/ - while (vtp->vt_delta <= now - ch.vtlist.vt_lasttime) { + while (vtp->vt_delta <= (systime_t)(now - ch.vtlist.vt_lasttime)) { vtfunc_t fn; /* The "last time" becomes this timer's expiration time.*/ diff --git a/os/rt/src/chvt.c b/os/rt/src/chvt.c index 8ec94e4e4..7f4ab6a89 100644 --- a/os/rt/src/chvt.c +++ b/os/rt/src/chvt.c @@ -95,6 +95,7 @@ void _vt_init(void) { void chVTDoSetI(virtual_timer_t *vtp, systime_t delay, vtfunc_t vtfunc, void *par) { virtual_timer_t *p; + systime_t delta; chDbgCheckClassI(); chDbgCheck((vtp != NULL) && (vtfunc != NULL) && (delay != TIME_IMMEDIATE)); @@ -106,13 +107,14 @@ void chVTDoSetI(virtual_timer_t *vtp, systime_t delay, { systime_t now = chVTGetSystemTimeX(); + /* If the requested delay is lower than the minimum safe delta then it + is raised to the minimum safe value.*/ + if (delay < (systime_t)CH_CFG_ST_TIMEDELTA) { + delay = (systime_t)CH_CFG_ST_TIMEDELTA; + } + /* Special case where the timers list is empty.*/ if (&ch.vtlist == (virtual_timers_list_t *)ch.vtlist.vt_next) { - /* If the requested delay is lower than the minimum safe delta then it - is raised to the minimum safe value.*/ - if (delay < (systime_t)CH_CFG_ST_TIMEDELTA) { - delay = (systime_t)CH_CFG_ST_TIMEDELTA; - } /* The delta list is empty, the current time becomes the new delta list base time, the timer is inserted.*/ @@ -131,28 +133,23 @@ void chVTDoSetI(virtual_timer_t *vtp, systime_t delay, /* Special case where the timer will be placed as first element in a non-empty list, the alarm needs to be recalculated.*/ - if ((now + delay) < (ch.vtlist.vt_lasttime + ch.vtlist.vt_next->vt_delta)) { - /* If the requested delay is lower than the minimum safe delta then it - is raised to the minimum safe value.*/ - if (delay < (systime_t)CH_CFG_ST_TIMEDELTA) { - delay = (systime_t)CH_CFG_ST_TIMEDELTA; - } - - /* Now the delay is calculated as delta from the last tick interrupt - time.*/ - delay += now - ch.vtlist.vt_lasttime; + delta = now + delay - ch.vtlist.vt_lasttime; + if (delta < ch.vtlist.vt_next->vt_delta) { /* New alarm deadline.*/ - port_timer_set_alarm(ch.vtlist.vt_lasttime + delay); + port_timer_set_alarm(ch.vtlist.vt_lasttime + delta); } } -#endif /* CH_CFG_ST_TIMEDELTA > 0 */ +#else /* CH_CFG_ST_TIMEDELTA == 0 */ + /* Delta is initially equal to the specified delay.*/ + delta = delay; +#endif /* CH_CFG_ST_TIMEDELTA == 0 */ /* The delta list is scanned in order to find the correct position for this timer. */ p = ch.vtlist.vt_next; - while (p->vt_delta < delay) { - delay -= p->vt_delta; + while (p->vt_delta < delta) { + delta -= p->vt_delta; p = p->vt_next; } @@ -161,11 +158,11 @@ void chVTDoSetI(virtual_timer_t *vtp, systime_t delay, vtp->vt_prev = vtp->vt_next->vt_prev; vtp->vt_prev->vt_next = vtp; p->vt_prev = vtp; - vtp->vt_delta = delay + vtp->vt_delta = delta /* Special case when the timer is in last position in the list, the value in the header must be restored.*/; - p->vt_delta -= delay; + p->vt_delta -= delta; ch.vtlist.vt_delta = (systime_t)-1; } -- cgit v1.2.3