
嵌入式系統 - 中斷
中斷是由硬體或軟體發給處理器的訊號,指示需要立即處理的事件。每當發生中斷時,控制器都會完成當前指令的執行,並開始執行中斷服務程式 (ISR) 或中斷處理程式。ISR 告訴處理器或控制器中斷髮生時該做什麼。中斷可以是硬體中斷或軟體中斷。
硬體中斷
硬體中斷是由外部裝置(如磁碟控制器或外部外設)傳送給處理器的電子警報訊號。例如,當我們按下鍵盤上的鍵或移動滑鼠時,它們會觸發硬體中斷,導致處理器讀取按鍵或滑鼠位置。
軟體中斷
軟體中斷是由異常情況或指令集中導致處理器執行時中斷的特殊指令引起的。例如,如果處理器的算術邏輯單元執行將數字除以零的命令,則會導致除以零異常,從而導致計算機放棄計算或顯示錯誤訊息。軟體中斷指令的工作方式類似於子程式呼叫。
什麼是輪詢?
持續監控的狀態稱為輪詢。微控制器不斷檢查其他裝置的狀態;在此過程中,它不執行其他操作,並消耗所有處理時間進行監控。這個問題可以透過使用中斷來解決。
在中斷方法中,控制器僅在發生中斷時才響應。因此,控制器不需要定期監控介面和內建裝置的狀態(標誌、訊號等)。
中斷與輪詢
這裡有一個比喻,可以區分中斷和輪詢:
中斷 | 輪詢 |
---|---|
中斷就像一個店主。如果需要服務或產品,他會去找他,並告知他自己的需求。在中斷的情況下,當收到標誌或訊號時,它們會通知控制器需要對其進行服務。 | 輪詢方法就像一個銷售人員。銷售人員挨家挨戶地請求購買產品或服務。類似地,控制器逐一監控所有裝置的標誌或訊號,併為需要其服務的任何元件提供服務。 |
中斷服務程式
對於每個中斷,都必須有一箇中斷服務程式 (ISR) 或中斷處理程式。當發生中斷時,微控制器會執行中斷服務程式。對於每個中斷,記憶體中都有一個固定的位置儲存其中斷服務程式 ISR 的地址。預留用於儲存 ISR 地址的記憶體位置表稱為中斷向量表。

