【微機原理與接口技術】學習筆記7 中斷和可編程中斷控制器8259A


8.1 中斷

8.1.1 中斷概念和分類

1.中斷的定義和功能

中斷定義:計算機在執行正常程序過程中,暫時中止當前程序的運行,轉到中斷處理程序去處理臨時發生的事件,處理完後又恢復原來程序的運行,這個過程稱爲中斷(Interrupt)。

中斷功能:

  • 使CPU和外設在部分時間內並行工作,大大提高CPU的利用率;
  • 在實時控制系統中,現場數據可及時接收處理,避免丟失;
  • 故障的處理,如電源掉電、奇偶校驗錯、運算中溢出錯等;
  • 利用中斷指令,直接調用大量系統已編寫好的中斷服務程序實現對硬件的控制

2.中斷源和中斷分類

引起中斷的原因或能發出中斷請求的來源稱爲中斷源。
8086有兩種中斷源,中斷分爲兩大類:
1)外部中斷或硬件中斷,從不可屏蔽中斷引腳 NMI 和可屏蔽中斷引腳 INTR 引入;
2)內部中斷或軟件中斷,是爲解決CPU運行過程中出現的一些意外事件或便於程序調試而設置的。

我們這門課,學習 8259A 主要是處理 INTR

圖8.1 IBM PC機中 8086 的中斷分類和中斷源

1)外部中斷

不可屏蔽中斷NMI,處理較緊急的情況,如存儲器或I/O校驗錯、掉電、協處理器異常中斷請求等,不受中斷標誌IF的影響。
可屏蔽中斷由 8259AINT 引腳輸出,連到CPU的INTR上。只有當CPU的 FLAGSIF=1 時,才允許響應此類中斷請求
8259A的輸入引腳 IR0~IR7 可引入 8 級中斷:時鐘、鍵盤、串行通信口COM1和COM2、硬盤、軟盤、打印機。經芯片內部判別後,將優先級高的中斷請求信號送到 INT 引腳。

2)內部中斷

(1) 除法錯中斷
執行除法運算指令時,如除數爲0或商超過了結果寄存器能容納的範圍,則產生除法錯中斷。

(2) 單步中斷
單步標誌 TF 置1,指令執行完後,產生單步中斷。結果是將CPU的內部寄存器和有關存儲器的內容顯示出來,便於跟蹤程序的執行過程,實現動態排錯。
8086沒有直接使TF標誌置1或清0的指令,如何使 TF 標誌置1或清0?使TF標誌置1的程序段:

PUSHF		  ;標誌寄存器FLAGS入棧
POP AX		  ;AX←FLAGS內容
OR  AX, 0100H ;使AX(即標誌寄存器)的
			  ;D8=1,其餘位不變
PUSH AX		  ;AX入棧
POPF		  ;FLAGS寄存器←AX

用類似方法將標誌寄存器與 FEFFH 相與,可使 TF 標誌清0,從而禁止單步中斷

(3) 溢出中斷
溢出標誌 =1 ,則可由溢出中斷指令 INTO 產生中斷類型號爲 4 的溢出中斷。若OF=0 ,不會產生中斷。
帶符號數加、減指令後應安排一條 INTO 指令,一旦溢出就能及時向CPU提出中斷請求,CPU響應中斷後可進行相應的處理。

(4) 軟件中斷指令 INT n
中斷類型號 n=0~255 。它可以安排在程序的任何位置上。

(5) 斷點中斷
程序運行到斷點時便產生中斷,像單步中斷一樣,查看各寄存器和有關存儲單元的內容
斷點可設在程序任何地方並可以設多個斷點,設置的方法是插入一條 INT 3 指令。利用斷點中斷可以調試一段程序,比單步中斷的調試速度快得多。

3. 中斷向量表

(1)中斷響應和返回

  • CPU響應中斷時,首先要把 CS、IP 寄存器的值(斷點)以及標誌寄存器 FLAGS 的值推入堆棧保護
  • 然後找到中斷服務程序的入口地址(中斷向量),轉去執行相應的中斷服務程序
  • 中斷服務程序結束時,執行中斷返回指令 IRET 返回正常程序繼續執行。

如何尋找中斷服務程序的入口地址,是中斷處理過程中的一個重要環節。

