From e7b320c91633ed9d8fd869af7231f69bedaa5a3f Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Mon, 10 Oct 2016 12:20:18 +0000 Subject: [PATCH] Fixed bug #784. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/stable_16.1.x@9856 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/rt/src/chvt.c | 25 +++++++++++++++++++------ readme.txt | 1 + 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/os/rt/src/chvt.c b/os/rt/src/chvt.c index 214e8a7b6..e3b44c2f2 100644 --- a/os/rt/src/chvt.c +++ b/os/rt/src/chvt.c @@ -131,23 +131,36 @@ void chVTDoSetI(virtual_timer_t *vtp, systime_t delay, return; } - /* Special case where the timer will be placed as first element in a - non-empty list, the alarm needs to be recalculated.*/ - delta = now + delay - ch.vtlist.vt_lasttime; - if (delta < ch.vtlist.vt_next->vt_delta) { + /* Pointer to the first element in the delta list, which is non-empty.*/ + p = ch.vtlist.vt_next; - /* New alarm deadline.*/ + /* Delay as delta from 'lasttime'. Note, it can overflow and the value + becomes lower than 'now'.*/ + delta = now - ch.vtlist.vt_lasttime + delay; + + if (delta < now - ch.vtlist.vt_lasttime) { + /* Scenario where a very large delay excedeed the numeric range, it + requires a special handling. We need to skip the first element and + adjust the delta to wrap back in the previous numeric range.*/ + delta -= p->vt_delta; + p = p->vt_next; + } + else if (delta < p->vt_delta) { + /* A small delay that will become the first element in the delta list + and next deadline.*/ port_timer_set_alarm(ch.vtlist.vt_lasttime + delta); } } #else /* CH_CFG_ST_TIMEDELTA == 0 */ /* Delta is initially equal to the specified delay.*/ delta = delay; + + /* Pointer to the first element in the delta list.*/ + p = ch.vtlist.vt_next; #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 < delta) { delta -= p->vt_delta; p = p->vt_next; diff --git a/readme.txt b/readme.txt index ac937acf7..e2cd28afb 100644 --- a/readme.txt +++ b/readme.txt @@ -73,6 +73,7 @@ ***************************************************************************** *** 16.1.6 *** +- RT: Fixed tick-less mode can fail in RT for very large delays (bug #784). - HAL: Fixed STM32L0xx CCIPR initialization (bug #783). - HAL: Fixed STM32F105 port not compiling (bug #782). - HAL: Fixed wrong registry for STM32F205xx and STM32F215xx port