中斷優先級最高,口執行設備服務程序到結尾處,就執行恢複設備中斷現場(由棧中彈出)程序段,最後是執行中斷返回指令,將斷點由棧中彈回,口重新返回設備中斷服務程序。以此類推,到結尾處,恢複設備中斷現場,執行中斷返回指令,將斷點反彈回,返回執行設備中斷服務程序。最後是恢複主程序中斷現場,執行中斷返回指令,將斷點彈回,口返回主程序段執行主程序指令。—般情況下,我們進行程序設計時,常常使用堆棧來保護現場信息,然後才開始中斷服務。服務完畢,中斷返回前,再將現場信息從堆棧中彈出。不過,我們也可以這樣考慮,因為有兩套通用寄存器對,以及累加器和標誌寄存器。兩套寄存器的內容通過交換指令很方便進行內容的交換。在處理單級中斷時就可以使用輔助寄存器組來保護現場。這種交換操作隻用兩條交換指令就可以完成:用指令來交換累加器和標誌寄存器的內容,采用另一條指令父來交換其餘六個通用寄存器的內容。由於這兩條指令都是單字節的,所以整個交換對間隻需八個時鍾周期就可以完成。
5.3 中斷的允許和中斷的禁止
上一節曾經說過Z80的軟件屏蔽中斷可以由程序員設定允許響應,這是因為在Z80中設置了兩個中斷允許觸發器。
1.在接受時,作的暫存單元狀態用於允許或禁止屏蔽中斷。當正為狀態時,能響應屏蔽中斷請求.而它為狀態就禁止響應。而是在響應非屏蔽中斷時用來暫存的現伏態。這是因為非屏蔽中斷隨時都可以被口接受,但當接受非屏蔽中斷進入服務程序後,為防止在非屏蔽中斷服務程序期間醇產生中斷,在非屏蔽中斷被接受後要將屏蔽中斷禁止。為此就要將置,不過要求將原來的工作的狀態保存起來,這樣才能使得在進入非屏蔽中斷前的全部伏態能夠在非屏蔽中斷服務結束以後得以恢複魯Z80指令係統中設置了兩條控製和的指令:允許中斷(開中斷)指令禁止中斷(關中斷)指令。這樣,程序員就可以用程序來控製中斷允許觸發器。
2.當執行一條指令,就使清“0”,就不能響應屏蔽中斷請求,當執行一條指令,就能響應屏蔽中斷請求。
3.要指出的是,指令要在其緊跟的一條指令被執行完畢後才能起作用。如後麵是一條或指令,則隻有返回指令執行完畢後,才允許中斷。
4.若程序是可以隨時允許中斷的,在程序設計時,在程序的一開始就安排一條指令。當指令和緊跟在它後麵的一條指令執行完畢就將置,隨時可以響應中斷。
5.當非屏蔽中斷申請胃被接受後,為防止再次中斷,是將置0但不影響的伏態,這恰好就實現了在接受非屏蔽中斷時,用暫存的狀態。因為當輸入信息或執行01指令或接受屏蔽中斷後均對和兩個觸發器同時起作用(置0)而執行21指令時,又同時將它倆置1。唯獨在接受時,兩者的待遇是不同的。
6.非屏蔽中斷處理結束時,執行一條非屏蔽中斷返回指令,使的內容重新放回到,自動恢複非屏蔽中斷接受前的狀態。
7.為了便於對“允許”、“禁止”中斷伏態的測試或存儲,當執行傳送指令,能夠把狀態複寫到標誌寄存器的奇偶位上去,程序員便可以對它進行知識或存儲。
還要說明一點,21指令和01指令,是在一級上允許與禁止屏蔽中斷的接受,除此之外,程序員還可以在1/0口電路這一級上允許與禁止中斷申請,這是通過對發出中斷請求的1/0口電路寫中斷控製字來實現的。
5.4 Z80的優先中斷級
中斷優先級具有兩個含義,其一是:當多個中斷源同時發出申請時,首先響應級高的中斷源,它是用中斷排隊鏈來解決的;其二是:正在執行中斷服務程序時,又出現優先級別更高的中斷源申請中斷,則允許更高級別的中斷源中斷現行的中斷服務程序,這叫中斷嵌套或稱多重中斷。
5.4-1 中斷排隊
Z80實現中斷排隊有兩種辦法軟件排隊和硬件排隊。
一、軟件排隊
軟件排隊,是靠軟件查詢的辦法實現的。當響應中斷後,便進入一個中斷處理程序入口。這段中斷處理程序,是一段事先編排好的以優先次序進行查詢的軟件排隊程序。首先被查詢的中斷源便是優先級別最高的中斷源。找到後即轉去執行該中斷源的服務程序。Z80的非屏蔽中斷、屏蔽中斷方式均隻有一個入口。若實時有多個中斷源,—般情況下是采用軟件排隊的方法來實現中斷排隊。
它有一個中斷源寄存器,其中每一位對應一個申請中斷的外設,也就是中斷設備的申請中斷寄存器。當外設請求中斷時,中斷源寄存器相應位置“1”,在進入中斷服務程序後再將其複位。此寄存器設備號設定為卯隻,可以用指令將其內容讀入累加器。這就可以實現查詢中斷的軟件排隊。若要實現多重中斷,還要設置一個中斷屏蔽寄存器。當設備有中斷申請,又沒有被屏蔽,就能發出中斷申請。所有中斷源的中斷請求信號送入一個“與非門”的輸入端,隻要有一個外設發出中斷請求信號(有請求,沒被屏蔽)則送到口的喬庁就是低電平。當響應中斷後,進入中斷處理程序入口,開始執行軟件排隊程序。
這裏特別要提出的是,要實現多重中斷,一定要在服務程序一開始就設置一條開中斷指令。
軟件排隊方法的特點是硬設備簡單,但速度慢,特別是中斷多時更為突出,往往滿是不了實時控製係統的要求。