(2)中斷向量表
中斷向量表用來存放中斷服務程序的入口地址

  • 8086可處理 2560~FFH)類中斷,每類中斷有一個入口地址(中斷向量),包含 CSIP ,共 4 個字節。因此存儲 256 個地址,需要佔用 1K 字節,它們位於內存 00000~003FFH 的區域中(早年的8086/8088)。
  • 將中斷類型號 n 乘以 4 就能找到規定類型的中斷向量,規定 IP 在前,CS 在後。
  • 類型號爲 0~4 的專用中斷:0-除法錯中斷、1-單步中斷、2-不可屏蔽(NMI)中斷、3-斷點中斷和4-溢出中斷,它們的中斷向量分別存放在 00H04H08H0CH10H開始的4個連續單元中。

舉例說明中斷類型號n中斷向量表的關係。

例8.1 類型號 n=44H 的中斷服務程序的入口地址爲 3600:2000H ,它們在中斷向量表中應如何存放?
分析:中斷類型號 n=44H=01000100B ,它的中斷服務程序的入口地址應放在 44H*4 開始的4個字節單元中。44H*4=01 0001 0000B= 0110H。從0110H開始存放 3600:2000H

例8.2 若在中斷向量表中,(0040H)=240BH,而 (0042H)=D169H,如圖8.4所示,試問這4個單元中的內容對應的中斷類型號 n= ?該中斷服務程序的起始地址是什麼?
分析:中斷服務程序的入口地址從 0040H 單元開始存放,其類型號n=40H/4=10H(右移 2 位)。由圖可知,中斷類型號爲 10H 的中斷服務程序的入口地址=D169:240BH

4.中斷優先級和中斷嵌套

(1) 中斷優先級

按中斷源的重要性實時性,排出響應中斷的次序,這種次序稱爲中斷優先級。 在8086中,中斷優先級從高到低的次序爲:

除法錯、INT n、INTO		;最高級,同一行的有同等優先級
NMI					    ;次高級
INTR					;較低級(由8259A引入)
單步中斷					;最低級

(2) 中斷嵌套

CPU響應中斷時,一般先響應優先級高的,後響應優先級低的中斷請求。如CPU正在執行中斷服務程序時,有優先級較高的中斷源提出請求,則將正在處理的中斷暫時掛起,先爲高級中斷服務,服務完後再返回較低級中斷,稱爲中斷嵌套。

如何實現中斷嵌套?

  • 機器進入中斷服務程序後,硬件會自動關中斷 CLI
  • 只有程序員手動用 STI 指令將中斷打開後,才允許高級中斷進入實現中斷嵌套
  • 中斷服程序結束前,必須用 EOI 命令結束該級中斷,並用 IRET 指令返回到中斷前的斷點處繼續執行原程序

8.1.2 中斷的響應與處理過程

1.中斷響應過程

可屏蔽中斷的響應和處理流程如圖:

每條指令執行完,CPU都要查 NMIINTR 腳上是否有中斷請求,若無,繼續取下一條指令執行。如有則響應中斷,硬件自動完成關閉中斷和保護斷點操作,將下條要執行指令的 CSIP(即斷點)推入堆棧;然後尋找中斷服務程序的入口地址,找到後就轉入相應的中斷服務程序。最後,恢復現場,開中斷,返回斷點。

2.8086的中斷響應與處理

1)中斷查詢

CPU在執行完每條指令後,會順序檢查是否有 軟中斷、NMI、INTR和單步中斷 ,如有,則進入中斷響應週期。

2)中斷響應

根據不同的中斷源形成不同的中斷類型碼n,再在中斷向量表中,根據 n 找到各自的中斷服務程序的入口地址,轉入相應的中斷處理程序

例如 n=2 ,則形成中斷類型碼 2 ,再在中斷向量表中找到 n*4=2*4=8 開始的連續4個字節單元,從中取出 CS:IP ,轉去執行可屏蔽中斷

重點介紹從 INTR 引腳引入的可屏蔽中斷的類型碼是如何形成的。CPU響應 INTR 中斷後,要執行兩個連續的中斷響應 INTA 總線週期,其時序圖如圖:

第一個 INTA\overline {\text{INTA}} 週期,CPU使數據線 D7~D0 浮空,T2~T4 期間向 8259A 發第1箇中斷響應信號 INTA\overline {\text{INTA}} ,表示CPU已響應此中斷禁止其它總線控制器競爭總線

第二個 INTA\overline {\text{INTA}} 週期,8259A 收到第二個 INTA\overline {\text{INTA}} 信號後,將中斷類型號 n 置於數據總線上,由此找到中斷服務程序的入口地址

