第二節(jié) 中斷及中斷系統(tǒng)
2.1 中斷的概念
1、 中斷與中斷系統(tǒng)
"中斷(Interrupt)"是一種操作,它使CPU中止正在執(zhí)行的程序,而轉(zhuǎn)入稱為"中斷處理程序(Interrupt Handler)"(或稱中斷服務(wù)程序Interrupt Service,或稱中斷例程Interrupt Routine)的程序。當(dāng)中斷處理程序執(zhí)行完后,CPU接著執(zhí)行被中斷的程序(相對于中斷處理程序來說,被中斷的程序稱為主程序)。

為了實(shí)現(xiàn)中斷功能而設(shè)置的硬件和軟件系統(tǒng)稱為中斷系統(tǒng)。
2、 中斷源
引起中斷的原因或發(fā)出中斷請求的來源,稱為中斷源,通常中斷源有以下幾種:
?。?) 通用的I/O設(shè)備。如鍵盤、打印機(jī)等。
?。?) 數(shù)據(jù)通道中斷源。如磁盤、磁帶、光盤等設(shè)備。
?。?) 實(shí)時(shí)時(shí)種(RTC)。
?。?) 故障源。如電源掉電、存儲(chǔ)器出錯(cuò)、運(yùn)算溢出等。
?。?) 軟件設(shè)置的中斷源。如中斷指令I(lǐng)NT產(chǎn)生的中斷。
(6) 為調(diào)試程序而設(shè)置的中斷源。如斷點(diǎn)中斷、單步中斷。
根據(jù)中斷源的性質(zhì),可以分為硬件中斷和軟件中斷。硬件中斷源產(chǎn)生一個(gè)硬件請求信號(hào),該信號(hào)連接到CPU的INTR或NMI引腳,使CPU執(zhí)行中斷處理。硬件中斷又稱為外部中斷。軟件中斷源是CPU根據(jù)指令(如INT指令)或內(nèi)部狀態(tài)(如運(yùn)算溢出、單步標(biāo)志TF)產(chǎn)生的中斷又稱為內(nèi)部中斷。
3、 中斷的用途
?。?) 并行操作。有了中斷功能后,CPU可以與多個(gè)外設(shè)并行工作。
CPU在啟動(dòng)某外設(shè)后,不必等待該外設(shè),而可以繼續(xù)執(zhí)行主程序,這樣,CPU與外設(shè)并行工作。如果CPU在主程序中啟動(dòng)了另一個(gè)外設(shè),則CPU與多個(gè)外設(shè)并行工作。
當(dāng)某外設(shè)準(zhǔn)備好后,主動(dòng)向CPU發(fā)出中斷請求,CPU在中斷處理程序中對該外設(shè)進(jìn)行處理。中斷處理執(zhí)行完后,CPU又返回主程序執(zhí)行。
(2) 實(shí)時(shí)處理。
實(shí)時(shí)處理即及時(shí)處理(在規(guī)定的時(shí)間內(nèi)處理)。有了中斷功能后,當(dāng)外設(shè)需要CPU處理時(shí),向CPU發(fā)出中斷請求,CPU立即響應(yīng)中斷,使該請求被立即處理,提高了系統(tǒng)的實(shí)時(shí)性。
在程序查詢方式下,不能保證實(shí)時(shí)性。因?yàn)?,?dāng)某外設(shè)需要處理時(shí),CPU可能正在查詢其它外設(shè)。
?。?) 故障處理。
系統(tǒng)設(shè)計(jì)人員把系統(tǒng)中可能出現(xiàn)的故障的處理程序設(shè)計(jì)為中斷處理程序,當(dāng)出現(xiàn)故障時(shí),CPU自動(dòng)轉(zhuǎn)入相應(yīng)的中斷處理程序,對該故障進(jìn)行處理,而不需要報(bào)告工作人員。
2.2 中斷處理過程
二、 中斷處理過程
六步:中斷請求、中斷響應(yīng)、保護(hù)斷點(diǎn)和現(xiàn)場、執(zhí)行中斷處理程序、恢復(fù)斷點(diǎn)和現(xiàn)場、中斷返回。

中斷處理過程是硬件和軟件相結(jié)合的過程,中斷處理程序是軟件,其余過程均為硬件動(dòng)作。
1、 CPU響應(yīng)中斷的條件
(1) 請求觸發(fā)器和屏蔽觸發(fā)器。
中斷請求信號(hào)必須一直有效,直到CPU響應(yīng)中斷后才能清除,對于每一個(gè)中斷源,一般用一個(gè)"請求觸發(fā)器"來保存外設(shè)的中斷請求。
在多個(gè)中斷源請求中斷的情況下,為了增加控制的靈活性,在每個(gè)外設(shè)的接口電路中,設(shè)置一個(gè)"中斷屏蔽觸發(fā)器"。只有該觸發(fā)器為1時(shí),外設(shè)的中斷請求才會(huì)被送到CPU。
具有中斷請求觸發(fā)器和屏蔽觸發(fā)器的接口電路如圖:

