X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Fplatforms%2Ftelosb%2Fmac%2Ftkn154%2Ftimer%2FAlarm32khzTo62500hzTransformC.nc;h=2af284dd9d1e3375c11b87da5735fdad8444a625;hb=82c215ff867ea7ef4fa748fb72b686c32ffb25e1;hp=20f0822d49e1d7863038d7f834e28b9ad3770734;hpb=afb6da3df34fdebb6843598761ef4de5eb0186f6;p=tinyos-2.x.git diff --git a/tos/platforms/telosb/mac/tkn154/timer/Alarm32khzTo62500hzTransformC.nc b/tos/platforms/telosb/mac/tkn154/timer/Alarm32khzTo62500hzTransformC.nc index 20f0822d..2af284dd 100644 --- a/tos/platforms/telosb/mac/tkn154/timer/Alarm32khzTo62500hzTransformC.nc +++ b/tos/platforms/telosb/mac/tkn154/timer/Alarm32khzTo62500hzTransformC.nc @@ -41,10 +41,13 @@ module Alarm32khzTo62500hzTransformC implementation { /** - * This is the place where we cheat: since we don't have a clock source - * running at 62500 Hz, we cast 2 symbols to 1 tick of the 32768 - * clock, which introduces a small (5%) error. -*/ + * TelosB lacks a clock with the precision and accuracy + * required by the 802.15.4 standard (62500 Hz, 40 ppm). + * As a workaround, we cast one tick of the 32768 Hz clock to + * two 802.15.4 symbols, which introduces a small (5%) error. + * Thus the channel access in particular in beacon-enabled PANs + * (slotted CSMA-CA) is not be standard-compliant! + */ #warning "Warning: MAC timing is not standard compliant (the symbol clock is based on the 32768 Hz oscillator)!" async command void Alarm.start[ uint8_t num ](uint32_t dt){ call AlarmFrom.start[num](dt >> 1);} @@ -61,15 +64,17 @@ implementation async command void Alarm.startAt[ uint8_t num ](uint32_t t0, uint32_t dt){ // t0 occured before "now" - uint32_t now = call Alarm.getNow[num](), elapsed; - if (t0 <= now) - elapsed = now - t0; - else - elapsed = ~(t0 - now) + 1; - if (elapsed > dt) - elapsed = dt; - dt -= elapsed; - call AlarmFrom.start[num](dt >> 1); + atomic { + uint32_t now = call Alarm.getNow[num](), elapsed; + if (t0 < now) + elapsed = now - t0; + else + elapsed = ~(t0 - now) + 1; + if (elapsed > dt) + dt = elapsed; + dt -= elapsed; + call Alarm.start[num](dt); + } } /******************** Defaults ****************************/