第7章
中斷系統
CPU與I/O溝通方式
程式I/O (Programmed I/O)
中斷I/O (Interrupt I/O)
直接記憶體存取 (Direct Memory
Access, DMA)
程式I/O (Programmed I/O)
當CPU 與 I/O要連繫時, CPU詢問或測 試週邊裝置是否備妥(ready),若尚未則 CPU等待(wait)一段時間後,再向週邊裝 置測試是否備妥;若備妥,則CPU執行所要 I/O動作,完畢後再繼續原工作。
優點:完全軟體方式進行,程式簡單易寫
,不需額外硬體,成本低。
缺點:無效率,浪費CPU時間。
中斷定義
中斷是指電腦在執行某一程式的過程中,由 於電腦系統內、外的某種原因,而必須終止 原程式的執行,轉去執行相應的處理程式,
待處理結束之後,再回來繼續執行被終止的
原程式過程。
中斷I/O (Interrupt I/O)
CPU 執行原工作,若週邊裝置有需求,則發出中 斷信號通知CPU ,待CPU知道後,暫停目前工作 (依中斷信號種類,CPU可以不理會,請看下節說 明),對週邊發出中斷認可(INTA),並依中斷來 源種類,跳至中斷服務常式(Interrupt Service Routine,ISR)執行I/O動作,完畢後,CPU 再繼續原工作。
優點:1.有效率,CPU執行原工作,只有週邊有 需求時,才對週邊服務。 2.能做即時控制。
缺點:1.需額外電路來處理多週邊同時需求。
中斷處理流程
Step1: CPU 執行原工作
Step2:若週邊裝置(I/O)有需求,則對CPU
發出中斷信號Step3:待CPU知道後,暫停目前工作,對週
邊發出中斷認可信號(INTA)Step4: CPU將目前PC值壓入stack,依中
斷來源種類,跳至適當中斷服務常式 (Interrupt Service Routine,ISR
)Step5: CPU執行I/O動作
中斷處理流程示意圖
直接記憶體存取(Direct Memory Access,DMA)
第一與第二種方式,須藉助CPU介入彼此間 連繫。所謂DMA,即允許週邊與記憶體兩 者直接傳送,不必CPU介入,完全交給
DMA控制器處理。
優點:資料傳送速度快,一般用在大量資料 傳送,如磁碟機與記憶體或記憶體與 記憶體之間。
缺點:1.需額外電路、成本高。
2.程式規劃複雜。
中斷種類(依來源分)
外部中斷(external interrupt)
z
由外界電路所產生中斷,例如鍵盤、計時器等。 內部中斷(internal interrupt)
z
有時也稱程式中斷(program interrupt),又稱陷 (trap)。當程式中的指令或資料不合法或錯誤等產生,例如除以零、堆疊溢位、保護入等。
軟體中斷(software interrupt)
z
本中斷來自執行程式中的一種特殊呼叫指令,例如當程 式要求系統OS做某些工作,執行某些監督者呼叫(supervisor call)。如同在個人電腦上呼叫BIOS(基 本輸入輸出系統)或DOS。
中斷與副程式呼叫之不同
來源不同
發生時間不同
處理事項不同
服務位址不同
中斷種類(依CPU是否需處理分)
不可遮罩中斷(NonMaskable Interrupt,NMI)
z 不可藉助軟體抑制,強迫CPU一定要理的中 斷。
可遮罩中斷(Maskable Interrupt Request,INT,IRQ)
z 可以藉助軟體(例如8088之CLI,STI指令),
控制 CPU是否要處理中斷信號。
註:在CPU內有一旗號暫存器,其中有一中斷 旗號(Interrupt FLAG ,IF),若IF=1,則 當INT 中斷信號觸發,CPU才會處理。CLI
中斷服務常式(ISR)位址決定
非向量式中斷(non vectored interrupt)
z ISR寫在固定位址,例如Z-80 CPU,模式 1(IM1)中斷,固定跳至0038H位址執行。
8048之外界中斷,固定跳至0003H位址執 行。Z-80 CPU之NMI中斷,跳至0066 H。
例如8051 CPU,INT0中斷跳至0003H位 址
向量式中斷(vectored interrupt)
z ISR可寫在任意位址,在中斷過程中,不僅送 中斷信號給CPU,並將一組辨識碼
(identifier)或中斷向量傳給CPU,而CPU則
微處理機對I/O介面定址方式
隔離式I/O(isolated I/O)又稱I/O對映I/O(I/O mapped I/O)。即I/O 空間(I/O space)與記憶體空間(memory space)互相獨立。
z 優點:
1.I/O不佔用memory空間,memory真正可用空間較大。
2.有專屬輸出入指令,如IN,OUT指令,程式容易區別I/O動作。
3.一般I/O空間較小,所以I/O解碼定址較簡單,快速。
z 缺點:
1.一般CPU中必須有一支接腳,以資區別是要存取I/O,或 memory(在8088中即IO/M接腳)。
2.程式較無效率,在I/O埠上只能做簡單IN,OUT動作,不能 處理,必須將資料讀入後,再做處理(例如,測試某一位元,
與某暫存器相加),再將結果OUT到I/O上。
記憶體對映I/O(memory mapped I/O)即I/O佔用memory space一部 份,利用記憶體來對映I/O埠位址。
z 優點:
1.I/O位址即一記憶體位址,凡是在記憶體上可做的運算, 在I/O上也 可以,所以所寫程式較有效率。
2.不必M/IO區別接腳。
z 缺點:
SPCE061A中斷類型
軟體中斷 :軟體中斷是由軟體指令break產生的中斷。軟體中 斷的向量位址為FFF5H
異常中斷 :異常中斷表示為非常重要的事件,一旦發生,CPU必須立即進行處理。目前SPCE061A定義的異常中斷只 有`重置Reset'一種。通常,SPCE061A系統重置可以由 以下三種情況引起:上電、看門狗計數器溢位以及系統電源低 於電壓低限。不論什麼情況引起重置,都會使重置腳的電位變 低,進而使程式指標PC指向由一個重置向量(FFF7H)所指 的系統重置程式入口位址。
事件中斷:事件中斷(可簡稱“中斷",以下提到的“中斷"均為事件中斷)一般產生於片內部元件或由外部中斷輸入腳引 入的某個事件。這種中斷的開通/禁止,由相應獨立使能和相 應的IRQ或FIQ總致能控制。
事件中斷
SPCE061A的事件中斷可採用兩種方式:
快速中斷請求即FIQ中斷和中斷請求即IRQ
中斷。這兩種中斷都有對應的致能控制。
SPCE061中斷來源
中斷系統有14個中斷源分為
z 兩個計時器溢出中斷、
z 兩個外部中斷、
z 一個串列口中斷、
z 一個觸鍵喚醒中斷、
z 7個時基信號中斷、
z 一個PWM輸出中斷。
中斷控制指令
FIQ ON
FIQ OFF
IRQ ON(IRQ的總中斷允許開)
IRQ OFF
INT
中斷源表
2Hz 時基信號
_IRQ5 FFFDH
IRQ5 4Hz 時基信號
1024Hz 時基信號
2048Hz 時基信號 IRQ4 FFFCH _IRQ4
4096Hz 時基信號 觸鍵喚醒信號 外部時脈源輸入 信號 EXT1
_IRQ3 FFFBH
IRQ3 外部時脈源輸入
信號 EXT2
_FIQ/_IRQ2 FFF6H/ FFFAH
FIQ /IRQ2 TimerB 溢出信號
_FIQ/_IRQ1 FFF6H/ FFF9H
FIQ /IRQ1 TimerA 溢出信號
_FIQ/_IRQ0 FFF6H/ FFF8H
FIQ/IRQ0 Fosc/1024 溢出信號
PWM INT
保留字 中斷向量
中斷優先順序 中斷源
中斷優先順序和中斷向量
IRQ5 FFFDH
IRQ4 FFFCH
IRQ3 FFFBH
IRQ2 FFFAH
IRQ1 FFF9H
IRQ0 FFF8H
FIQ FFF6H
RESET FFF7H(重置向量)
中斷優先順序別 中斷向量
相關SFR
P_INT_Ctrl暫存器
P_INT_Clear暫存器
P_INT_Ctrl暫存器
IRQ3_EXT1 IRQ3_EXT2
IRQ2_TMB FIQ_TMB
IRQ1_TMA FIQ_TMA
IRQ0_Fosc/
FIQ_Fosc/
b8 b9
b10 b11
b12 b13
b14 b15
IRQ6_TMB2 IRQ6_TMB1
IRQ5_2Hz IRQ5_4Hz
IRQ4_1KHz IRQ4_2KHz
IRQ4_4KHz IRQ3_KEY
b0 b1
b2 b3
b4 b5
b6 b7
P_INT_Clear暫存器
b8 b9
b10 b11
b12 b13
b14 b15
IRQ6_TMB2 IRQ6_TMB1
IRQ5_2Hz IRQ5_4Hz
IRQ4_1KHz IRQ4_2KHz
IRQ4_4KHz IRQ3_KEY
b0 b1
b2 b3
b4 b5
b6 b7
中斷服務副程式流程(ISR寫法)
中斷控制的內建常數
(b12) Timer A IRQ1
C_IRQ1_TMA
(b11) Timer B FIQ
C_FIQ_TMB
(b10) Timer B IRQ2
C_IRQ2_TMB
(b9) Ext2 IRQ3
C_IRQ3_EXT2
(b8) Ext1 IRQ3
C_IRQ3_EXT1
(b7) Key Change IRQ3
C_IRQ3_KEY
(b6) 4096Hz IRQ4
C_IRQ4_4KHz
(b5) 2048Hz IRQ4
C_IRQ4_2KHz
(b4) 1024Hz IRQ4
C_IRQ4_1KHz
(b3) IRQ5 4 Hz
C_IRQ5_4Hz
(b2) IRQ5 2 Hz
C_IRQ5_2Hz
(b1) Timer A IRQ6
C_IRQ6_TMB1
(b0) Timer B IRQ6
C_IRQ6_TMB2
規劃允許2Hz時基中斷
asm("INT OFF"); // 關閉所有中斷
*P_INT_Ctrl = C_IRQ5_2Hz;
//允許2 Hz 中斷
asm("INT IRQ"); //允許所有IRQ中斷
規劃允許外部中斷1
asm("INT OFF"); // 關閉所有中斷
Init_B_Port(); //規劃B Port bit 2為具上拉電阻的輸入
*P_INT_Ctrl = C_IRQ3_EXT1;
//允許 EXT1 中斷
asm("INT IRQ"); //允許所有IRQ中斷
規劃允許外部中斷1與2
asm("INT OFF"); // 關閉所有中斷
*P_INT_Ctrl = C_IRQ3_EXT1 | C_IRQ3_EXT2;
//允許 EXT1及EXT2 中斷
asm("INT IRQ"); //允許所有IRQ中斷
規劃計時器A定時2秒中斷
asm("INT OFF"); // 關閉所有中斷
*P_TimerA_Ctrl = C_SourceA_8192Hz+C_SourceB_1;
//TimerA:8192Hz
*P_TimerA_Data = 0xffff -0x4000 ; //2sec時間常數
*P_INT_Ctrl=C_IRQ1_TMA;
//允許TimerA_IRQ1中斷
中斷副程式
void IRQ5(void) __attribute__ ((ISR));
void IRQ5(void) {
if ( *P_INT_Ctrl & 0x0004 ) { //IRQ5_2Hz
*P_IOA_Data = data;
data ^= 0xffff;
*P_INT_Clear = 0x0004; // 清除中斷旗號 }
else
{ //IRQ5_4Hz
*P_INT_Clear=0x0008; // 清除中斷旗號