]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
a bug fix got lost
authoridgay <idgay>
Fri, 11 Aug 2006 20:46:23 +0000 (20:46 +0000)
committeridgay <idgay>
Fri, 11 Aug 2006 20:46:23 +0000 (20:46 +0000)
simplify logic

tos/chips/atm128/timer/Atm128AlarmC.nc

index 4bd2e7ac68be7a255f25b6e025d07b07d87fa6f8..b16f784482e43ebcd665d2361efd441310850ea4 100644 (file)
@@ -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