通過初始化程式設計向8259a寫入相應的初始化命令icw,可以使晶元處於乙個規定的基本工作方式,並在此方式下進行工作。8259a的初始化命令字共有4個icw1-icw4,進行初始化時要求icw1-icw4按一定的順序寫入。
首先,乙個外部中斷請求訊號通過中斷請求線 irq ,傳輸到 imr (中斷遮蔽暫存器) , imr 根據所設定的中斷遮蔽字( ocw1 ),決定是將其丟棄還是接受。如果可以接受,則 8259a 將 irr (中斷請求暫存暫存器)中代表此 irq 的位置位,以表示此 irq 有中斷請求訊號,並同時向 cpu 的 intr (中斷請求) 管腳傳送乙個訊號,但 cpu 這時可能正在執行一條指令,因此 cpu 不會立即響應,而當這 cpu 正忙著執行某條指令時,還有可能有其餘的 irq 線送來中斷請求,這些請求都會接受 imr 的挑選,如果沒有被遮蔽,那麼這些請求也會被放到 irr 中,也即 irr 中代表它們的 irq 的相應位會被置 1 。
當 cpu 執行完一條指令時後,會檢查一下 intr 管腳是否有訊號,如果發現有訊號,就會轉到中斷服務,此時, cpu 會立即向 8259a 晶元的 inta (中斷應答) 管腳傳送乙個訊號。當晶元收到此訊號後,判優部件開始工作,它在 irr 中,挑選優先順序最高的中斷,將中斷請求送到 isr (中斷服務暫存器) ,也即將 isr 中代表此irq 的位置位,並將 irr 中相應位置零,表明此中斷正在接受 cpu 的處理。同時,將它的編號寫入中斷向量暫存器 ivr 的低三位( ivr 正是由 icw2 所指定的,不知你是否還記得 icw2 的最低三位在指定時都是 0 ,而在這裡,它們被利用了!)這時, cpu 還會送來第二個 inta 訊號,當收到此訊號後,晶元將 ivr 中的內容,也就是此中斷的中斷號送上通向 cpu 的資料線。
這裡需要理解的是中斷遮蔽與優先順序判定並不是一回事,如果被遮蔽了,那麼參加判定的機會也都沒了。在預設情況下, irq0 的優先順序最高, irq7 最低。當然我們可以更改這個設定,這樣在下面有詳細描述。
言歸正傳,當晶元把中斷號送上通往 cpu 的資料線後,就會檢測 icw4 中的 eoi 是否被置位。如果 eoi 被置位表示需要自動清除中斷請求訊號,則晶元會自動將 isr 中的相應位清零。如果 eoi 沒有被置位,則需要中斷處理程式向晶元傳送 eoi 訊息 ,晶元收到 eoi 訊息後才會將 isr 中的相應位清零。
這裡的機關存在於這樣乙個地方。優先權判定是存在於 8259a 晶元中的,假如 cpu 正在處理 irq1 線來的中斷,這時 isr 中 irq1 所對應的位是置 1 的。這時來了乙個 irq2 的中斷請求, 8259a 會將其同 isr 中的位進行比較,發現比它高的 irq1 所對應的位被置位,於是 8259a 會很遺憾的告訴 irq2 :你先在 irr 中等等。而如果這時來的是 irq0 ,晶元會馬上讓其進入 isr ,即將 isr 中的 irq0 所對應的位置位,並向 cpu 傳送中斷請求。這時由於 irq1 還在被 cpu 處理,所以 isr 中 irq1 的位也還是被置位的,但由於 irq0 的優先順序高,所以 irq0 的位也會被置位,並向 cpu 傳送新的中斷請求。此時 isr 中 irq0 與 irq1 的位都是被置位的,這種情況在多重中斷時常常發生,非常正常。
如果 eoi 被設為自動的,那麼 isr 中的位總是被清零的(在 eoi 被置位的情況下, 8259a 只要向 cpu 傳送了中斷號就會將 isr 中的相應位清零),也就是如果有中斷來,晶元就會馬上再向 cpu 發出中斷請求,即使cpu 正在處理 irq0 的中斷, cpu 並不知道誰的優先順序高,它只會簡單的響應 8259a 送來的中斷,因此,這種情況下低優先順序的中斷就可能會中斷高優先順序的中斷服務程式。所以在 pc 中,我們總是將 eoi 位清零,而在中斷服務程式結束的時候才傳送 eoi 訊息。
8259a是乙個中斷控制器。在乙個8259a晶元有如下幾個內部暫存器: interrupt mask register (imr) interrupt request register (irr) in sevice register (isr) imr被用作過濾被遮蔽的中斷;irr被用作暫時放置未被進一步處理的interrupt;當乙個interrupt正在被cpu處理時,此中斷被放置在isr中。 除了這幾個暫存器之外,8259a還有乙個單元叫做priority resolver,當多個中斷同時發生時,priority resolver根據它們的優先順序,將高優先順序者優先傳遞給cpu。當乙個中斷請求從ir0到ir7中的某根線到達imr時,imr首先判斷此ir是否被遮蔽,如果被遮蔽,則此中斷請求被丟棄;否則,則將其放入irr中。 在此中斷請求不能進行下一步處理之前,它一直被放在irr中。一旦發現處理中斷的時機已到,priority resolver將從所有被放置於irr中的中斷中挑選出乙個優先順序最高的中斷,將其傳遞給cpu去處理。ir號越低的中斷優先級別越高,比如ir0的優先級別是最高的。 8259a通過傳送乙個intr(interrupt request)訊號給cpu,通知cpu有乙個中斷到達。cpu收到這個訊號後,會暫停執行下一條指令,然後傳送乙個inta(interrupt acknowledge)訊號給8259a。8259a收到這個訊號之後,馬上將isr中對應此中斷請求的bit設定,同時irr中相應的bit會被reset。比如,如果當前的中斷請求是ir3的話,那麼isr中的bit-3就會被設定,irr中ir3對應的bit就會被reset。這表示此中斷請求正在被cpu處理,而不是正在等待cpu處理。 隨後,cpu會再次傳送乙個inta訊號給8259a,要求它告訴cpu此中斷請求的中斷向量是什麼,這是乙個從0到255的乙個數。8259a根據被設定的起始向量號(起始向量號通過中斷控制字icw2被初始化)加上中斷請求號計算出中斷向量號,並將其放置在data bus上。比如被初始化的起始向量號為8,當前的中斷請求為ir3,則計算出的中斷向量為8+3=11。 cpu從data bus上得到這個中斷向量之後,就去idt中找到相應的中斷服務程式isr,並呼叫它。如果8259a的end of interrupt (eoi)通知被設定位人工模式,那麼當isr處理完該處理的事情之後,應該傳送乙個eoi給8259a。 8259a得到eoi通知之後,isr暫存器中對應於此中斷請求的bit會被reset。 如果8259a的end of interrupt (eoi)通知被設定位自動模式,那麼在第2個inta訊號收到後,8259a isr暫存器中對應於此中斷請求的bit就會被reset。 在此期間,如果又有新的中斷請求到達,並被放置於irr中,如果這些新的中斷請求中有比在isr寄存中放置的所有中斷優先級別還高的話,那麼這些高優先順序別的中斷請求將會被馬上按照上述過程進行處理;否則,這些中斷將會被放在irr中,直到isr中高優先順序別的中斷被處理結束,也就是說知道isr暫存器中高優先順序別的bit被reset為止.
8259A程式設計
乙個外部中斷請求訊號通過中斷請求線irq,傳輸到imr 中斷遮蔽暫存器 imr根據所設定的中斷遮蔽字 ocw1 決定是將其丟棄還是接受。如果可以接受,則8259a將irr 中斷請求暫存暫存器 中代表此irq的位置位,以表示此irq有中斷請求訊號,並同時向cpu的intr 中斷請求 管腳傳送乙個訊號,...
8259A究竟是做什麼的?
這類中斷有兩個特點,第一是數量很多,畢竟有很多外部裝置 第二是它們可以被遮蔽,這樣處理器就像是沒聽見 沒看見一樣,不會對它們進行處理。所以,這類硬體中斷稱為可遮蔽中斷。儘管不處理中斷就會把零件銑壞,但是否允許處理器看見該中斷,是你自己的事,這是處理器賦予你的權利。可遮蔽中斷是通過intr引腳進入處理...
彙編(8259A的初始化多片)
1 主從式8259a的初始化設定 初始化設定如下 1 中斷觸發方式 邊沿觸發 2 中斷遮蔽方式 常規遮蔽方式,即使用ocw1向imr寫屏碼 3 中斷優先順序排隊方式 固定優先順序的完全巢狀方式 4 中斷結束方式 非自動結束方式的兩種命令格式 即 不指定eoi方式 指定eoi方式 在中斷服務程式完畢時...