8259AIR7~IR0 上可引入 8 級中斷,形成 88 位中斷類型碼,其中高 5D7~D3 由用戶通過對8259A編程來確定,在 PC/XT 機中爲 00001 ;低 3D2~D0IR7~IR0 的序號來決定, 見表8.1。高5位確定後,8 級中斷類型碼就確定了。

3)中斷處理和返回

(1) 由硬件自動完成以下工作

  • FLAGS 的內容入棧;
  • 保護單步標誌 TF
  • IF 標誌,關中斷,中斷處理過程中禁止其它中斷進入;
  • TF 標誌,使CPU不會以單步形式執行中斷處理程序;
  • 保護斷點,CS:IP 入棧。

(2) 進入中斷服務
進入中斷處理後,若在處理過程中又有 NMI 進入,NMI 中斷處理後,會清除CPU中鎖存的 NMI 請求信號,使加在CPU上的 NMI 只會被CPU識別一次;

接下來執行用戶編寫的中斷服務程序,包含保護現場,中斷處理和恢復現場程序。

(3) 執行用戶編寫的中斷返回指令 IRET
CS:IP 出棧,恢復斷點,恢復 FLAGS 的內容,返回主程序,繼續執行下一條指令。


8.2 可編程中斷控制器8259A的工作原理

8.2.1 8259A的引腳信號和內部結構

中斷控制器8259A的引腳:

可接收 8 級中斷,經 48 位寄存器判別後,優先級最高的中斷請求信號從 INT 腳輸出,送CPU的 INTR 腳請求可屏蔽中斷。

內部結構:(1根地址,說明只佔用了兩個端口地址;D7-D0 8位數據)

  • 中斷請求寄存器 IRR\text{IRR} (Interrupt Request Register)

    • 外部8級中斷請求信號IR7~IR0 腳上引入,有請求時相應位置 1 。例如 IR7、IR5、IR2 上有請求,IRR\text{IRR} 將置成 10100100
    • 中斷響應時相應位清 0
    • 中斷請求信號可爲高電平或上升沿觸發,編程定義。
  • 中斷屏蔽寄存器 IMR\text{IMR} (Interrupt Mask Register)
    存放中斷屏蔽信息,每 1 位與 1IR 位對應,置 1 禁止對應中斷請求進入系統。用來有選擇地禁止某些設備請求中斷。

  • 中斷服務寄存器 ISR\text{ISR}Interrupt Service Register
    保存正處理的中斷請求。任一中斷被響應而執行其服務程序時,相應位置 1 ,直到處理結束。多重中斷情況下,會有多個位置 1

  • 優先級判決器PR\text{PR}Priority Resolver

    • 判別請求寄存器 IRR\text{IRR} 裏中斷的優先級,把優先級最高的中斷請求選進服務寄存器 ISR\text{ISR} 中去。
    • 多重中斷出現時,PR\text{PR} 判定新出現的中斷能否去打斷正在處理的中斷,優先服務更高的中斷級別
  • 控制電路
    包含一組初始化命令字寄存器 ICW1~ICW4 和一組操作命令字寄存器 OCW1~OCW3 ,管理 8259A 的全部工作。

    • 根據 IRR\text{IRR} 設置和 PR\text{PR} 判定,發控制信號。
    • INT 腳向CPU發中斷請求信號接收CPU或總線控制器8288送來的中斷響應信號 INTA\overline {\text{INTA}}
    • 中斷響應ISR\text{ISR} 相應位置 1 ,併發送中斷類型號 n ,經數據總線緩衝器送到 D7~D0
    • 中斷服務程序結束時,按編程規定方式結束中斷。
  • 數據總線緩衝器
    8259A 與CPU的接口,CPU經它向 8259A 寫控制字接收 8259A 送出的中斷類型號,還可從中讀出狀態字(中斷請求、屏蔽、服務寄存器的狀態)和中斷查詢字

  • 讀/寫控制電路
    接收CPU的 RD\overline {\text{RD}}WR\overline {\text{WR}} 、地址、片選 。一片 8259A 只佔兩個I/O地址,XT機中 A0 接地址 A0 ,口地址爲 20H、21H 。與8086連時,A0 腳接地址 A1A0 的0/1選偶/奇地址口。

  • 級聯緩衝器/比較器

    • 一片 8259A 最多引入 8 級中斷,超過 8 級要用多片 8259A 構成主從關係,級聯使用。
      從片輸出 INT 接主片 IRi 。主從片的 3 條級聯信號線 CAS2~CAS0 並接。
    • SP/EN\overline {\text{SP}} /\overline {\text{EN}}主從定義/緩衝器方向;雙功能
      • 緩衝方式:輸出,控制緩衝器傳送方向;
      • 非緩衝方式:輸入;定義主從片,1:主片,0:從片
    • 多片時,8259A 必須經驅動器與數據總線相連工作於緩衝方式;少量 8259A 系統中,8259A直接與數據總線相連工作於非緩衝方式