注意:
① 中斷請求信號(hào)只能保持到CPU響應(yīng)中斷,CPU響應(yīng)中斷后必須清除請求信號(hào)??梢杂肅PU的響應(yīng)信號(hào) 清除中斷請求信號(hào),或在中斷處理程序中用軟件清除中斷請求信號(hào)。上圖中,在中斷處理程序中用指令:
IN AL,ADD_DATA
清除中斷請求信號(hào).
② 上圖中,中斷屏蔽觸發(fā)器為1時(shí),外設(shè)的中斷請求才會(huì)被送到CPU。
在主程序中,用指令:
MOV AL,01H
OUT ADD_EN,AL
使中斷屏蔽觸發(fā)器為1。
在某些中斷控制邏輯中(如中斷控制器Intel 8259A),中斷屏蔽觸發(fā)器為0時(shí),外設(shè)的中斷請求才會(huì)被送到CPU。
(2) CPU允許中斷
當(dāng)CPU標(biāo)志寄存器中"中斷允許標(biāo)志IF"置1時(shí),CPU才能響應(yīng)INTR信號(hào)線上的請求。否則,即使INTR上有請求,CPU也不響應(yīng)。
指令STI使IF=1,允許CPU響應(yīng)INTR請求,稱為"開中斷"。
指令CLI使IF=0,禁止CPU響應(yīng)INTR請求,稱為"關(guān)中斷"。
注意:NMI上的中斷請求不受IF標(biāo)志的影響,當(dāng)NMI上出現(xiàn)請求時(shí),無論IF的值是什么,CPU均要響應(yīng)NMI上的請求。
(3)在當(dāng)前指令結(jié)束后,CPU響應(yīng)中斷。(執(zhí)行一條指令所需要的時(shí)間,稱為一個(gè)指令周期。一條指令一般包含幾個(gè)基本操作,稱為總線操作或總線通訊。一次總線操作所需的時(shí)間稱為總線周期或機(jī)器周期。8086的基本總線周期由4個(gè)T狀態(tài)組成:T1、T2、T3、T4)。即CPU在最后一個(gè)機(jī)器周期的最后一個(gè)T狀態(tài)時(shí),可以響應(yīng)中斷請求。

2、 CPU對中斷的響應(yīng)
當(dāng)滿足上述條件后,CPU響應(yīng)中斷,執(zhí)行以下任務(wù):
(1) 發(fā)出中斷響應(yīng)信號(hào)INTA(目的:獲得中斷類型碼)。
(2) 把標(biāo)志寄存器的值存入堆棧。
(3) 關(guān)中斷(使標(biāo)志寄存器中IF=0。目的:禁止CPU響應(yīng)新的中斷請求)。同時(shí)使TF=0,禁止單步執(zhí)行中斷處理程序。
(4) 保護(hù)斷點(diǎn)。即把下一條指令的地址(等于當(dāng)前CS和IP的值)存入堆棧。(目的:中斷處理完后能接著該指令執(zhí)行)。
(5) 根據(jù)中斷類型碼,從中斷向量表中獲得中斷處理程序的入口地址。
(6) 保護(hù)現(xiàn)場。(用PUSH指令把中斷處理程序中要改變值的寄存器的值存入堆棧)。
(7) 執(zhí)行中斷處理。
(8) 恢復(fù)現(xiàn)場。(用POP指令從堆棧中恢復(fù)中斷處理程序中改變值的寄存器的值)。
(9) 開中斷(用STI指令使IF=1)。
(10) 中斷返回(執(zhí)行IRET指令,從堆棧中取出下一條指令的地址送CS和IP,從堆棧中取出標(biāo)志寄存器的值,CPU接著該指令執(zhí)行)。
注意:
?、?第(1)~(5)步是CPU的硬件動(dòng)作。第(6)~(10)步屬于中斷處理程序軟件。
?、?中斷處理程序中,開中斷的時(shí)機(jī)取決于具體應(yīng)用。如果該中斷處理程序執(zhí)行期間,不允許CPU響應(yīng)其它中斷,則在中斷返回前開中斷(如上述順序),否則在保護(hù)現(xiàn)場后就開中斷。
2.3 中斷的優(yōu)先權(quán)
三、 中斷的優(yōu)先權(quán)(優(yōu)先級(jí))
多個(gè)設(shè)備使用中斷方式與CPU交換數(shù)據(jù)時(shí),需解決優(yōu)先級(jí)問題。CPU對中斷的優(yōu)先權(quán)處理的一般原則是:
?。?) 不同級(jí)的中斷請求同時(shí)發(fā)生時(shí),先處理優(yōu)先級(jí)高的請求。
?。?) 當(dāng)CPU正在處理低優(yōu)先級(jí)中斷的過程中,又出現(xiàn)優(yōu)先級(jí)高的請求,則CPU暫停低優(yōu)先級(jí)中斷的處理, 而優(yōu)先處理高優(yōu)先級(jí)的中斷,當(dāng)高優(yōu)先級(jí)中斷處理完后,再接著處理低優(yōu)先級(jí)中斷。這種情況稱為"多重中斷"或"中斷嵌套"。
?。?) 當(dāng)CPU正在處理某優(yōu)先級(jí)中斷的過程中,出現(xiàn)優(yōu)先級(jí)低的請求,則CPU在處理完該中斷后再響應(yīng)新的請求。
?。?) 中斷優(yōu)先級(jí)相同的請求同時(shí)發(fā)生時(shí),按預(yù)先規(guī)定的次序逐個(gè)處理。
CPU處理中斷優(yōu)先級(jí)的方法:
1.軟件查詢方式 軟件查詢方式要借助簡單的硬件電路。把多個(gè)設(shè)備的中斷請求信號(hào)相"或"作為向CPU的請求信號(hào), 任意外設(shè)有中斷請求時(shí),都可以向CPU發(fā)出INTR信號(hào)。

