中斷系統(tǒng)是計(jì)算機(jī)或者單片機(jī)的主要功能部件。
有了中斷系統(tǒng),便可以使微處理器具備對(duì)外部的異步事件進(jìn)行處理的能力。
當(dāng)微處理器的CPU正在執(zhí)行程序的過(guò)程中,如果外部硬件或者內(nèi)部組件有緊急的請(qǐng)求(如通信,斷點(diǎn),發(fā)生重大故障等),中斷系統(tǒng)就可以將當(dāng)前的程序暫停,優(yōu)先處理這些中斷請(qǐng)求。
這種處理方式,對(duì)整個(gè)系統(tǒng)的穩(wěn)定性,健壯性至關(guān)重要,同時(shí)也能大大提高處理器的效率,使得系統(tǒng)的應(yīng)用更加靈活多變。
中斷的概念
中斷是指單片機(jī)在執(zhí)行程序的過(guò)程中,當(dāng)出現(xiàn)異常情況或特殊請(qǐng)求時(shí),單片機(jī)停止當(dāng)前程序的運(yùn)行,轉(zhuǎn)向?qū)@些異常情況或特殊請(qǐng)求進(jìn)行處理,當(dāng)處理結(jié)束后再返回原程序的間斷處,繼續(xù)執(zhí)行原程序,這一現(xiàn)象稱(chēng)為中斷。
中斷是單片機(jī)實(shí)時(shí)處理內(nèi)部或外部事件的一種內(nèi)部機(jī)制。
原來(lái)正在執(zhí)行的程序稱(chēng)為主程序;用來(lái)處理突變事件或故障的程序稱(chēng)為中斷服務(wù)子程序;導(dǎo)致中斷產(chǎn)生的原因稱(chēng)為中斷源;主程序被中斷源打斷,轉(zhuǎn)去執(zhí)行中斷服務(wù)子程序的位置稱(chēng)為斷點(diǎn)。
中斷的作用
中斷不只是51系列單片機(jī)所特有的,目前基本所有的微處理器均具備完善的中斷系統(tǒng)。
中斷系統(tǒng)是一個(gè)非常實(shí)用的微處理器組件,合理地使用中斷技術(shù),可以極大地提高單片機(jī)的工作效率和實(shí)時(shí)性。其主要作用體現(xiàn)在下面兩個(gè)方面。
1)對(duì)外部信號(hào)的實(shí)時(shí)處理
在基于單片機(jī)的應(yīng)用系統(tǒng)中,單片機(jī)作為整個(gè)系統(tǒng)的控制和處理中心,它和外圍設(shè)備的信息交換非常頻繁,這種信息交換一般采用兩種工作方式,一種是查詢方式,另外一種為中斷方式。
2)故障處理
在單片機(jī)系統(tǒng)運(yùn)行過(guò)程中,會(huì)有很多無(wú)法預(yù)測(cè)的故障或錯(cuò)誤產(chǎn)生,例如掉電,計(jì)算溢出等。
在產(chǎn)生掉電故障時(shí),會(huì)立即執(zhí)行相應(yīng)的中斷處理,保護(hù)重要的系統(tǒng)參數(shù),以便后續(xù)的系統(tǒng)恢復(fù)。
當(dāng)發(fā)生錯(cuò)誤時(shí),也會(huì)有相應(yīng)的中斷處理子程序運(yùn)行,自動(dòng)修改算法參數(shù)并發(fā)出警告。這些都采用的是中斷處理方式。
中斷源的分類(lèi)
從中斷執(zhí)行的角度來(lái)看,可以分為兩類(lèi)。
1)處理器預(yù)先考慮的中斷
這些中斷的處理是處理器在設(shè)計(jì)之初就進(jìn)行考慮了的。如除零中斷,溢出中斷,掉電中斷,集成的接口電路中斷。
這類(lèi)中斷是我們常見(jiàn)的一類(lèi)中斷,幾乎所有的微處理器都預(yù)先定義了這類(lèi)中斷。此類(lèi)中斷發(fā)生之后,硬件可以快速地找到相應(yīng)的中斷服務(wù)子程序去執(zhí)行相應(yīng)的處理。
2)處理器沒(méi)有預(yù)先考慮而需要擴(kuò)展的中斷
這里中斷通常與實(shí)際的應(yīng)用有關(guān),同時(shí),微處理器的中斷資源也是有限的,當(dāng)中斷資源不夠用時(shí),就需要擴(kuò)展不同的中斷。
簡(jiǎn)單中斷的處理過(guò)程
當(dāng)有中斷產(chǎn)生時(shí),處理器在執(zhí)行完當(dāng)前的指令后,如果允許響應(yīng)中斷的條件滿足,處理器就會(huì)轉(zhuǎn)向中斷服務(wù)子程序,中斷系統(tǒng)會(huì)自動(dòng)保存斷點(diǎn),當(dāng)執(zhí)行完中斷服務(wù)子程序后,再返回?cái)帱c(diǎn)處繼續(xù)執(zhí)行原程序。
為了更好了解這個(gè)過(guò)程,把這個(gè)過(guò)程分成如下幾個(gè)步驟。
1)中斷源識(shí)別和中斷入口地址查找
當(dāng)處理器收到中斷請(qǐng)求,并允許響應(yīng)時(shí),首先要做的就是識(shí)別中斷源,判斷是哪個(gè)中斷源發(fā)出的中斷請(qǐng)求,然后根據(jù)中斷源找到相應(yīng)的中斷入口地址。
如何找到中斷入口地址,不同的處理器有不同的處理方法,如在80X86系列處理器中,中斷源的識(shí)別和中斷入口地址查找是按中斷源的類(lèi)別分別處理的,過(guò)程較為復(fù)雜。
但51單片機(jī)這個(gè)過(guò)程被大大簡(jiǎn)化了,51系列基本型單片機(jī)只有5個(gè)中斷源,這5個(gè)中斷源的中斷程序入口地址是固定的。
2)斷點(diǎn)保護(hù)
在處理器找到中斷程序的入口地址后,就會(huì)暫停主程序的執(zhí)行,轉(zhuǎn)去執(zhí)行終端服務(wù)子程序。
為了在執(zhí)行完成中斷服務(wù)子程序后,能夠返回原程序斷點(diǎn)處接著執(zhí)行,就需要記憶斷點(diǎn)的位置。
斷點(diǎn)就是中斷返回后將要執(zhí)行的指令的地址,保護(hù)斷點(diǎn)就是保護(hù)斷點(diǎn)地址,中斷發(fā)生時(shí),CPU硬件自動(dòng)把這個(gè)地址值壓入堆棧,當(dāng)執(zhí)行完成中斷子程序后,通過(guò)RETI指令,再把這個(gè)地址值從堆棧中彈出送給PC,從而實(shí)現(xiàn)中斷返回。
3)執(zhí)行中斷服務(wù)子程序
中斷服務(wù)子程序是中斷的主題。程序的具體內(nèi)容由用戶編程決定,不同的中斷在不同的應(yīng)用場(chǎng)合下,子程序的內(nèi)容是不同的。
中斷發(fā)生后,在主程序執(zhí)行時(shí),很多計(jì)算的中間結(jié)果都是使用內(nèi)部寄存器來(lái)保存的,在主程序和中斷服務(wù)子程序中很可能會(huì)用到同一個(gè)寄存器,比如我們最常用的累加器ACC等。
因此在中斷子程序開(kāi)始之前,需要把這些公用寄存器的內(nèi)容進(jìn)行保護(hù),這就是保護(hù)現(xiàn)場(chǎng)。保護(hù)現(xiàn)場(chǎng)和保護(hù)斷點(diǎn)十分類(lèi)似,所不同的是,保護(hù)斷點(diǎn)是硬件自動(dòng)完成的,而保護(hù)現(xiàn)場(chǎng)則需要用戶編寫(xiě)程序?qū)崿F(xiàn)。
其中保護(hù)現(xiàn)場(chǎng)除了利用堆棧來(lái)進(jìn)行保護(hù)外,還有一種比較有效的方法就是切換工作寄存器組。
我們已經(jīng)知道80C51有4組工作寄存器組,當(dāng)中斷發(fā)生后,在執(zhí)行子程序之前,可以先切換到同主程序不同的工作寄存器組,在中斷子程序執(zhí)行完成之后,再切換主程序使用的工作寄存器組。
4)中斷返回
執(zhí)行完成中斷服務(wù)子程序之后,返回?cái)帱c(diǎn)處繼續(xù)執(zhí)行主程序。在80C51單片機(jī)中,就是執(zhí)行RETI指令,這時(shí),前面保護(hù)的斷點(diǎn)就會(huì)從堆棧中彈出,送入程序計(jì)數(shù)器PC,繼續(xù)主程序的執(zhí)行。
復(fù)雜中斷的執(zhí)行
在實(shí)際的應(yīng)用系統(tǒng)中,往往有多個(gè)中斷源同時(shí)向處理器申請(qǐng)中斷,也有可能中斷產(chǎn)生時(shí),處理器正在執(zhí)行的就是某個(gè)其他中斷服務(wù)子程序,那么在這些情況下CPU該如何處理呢?
1)中斷優(yōu)先級(jí)
當(dāng)多個(gè)中斷源同時(shí)提出中斷申請(qǐng)時(shí),處理器先處理哪個(gè)?
為此提出了中斷優(yōu)先級(jí)的概念,給每個(gè)中斷源賦予不同的優(yōu)先級(jí),在同一時(shí)刻,有多個(gè)中斷請(qǐng)求時(shí),中斷系統(tǒng)按照中斷源優(yōu)先級(jí)的高低逐次響應(yīng),即優(yōu)先級(jí)高的中斷優(yōu)先處理,處理完畢后,再處理優(yōu)先級(jí)低的中斷。
2)中斷嵌套
如果處理器正在處理一個(gè)中斷,這時(shí)又有一個(gè)中斷產(chǎn)生了,那么,處理器是否響應(yīng)新的中斷?
這時(shí)有兩種處理方法。一種方法是處理器不響應(yīng)新的中斷,這種中斷管理機(jī)制比較簡(jiǎn)單。
這種中斷處理可以保證中斷處理的實(shí)時(shí)性。但是有時(shí)會(huì)導(dǎo)致比較嚴(yán)重的后果,比如一些重要的中斷(如斷電)得不到及時(shí)處理,造成硬件損壞。
另一種處理方法是處理器響應(yīng)新的中斷,這時(shí)就會(huì)出現(xiàn)中斷嵌套。
中斷嵌套提高了處理器的處理能力,理論上,中斷嵌套的層數(shù)可以很多,但是嵌套層數(shù)太多,由于每次嵌套都需要保護(hù)斷點(diǎn)和現(xiàn)場(chǎng),從而導(dǎo)致堆棧生長(zhǎng)得太大,這對(duì)資源有限的單片機(jī)會(huì)造成比較大的負(fù)擔(dān)。
另外,會(huì)導(dǎo)致最早響應(yīng)的中斷服務(wù)子程序可能要等待很久,才能執(zhí)行完本身的中斷任務(wù),這明顯降低了中斷處理的及時(shí)性。
因此在微機(jī)系統(tǒng),允許中斷嵌套層數(shù)最好要根據(jù)系統(tǒng)的實(shí)時(shí)性和資源來(lái)綜合考慮,在80C51單片機(jī)中,允許最大的層數(shù)為2。
80C51的中斷系統(tǒng)結(jié)構(gòu)及中斷源
在基本型80C51單片機(jī)中,共有5個(gè)中斷源,即外部中斷0/1,定時(shí)/計(jì)數(shù)器0中斷T0,定時(shí)/計(jì)數(shù)器1中斷T1,串行通信接口中斷RX,TX。中斷系統(tǒng)結(jié)構(gòu)如下圖。
從結(jié)構(gòu)圖可以看出,中斷控制系統(tǒng)是由相應(yīng)的寄存器所控制的,并不是一有中斷,CPU就會(huì)響應(yīng)這個(gè)中斷請(qǐng)求。
從左往右看,可以發(fā)現(xiàn)外部中斷0和1比較特殊,控制位IT0和IT1控制外部中斷的觸發(fā)方式(下降沿觸發(fā)或者低電平觸發(fā))。
每個(gè)中斷源都有相應(yīng)的中斷請(qǐng)求標(biāo)志位(IE0,TF0,IE1,TF1,TI,RI)與其對(duì)應(yīng),其中串行通信的發(fā)送和接收分別對(duì)應(yīng)有兩個(gè)中斷請(qǐng)求標(biāo)志位(TI和RI),但是他們公用一個(gè)中斷號(hào),即處理器識(shí)別為一個(gè)中斷源,具體區(qū)分二者需要軟件查詢這兩個(gè)中斷標(biāo)志位。
每個(gè)中斷源都有相應(yīng)的中斷子開(kāi)關(guān)(EX0,ET0,EX1,ET1,ES),只有這個(gè)控制位為1時(shí),并且總開(kāi)關(guān)EA為1時(shí),才可能產(chǎn)生中斷。
最右邊的優(yōu)先級(jí)選擇開(kāi)關(guān)(PX0,PT0,PX1,PT1,PS)用于確定每個(gè)中斷源的優(yōu)先級(jí)。
操作80C51的中斷系統(tǒng),實(shí)際上也就是操作80C51內(nèi)部的特殊功能寄存器。
中斷請(qǐng)求標(biāo)志
80C51系列單片機(jī)共有6個(gè)中斷申請(qǐng)標(biāo)志位,分布在TCON和SCON寄存器中。
其中外部中斷和定時(shí)器溢出中斷由TCON控制,串行口中斷由SCON控制。
單片機(jī)復(fù)位后所有中斷請(qǐng)求標(biāo)志位清0,表示沒(méi)有中斷請(qǐng)求,為1時(shí),表示有相應(yīng)的中斷請(qǐng)求。
1)TCON中的請(qǐng)求標(biāo)志
TF1:定時(shí)/計(jì)數(shù)器1中斷請(qǐng)求標(biāo)志位,當(dāng)計(jì)數(shù)器計(jì)數(shù)溢出時(shí),中斷被響應(yīng)后,轉(zhuǎn)向相應(yīng)的中斷服務(wù)程序,由硬件自動(dòng)置TF1=0,在查詢方式下由軟件清除。
TF0:定時(shí)/計(jì)數(shù)器0中斷請(qǐng)求標(biāo)志位,功能與TF1相同。
IE1:外部中斷1請(qǐng)求標(biāo)志位。在外部中斷設(shè)置為下降沿觸發(fā)時(shí),INT1腳的下降沿置該位為1,中斷被響應(yīng)后,該位由硬件自動(dòng)清0;在外部中斷設(shè)為低電平觸發(fā)時(shí),當(dāng)INT1為低電平時(shí),該位置1,此時(shí),撤銷(xiāo)中斷的辦法只有把外部輸入的低電平變?yōu)楦唠娖健?/p>
IT1:外部中斷1觸發(fā)方式選擇位。為1表示下降沿觸發(fā),為0表示低電平觸發(fā)。
IE0:外部中斷0請(qǐng)求標(biāo)志位,功能與IE1相同。
IT0:外部中斷0觸發(fā)方式選擇位。功能與IT1相同。
定時(shí)/計(jì)數(shù)器中斷:當(dāng)定時(shí)/計(jì)數(shù)器溢出時(shí),在最近機(jī)器周期的S5P2期間設(shè)置TCON的TF0或TF1為1.中斷請(qǐng)求標(biāo)志置1后,會(huì)一直保持到中斷被響應(yīng),然后由單片機(jī)的內(nèi)部硬件自動(dòng)對(duì)它清0。在查詢方式下只能軟件清0。
外部中斷:80C51單片機(jī)在每個(gè)機(jī)器周期的S5P2期間掃描外部中斷輸入引腳的電平狀態(tài)。當(dāng)外部中斷設(shè)置為下降沿觸發(fā)時(shí),若處理器在連續(xù)兩個(gè)機(jī)器周期掃描到INT0引腳的電平先后為高電平和低電平時(shí),就會(huì)置IE0位1,表示有外部中斷申請(qǐng),該中斷申請(qǐng)信號(hào)會(huì)一直保持,一直到中斷被響應(yīng),后硬件清0。
2)SCON中的請(qǐng)求標(biāo)志
TI為串口發(fā)送數(shù)據(jù)的中斷請(qǐng)求位,RI為串口接收數(shù)據(jù)的中斷請(qǐng)求位。
在結(jié)構(gòu)圖中,可以知道,TI和RI通過(guò)與門(mén)后輸出,只要有一個(gè)為1,就可以向CPU申請(qǐng)中斷,其中斷入口地址是相同的,被認(rèn)為是一個(gè)中斷源。
由此可知,在每個(gè)機(jī)器周期的S5P2期間,中斷請(qǐng)求標(biāo)志位會(huì)因?yàn)橹袛嘣瓷暾?qǐng)中斷而設(shè)置成1,如果有1位或者多位為1,則表示有多個(gè)中斷源同時(shí)向處理器申請(qǐng)中斷。
中斷允許控制
IE寄存器內(nèi)容包含各個(gè)中斷源使能控制位和全局中斷使能控制位。
EA:全局中斷使能控制位;
ES:串口中斷使能控制位;
ET1:定時(shí)/計(jì)數(shù)器1中斷使能控制位;
EX1:外部中斷1使能控制位;
ET0:定時(shí)/計(jì)數(shù)器0中斷使能控制位;
EX0:外部中斷0使能控制位。
中斷優(yōu)先權(quán)管理和中斷嵌套原則
某個(gè)機(jī)器周期的S5P2期間,若有中斷請(qǐng)求標(biāo)志位有效時(shí),處理器會(huì)在下一個(gè)機(jī)器周期的S6期間就會(huì)根據(jù)設(shè)置的中斷優(yōu)先等級(jí)響應(yīng)中斷,并在再下一個(gè)機(jī)器周期的S1期間開(kāi)始執(zhí)行中斷服務(wù)子程序。
80C51單片機(jī)支持兩級(jí)中斷優(yōu)先級(jí),允許用戶設(shè)置每個(gè)中斷源為高級(jí)或低級(jí)中斷。由中斷優(yōu)先級(jí)標(biāo)志位來(lái)設(shè)置。對(duì)應(yīng)位為1則設(shè)置為高優(yōu)先級(jí)中斷,反之為低優(yōu)先級(jí)。這些設(shè)置位分布在IP寄存器中。
其中斷裁決的原則是:高級(jí)中斷和低級(jí)中斷同時(shí)申請(qǐng)中斷時(shí),優(yōu)先響應(yīng)高級(jí)中斷;當(dāng)同級(jí)有多個(gè)中斷同時(shí)發(fā)生時(shí),則有中斷優(yōu)先權(quán)排隊(duì)問(wèn)題,這時(shí),按由中斷系統(tǒng)硬件決定的自然優(yōu)先級(jí)順序來(lái)處理。
80C51單片機(jī)的中斷嵌套原則是:高級(jí)中斷可以打斷低級(jí)中斷,低級(jí)中斷不能打斷高級(jí)中斷,同級(jí)中斷不能打斷同級(jí)中斷。
IP寄存器如下。
PS:串口中斷優(yōu)先級(jí)設(shè)置位;
PT1:定時(shí)/計(jì)數(shù)器1中斷優(yōu)先級(jí)設(shè)置位;
PX1:外部中斷1優(yōu)先級(jí)設(shè)置位;
PT0:定時(shí)/計(jì)數(shù)器0中斷優(yōu)先級(jí)設(shè)置位;
PX0:外部中斷0優(yōu)先級(jí)設(shè)置位;
中斷響應(yīng)的條件
當(dāng)中斷源發(fā)出中斷請(qǐng)求信號(hào)時(shí),單片機(jī)并不總能對(duì)該中斷進(jìn)行響應(yīng),一般來(lái)說(shuō),單片機(jī)能響應(yīng)中斷應(yīng)注意以下幾個(gè)方面:
1)首先,全局中斷使能控制位EA=1;
2)對(duì)應(yīng)中斷使能控制位有效;
3)如果程序正在執(zhí)行讀/寫(xiě)寄存器IE或IP指令,則執(zhí)行完該指令后,需要再執(zhí)行一條其他指令才可以響應(yīng)中斷;
4)如果程序正在執(zhí)行返回指令,則執(zhí)行完該指令后,需要再執(zhí)行一條其他指令才可以響應(yīng)中斷,這個(gè)特性常用來(lái)實(shí)現(xiàn)硬件單步執(zhí)行;
5)任何正在執(zhí)行的指令在未完成前,中斷請(qǐng)求都不會(huì)響應(yīng);
6)考慮中斷優(yōu)先級(jí)或者中斷嵌套時(shí)帶來(lái)的延時(shí)。
中斷服務(wù)程序的執(zhí)行
當(dāng)前面所有的中斷響應(yīng)條件都滿足時(shí),處理器在當(dāng)前指令執(zhí)行完成的下一個(gè)機(jī)器周期內(nèi),由硬件自動(dòng)執(zhí)行一條LCALL執(zhí)行,跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)子程序入口地址去執(zhí)行中斷程序。
在80C51中,中斷程序入口地址是固定的。兩個(gè)相鄰的中斷入口地址很接近,只有8字節(jié),根本放置不了幾個(gè)代碼。
在實(shí)際應(yīng)用中,一般都將一個(gè)跳轉(zhuǎn)指令(LJMP,AJMP)放置在入口地址處,從而跳轉(zhuǎn)到其他程序空間去執(zhí)行較長(zhǎng)的中斷服務(wù)子程序。
中斷服務(wù)子程序的編寫(xiě)
當(dāng)80C51單片機(jī)響應(yīng)中斷請(qǐng)求,跳轉(zhuǎn)到相應(yīng)的中斷處理子程序時(shí),除了斷點(diǎn)保護(hù)由硬件自動(dòng)完成外,保護(hù)現(xiàn)場(chǎng),恢復(fù)現(xiàn)場(chǎng),中斷返回等都需要用戶自己編寫(xiě)。
另外,還要考慮是否支持中斷嵌套,在中斷服務(wù)子程序設(shè)置EA=1,則允許中斷嵌套,反之不允許。注意在保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)過(guò)程中需要關(guān)閉全局中斷。
中斷撤銷(xiāo)
中斷請(qǐng)求撤銷(xiāo)的目的是保證對(duì)于一次中斷請(qǐng)求標(biāo)志只執(zhí)行一次中斷響應(yīng)。
CPU響應(yīng)中斷后,需要及時(shí)將中斷請(qǐng)求標(biāo)志清除,否則將引起一個(gè)中斷信號(hào)多次觸發(fā)中斷響應(yīng)。中斷撤銷(xiāo)一般分為硬件自動(dòng)處理和軟件清除。
對(duì)于外部中斷0/1,定時(shí)/計(jì)數(shù)器0/1中斷,在中斷響應(yīng)后,由硬件自動(dòng)清除該中斷的請(qǐng)求標(biāo)志位,無(wú)須軟件處理。
對(duì)于串行接口的中斷請(qǐng)求,當(dāng)CPU響應(yīng)中斷后,硬件不會(huì)自動(dòng)清除中斷標(biāo)志位,因此需要在中斷服務(wù)程序中軟件清除。
中斷響應(yīng)時(shí)間
從中斷源發(fā)出中斷請(qǐng)求到處理器執(zhí)行該中斷服務(wù)子程序的這一段時(shí)間稱(chēng)為中斷響應(yīng)時(shí)間。
80C51中斷響應(yīng)時(shí)間的最短時(shí)間是3個(gè)機(jī)器周期(優(yōu)先權(quán)掃描1個(gè)周期,LCALL指令2個(gè)周期)。
最長(zhǎng)的響應(yīng)時(shí)間為8個(gè)機(jī)器周期,除了必要的3個(gè)周期外,考慮最壞的情況,比如當(dāng)前正在執(zhí)行RETI的第一個(gè)機(jī)器周期,那么等RETI執(zhí)行完成之后,還需再等待執(zhí)行一條指令,假設(shè)這條指令最長(zhǎng)是4個(gè)機(jī)器周期,那么就是3+1+4=8個(gè)機(jī)器周期。
評(píng)論