8.2.2 8259A的工作方式

寫入初始化命令字 ICW 和控制命令字 OCW ,對 8259A 設置不同的工作方式。

1. 設置優先級方式

1)全嵌套方式

最基本方式,初始化後自動進入

  • 從各 IRi 腳引入的中斷請求具有固定優先級IR0~IR7 依次降低,IR0 最高。8259A 初始化後自動進入此方式。
  • 中斷響應後,中斷服務寄存器 ISR\text{ISR} 的對應位 ISn1 ,並保持到中斷結束,類型號 n 出現在 DB 上,然後進入中斷處理
  • 由CPU發 EOI 命令結束中斷,使 ISn 復位;也可發自動結束中斷命令 AEOI
  • 處理過程中,高級中斷打斷低級中斷禁止低級或同級中斷進入

2)特殊全嵌方式

同全嵌套方式,但允許同級中斷進入

例8.3 同級中斷舉例。圖中,從片 INT 腳接主片的 IR2,主片角度看,從片的 8 級中斷爲同級中斷。若正在處理 IR3 ,則允許 IR0~IR2 進入, 即允許同級中斷進入。必須在 IR3 中斷處理程序中,用 STI 指令開中斷,才允許從片中斷嵌套。但全嵌套方式禁止同級中斷進入。

3)優先級自動循環方式

各中斷請求優先級相同IRi 服務完後成爲最低級IRi+1 成最高級。初始優先級從高到低爲 IR0~IR7

例8.4 參看下圖的優先級自動循環方式示意圖。

  • 圖(a):初始狀態 IR0 爲最高級,若 IR1、IR3、IR6 同時請求中斷,則 IRR\text{IRR}IR1、IR3、IR6 均置 1
  • 圖(b):IR1 先被服務,之後 IS1=0IR1 成最低級,IR2 爲最高級,優先級順序:IR2->IR7、IR0、IR1 。爲 IR3 服務後 IS3=0IR3 最低,IR4 最高,依次類推。

4)優先級特殊循環方式

也稱爲設置最低優先級方式,與優先級自動循環方式類似,只是最低優先級由程序設置,並非 IR7 最低。IRi 設爲最低後,IRi+1 便是最高。


2.中斷屏蔽方式

可用 CLI 指令關中斷,禁止可屏蔽中斷進入;開中斷情況下,可將中斷屏蔽寄存器 IMR\text{IMR} 的相應位置1,來屏蔽某一級或某幾級中斷。有兩種屏蔽方式:

1)普通屏蔽方式

IMR\text{IMR} 中的某 1 位或某幾位置 1 ,就可將相應的中斷請求屏蔽。例如,令 IMR=00100100\text{IMR}=00100100 ,則 IR5IR2 上的中斷請求被屏蔽。

2)特殊屏蔽方式

僅屏蔽本級中斷,高級或低級中斷允許進入。(關於優先級的改變)


3.結束中斷方式

中斷響應後,ISR\text{ISR} 的相應位 ISn1中斷結束後應將 ISn0 ,表示結束中斷。
2 種結束中斷方式:自動和非自動,後者又分普通結束和特殊結束(EOI和SEOI)。

1)自動結束中斷方式—AEOI

IRi 上中斷響應後,ISR\text{ISR} 相應位置 1 ,在CPU發來的中斷響應信號 INTA\overline {\text{INTA}} 的第 2 週期結束時,ISR\text{ISR}相應位自動清 0,結束中斷。

AEOI 方式,中斷結束時(中斷服務程序)不用對 8259A 發任何命令,通常在只有一片 8259A多箇中斷不會嵌套的情況下使用。

2)普通結束中斷方式—EOI(End of Interrupt)

是常用的結束中斷方式,用於全嵌套方式。當CPU處理完 1 箇中斷請求時,需向 8259AEOI 命令,8259A 收到 EOI 後,將 ISR\text{ISR} 寄存器中優先級最高的中斷,也就是剛服務過的中斷ISn 清零,從而結束中斷

