微控制器入門: 中斷處理

LET′S TRY“嵌入式系統編程”: 6之5

在本系列MCU基礎知識文章的最後部分,我們將討論中斷處理,它是MCU程式設計的核心概念之一。我們亦將探討輪詢的替代程序。

中斷與輪詢

這是「微控制器簡介」系列文章的第五個也是最後一個主題。本系列文章的第一部分說明有關MCU基本架構與運作,第二部分探討周邊電路,第三部分探討程式設計語言與軟體開發環境,第四部分則探討周邊電路控制的基礎知識。今天我們要探討中斷處理,這是MCU控制的主要功能。

中斷是大家在日常生活中都很熟悉的。讓我們看看典型的範例:您在客廳看書,但是您也期待今天有人會送貨過來。突然門鈴響了,提醒您商品已經送到了。現在將「您」這個字換成「MCU」,「門鈴」換成「中斷訊號」,「送貨」換成「事件」,那麼一切就很清楚了。

图1:“中断”处理示意图

圖1:中斷;概念

現在假設您在看書並等待有人來送貨,但是您沒有門鈴,而且送貨員同意安靜地將包裹放在您的門口 (換言之,您不會被中斷)。在此情況下,您將不時停止閱讀並前往門口查看包裹是否已經送到。在MCU的世界中,這類型取代中斷的定期檢查稱為輪詢。

圖2:輪詢;概念

圖2:輪詢;概念

MCU的中斷處理

事實上,MCU的中斷處理比上述情況稍微複雜。但它仍與看書的範例相當類似,從以下內容即可明顯理解。

在家處理中斷 在MCU中處理中斷
1) 您正在看書
主程式正在執行
2) 送貨員按門鈴
中斷訊號讓MCU知道有事件發生了
3) 停止看書
MCU收到中斷訊號,並暫停執行主程式
4) 在目前閱讀的頁面放入書籤
MCU將目前的程式執行狀態儲存至其暫存器
5) 收取貨物
MCU執行對應於所收到中斷的中斷常式
6) 回到標記的頁面 MCU還原已儲存的程式執行狀態
從剛才閱讀的頁面重新開始閱讀 繼續執行程式

發生事件時,將會傳送中斷訊號以通知MCU。如果事件發生在外部裝置,訊號將傳送至MCU的INT腳位。如果事件發生在

MCU晶片內建的周邊電路,例如計時器遞增或序列I/F事件,則將會在內部發出中斷訊號。
這些中斷訊號將由MCU的中斷控制器(IC)接收及處理。如果收到多個中斷訊號,IC的邏輯將決定中斷的處理順序(依據各裝置的優先等級),然後以正確的順序將對應的中斷要求訊號傳送至CPU (IC亦可設為忽略或「遮罩」特定中斷以阻擋不必要的中斷)。當CPU收到要求時,將暫停執行目前的程式,然後載入並執行對應於該中斷的中斷處理程式碼。

 

图3:单片机内部的“中断”处理

圖3:MCU內部的中斷處理

即時處理

雖然中斷與輪詢都會執行類似的處理程序,但是仍有明顯的差異。如果使用中斷,MCU會在事件發生時立即收到通知,並可快速切換至所要求的處理。這種快速回通常被稱為即時處理。

理論上,如果輪詢的頻率非常高,輪詢也能夠快速執行。但實際上,運作速度將因為必須輪詢多種事件而變慢,同時也會因為要以夠短的輪詢迴圈進行主要處理作業的難度而變慢。
例如,以MCU等待使用者按下開關的情況為例。因為MCU無法預測何時會發生,因此必須持續無限的迴圈與輪詢。這種空轉的迴圈將耗費大量的CPU處理時間。而且如果需要輪詢各種事件,將很難維持夠短的輪詢間隔時間以達成快速回 應。

中斷處理對於程式設計師而言或許較不容易撰寫,因為它需要對MCU硬體有相當程度的瞭解。但中斷是MCU程式設計 的重要功能,而且無法迴避。我們鼓勵程式設計師更深入瞭解MCU架構並學習如何撰寫有效的中斷處理常式。

到此我們已完成MCU基礎知識系列的內容。希望您覺得這些內容有趣,並希望您繼續進行MCU的實作練習。