###### tags: `microcomputer` `note` `thu` # CH8 ## **中斷與處理** ## 主要應用 * 協調I/O動作與處理 * 偵測軟體程式執行時,可能產生的意外情況 * 偵測硬體電路的意外狀況 * 提供使用者存取系統資源的管道 * 提供危機性事件的處理 * 提醒CPU定時的處理某些例行性程式 ## 中斷類型 ### 內部中斷(internal interrupt, TRAP) 1. CPU內部的硬體電路產生的中斷 1. 大部分16或32位元的微處理器中,當CPU內部發生異常的事件(除以0或執行一個不合法的指令),都會產生一個硬體中斷 1. CPU轉移控制權到一個預定的ISR,做一些應急的處理 1. 例外(exception)或是TRAP * MCS-51並未提供,只有ARM或x86/x64 #### 軟體中斷(software interrupt) 1. CPU執行一個軟體中斷指令產生的中斷 1. 大部分16或32位元的微處理器,通常提供一種特殊的軟體指令 1. 程式的控制權轉移之用 1. 指令執行後,CPU即產生一個中斷程序,而執行相關的ISR * MCS-51並未提供,只有ARM或x86/x64 ### 外部中斷(external interrupt) #### 可抑制式中斷(maskable interrupt) 中斷信號可以被擋住(抑制),令CPU不對其採取任何行動 * MCS-51與x86/x64 #### 不可抑制式中斷(nonmaskable interrupt) 中斷信號產生後,CPU必然會對其採取因應措施(行動) * x86/x64中的NMI (non maskable interrupt) **CPU在認知一個中斷後,即暫時中止目前正在執行的程式,而進入中斷服務程式繼續執行指令,以處理中斷需求的動作。** #### 導向性中斷(vectored interrupt) 一個中斷的中斷服務程式(ISR)的起始位址,需要由產生該中斷的來源I/O裝置,提供一些(位址)資料 * x86/x64微處理器中的INTR #### 非導向性中斷(nonvectored interrupt) 1. 一個中斷的中斷服務程式(ISR)的起始位址,只由CPU內部自行決定時 1. 每一個中斷的中斷服務程式的起始位址,在設計CPU時已經事先設定為固定的位址。 * MCS-51中的所有中斷和x86/x64中的NMI ## CPU對中斷的反應 ### 中斷輸入控制線的輸入信號是否會被CPU認知 * 中斷致能旗號IE(interrupt enable flag)(EA, enable all) * IE=0,不管該中斷輸入線是否有中斷信號產生,CPU皆不會認知此中斷 * IE=1,CPU才會認知該中斷 ### 為了簡化CPU內部的硬體設計與指令執行的完整性, * 目前指令執行週期結束,才會認知一個中斷 ### CPU對中斷的反應 * 目前指令執行週期結束 * IE=1(對可抑制式中斷而言) * 有中斷信號發生 #### 導向性中斷:  1. ***導向性中斷*中,當CPU認知一個中斷及送出中斷認知信號後,即自動地由資料匯流排中,讀取一個位元組的資訊** * 中斷向量(interrupt vector)或中斷類型(interrupt type) * 決定ISR的起始位址 2. **中斷向量內容可以為** * 單位元組的指令(Z80中的RST) * 中斷向量表的指標(x86/x64) * 由微處理器的類型與工作模式而定 3. ***非導向性中斷*** * CPU認知一個中斷後,自動由內部硬體取得對應的中斷向量 * 決定ISR的起始位址 * MCS-51中的所有中斷均屬於此類型 4. **任何一個微處理器通常擁有多條中斷輸入線** * 處理每一條中斷輸入線,皆有不同的優先順序 * 中斷優先權(interrupt priority) * 每一條輸入線相當於一個優先權層次(interrupt level) 5. **每一條輸入線皆可被外部I/O裝置用來要求中斷服務** * 較低層次的中斷服務程式可以被另外一個較高層次的中斷所中斷 * 多層次(multilevel)中斷系統 6. **x86/x64,有兩條中斷輸入線(NMI與INTR)** * NMI有較高的優先權 7. **MCS-51中,一共有5個中斷來源** * 由中斷優先權(IP)暫存器動態地分成高、低兩種不同的優先權層次 * 相同優先權群中的中斷不能被另外一個中斷所中斷 ### MCS-51中斷結構 #### MCS-51在取樣中斷後 * CPU檢查高、低兩個優先權中斷群中的中斷 * 事先設定好的輪呼次序,決定目前可以被服務的中斷,提供服務 * 輪呼次序是固定的,但優先權可以選擇為高或低 * 優先權由IP暫存器與輪呼共同決定  ### 中斷來源控制 #### 外部中斷輸入線可由定時器控制暫存器(time control register) 中的位元IT0與IT1規劃成位準偵測(Level sensitive) 或負緣偵測(negavite edge sensitive) #### ITx(x=1/0)為0時,$\overline{INTx}$為低位準偵測,ITx為1時,為負緣偵測 #### 負緣偵測時,外部中斷$\overline{INTx}$的信號上升為高電位的一個週期,然後下降為低電位的一個機器週期 * TCON暫存器中的中斷旗號位元IEx為1,產生中斷 * IEx在CPU進入對應中斷服務程式後,即自動被清除為0 #### 位準偵測時,$\overline{INTx}$的信號必須持續啟動(維持在低電位)直到該中斷被認知為止 * 恢復為不起動狀態,否則將再度產生中斷 * 中斷旗號位元的值與$\overline{INTx}$的反向值相同 #### 當定時器/計數器0與1(定時器0模式3除外)計時終了或計數溢位時 * 對應的中斷旗號位元TFx即設定為1,因而產生中斷 * CPU進入對應中斷服務程式後,即清除該中斷旗號位元TFx為0 #### 在串列埠中,TI(transmit interrupt)與RI(receive interrupt)共用一個中斷。 * 進入中斷服務程式後,必須判別是TI或RI產生的中斷,以提供適當的服務 * TI與RI必須由中斷服務程式清除 #### MCS-52,定時器2的中斷由TF2或EXF2產生 * 判別是TF2或EXF2產生的中斷 * 由中斷服務程式清除 #### 均可由軟體設定為1,以產生中斷,或是清除為0,清除任何懸置尚未服務的中斷  ### 中斷智能暫存器 * 全體致能(Enable all, EA)位元控制所有中斷的產生與否 * EA為一般微處理器中的中斷致能(IE) * 當EA為0,所有中斷均不被接受 * EA為1,一個中斷的接受與否,尤其各別的控制位元決定 #### 暫存器控制功能 1. ES (enable serial port) >> 串列通訊埠 1. ET1 (enable timer 1) >> 定時器1 1. EX1 (enable external interrupt 1) >> 外部中斷輸入$\overline{INT1}$ 1. ET0 (enable timer 0) >> 定時器 0 1. EX0 (enable external interrupt 0) >> 外部中斷輸入$\overline{INT0}$ #### 其值為0:抑制中斷 ; 其值為1:致能中斷 #### ET2(enable timer 2)為MCS-52的定時器2的中斷控制位元  ### 中斷優先權暫存器 #### MCS-51中的每一個中斷來源,均可以依據IP的內容,規畫為高優先權中斷群或是低優先權中斷群 #### 中斷優先權暫存器中的每一個位元對應一個中斷來源 * PT2(MCS-52的定時器2) * PS(串列通訊埠) * PT1(定時器1) * PX1(外部中斷輸入$\overline{INT1}$) * PT0(定時器0) * PX0(外部中斷輸入$\overline{INT0}$) **當其值為0,對應來源歸入低優先權;其值為1,對應來源歸入高優先權** #### 低優先權中斷群中的中斷 * 可被高優先權中斷群中的中斷所中斷 * 不會被另一個低優先權中斷群的中斷所中斷 #### 高優先權中斷群中的中斷,則不會被任何其他的中斷所中斷。當有2個或多個中斷來源同時產生 -> 高優先權的中斷將被認知(依據事先設定好的輪呼次序) #### 輪呼次序為$\overline{INT0}$(優先權最高)->定時器0->$\overline{INT1}$->定時器1->串列通訊埠->定時器2->(優先權最低) #### MCS-51/52提供2個層次的中斷優先控制 1. 中斷優先權暫存器決定 1. 輪呼次序  ## 中斷處理 ### 中斷處理程序 #### 於每一個機器週期的S5P2時 * 取樣中斷旗號位元 * 其次的機器週期執行輪呼動作,選取一個中斷提供服務 * MCS-52的定時器2的TF2在S2P2設定,並且在產生設定時器溢位的同一個機器週期中,執行輪呼動作 #### 認知一個中斷後,若無下列一個狀況發生時,CPU即執行一個硬體的LCALL副程式呼叫動作,跳到ISR中執行,並抑制相同優先權層次的其他中斷產生中斷,稱為 ***中斷處理程序(中斷程序)*** * 已經有一個較高或是相同優先權層次的中斷服務程式正在執行 * 目前的輪呼動作不是在一個執行中的指令的最後一個週期 * 目前正在執行中的指令為RETI指令或是任何寫入IE或是IP暫存器的指令 #### 三條件中任一情況發生時: 暫停產生硬體的LCALL副程式呼叫動作 #### 狀況2: 確保在進入一個中斷服務程式之前,已經完成目前正在進行中的指令之動作 #### 狀況3: 確保在進入一個ISR之前,若目前正在進行中的指令為RETI或是任何寫入IE或IP暫存器的指令時,至少能在繼續執行一個指令。 * **輪呼動作** -> 每一個機器週期均重複一次 * 一個中斷旗號啟動後,因上述狀況而其ISR無法被執行,並且在狀況解除之後,該中斷旗號也不再啟動時,該中斷將不被服務。 * 每一個中斷向量皆**配置8個位元組** -> 較複雜的應用中,ISR多於8個位元組,可以在此位置上置放一個LJMP指令  ### 中斷遲滯時間 * 中斷的需求產生到進入ISR,開始執行指令的時間 * 關鍵的因素  #### 當進入一個ISR後,除非被中斷的程式至少執行一個指令,否則將不再進入該ISR * 利用此一特性,MCS-51可以單步執行指令,其做法為設定$\overline{INT0}$為位準啟動方式,並設定該ISR為:  #### 若$\overline{INT0}$(P3.2)正常為低電位 * CPU 進入$\overline{INT0}$ISR,等待$\overline{INT0}$上升為高電位,然後下降為低電位 * 接著執行RET1指令,回到程式中執行一個指令,再進入$\overline{INT0}$ISR,重複上述動作。 #### 每一個$\overline{INT0}$的高電位脈波將促使程式執行一個指令 ### 中斷服務程式 #### ISR的結構與副程式的結構類似 * 運用CALL呼叫副程式,RET則由副程式回到主程式 #### CPU認知一個中斷後,呼叫該中斷的ISR * ISR欲回到主程式,使用RET  #### 設計一個ISR,需遵守下列三步驟: ***撰寫ISR*** 1. 在中斷向量表中的適當位置內填入ISR,或是在該位置中填入LJMP指令,使其跳到ISR中執行 1. 若需要,設定IP暫存器 1. 設定適當的中斷致能位元  ### 巢路中斷  $\overline{INT1}$產生中斷,中斷向量為13H ### 系統重置 #### 系統重製為讓CPU回到一個已知的初始狀態 * 恢復內部的SFR內容為預先設定的值,然後重新執行開機程式 #### 功率控制為適當管理功率消耗(Power consumption) * 在一特定的應用中,僅需最小的功率消耗 #### 如何重置MCS-51系統? * 啟動RST信號完成 * 時脈信號啟動後,RST設為高電位,且延續兩個機器週期以上時,即系統重置。 #### SFR的初值 * PC、ACC、暫存器B、DPTR & PSW均清除為0。(CPU由0000H位址開始執行指令) * SP設為07H * I/O port設為0FFH * IP為xxx00000B,IE為0xx00000B (MCS-51) * IP為xx000000B,IE為0X000000B (MCS-52) * 定時器暫存器與SCON均清除為0,SBUF則為未定值(xxH) * PCON為0xxx0000B ### 電源控制    ***END***
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up