From: idgay Date: Fri, 11 Aug 2006 20:46:23 +0000 (+0000) Subject: a bug fix got lost X-Git-Tag: tinyos/2.0.1~290 X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=commitdiff_plain;h=7c08ae5f79c9791d10a7798df5ebfb80505d91f2;p=tinyos-2.x.git a bug fix got lost simplify logic --- diff --git a/tos/chips/atm128/timer/Atm128AlarmC.nc b/tos/chips/atm128/timer/Atm128AlarmC.nc index 4bd2e7ac..b16f7844 100644 --- a/tos/chips/atm128/timer/Atm128AlarmC.nc +++ b/tos/chips/atm128/timer/Atm128AlarmC.nc @@ -72,43 +72,31 @@ implementation } async command void Alarm.startAt( timer_size t0, timer_size dt ) { - /* We don't set an interrupt before "now" + mindt to avoid setting an - interrupt which is in the past by the time we actually set - it. mindt should always be at least 2, because you cannot set an - interrupt one cycle in the future. mindt should also be large enough - to cover the execution time of this function. */ + /* We don't set an interrupt before "now" + mindt to avoid setting + an interrupt which is in the past by the time we actually set + it. mindt should always be at least 2, because you cannot + reliably set an interrupt one cycle in the future. mindt should + also be large enough to cover the execution time of this + function. */ atomic { - timer_size now, expires, minExpires, guardedExpires; + timer_size now, elapsed, expires; - dbg("Atm128AlarmC", " starting timer at %llu with dt %llu\n", (uint64_t)t0, (uint64_t) dt); + dbg("Atm128AlarmC", " starting timer at %llu with dt %llu\n", + (uint64_t)t0, (uint64_t) dt); - if (dt < mindt) /* guardedExpires should not be less than t0 */ - dt = mindt; - expires = t0 + dt; - guardedExpires = expires - mindt; now = call HplAtm128Timer.get(); - minExpires = now + mindt; - - /* t0 is assumed to be in the past. If it's numerically greater - than now, that just represents a time one wrap-around - ago. This requires handling the t0 <= now and t0 > now cases - separately. */ - if (t0 <= now) - { - /* if it's in the past or the near future, fire now (i.e., test - guardedExpires <= now in wrap-around arithmetic). */ - if (guardedExpires >= t0 && // if it wraps, it's > now - guardedExpires <= now) - expires = minExpires; - } + elapsed = now + mindt - t0; + if (elapsed >= dt) + expires = now + mindt; else - { - /* again, guardedExpires <= now in wrap-around arithmetic */ - if (guardedExpires >= t0 || // didn't wrap so < now - guardedExpires <= now) - expires = minExpires; - } + expires = t0 + dt; + + /* Setting the compare register to "-1" is a bad idea + (interrupt fires before counter overflow is detected, and all + the "current time" stuff goes bad) */ + if (expires == 0) + expires = 1; /* Note: all HplAtm128Compare.set values have one subtracted, because the comparisons are continuous, but the actual