中斷向量表
8051 中有六個中斷,包括復位。
中斷 | ROM 位置 (十六進位制) | 引腳 |
---|---|---|
中斷 | ROM 位置 (十六進位制) | |
序列 COM (RI 和 TI) | 0023 | |
定時器 1 中斷 (TF1) | 001B | |
外部硬體中斷 1 (INT1) | 0013 | P3.3 (13) |
外部硬體中斷 0 (INT0) | 0003 | P3.2 (12) |
定時器 0 (TF0) | 000B | |
復位 | 0000 | 9 |
當復位引腳被啟用時,8051 會跳轉到地址位置 0000。這是上電覆位。
為定時器預留了兩個中斷:一個用於定時器 0,另一個用於定時器 1。在中斷向量表中,記憶體位置分別為 000BH 和 001BH。
為硬體外部中斷預留了兩個中斷。埠 3 中的引腳 12 和引腳 13 分別用於外部硬體中斷 INT0 和 INT1。在中斷向量表中,記憶體位置分別為 0003H 和 0013H。
序列通訊有一個屬於接收和傳送的單箇中斷。記憶體位置 0023H 屬於此中斷。
執行中斷的步驟
當中斷被啟用時,微控制器會執行以下步驟:
微控制器關閉當前正在執行的指令,並將下一條指令的地址 (PC) 儲存到堆疊中。
它還會在內部儲存所有中斷的當前狀態(即,不在堆疊中)。
它跳轉到中斷向量表中儲存中斷服務程式地址的記憶體位置。
微控制器從中斷向量表中獲取 ISR 的地址並跳轉到它。它開始執行中斷服務子程式,即 RETI(從中斷返回)。
執行 RETI 指令後,微控制器返回到中斷髮生的位置。首先,它透過將堆疊的頂部位元組彈出到 PC 中來獲取程式計數器 (PC) 地址。然後,它從該地址開始執行。
邊沿觸發與電平觸發
中斷模組有兩種型別:電平觸發或邊沿觸發。
電平觸發 | 邊沿觸發 |
---|---|
電平觸發中斷模組只要中斷源的電平被置位就會始終產生中斷。 | 邊沿觸發中斷模組僅在其檢測到中斷源的置位邊沿時才產生中斷。當中斷源電平實際變化時,邊沿被檢測到。它也可以透過週期性取樣並在前一個樣本被取消置位時檢測到置位電平來檢測。 |
如果中斷源在韌體中斷處理程式處理中斷時仍然被置位,則中斷模組將重新生成中斷,導致再次呼叫中斷處理程式。 | 邊沿觸發中斷模組可以立即採取行動,無論中斷源的行為如何。 |
電平觸發中斷對於韌體來說很麻煩。 | 邊沿觸發中斷使韌體的程式碼複雜性保持較低,減少了韌體的條件數量,並在處理中斷時提供了更大的靈活性。 |
啟用和停用中斷
復位後,即使中斷被啟用,所有中斷也會被停用。必須使用軟體啟用中斷,以便微控制器響應這些中斷。
IE(中斷啟用)暫存器負責啟用和停用中斷。IE 是一個按位定址的暫存器。
中斷啟用暫存器
EA | - | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
---|
EA - 全域性啟用/停用。
- - 未定義。
ET2 - 啟用定時器 2 中斷。
ES - 啟用序列埠中斷。
ET1 - 啟用定時器 1 中斷。
EX1 - 啟用外部 1 中斷。
ET0 - 啟用定時器 0 中斷。
EX0 - 啟用外部 0 中斷。
要啟用中斷,我們執行以下步驟:
IE 暫存器的位 D7 (EA) 必須為高電平才能使暫存器的其餘部分生效。
如果 EA = 1,則將啟用中斷,如果它們在 IE 中的相應位為高電平,則將對其進行響應。如果 EA = 0,則任何中斷都不會響應,即使它們在 IE 暫存器中的關聯引腳為高電平。
8051 中的中斷優先順序
我們可以透過將更高優先順序分配給任何一箇中斷來更改中斷優先順序。這是透過程式設計名為IP(中斷優先順序)的暫存器來實現的。
下圖顯示了 IP 暫存器的位。復位後,IP 暫存器包含全 0。要將更高優先順序賦予任何中斷,我們將 IP 暫存器中的相應位設定為高電平。
- | - | - | - | PT1 | PX1 | PT0 | PX0 |
---|
- | IP.7 | 未實現。 |
- | IP.6 | 未實現。 |
- | IP.5 | 未實現。 |
- | IP.4 | 未實現。 |
PT1 | IP.3 | 定義定時器 1 中斷優先順序。 |
PX1 | IP.2 | 定義外部中斷 1 優先順序。 |
PT0 | IP.1 | 定義定時器 0 中斷優先順序。 |
PX0 | IP.0 | 定義外部中斷 0 優先順序。 |
中斷中的中斷
如果 8051 正在執行屬於一箇中斷的中斷服務程式,而另一箇中斷被啟用會發生什麼?在這種情況下,高優先順序中斷可以中斷低優先順序中斷。這稱為中斷中的中斷。在 8051 中,低優先順序中斷可以被高優先順序中斷中斷,但不能被任何其他低優先順序中斷中斷。
透過軟體觸發中斷
有時我們需要透過模擬來測試 ISR。這可以透過簡單的指令來實現,這些指令將中斷設定為高電平,從而導致 8051 跳轉到中斷向量表。例如,將定時器 1 的 IE 位設定為 1。指令SETB TF1 將中斷 8051 當前正在執行的操作,並強制其跳轉到中斷向量表。