}
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