複製鏈接
請複製以下鏈接發送給好友

中斷嵌套

鎖定
中斷嵌套是指中斷系統正在執行一箇中斷服務時,有另一個優先級更高的中斷提出中斷請求,這時會暫時終止當前正在執行的級別較低的中斷源服務程序,去處理級別更高的中斷源,待處理完畢,再返回到被中斷了的中斷服務程序繼續執行的過程。
中文名
中斷嵌套
別    名
加塞
基    礎
正在執行一箇中斷服務時
所屬分類
中斷系統

中斷嵌套簡介

其實就是更高一級的中斷的“加塞”,處理器正在執行着中斷,又接受了更急的另一件“急件”,轉而處理更高一級的中斷的行為!

中斷嵌套優先級

中斷嵌套定義

優先級高的中斷源可以中斷優先級低的中斷服務程序,這就形成了中斷服務程序中套着中斷服務程序的情況,即形成了所謂的中斷嵌套。
MCU暫停現行程序而轉去響應中斷請求的過程稱為中斷響應;為使系統能及時響應並處理髮生的所有中斷,系統根據引起中斷事件的重要性和緊迫程序,硬件將中斷源分為若干個級別,稱作中斷優先級。

中斷嵌套查詢

中斷的優先級有兩個:查詢優先級和執行優先級。
查詢優先級是datasheet或書上的默認(IP寄存器不做設置,上電覆位後為00H)的優先級:
外部中斷0> 定時/計數器0> 外部中斷1 > 定時/計數器1 > 串行中斷
或int0,timer0,int1,timer1,serial port 或 INT0、T0、INT1、T1、UART
或PX0>PT0>PX1>PT1>PS>......
其實都是查詢優級。首先查詢優先級是不可以更改和設置的。這是一個中斷優先權排隊的問題,是指多個中斷源同時產生中斷信號時,中斷仲裁器選擇對哪個中斷源優先處理的順序。而這與是否發生中斷服務程序的嵌套毫不相干。當CPU查詢各個中斷標誌位的時候,會依照上述5個查詢優先級順序依次查詢,當數箇中斷同時請求的時候,會優先查詢到高優查詢先級的中斷標誌位,但並不代表高查詢優先級的中斷可以打斷已經並且正在執行的低查詢優先級的中斷服務。
例如:當計數器0中斷和外部中斷1(按查詢優先級,計數器0中斷>外部中斷1)同時到達時,會進入計時器0的中斷服務函數;但是在外部中斷1的中斷服務函數正在服務的情況下,這時候任何中斷都是打斷不了它的,包括邏輯優先級比它高的外部中斷0計數器0中斷。

中斷嵌套執行

中斷的執行優先級就是你對IP寄存器的設置了。在2個優先級的情況下,某位為1,則相應的中斷源為高優先級;為0,則為低優先級。
關於中斷的優先級有三條原則:
1、CPU同時接收到幾個中斷時,首先響應優先級最高的中斷請求
2、正在進行的中斷過程不能被新的同級或低優先級的中斷請求所中斷;
3、正在進行的低優先級中斷服務,能被高優先級中斷請求中斷;
若:同一執行優先級中的中斷申請不止一個時,則有一箇中斷優先權排隊問題。同一執行優先級中斷的排隊,由中斷系統硬件確定的自然優先級形成,優先權自高到低的順序即:
外部中斷0>定時/計數0>外部中斷1>定時/計數1>串行接口
例如:設置IP =0x10,即設置串口中斷為最高優先級,則串口中斷可以打斷任何其他的中斷服務函數實現嵌套,且只有串口中斷能打斷其他中斷的服務函數。若串口中斷沒有觸發,則其他幾個中斷之間還是保持邏輯優先級,相互之間無法嵌套。

中斷嵌套執行操作