同時(shí),設(shè)計(jì)一個(gè)狀態(tài)寄存器,其中每一位標(biāo)識(shí)一個(gè)設(shè)備的請求情況(如,有請求時(shí),對應(yīng)位置1)。CPU在中斷處理程序中,讀入狀態(tài)寄存器的值,然后逐位檢查它們的狀態(tài)。若發(fā)現(xiàn)某位有中斷請求,就轉(zhuǎn)入相應(yīng)的中斷處理程序。

設(shè)中斷優(yōu)先級(jí)排列為:
電源故障>磁盤>磁帶>CRT>紙帶輸入>紙帶穿孔>鍵盤>打印機(jī)
部分軟件編程為:
IN AL,INT_PORT ;中斷請求狀態(tài)寄存器
TEST AL, 80H ;電源故障(bit7)優(yōu)先級(jí)最高,先查詢
JNZ PWZ ;bit7=1,出現(xiàn)電源故障中斷請求,
;轉(zhuǎn)入相應(yīng)的中斷處理程序
TEST AL, 40H ;bit6=1表示磁盤中斷請求
JNZ DISK ;轉(zhuǎn)入磁盤中斷處理程序
┆
2、 硬件優(yōu)先級(jí)排隊(duì)電路
(1).鏈?zhǔn)脚抨?duì)電路-菊花鏈法
在每個(gè)外設(shè)對應(yīng)的接口電路上連接一個(gè)邏輯電路,這些邏輯電路構(gòu)成一個(gè)鏈,稱為菊花鏈。

當(dāng)某個(gè)或幾個(gè)外設(shè)請求中斷時(shí),優(yōu)先級(jí)排隊(duì)電路設(shè)置中斷(F/F),并向CPU發(fā)出INTR信號(hào)(圖中未畫出),CPU響應(yīng)中斷時(shí)發(fā)出INTA信號(hào)。INTA信號(hào)只能傳送到排隊(duì)電路的前面,因此排隊(duì)電路前面的外設(shè)獲得允許信號(hào)(圖中的中斷輸出),送出中斷類型碼。
排隊(duì)電路后面的外設(shè)收不到INTA信號(hào)。因此,接口在菊花鏈中的位置,決定了其優(yōu)先級(jí),越靠近排隊(duì)電路前面的外設(shè),優(yōu)先級(jí)越高。
(2)優(yōu)先級(jí)編碼集成芯片
在微機(jī)中,典型地使用可編程中斷控制器Intel 8259管理多個(gè)外設(shè)的中斷請求。在中斷控制器內(nèi)部,有一個(gè)優(yōu)先權(quán)編碼排隊(duì)電路,如圖所示:

8條中斷輸入線的任意一條請求信號(hào),經(jīng)"8到3優(yōu)先權(quán)編碼器"5產(chǎn)生三位二進(jìn)制編碼A2A1A0,優(yōu)先權(quán)最高的請求編碼為111,優(yōu)先權(quán)最低的請求編碼為000。若有多個(gè)請求線同時(shí)請求,編碼器僅輸出優(yōu)先權(quán)最高的編碼。
當(dāng)CPU尚未處理任何中斷時(shí),"優(yōu)先權(quán)失效"信號(hào)為1,此時(shí),任意請求線有請求時(shí),均可以經(jīng)“或門7”、"與門2”、“或門3”向CPU申請中斷,且該中斷的編碼經(jīng)過CPU數(shù)據(jù)總線送至"優(yōu)先權(quán)寄存器6"。 優(yōu)先權(quán)寄存器中總是存放著當(dāng)前正在處理的中斷的編碼(B2B1B0)。
當(dāng)出現(xiàn)新的請求時(shí),新請求的編碼A2A1A0送到比較器,只有當(dāng)新請求的優(yōu)先級(jí)A2A1A0大于正在處理的中斷的編碼B2B1B0時(shí),比較器輸出1,經(jīng)“與門1”、“或門3”向CPU申請中斷,同時(shí),新中斷的編碼經(jīng)過CPU數(shù)據(jù)總線送至“優(yōu)先權(quán)寄存器6”。
