2011年12月28日 星期三

Netduino--讀取按鈕狀態控制LED亮(或滅)--事件觸發


若使用迴圈的方式來偵測是否按下按鈕(如下程式片段)
  while (true)
  {
      buttonState = button.Read();
      led.Write(!buttonState);
  }
這代表CPU會花很多時間在空轉,這種方法也稱為輪詢(polling)
若能改為由系統偵測是否按下按鈕發出中斷 Interrupt,然後在中斷服務常式內撰寫程式,可以使系統執行更有效率,也讓程式更為簡潔
改寫程式如下,這樣就比較接近 event-driven 的架構 
public class Program
    {
        static OutputPort led = new OutputPort(Pins.ONBOARD_LED, false);
        public static void Main()
        {
            InterruptPort button = new InterruptPort(Pins.ONBOARD_SW1, false, Port.ResistorMode.Disabled, Port.InterruptMode.InterruptEdgeBoth);
            button.OnInterrupt += new NativeEventHandler(button_OnInterrupt);  //向系統註冊,若button發生interrupt時,就執行button_OnInterrupt函式
            Thread.Sleep(Timeout.Infinite);
        }
        static void button_OnInterrupt(uint data1, uint data2, DateTime time) //自行定義中斷服務常式        {
            if (data2 == 0)  //若按鈕被按下
                   led.Write(true);
        }
    }
大部分的時間CPU都在休息,但是只要按下按鈕,系統送出按鈕中斷,觸發使用者定義的中斷服務常式,就執行函數內的程式

沒有留言:

張貼留言