中斷如何處理
當(dāng)CPU(中央處理器)執(zhí)行一條現(xiàn)行指令的時(shí)候,如果外設(shè)向CPU發(fā)出中斷請(qǐng)求,那么CPU在滿足響應(yīng)的情況下,將發(fā)出中斷響應(yīng)信號(hào),與此同時(shí)關(guān)閉中斷,表示CPU不在受理另外一個(gè)設(shè)備的中斷。這時(shí),CPU將尋找中斷請(qǐng)求源是哪一個(gè)設(shè)備,并保存CPU自己的程序計(jì)數(shù)器(PC)的內(nèi)容。然后,他將轉(zhuǎn)移到處理該中斷源的中斷服務(wù)程序。CPU在保存現(xiàn)場(chǎng)信息,設(shè)備服務(wù)(如交換數(shù)據(jù))以后,將恢復(fù)現(xiàn)場(chǎng)信息。在這些動(dòng)作完成以后,開放中斷,并返回到原來被中斷的主程序的下一條指令。
在微機(jī)系統(tǒng)中,對(duì)于外部中斷,中斷請(qǐng)求信號(hào)是由外部設(shè)備產(chǎn)生,并施加到CPU的NMI或INTR引腳上,CPU通過不斷地檢測(cè)NMI和INTR引腳信號(hào)來識(shí) 別是否有中斷請(qǐng)求發(fā)生。對(duì)于內(nèi)部中斷,中斷請(qǐng)求方式不需要外部施加信號(hào)激發(fā),而是通過內(nèi)部中斷控制邏輯去調(diào)用。無論是外部中斷還是內(nèi)部中斷,中斷處理過程 都要經(jīng)歷以下步驟: 請(qǐng)求中斷→響應(yīng)中斷→關(guān)閉中斷→保留斷點(diǎn)→中斷源識(shí)別→保護(hù)現(xiàn)場(chǎng)→中斷服務(wù)子程序→恢復(fù)現(xiàn)場(chǎng)→中斷返回。
請(qǐng)求中斷當(dāng)某一中斷源需要CPU為其進(jìn)行中斷服務(wù)時(shí),就輸出中斷請(qǐng)求信號(hào),使中斷控制系統(tǒng)的中斷請(qǐng)求觸發(fā)器置位,向CPU請(qǐng)求中斷。系統(tǒng)要求中斷請(qǐng)求信號(hào)一直保持到CPU對(duì)其進(jìn)行中斷響應(yīng)為止。
中斷響應(yīng)CPU對(duì)系統(tǒng)內(nèi)部中斷源提出的中斷請(qǐng)求必須響應(yīng),而且自動(dòng)取得中斷服務(wù)子程序的入口地址,執(zhí)行中斷 服務(wù)子程序。對(duì)于外部中斷,CPU在執(zhí)行當(dāng)前指令的最后一個(gè)時(shí)鐘周期去查詢INTR引腳,若查詢到中斷請(qǐng)求信號(hào)有效,同時(shí)在系統(tǒng)開中斷(即IF=1)的情 況下,CPU向發(fā)出中斷請(qǐng)求的外設(shè)回送一個(gè)低電平有效的中斷應(yīng)答信號(hào),作為對(duì)中斷請(qǐng)求INTR的應(yīng)答,系統(tǒng)自動(dòng)進(jìn)入中斷響應(yīng)周期。
關(guān)閉中斷CPU響應(yīng)中斷后,輸出中斷響應(yīng)信號(hào),自動(dòng)將狀態(tài)標(biāo)志寄存器FR或EFR的內(nèi)容壓入堆棧保護(hù)起來,然后將FR或EFR中的中斷標(biāo)志位IF與陷阱標(biāo)志位TF清零,從而自動(dòng)關(guān)閉外部硬件中斷。因?yàn)镃PU剛進(jìn)入中斷時(shí)要保護(hù)現(xiàn)場(chǎng),主要涉及堆棧操作,此時(shí)不能再響應(yīng)中斷,否則將造成系統(tǒng)混亂。
保護(hù)斷點(diǎn)保護(hù)斷點(diǎn)就是將CS和IP/EIP的當(dāng)前內(nèi)容壓入堆棧保存,以便中斷處理完畢后能返回被中斷的原程序繼續(xù)執(zhí)行,這一過程也是由CPU自動(dòng)完成。
中斷源識(shí)別當(dāng)系統(tǒng)中有多個(gè)中斷源時(shí),一旦有中斷請(qǐng)求,CPU必須確定是哪一個(gè)中斷源提出的中斷請(qǐng)求,并由中斷控制器給出中斷服務(wù)子程序的入口地址,裝入CS與IP/EIP兩個(gè)寄存器。CPU轉(zhuǎn)入相應(yīng)的中斷服務(wù)子程序開始執(zhí)行。
保護(hù)現(xiàn)場(chǎng)主程序和中斷服務(wù)子程序都要使用CPU內(nèi)部寄存器等資源,為使中斷處理程序不破壞主程序中寄存器的內(nèi)容,應(yīng)先將斷點(diǎn)處各寄存器的內(nèi)容壓入堆棧保護(hù)起來,再進(jìn)入的中斷處理?,F(xiàn)場(chǎng)保護(hù)是由用戶使用PUSH指令來實(shí)現(xiàn)的。