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