什么是單片機嵌套中斷
所謂“中斷”是處理事件的一個“過程”,這一過程一般是由計算機內部或外部某件緊急事件引起并向主機發(fā)出請求處理的信號,主機在允許的情況下響應請求,暫停正在執(zhí)行的程序,保存好“斷點”處的現場,轉去執(zhí)行中斷處理程序,處理完中斷服務程序后自動返回原斷點處,繼續(xù)執(zhí)行原程序,這一處理過程稱為“中斷”。以AT89S52為例,中斷系統(tǒng)含有8個中斷源,共有6個中斷矢量:定時/計數器0、1、2,INT0、INT1和UART。兩級中斷優(yōu)先級,可實現兩級中斷嵌套。用戶可以很方便的通過軟件實現對中斷的控制。既然系統(tǒng)含有8個中斷源,就有可能出現數個中斷源同時提出中斷請求的情況,這樣,設計人員必須事先根據它們的輕重緩急來為每個中斷源確定CPU對其的響應順序。然而,對于中斷優(yōu)先級寄存器IP來說,只可能設定兩級優(yōu)先,即控制位為1時對應的中斷源為高級中斷,反之,控制位為0時對應的為低級中斷。
LinkedIn下圖為一聲光報警電路,當按下S1時,蜂鳴器發(fā)音;當按下S2時,停止發(fā)音,但LED發(fā)光。
2、 按鍵S1和S2觸發(fā)的先后順序對此聲光報警電路有什么影響?為什么?
1、完整程序:
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP EXINT0
ORG 0013H
AJMP EXINT1
ORG 0030H;不能用0000H
MAIN: SETB EA
SETB EX0
SETB EX1
SETB IT0
SETB IT1
AJMP $
EXINT0: CLR P1.2
RETI
EXINT1: SETB P1.2
CLR P2.0
RETI
END
2、若先按下S1則蜂鳴器發(fā)音;再按S2蜂鳴器停止發(fā)音,LED發(fā)光。
若先按下S2LED發(fā)光,再按S1蜂鳴器發(fā)音的同時LED發(fā)光。
能實現中斷嵌套因為外部中斷0、1在執(zhí)行完后都會返回主程序。
關于51系列單片機中斷嵌套
說最基本的,老的51單片機(80C51系列)有5個中斷源,2個優(yōu)先級,可以實現二級中斷服務嵌套。現在很多擴展的51單片機已經有4個優(yōu)先級(或更多)和更多的中斷源了。
在說到中斷之前,我先來定義一下優(yōu)先級,明白了什么是優(yōu)先級,后面的闡述就容易明白了。實際上很多人都是混淆了優(yōu)先級的含義,所以才覺得糊里糊涂。
中斷的優(yōu)先級有兩個:查詢優(yōu)先級和執(zhí)行優(yōu)先級。
什么是查詢優(yōu)級呢?我們從datasheet或書上看到的默認(IP寄存器不做設置,上電復位后為00H)的優(yōu)先級:
外部中斷0 》 定時/計數器0 》 外部中斷1 》 定時/計數器1 》 串行中斷
或int0,timer0,int1,timer1,serial port
或INT0、T0、INT1、T1、UART
或PX0》PT0》PX1》PT1》PS》
其實都是查詢優(yōu)級。首先查詢優(yōu)先級是不可以更改和設置的。這是一個中斷優(yōu)先權排隊的問題。是指多個中斷源同時產生中斷信號時,中斷仲裁器選擇對哪個中斷源優(yōu)先處理的順序。而這與是否發(fā)生中斷服務程序的嵌套毫不相干。當CPU查詢各個中斷標志位的時候,會依照上述5個查詢優(yōu)先級順序依次查詢,當數個中斷同時請求的時候,會優(yōu)先查詢到高優(yōu)查詢先級的中斷標志位,但并不代表高查詢優(yōu)先級的中斷可以打斷已經并且正在執(zhí)行的低查詢優(yōu)先級的中斷服務。
例如:當計數器0中斷和外部中斷1(按查詢優(yōu)先級,計數器0中斷》外部中斷1)同時到達時,會進入計時器0的中斷服務函數;但是在外部中斷1的中斷服務函數正在服務的情況下,這時候任何中斷都是打斷不了它的,包括邏輯優(yōu)先級比它高的外部中斷0計數器0中斷。
而中斷的執(zhí)行優(yōu)先級就是你對IP寄存器的設置了。在2個優(yōu)先級的情況下,某位為1,則相應的中斷源為高優(yōu)先級;為0,則為低優(yōu)先級。
關于中斷的優(yōu)先級有三條原則:
1、CPU同時接收到幾個中斷時,首先響應優(yōu)先級最高的中斷請求;
2、正在進行的中斷過程不能被新的同級或低行優(yōu)優(yōu)先級的中斷請求所中斷;
3、正在進行的低行優(yōu)優(yōu)先級中斷服務,能被高行優(yōu)優(yōu)先級中斷請求中斷;
若:同一執(zhí)行優(yōu)先級中的中斷申請不止一個時,則有一個中斷優(yōu)先權排隊問題。同一執(zhí)行優(yōu)先級的中斷優(yōu)先權排隊,由中斷系統(tǒng)硬件確定的自然優(yōu)先級形成,優(yōu)先權自高到低的順序即:外部中斷0》定時/計數0》外部中斷1》定時/計數1》串行接口。
例如:設置IP = 0x10,即設置串口中斷為最高優(yōu)先級,則串口中斷可以打斷任何其他的中斷服務函數實現嵌套,且只有串口中斷能打斷其他中斷的服務函數。若串口中斷沒有觸發(fā),則其他幾個中斷之間還是保持邏輯優(yōu)先級,相互之間無法嵌套。
關于中斷嵌套。可以這樣說,當一個中斷正在執(zhí)行的時候,如果事先設置了中斷優(yōu)先級寄存器IP,那么當一個更高優(yōu)先級的中斷到來的時候會發(fā)生中斷嵌套,如果沒有設置則不會發(fā)生任何嵌套;如果有同一個優(yōu)先級的中斷觸發(fā),它并不是在“不斷的申請”,而是將它相應的中斷標志位置即IE寄存器的某位置位,當CPU執(zhí)行完當前中斷之后,按照查詢優(yōu)先級重新去查詢各個中斷標志位,進入相應中斷。
要記住,沒有設置IP時,單片機會按照查詢優(yōu)先級(或都說邏輯優(yōu)先級)來排隊進入服務。如果要想讓某個中斷優(yōu)先響應,則要設置IP,更改執(zhí)行優(yōu)先級(或者說物理優(yōu)先級)。要注意的是,當設置了IP后,當低執(zhí)行優(yōu)先級中斷在運行時,如果有高執(zhí)行優(yōu)先級的中斷產生,則會嵌套調用進入高執(zhí)行優(yōu)先級的中斷。如果你是用C語言寫的程序,并在中斷服務時using 了寄存組,要注意,兩個不同執(zhí)行優(yōu)先級的中斷服務程序不要using 同一組寄存器。
看兩個問題,如下:
1 在各個中斷都是低優(yōu)先級的時候,如果定時器0的溢出進入中斷。在這個中斷處理的過程中,外部中斷0也被觸發(fā)了,那么是不是要發(fā)生中斷嵌套?
2 如果定時器0發(fā)生中斷的時候,進入中斷處理程序,這個時候外部中斷1條件觸發(fā)條件滿足了。因為定時器0自然優(yōu)先級比外部中斷1高,那么定時器0的中斷處理程序繼續(xù)執(zhí)行。假設定時器中斷處理程序執(zhí)行的過程中,外部中斷1的觸發(fā)。條件消失了,那么等定時器0的中斷處理完后,程序還是會進入外部中斷1處理程序嗎?
答案1:在IP事先設置了外部中斷0的優(yōu)先級的情況下,CUP會中止定時器0的中斷服務,進入外部中斷0服務程序,執(zhí)行完以后再回到定時器0中斷服務程序。否則不會。
答案2:肯定會進入中斷的;外部中斷1的觸發(fā)條件滿足后會置位外部1的中斷標志,即使后來外部中斷1的觸發(fā)條件消失了,也不會清除已置位的中斷標志,所以等定時器0的中斷處理完后,程序判斷外部中斷的中斷標志為1后依然會進入外部中斷1處理程序的,只有在外部中斷1處理程序中執(zhí)行reti指令才會硬件清除外部中斷1的中斷標志(這也正是為什么中斷返回使用reti指令而不可以用ret替換的原因)
評論