3)特殊結束中斷方式—SEOI

非完全嵌套方式下,用 ISR\text{ISR} 寄存器無法確定當前正在處理哪級中斷,也無法確定哪級中斷是最後響應和處理的,不能用 EOI 方式結束中斷,要用特殊方式。這時要用 OCW2 命令中的 L2~L0 來指定將 ISR\text{ISR} 寄存器的哪 1 位清 0


4.中斷查詢方式-POLL

使用一條 IN 指令讀取中斷查詢字,就可查到 8259A 是否有中斷請求以及哪個優先級最高。下圖是中斷查詢字格式:


8.2.3 8259A的命令字及編程

爲使 8259A 按預定方式工作,必須對它編程,由CPU向其控制寄存器發各種控制命令。控制命令有兩類:

  • 初始化命令字 ICW1~ICW4 ,對 8259A 初始化;
  • 操作命令字 OCW1~OCW3 ,定義操作方式

在操作過程中,允許重設置操作命令字,動態改變 8259A 的控制方式。兩類命令字被寫入 8259A 的兩個端口,一個爲偶地址口8259AA0=0 ,另一個爲奇地址口,A0=1 。在 XT 機中,偶/奇地址口爲 20H21H

1. 初始化命令字ICW

初始化命令字 ICW1~ICW4 順序寫入控制口,設置 8259A 初始狀態。8086系統中 ICW1ICW2ICW4 必須要有,ICW3 只在級聯時用

(1) ICW_1 初始化命令字

A0=0,ICW1 寫入偶地址口D4=1 標誌位;IC4=1 需要設 ICW4 (8086必須寫 ICW4 );
單片SNGL=1, 不要寫入ICW3級聯SNGL=0 ,要寫入 ICW3
LIMT=1IRi 引入中斷爲電平觸發,0 邊沿觸發;
A7~A5ADI 位用於8位CPU。

(2) ICW_2 中斷類型碼初始化

ICW2 緊跟 ICW1 寫入,A0=1 ,寫入奇地址口無標誌位T7~T3 位用於確定中斷類型碼 n 的高 5 位,低 3D2~D0 則由 8259A 根據從 IR_i引入中斷的引腳序號自動填入,從 IR0~IR7 的序號依次爲 000~111,其初值可以置爲 0

ICW2 的高 5 位內容是可以任選的,一旦高 5 位確定,一塊芯片的 8 箇中斷請求信號 IR0~IR7 的中斷類型號也就確定了。

例8.4 在 PC/XT 機中,ICW2的高 5T7~T3=00001B ,若從 IR5 上引入中斷請求,則其中斷類型碼 n= ? 如何設置 ICW2 ?
分析:從 IR5 上引入的中斷類型號的低 3D2~D0=101B ,由於高 5 位是 00001B ,所以從 IR5 上引入的中斷類型碼 n=00001 101B=0DH ,表示是硬盤中斷請求。設置 ICW2 的指令爲:

MOV	AL, 00001000B
OUT 21H, AL

據此可知,若 ICW2 的高 5 位爲 01110B ,則該 8259A 引入的 8 級中斷的中斷類型號 n = 01110000B ~ 01110111B = 70H~ 77H ,這是爲 PC/AT 機設置的 ICW2

(3) ICW_3 級聯初始化

ICW3 只在級聯時使用。圖8.15是 ICW3 的格式和 8259A 主從結構連接圖。
(a) 主片 ICW3 格式。Si=0IRi 上未接從片;Si=1 接有從片。
(b) 從片 ICW3 格式。低 3 位指明從片接主片哪個引腳,ID2~ID0 = 000~111 表示 IR0~IR7 引腳。

例8.5 用 38259A 按主從結構連接,如圖8.15(c)。主片口地址爲 20H/21H , 從片1口地址爲 A0H/A1H ,從片 2B0/B1H 。試求出 38259AICW3 ,並編程將 ICW3 寫入各芯片的奇地址口中。
分析:

  • 主片 IR2IR7 接從片,故主片 ICW3=10000100B=84H
  • 從片 1 接主片 IR2 ,故從片 1ICW3=00000010B=02H
  • 從片 2 接主片 IR7 ,故從片 2ICW3=00000111B=07H

對各芯片寫入初始化命令字 ICW3

