[Tinyos-2-commits] CVS: tinyos-2.x/tos/chips/atm128/timer
Atm128AlarmC.nc, 1.3, 1.4 HplAtm128Timer0AsyncC.nc, 1.2, 1.3
David Gay
idgay at users.sourceforge.net
Wed Aug 9 17:01:02 PDT 2006
Update of /cvsroot/tinyos/tinyos-2.x/tos/chips/atm128/timer
In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv21602
Modified Files:
Atm128AlarmC.nc HplAtm128Timer0AsyncC.nc
Log Message:
minor alarm tweaks:
- enable interrupts in the HAL (to preserve correct stop/isRunning semantics)
- slight tweak to the mindt stuff
Index: Atm128AlarmC.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/tos/chips/atm128/timer/Atm128AlarmC.nc,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** Atm128AlarmC.nc 7 Aug 2006 22:57:37 -0000 1.3
--- Atm128AlarmC.nc 10 Aug 2006 00:00:59 -0000 1.4
***************
*** 73,124 ****
async command void Alarm.startAt( timer_size t0, timer_size dt ) {
! timer_size now;
! timer_size expires, guardedExpires;
!
! now = call HplAtm128Timer.get();
! dbg("Atm128AlarmC", " starting timer at %llu with dt %llu\n", (uint64_t)t0, (uint64_t) dt);
! /* We require dt >= 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. It should be more than 2 if the timer's clock rate is
! very high (e.g., equal to the processor clock). */
! if (dt < mindt)
! dt = mindt;
!
! expires = t0 + dt;
! guardedExpires = expires - 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.
! Note also that casting compared quantities to timer_size produces
! predictable comparisons (the C integer promotion rules would make it
! hard to write correct code for the possible timer_size size's) */
! /* Note: all HplAtm128Compare.set values have one subtracted, because
! the comparisons are continuous, but the actual interrupt is signalled
! at the next timer clock cycle. */
! 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)
! call HplAtm128Compare.set(call HplAtm128Timer.get() + mindt - 1);
! else
! call HplAtm128Compare.set(expires - 1);
! }
! else
! {
! /* again, guardedExpires <= now in wrap-around arithmetic */
! if (guardedExpires >= t0 || // didn't wrap so < now
! guardedExpires <= now)
! call HplAtm128Compare.set(call HplAtm128Timer.get() + mindt - 1);
else
! call HplAtm128Compare.set(expires - 1);
}
- call HplAtm128Compare.reset();
- call HplAtm128Compare.start();
}
--- 73,121 ----
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. */
! atomic
! {
! timer_size now, expires, minExpires, guardedExpires;
! 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;
! }
else
! {
! /* again, guardedExpires <= now in wrap-around arithmetic */
! if (guardedExpires >= t0 || // didn't wrap so < now
! guardedExpires <= now)
! expires = minExpires;
! }
!
! /* Note: all HplAtm128Compare.set values have one subtracted,
! because the comparisons are continuous, but the actual
! interrupt is signalled at the next timer clock cycle. */
! call HplAtm128Compare.set(expires - 1);
! call HplAtm128Compare.reset();
! call HplAtm128Compare.start();
}
}
***************
*** 126,129 ****
--- 123,127 ----
call HplAtm128Compare.stop();
dbg("Atm128AlarmC", " Compare fired, signal alarm above.\n");
+ __nesc_enable_interrupt();
signal Alarm.fired();
}
Index: HplAtm128Timer0AsyncC.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/tos/chips/atm128/timer/HplAtm128Timer0AsyncC.nc,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** HplAtm128Timer0AsyncC.nc 12 Jul 2006 17:01:30 -0000 1.2
--- HplAtm128Timer0AsyncC.nc 10 Aug 2006 00:00:59 -0000 1.3
***************
*** 47,52 ****
implementation
{
- bool inOverflow;
-
command error_t Init.init() {
SET_BIT(ASSR, AS0); // set Timer/Counter0 to asynchronous mode
--- 47,50 ----
***************
*** 163,167 ****
AVR_ATOMIC_HANDLER(SIG_OUTPUT_COMPARE0) {
stabiliseTimer0();
- __nesc_enable_interrupt();
signal Compare.fired();
}
--- 161,164 ----
***************
*** 170,176 ****
AVR_ATOMIC_HANDLER(SIG_OVERFLOW0) {
stabiliseTimer0();
- inOverflow = TRUE;
signal Timer.overflow();
- inOverflow = FALSE;
}
}
--- 167,171 ----
More information about the Tinyos-2-commits
mailing list