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都在休息,但是只要按下按鈕,系統送出按鈕中斷,觸發使用者定義的中斷服務常式,就執行函數內的程式
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言