Tickless mode tentative fix: http://www.chibios.com/forum/viewtopic.php?f=35&t=3532
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9854 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
257a19753d
commit
9763494076
|
@ -131,23 +131,36 @@ void chVTDoSetI(virtual_timer_t *vtp, systime_t delay,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Special case where the timer will be placed as first element in a
|
/* Pointer to the first element in the delta list, which is non-empty.*/
|
||||||
non-empty list, the alarm needs to be recalculated.*/
|
p = ch.vtlist.next;
|
||||||
delta = now + delay - ch.vtlist.lasttime;
|
|
||||||
if (delta < ch.vtlist.next->delta) {
|
|
||||||
|
|
||||||
/* New alarm deadline.*/
|
/* Delay as delta from 'lasttime'. Note, it can overflow and the value
|
||||||
|
becomes lower than 'now'.*/
|
||||||
|
delta = now - ch.vtlist.lasttime + delay;
|
||||||
|
|
||||||
|
if (delta < now - ch.vtlist.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->delta;
|
||||||
|
p = p->next;
|
||||||
|
}
|
||||||
|
else if (delta < p->delta) {
|
||||||
|
/* A small delay that will become the first element in the delta list
|
||||||
|
and next deadline.*/
|
||||||
port_timer_set_alarm(ch.vtlist.lasttime + delta);
|
port_timer_set_alarm(ch.vtlist.lasttime + delta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else /* CH_CFG_ST_TIMEDELTA == 0 */
|
#else /* CH_CFG_ST_TIMEDELTA == 0 */
|
||||||
/* Delta is initially equal to the specified delay.*/
|
/* Delta is initially equal to the specified delay.*/
|
||||||
delta = delay;
|
delta = delay;
|
||||||
|
|
||||||
|
/* Pointer to the first element in the delta list.*/
|
||||||
|
p = ch.vtlist.next;
|
||||||
#endif /* CH_CFG_ST_TIMEDELTA == 0 */
|
#endif /* CH_CFG_ST_TIMEDELTA == 0 */
|
||||||
|
|
||||||
/* The delta list is scanned in order to find the correct position for
|
/* The delta list is scanned in order to find the correct position for
|
||||||
this timer. */
|
this timer. */
|
||||||
p = ch.vtlist.next;
|
|
||||||
while (p->delta < delta) {
|
while (p->delta < delta) {
|
||||||
delta -= p->delta;
|
delta -= p->delta;
|
||||||
p = p->next;
|
p = p->next;
|
||||||
|
|
Loading…
Reference in New Issue