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