aboutsummaryrefslogtreecommitdiffstats
path: root/os
diff options
context:
space:
mode:
Diffstat (limited to 'os')
-rw-r--r--os/hal/include/hal.h2
-rw-r--r--os/nil/include/nil.h2
-rw-r--r--os/rt/include/ch.h2
-rw-r--r--os/rt/include/chvt.h2
-rw-r--r--os/rt/src/chvt.c39
5 files changed, 22 insertions, 25 deletions
diff --git a/os/hal/include/hal.h b/os/hal/include/hal.h
index 25772e304..029f05dfa 100644
--- a/os/hal/include/hal.h
+++ b/os/hal/include/hal.h
@@ -101,7 +101,7 @@
/**
* @brief HAL version string.
*/
-#define HAL_VERSION "3.0.0p1"
+#define HAL_VERSION "3.0.0p2"
/**
* @brief HAL version major number.
diff --git a/os/nil/include/nil.h b/os/nil/include/nil.h
index 5b56bf554..eb92b2e22 100644
--- a/os/nil/include/nil.h
+++ b/os/nil/include/nil.h
@@ -61,7 +61,7 @@ typedef struct nil_thread thread_t;
/**
* @brief Kernel version string.
*/
-#define CH_KERNEL_VERSION "1.0.0p1"
+#define CH_KERNEL_VERSION "1.0.0p2"
/**
* @brief Kernel version major number.
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;
}