關於中斷嵌套。可以這樣説,當一箇中斷正在執行的時候,如果事先設置了中斷優先級寄存器IP,那麼當一個更高優先級的中斷到來的時候會發生中斷嵌套,如果沒有設置則不會發生任何嵌套;如果有同一個優先級的中斷觸發,它並不是在“不斷的申請”,而是將它相應的中斷標誌位置即IE寄存器的某位置位,當CPU執行完當前中斷之後,按照查詢優先級重新去查詢各個中斷標誌位,進入相應中斷。
要記住,沒有設置IP時,單片機會按照查詢優先級(或都説邏輯優先級)來排隊進入服務。如果要想讓某個中斷優先響應,則要設置IP,更改執行優先級(或者説物理優先級)。要注意的是,當設置了IP(Interrupt priority即中斷優先級,後同)後,當低執行優先級中斷在運行時,如果有高執行優先級的中斷產生,則會嵌套調用進入高執行優先級的中斷。如果你是用C語言寫的程序,並在中斷服務時 using 了寄存組,要注意,優先級不同的兩個中斷服務程序不要 using 同一組寄存器。
例1
1 在各個中斷都是低優先級的時候,如果定時器0的溢出進入中斷。在這個中斷處理的過程中,外部中斷0也被觸發了,那麼是不是要發生中斷嵌套?
答案1:在IP事先設置了外部中斷0的優先級的情況下,CPU會中止定時器0的中斷服務,進入外部中斷0服務程序,執行完以後再回到定時器0中斷服務程序。否則不會。
例2
2 如果定時器0發生中斷的時候,進入中斷處理程序,這個時候外部中斷1條件觸發條件滿足了。因為定時器0自然優先級比外部中斷1高,那麼定時器0的中斷處理程序繼續執行。假設定時器中斷處理程序執行的過程中,外部中斷1的觸發。條件消失了,那麼等定時器0的中斷處理完後,程序還是會進入外部中斷1處理程序嗎?
答案2:肯定會進入中斷的;外部中斷1的觸發條件滿足後會置位外部1的中斷標誌,即使後來外部中斷1的觸發條件消失了,也不會清除已置位的中斷標誌,所以等定時器0的中斷處理完後,程序判斷外部中斷的中斷標誌為1後依然會進入外部中斷1處理程序的,只有在外部中斷1處理程序中執行reti指令才會硬件清除外部中斷1的中斷標誌(這也正是為什麼中斷返回使用reti指令而不可以用ret替換的原因)...

中斷嵌套中斷處理

中斷處理分為四個階段:
1、保存被中斷程序的現場,其目的是為了在中斷處理完之後,可以返回到原來被中斷的地方繼續執行;
2、分析中斷源,判斷中斷原因,當同時有多箇中斷同時請求的時候還要考慮中斷的優先級
3、轉去執行相應的處理程序;
4、恢復被中斷程序現場,繼續執行被中斷程序。

中斷嵌套清除方式

MCU清除中斷標誌位有兩種方式
一種是通過軟件代碼往這個中斷標誌位的寄存器裏面寫“1”來完成標誌位的清零操作
第二種是當MCU響應中斷,執行中斷服務程序的時候(也就是程序計數器的指針跳轉到了中斷服務程序代碼區),由硬件自動執行清零操作。

中斷嵌套中斷特點

1、一個系統若有n級中斷,在MCU中就有n個中斷請求觸發器,總稱為中斷請求寄存器;與之對應的有n個中斷屏蔽觸發器,總稱為中斷屏蔽寄存器。與單級中斷不同,在多級中斷中,中斷屏蔽寄存器的內容是一個很重要的程序現場,因此在響應中斷時,需要把中斷屏蔽寄存器的內容保存起來,並設置新的中斷屏蔽狀態。一般在某一級中斷被響應後,要置“1 ”(關閉)本級和優先權低於本級的中斷屏蔽觸發器,置“0”(開放)更高級的中斷屏蔽觸發器,以此來實現正常的中斷嵌套。
2、 多級中斷中的每一級可以只有一箇中斷源,也可以有多箇中斷源。在多級中斷之間可以實現中斷嵌套,但是同一級內有不同中斷源的中斷是不能嵌套的,必須是處理完一箇中斷後再響應和處理同一級內其他中斷源。