MOV    AL, 84H		;主片程序
OUT    21H, AL
MOV    AL, 02H		;從片1程序
OUT    0A1H, AL
MOV    AL, 07H		;主片2程序
OUT    0B1H, AL

如圖中所示的級聯繫統:

  • 主片的 ICW3=24H00100100
  • 從片 1ICW3=02H00000010
  • 從片 2ICW3=05H00000101

只有 A 有申請(與單片系統相同):

  • 從片1:IRR=00H\text{IRR=00H}
  • 從片2:IRR=00H\text{IRR=00H}
  • 主片:IRR6=1\text{IRR}_6=1INT=1\text{INT}=1,收到 INTA\overline {\text{INTA}},主片 ISR6=1\text{ISR}_6=1 ,送 IR6 的類型號。

A、B、C 同時申請:

  • 從片1:IRR7=1\text{IRR}_7=1
  • 從片2:IRR4=1\text{IRR}_4=1
  • 主片:IRR6\text{IRR}_6IRR2\text{IRR}_2IRR5\text{IRR}_5 同時爲1,INT=1\text{INT=1} (轉發 IR2 的請求)
  • 過程:
    • 第1個 INTA\overline {\text{INTA}},主片 ISR2=1\text{ISR}_2=1 並送 IR2 的級聯代碼;從片 2 與自己的識別碼比較不同,無操作;從片 1 :相同,ISR7=1\text{ISR}_7=1
    • 2INTA\overline {\text{INTA}}:從片 1 送出 IR7 的類型號,主片不送
    • 最後,送兩個 EOI 命令,給主片送 EOI 的條件——從片 ISR=00H\text{ISR=00H}

(4) ICW4

8086系統 ICW4 必須設置,寫入奇地址口。無級聯時 ICW4 應在 ICW2 後寫入,級聯時它在 ICW3 後寫入。圖8.16 ICW4 的格式:

ICW4 各位的含義:

  • D7~D5=000,爲標誌位;
  • SFNM=1 ,設置特殊全嵌套方式(Special Fully Nested Mode),否則爲一般全嵌套方式;
  • BUFM/S 配合使用決定緩衝或非緩衝方式等;
  • AEOI=1,選擇 AEOI 方式,即自動結束中斷方式;
    AEOI=0,爲非 AEOI (非自動結束中斷)方式,須在中斷服務程序中安排操作命令字 OCW2,選擇所需的方式結束中斷;
  • μPM=1\mu \text{PM=1},選擇8086系統。

整個初始化流程如下:

例8.6 在 PC/XT 機中,只使用一片 8259AROM BIOS 中對 8259A 進行初始化的程序爲:

MOV 	AL, 00010011B  ;ICW1:邊沿觸發,
					   ;單級,要ICW4
OUT  	20H, AL
                         
MOV  	AL, 00001000B  ;ICW2:中段類型號
					   ;基值爲08H
OUT   	21H, AL

MOV  	AL, 00001001B  ;ICW4:全嵌套,
					   ;緩衝,非AEOI
OUT 	21H, AL

2. 操作命令字OCW

8259A 工作期間,可寫入操作命令,讓它按需要方式工作。

  • 可寫入 3 個操作命令字 OCW1~OCW3 ,用來發非 AEOI 方式結束中斷的命令、優先級循環命令中斷查詢命令,還可設置或撤銷 AEOI 循環命令、設置或撤銷特殊屏蔽方式、讀內部寄存器的狀態,功能比較複雜,尤其是 OCW2
  • OCW 在應用程序內部設置,沒有規定寫入順序,但寫入的端口地址有規定:OCW1 必須寫入奇地址口OCW2OCW3 要求寫入偶地址口

(1) OCW1 中斷屏蔽字

OCW1 也稱中斷屏蔽字,直接對中斷屏蔽寄存器 IMR\text{IMR} 的各位進行置 1 或清 0 。當 Mi 位置 1 ,相應 IRi 的中斷請求將被屏蔽,清 0 則允許中斷。

屏蔽某個 IRi 中斷,並不影響其它腳上的中斷請求。允許隨時讀出 IMR\text{IMR} 的內容,供CPU分析。

例8.7 某系統只允許鍵盤(IR1)中斷,其餘位均屏蔽,8259A 口地址 20H/21H,試寫入中斷屏蔽字。如系統中要新增鍵盤中斷,其餘屏蔽位不變,如何設置屏蔽字。
只允許鍵盤中斷的程序段爲:

