中斷處理

所謂中斷處理,是指中斷開發板CPU目前正在處理的事情,通常是「重複執行loop」正在執行的程式,先來執行我現在迫切急需處理的程式,等處理完之後再回到「重複執行loop」繼續處理例行事務。所以中斷處理的事件具有急迫性,必須馬上處理,它的優先權高於「重複執行loop」裡的程式。就像我們在工作時,如果聽到電話響,便會中斷目前所做的事情,先去接電話,電話結束再回到工作崗位,這個便是中斷處理。中斷處理因為是要中斷重複執行中的例行程式,所以中斷處理的程式最好不要太複雜、太耗時,以免大大影響原本應該要執行的程式。

中斷處理可以細分為硬體中斷及軟體中斷,硬體中斷通常是指某個腳位的電位改變了,如果有針對這個腳位寫中斷處理的事件及程式,當腳位的電位改變時,便會觸發這個事件,轉而先去處理相關程式。軟體中斷則是由軟體觸發,例如計時器的中斷,設定計時器每隔一段時間要做什麼事,這便是計時器的中斷。

中斷處理的積木位於「吉哥積木」→「ESP32」→「中斷處理」中,因為沒有使用額外的函式庫,因此不需更新「吉哥積木」,只要重新開啟BlocklyDuino3便可以看到了。

ESP32的硬體及計時器中斷

硬體中斷:

當某個腳位的電位突然上升、下降、改變、高電位、低電位時,便會觸發中斷。例如,當某個腳位的按鈕被導通了,可以觸發電位上升(Rising)的事件;斷電了,也可以觸發電位下降的事件(Falling),或是不管上升或是下降,都會觸發「改變」(change)的事件。按鈕持續在高電位狀態,便會一直觸發高電位事件(High);按鈕持續在電位狀態,便會一直觸發低電位事件(Low)。ESP32的每一個腳位都可以設定硬體中斷。

硬體中斷程式範例:

  1. GPIO5和GPIO32各連接了一個按鈕,GPIO5的電位改變時,會觸發pin5Task函式,讓GPIO16的LED燈亮起;當GPIO36的電位改變時,會觸發pin36Task函式,讓GPIO16上的LED燈熄滅。

  2. 重複執行的迴圈內每五秒會偵測一次溫濕度,程式裡面「延遲毫秒4700」以及「延遲毫秒300」。

  3. GPIO5和36上的按鈕按下時,就算「重複執行」的迴圈內執行了五秒的延遲,「重複執行」內的程式仍然必須中斷,然後先去處理按鈕電位改變的事件(控制LED燈亮或熄滅)。

  4. 按鈕在按下以及鬆開時,一個是電位上升,一個是電位下降,二個都是電位的改變,因此在這個例子中,按鈕按下後鬆開,中斷處理會發生二次。

  5. 如果在程式過程中想要停止使用某個腳位硬體中斷,可以使用「ESP32計時器中斷 停止腳位中斷 Pin X」這個積木。

軟體中斷:

除了腳位的電位改變能夠觸發中斷,ESP32內部有四個計時器,它們也可以觸發中斷事件,是「計時器中斷」。ESP32有四個計時器Timer,編號為Timer0~3,每個計時器可以設定每隔多少時間觸發中斷,並執行指定的函式。

計時器中斷程式範例:

  1. 程式初始化時設定三個計時器中斷事件,計時器Timer0每1000毫秒執行onTimer0的函式一次,函式「onTimer0」執行時,會讓GPIO16的LED燈亮或是熄滅計時器Timer1500毫秒執行onTimer1的函式一次,函式「onTimer1」執行時,會讓GPIO12的LED燈亮或是熄滅;;計時器Timer2200毫秒執行onTimer2的函式一次,函式「onTimer2」執行時,會讓GPIO13的LED燈亮或是熄滅;

  2. 重複執行的迴圈內每五秒會偵測一次溫濕度,程式裡面「延遲毫秒4700」以及「延遲毫秒300」。

  3. 當計時器Timer0~2的時間觸發中斷時,就算「重複執行」的迴圈內執行了五秒的延遲,「重複執行」內的程式仍然必須中斷,然後先去處理計時器中斷的事件。

  4. 如果在程式過程中想要停止使用某個計時器中斷,可以使用「ESP32計時器中斷 停止計時器中斷 在計時器X」這個積木。