亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hplatm128comparec.nc

?? tinyos-2.x.rar
?? NC
字號:
/// $Id: HplAtm128CompareC.nc,v 1.1 2008/06/12 14:02:20 klueska Exp $
/*
 * "Copyright (c) 2005 Stanford University. All rights reserved.
 *
 * Permission to use, copy, modify, and distribute this software and
 * its documentation for any purpose, without fee, and without written
 * agreement is hereby granted, provided that the above copyright
 * notice, the following two paragraphs and the author appear in all
 * copies of this software.
 * 
 * IN NO EVENT SHALL STANFORD UNIVERSITY BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
 * IF STANFORD UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 * 
 * STANFORD UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE
 * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND STANFORD UNIVERSITY
 * HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
 * ENHANCEMENTS, OR MODIFICATIONS."
 */

/**
 * Basic compare abstraction that builds on top of a counter.
 *
 * @author Philip Levis
 * @date   Nov 22 2005
 */

// $Id: HplAtm128CompareC.nc,v 1.1 2008/06/12 14:02:20 klueska Exp $

#include <Atm128Timer.h>

generic module HplAtm128CompareC(typedef width_t @integer(),
				 uint8_t valueRegister,
				 uint8_t interruptRegister,
				 uint8_t interruptBit,
				 uint8_t flagRegister,
				 uint8_t flagBit) 
{
  provides {
    // 8-bit Timers
    interface HplAtm128Compare<width_t> as Compare;
  }
  uses {
    interface HplAtm128Timer<width_t>   as Timer;
    interface HplAtm128TimerCtrl8       as TimerCtrl;
    interface HplAtm128TimerNotify as Notify;
    interface ThreadScheduler;
  }
}
implementation {
  /* lastZero keeps track of the phase of the clock. It denotes the sim
   * time at which the underlying clock started, which is needed to
   * calculate when compares will occur. */
  sim_time_t lastZero = 0;

  /** This variable is needed to keep track of when the underlying
   *  timer starts, in order to reset lastZero. When oldScale is
   *  AVR_CLOCK_OFF and the scale is set to something else, the
   *  clock starts ticking. */
  uint8_t oldScale = AVR_CLOCK_OFF;
  
  void adjust_zero(width_t currentCounter);

  void cancel_compare();
  sim_event_t* allocate_compare();
  void configure_compare(sim_event_t* e);
  void schedule_new_compare();

  sim_time_t clock_to_sim(sim_time_t t);
  sim_time_t sim_to_clock(sim_time_t t);
  uint16_t shiftFromScale();


  sim_time_t last_zero() {
    if (lastZero == 0) {
      lastZero = sim_mote_start_time(sim_node());
    }
    return lastZero;
  }


  async event void Notify.changed() {
    uint8_t newScale = call Timer.getScale();
    if (newScale != AVR_CLOCK_OFF &&
	oldScale == AVR_CLOCK_OFF) {
      lastZero = sim_time();
    }
    oldScale = newScale;
    
    schedule_new_compare();
  }
  
  async command void Compare.reset() { REG_ACCESS(flagRegister) &= ~(1 << flagBit); }
  async command void Compare.start() { SET_BIT(interruptRegister,interruptBit); }
  async command void Compare.stop()  { CLR_BIT(interruptRegister,interruptBit); }
  async command bool Compare.test()  { 
    return (call TimerCtrl.getInterruptFlag()).bits.ocf0; 
  }
  async command bool Compare.isOn()  { 
    return (call TimerCtrl.getInterruptMask()).bits.ocie0; 
  }

  //=== Read the compare registers. =====================================
  async command width_t Compare.get()   { return (width_t)REG_ACCESS(valueRegister); }

  //=== Write the compare registers. ====================================
  async command void Compare.set(width_t t)   { 
    atomic {
	/* Re the comment above: it's a bad idea to wake up at time 0, as
	   we'll just spin when setting the next deadline. Try and reduce
	   the likelihood by delaying the interrupt...
	*/
      if (t == 0 || t >= 0xfe)
	t = 1;
      
      if (t != REG_ACCESS(valueRegister)) {
	REG_ACCESS(valueRegister) = t;
	schedule_new_compare();
      }
    }
  }

  //=== Timer interrupts signals ========================================
  default async event void Compare.fired() { }
  AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE0) {
    signal Compare.fired();
    call ThreadScheduler.interruptPostAmble();
  }


  /**
   * If the clock was stopped and has restarted, then
   * we need to move the time when the clock was last
   * zero to a time that reflects the current settings.
   * For example, if the clock was stopped when the counter
   * was 52 and then later restarted, then <tt>lastZero</tt>
   * needs to be moved forward in time so that the 52
   * reflects the current time.
   */ 
  void adjust_zero(width_t currentCounter) {
    sim_time_t now = sim_time();
    sim_time_t adjust = currentCounter;
    adjust = adjust << shiftFromScale();
    adjust = clock_to_sim(adjust);
    lastZero = now - adjust;
  }
  
  sim_time_t clock_to_sim(sim_time_t t) {
    t *= sim_ticks_per_sec();
    t /= call Notify.clockTicksPerSec();
    return t;
  }

  sim_time_t sim_to_clock(sim_time_t t) {
    t *= call Notify.clockTicksPerSec();
    t /= sim_ticks_per_sec();
    return t;
  }
  
  uint16_t shiftFromScale() {
    uint8_t scale = call Timer.getScale();
    switch (scale) {
    case 0:
      return 0;
    case 1:
      return 0;
    case 2:
      return 3;
    case 3:
      return 5;
    case 4:
      return 6;
    case 5:
      return 7;
    case 6:
      return 8;
    case 7:
      return 10;
    default:
      return 255;
    }
    
  }

  sim_event_t* compare;

  void timer0_compare_handle(sim_event_t* evt) {
    dbg("HplAtm128CompareC", "%s Beginning compare at 0x%p\n", __FUNCTION__, evt);
    if (evt->cancelled) {
      return;
    }
    else {
      dbg("HplAtm128CompareC", "%s Handling compare at 0x%p @ %s\n",__FUNCTION__,  evt, sim_time_string());
	    
      if (READ_BIT(interruptRegister, interruptBit)) {
	CLR_BIT(flagRegister, flagBit);
	dbg("HplAtm128CompareC", "%s Compare interrupt @ %s\n", __FUNCTION__, sim_time_string());
	SIG_OUTPUT_COMPARE0();
      }
      else {
	SET_BIT(flagRegister, flagBit);
      }
      // If we haven't been cancelled
      if (!evt->cancelled) {
	configure_compare(evt);
	sim_queue_insert(evt);
      }
    }
  }

  sim_event_t* allocate_compare() {
    sim_event_t* newEvent = sim_queue_allocate_event();
    dbg("HplAtm128CompareC", "Allocated compare at 0x%p\n", newEvent);
    newEvent->handle = timer0_compare_handle;
    newEvent->cleanup = sim_queue_cleanup_none;
    return newEvent;
  }
  
  void configure_compare(sim_event_t* evt) {
    sim_time_t compareTime = 0;
    sim_time_t phaseOffset = 0;
    uint8_t timerVal = call Timer.get();
    uint8_t compareVal = call Compare.get();

    // Calculate how many counter increments until timer
    // hits compare, considering wraparound, and special
    // case of complete wraparound.
    compareTime = ((compareVal - timerVal) & 0xff);
    if (compareTime == 0) {
      compareTime = 256;
    }

    // Now convert the compare time from counter increments
    // to simulation ticks, considering the fact that the
    // increment actually has a phase offset.
    compareTime = compareTime << shiftFromScale();
    compareTime = clock_to_sim(compareTime);
    compareTime += sim_time();

    // How long into a timer tick was the clock actually reset?
    // This covers the case when the compare is set midway between
    // a tick, so it will go off a little early
    phaseOffset = sim_time();
    phaseOffset -= last_zero();
    phaseOffset %= clock_to_sim(1 << shiftFromScale());
    compareTime -= phaseOffset;
      
    dbg("HplAtm128CompareC", "Configuring new compare of %i for %i at time %llu  (@ %llu)\n", (int)compareVal, sim_node(), compareTime, sim_time());
    
    evt->time = compareTime;    
  }
  
  void schedule_new_compare() {
    if (compare != NULL) {
      cancel_compare();
    }
    if (call Timer.getScale() != AVR_CLOCK_OFF) {
      sim_event_t* newEvent = allocate_compare();
      configure_compare(newEvent);

      compare = newEvent;
      sim_queue_insert(newEvent);
    }
  }

  void cancel_compare() {
    dbg("HplAtm128CompareC", "Cancelling compare at 0x%p\n", compare);
    if (compare != NULL) {
      compare->cancelled = 1;
      compare->cleanup = sim_queue_cleanup_total;
    }
  }

  async event void Timer.overflow() {}
  
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆久久一区二区| 欧美日韩国产片| 精久久久久久久久久久| 日本在线不卡一区| 日韩成人一区二区三区在线观看| 亚洲网友自拍偷拍| 午夜激情久久久| 免费欧美日韩国产三级电影| 香蕉乱码成人久久天堂爱免费| 亚洲成人免费影院| 日本不卡视频在线观看| 麻豆国产精品一区二区三区 | 99视频精品全部免费在线| 成人一道本在线| 91在线免费视频观看| 色妹子一区二区| 色先锋资源久久综合| 91电影在线观看| 7799精品视频| 亚洲精品一区二区三区在线观看| 精品成人私密视频| 中文字幕日韩av资源站| 亚洲精品福利视频网站| 日韩高清不卡一区二区三区| 久久福利视频一区二区| 成人午夜激情影院| 91麻豆免费看片| 欧美日韩一级黄| 精品免费99久久| 国产精品久久久久久久蜜臀| 亚洲免费电影在线| 日韩国产一二三区| 国产不卡在线播放| 在线精品视频一区二区三四| 日韩精品在线网站| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 一区二区三区久久久| 日本亚洲天堂网| 国产成人亚洲综合色影视| 色中色一区二区| 精品成人a区在线观看| 伊人性伊人情综合网| 久久精品国产亚洲5555| 97精品电影院| 欧美va在线播放| 一区二区三区在线高清| 九九**精品视频免费播放| 99久久精品费精品国产一区二区| 9191精品国产综合久久久久久| 国产嫩草影院久久久久| 五月天一区二区三区| 国产成人午夜片在线观看高清观看| 91国模大尺度私拍在线视频| 精品福利二区三区| 亚洲线精品一区二区三区八戒| 国产一区二区三区免费观看| 欧美三级韩国三级日本一级| 国产欧美精品区一区二区三区 | 国产精品18久久久久久久久| 色www精品视频在线观看| 26uuu国产日韩综合| 亚洲永久免费av| 懂色av一区二区夜夜嗨| 制服丝袜亚洲播放| 亚洲免费观看高清完整版在线观看熊 | 亚洲精品你懂的| 国产精品1区二区.| 91精品国产综合久久小美女| 亚洲精品成a人| 国产jizzjizz一区二区| 欧美不卡一区二区三区四区| 亚洲国产精品视频| 一本色道久久综合狠狠躁的推荐| 久久你懂得1024| 青青草97国产精品免费观看无弹窗版 | 国产麻豆9l精品三级站| 91精品欧美综合在线观看最新| 亚洲精品视频在线看| 国产suv一区二区三区88区| 欧美不卡在线视频| 男女激情视频一区| 欧美精品黑人性xxxx| 一区二区三区四区高清精品免费观看| 成人综合日日夜夜| 精品久久人人做人人爰| 免费在线看成人av| 91精品国产综合久久久蜜臀粉嫩| 一个色综合网站| 91美女福利视频| 中文字幕在线不卡| 成人av手机在线观看| 欧美激情一区二区三区蜜桃视频| 精彩视频一区二区三区| 日韩精品一区二区三区视频播放| 亚洲电影一区二区三区| 色狠狠色噜噜噜综合网| 亚洲精品videosex极品| 91国产免费看| 亚洲图片欧美一区| 欧美肥妇free| 免费人成网站在线观看欧美高清| 欧美一区二区三区日韩视频| 日日欢夜夜爽一区| 日韩一级黄色大片| 蜜桃91丨九色丨蝌蚪91桃色| 欧美一区二区三区免费在线看 | 国产一区二区福利视频| 欧美成人精品1314www| 麻豆精品新av中文字幕| 日本午夜一区二区| 3d动漫精品啪啪| 久久99久久久欧美国产| 精品对白一区国产伦| 国产成人激情av| 中文字幕一区二区三区在线播放 | 久久se精品一区二区| 久久久久一区二区三区四区| 成人性视频网站| 亚洲色图制服丝袜| 欧美日韩国产高清一区| 日本欧美一区二区在线观看| 日韩精品一区二区三区在线| 高清成人在线观看| 亚洲精品免费在线观看| 欧美一区永久视频免费观看| 精品一区二区三区av| 国产精品久久久久一区二区三区| 91久久香蕉国产日韩欧美9色| 三级亚洲高清视频| 国产午夜久久久久| 色婷婷国产精品久久包臀| 一区二区三区在线观看动漫| 日韩欧美专区在线| 成人一区二区视频| 午夜视频在线观看一区二区三区 | 天天色综合天天| 26uuu久久综合| 日本精品视频一区二区| 免费观看日韩电影| 国产精品丝袜黑色高跟| 精品视频在线免费| 国产自产v一区二区三区c| 亚洲三级视频在线观看| 在线综合亚洲欧美在线视频| 国产精品正在播放| 一区二区三区久久| 久久免费午夜影院| 日本韩国欧美在线| 国产精品99久| 日韩电影一区二区三区| 最近中文字幕一区二区三区| 日韩一级高清毛片| 91色porny在线视频| 欧美一卡2卡三卡4卡5免费| 国产一区二区三区最好精华液| 亚洲三级理论片| 久久精品视频在线看| 欧美午夜不卡在线观看免费| 国产91丝袜在线播放| 国产精品主播直播| 欧美色综合影院| 亚洲午夜成aⅴ人片| 欧美人伦禁忌dvd放荡欲情| 国产成人一区在线| 视频一区国产视频| 一区在线观看免费| 亚洲精品在线观看网站| 精品视频资源站| 99国产精品久久久久久久久久 | 日韩中文欧美在线| 亚洲欧美偷拍卡通变态| 欧美精品一区二区三区蜜臀| 欧美唯美清纯偷拍| 99r精品视频| 国产盗摄一区二区| 精品在线一区二区| 日韩和欧美的一区| 亚洲乱码精品一二三四区日韩在线| 国产日韩精品久久久| 日韩一区二区三区av| 欧美日韩国产片| 欧美专区在线观看一区| 91麻豆免费观看| 播五月开心婷婷综合| 国产成人激情av| 国产精品夜夜嗨| 久久精品国产亚洲一区二区三区| 丝袜美腿高跟呻吟高潮一区| 一区二区三区在线播放| 亚洲视频一区在线| 亚洲婷婷国产精品电影人久久| 国产午夜精品美女毛片视频| 欧美v国产在线一区二区三区| 欧美一区二区三区精品| 欧美一区二区在线免费播放| 精品视频资源站| 在线播放亚洲一区| 欧美另类变人与禽xxxxx| 婷婷中文字幕一区三区| 一级女性全黄久久生活片免费|