MOV  AL, 11111101B          ;D1=0,IR1沒被屏蔽,
	            			;其餘均被屏蔽
OUT  21H, AL

新增鍵盤中斷的程序段爲:

IN   AL, 21H        		;用IN指令讀屏蔽字
AND  AL, 11111101B       	;僅D1清0,其餘位不變
OUT  21H, AL             	;寫入修改後的屏蔽字

(2) OCW2 優先級循環和中斷結束

OCW2 設置優先級循環方式中斷結束方式的命令字:

OCW2 各位有單獨的含義:

  • D4D3=00,是 OCW2 的標誌位。和 ICW1 進行區分。
  • RRotate) :R=1,優先級按循環方式設置,否則爲非循環方式。
  • SLSpecific Level):SL=1OCW2 中的 L2~L0 有效,否則無效。
  • EOIEnd of Interrupt) :結束中斷命令。EOI=1,當前 ISR\text{ISR} 寄存器相應位清 0 。當 ICW4 中的 AEOI=0 ,即非自動結束中斷時,可用它來結束中斷。
  • L2~L0SL=1 時,配合 RSLEOI 設置來確定一箇中斷優先級的編碼,L2~L0 的編碼000~111,分別與 IR0~IR7 相對應。

R、SL、EOI 組合設置,具有不同的意義:
(1) R SL EOI=001 ,發 EOI 命令
在中斷服務程序結束時,IRET 指令前,發 EOI 命令結束中斷,將服務寄存器中剛服務過的 ISn 位清 0 ,結束中斷。設置命令的方法是將 00100000B=20H 輸出到 8259A偶地址口中。EOI命令是最常用的中斷結束命令
例8.9 在PC機的中斷服務程序中設置中斷結束命令,使相應的 ISn0 。程序段如下:

MOV   AL, 20H         		;OCW2的EOI命令
OUT   20H, AL         		;發EOI命令

(2) R SL EOI=011 ,發 SEOI 命令
在中斷服務程序結束時,發特殊結束中斷命令 SEOI ,到底結束哪一級中斷由 L2~L0 指定,將相應的 ISn0
例8.10 發特殊結束中斷 SEOI 命令,結束 5 級中斷。

MOV   AL, 01100101B   ;OCW2的SEOI命令, L2~L0=101
OUT   20H, AL         ;將IS5清0, 結束5級中斷

(3) R SL EOI=101 ,發 EOI 循環命令
採用 EOI 方式結束中斷,將剛服務過的優先級最高的 ISn0 ,同時將剛結束的中斷請求 IRi 的優先級設爲最低級,使 IRi+1 置爲最高級,將優先級置爲自動循環方式

(4)R SL EOI=100 ,設置 AEOI 循環命令
使 8259A 採用自動結束中斷方式結束中斷,CPU響應中斷時,在中斷總線週期的第二個 INTA\overline {\text{INTA}} 脈衝結束時,將 ISR\text{ISR} 寄存器的相應位清 0 ,並使優先級置爲自動循環方式

(5) R SL EOI=000 ,發清除 AEOI 循環方式命令

(6) R SL EOI=111 ,發 SEOI 循環命令
採用特殊結束中斷方式結束中斷,使 ISR\text{ISR} 寄存器中由 L2~L0 指定的相應 ISn 位清 0,並置優先級爲自動循環方式

例8.11 發 OCW2 命令,結束 2 級中斷,並置優先級爲自動循環方式

MOV  AL, 11100010B   ;OCW2的SEOI循環命令, 
				     ;L2~L0=010
OUT  20H, AL       	 ;IS2=0結束2級中斷, 優先級
			  		 ;IR2最低, IR3爲最高

(7) R SL EOI=110 ,設置最低優先級循環命令
L2~L0 指定的中斷請求 IRi 設置爲最低優先級其餘按循環方式給出。(對應優先級特殊循環)

例8.12 要求發OCW2命令,使IR3設爲最低優先級,優先權按循環方式給出。

MOV  AL, 11000011B    ;將IR3置爲最低優先級, IR4置爲最高優先級
OUT  20H, AL

(8) R SL EOI=010 無效命令字

(3) OCW3 特殊屏蔽和中斷查詢

OCW3 的格式如圖所示。(下圖的 D7 其實是 0 不是 R)

OCW3 命令字含義:

  • D4D3位=01OCW3 的標誌位( 20H 端口,標誌爲進行區分)。
  • D6D5=11設置特殊屏蔽方式D6D5=10 時撤銷該方式。
  • P 位是中斷查詢(Poll)位,若 P=18529A 發中斷查詢命令,緊接着用 IN 指令讀取中斷查詢字。查詢字格式見圖。
  • RR 位爲讀寄存器RR=1,允許讀 IRR\text{IRR}ISR\text{ISR} 寄存器的內容。進一步查看 RIS;若 RIS=0,下次 IN 指令讀取 IRR\text{IRR} 內容;若 RIS=1 ,則讀取 ISR\text{ISR} 內容。RR=0爲無效命令。

例8.13 編寫讀取中斷屏蔽字 (21H)、中斷查詢字(20H)及中斷服務寄存器的程序段。
讀取中斷屏蔽字的程序段:

IN AL, 21H   ;從奇地址口讀IMR, 獲得中斷屏蔽字

讀取中斷查詢字的程序段:

MOV AL, 00001100B  ;OCW3, P=1, 發查詢命令
OUT 20H, AL        ;OCW3寫入偶地址口
IN  AL, 20H        ;AL←中斷查詢字。若AL=
				   ;10000110B,表示有中斷請求, 且IR6上的優先級最高

讀取中斷服務寄存器 ISR\text{ISR} 的程序段:

MOV	AL 00001011B 	;OCW3, RR-RIS=11,
					;下次讀ISR
OUT 20H, AL        	;OCW3寫入偶地址口
IN  AL, 20H        	;AL←ISR內容

特定屏蔽方式(開放高級和低級中斷)設置方法(在某一箇中斷的中斷服務程序中設置的,把我的中斷優先級屏蔽掉,允許中斷嵌套;設置後一直有效,直到清除):
① 用 OCW1 屏蔽當前中斷
② 用 OCW3 設置特定屏蔽方式

清除方法:
① 用 OCW3 清除特定屏蔽方式
② 用 OCW1 開放當前中斷

如在 IR3 的服務程序中使用,IR0-2 開放,IR3-7 關閉。比 IR3 優先級低的中斷的服務程序必須送指定 EOI

...           ;IR0-2開放,IR3-7關閉; 下面設置特殊屏蔽方式
CLI			  ;關中斷
IN  AL, 21H	  ;讀入中斷屏蔽字
OR  AL, 08H   ;屏蔽第3個引腳 0000_1000
OUT 21H, AL   ;送出去
MOV AL, 68H   ;0_11_01_0_00特殊屏蔽字
OUT 20H, AL   ;發特殊屏蔽字
STI        	  ;開中斷
...			  ;IR0-2開放,IR4-7開放,IR3關閉    
 
CLI        	  ;關中斷; 下面關閉特殊屏蔽方式
MOV AL, 48H   ;0_10_01_0_00
OUT 20H, AL   ;清除特殊屏蔽方式
IN  AL, 21H   ;讀入中斷屏蔽字
AND AL, 0F7H  ;開放自己,IMR3=0
OUT 21H, AL   ;送出去
STI        	  ;開中斷
...         
MOV AL, 20H   ;EOI命令
OUT 20H, AL   
RET  

8.3 8259A應用舉例

早期PC機——單片系統端口地址:20H、21H

  • 邊沿觸發
  • 完全嵌套
  • 固定優先級;
  • 非緩衝
  • 中斷類型號08H~0FH

初始化編程:

MOV  AL, 13H    
OUT  20H, AL    ;ICW1
MOV  AL, 08H 
OUT  21H, AL    ;ICW2
MOV  AL, 01H    
OUT  21H, AL    ;ICW4

286以上PC機——雙片級聯繫統:

  • 從片連在主片的 IR2 上,主從級聯信號互連
  • 端口地址,主片:20H、21H;從片:0A0H、0A1H
  • 邊沿觸發;
  • 完全嵌套;
  • 固定優先級;
  • 非緩衝;
  • 中斷類型號,主片:08H~0FH;從片:70H~77H

初始化編程(主)

MOV  AL, 11H  ;000_1_0_0_01
OUT  20H, AL
MOV  AL, 08H
OUT  21H, AL
MOV  AL, 04H
OUT  21H, AL
MOV  AL, 01H
OUT  21H, AL

初始化編程(從)

MOV  AL, 11H
OUT  0A0H, AL
MOV  AL, 70H
OUT  0A1H, AL
MOV  AL, 02H
OUT  0A1H, AL
MOV  AL, 01H
OUT  0A1H, AL
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章