第 3 組中斷優先順序暫存器:P_INT_GROUP3_PRI(0x880A001C) 透過 P_INT_GROUP3_PRI 暫存器控制第 3 組各中斷源的優先順序。
各占去 4 個位元組位址單元(字對齊) ,所以 63 個硬體中斷向量的入口位址為 0xa0000200+
嵌入式微處理器 SPCE3200 原理及應用
© Sunplus Technology Co., Ltd. PAGE 129 V1.1 - Agu 29, 2007
嵌入式微處理器 SPCE3200 原理及應用
© Sunplus Technology Co., Ltd. PAGE 130 V1.1 - Agu 29, 2007
jl intmsg // 調用 intmsg 函數
general_service: // 軟體中斷 2(General 異常)中斷服務程式 jl intmsg // 調用 intmsg 函數
int_service:
jl intmsg // 調用 intmsg 函數
.extern irq_dispatch // 該函數在 Sys_IRQ.c 檔中定義 .set r1
//========================================================================
// 組合语言格式: save_reg
// C 語 言 格式: void save_reg(void) // 功 能 描 述: 中斷服務函數,
// 保護及恢復現場,調用 irq_dispatch 函數 // 入 口 參 數: 無
// 出 口 參 數: 無
//========================================================================
save_reg:
// 保存現場:保存 r1~r31 暫存器,保存條件暫存器 cr1 和中斷計數器 cr5 subi SP, 38*4
sw r1, [SP,1*4]
sw r2, [SP,2*4]
sw r3, [SP,3*4]
sw r4, [SP,4*4]
sw r5, [SP,5*4]
sw r6, [SP,6*4]
sw r7, [SP,7*4]
sw r8, [SP,8*4]
sw r9, [SP,9*4]
sw r10, [SP,10*4]
sw r11, [SP,11*4]
sw r12, [SP,12*4]
sw r13, [SP,13*4]
sw r14, [SP,14*4]
sw r15, [SP,15*4]
sw r16, [SP,16*4]
sw r17, [SP,17*4]
sw r18, [SP,18*4]
sw r19, [SP,19*4]
sw r20, [SP,20*4]
sw r21, [SP,21*4]
sw r22, [SP,22*4]
sw r23, [SP,23*4]
sw r24, [SP,24*4]
sw r25, [SP,25*4]
sw r26, [SP,26*4]
sw r27, [SP,27*4]
sw r28, [SP,28*4]
sw r29, [SP,29*4]
sw r30, [SP,30*4]
sw r31, [SP,31*4]
mfcr r13, cr1 mfcr r15, cr5 sw r13, [SP,33*4]
嵌入式微處理器 SPCE3200 原理及應用
© Sunplus Technology Co., Ltd. PAGE 131 V1.1 - Agu 29, 2007
sw r15, [SP,35*4]
mfcr r4, cr2
// 透過 cr2 的 b23~b16 讀取中斷請求的向量號,並把此資料作為調用函數的入口參數 jl irq_dispatch // 調用 irq_dispatch 函數,此函數在 Sys_IRQ.c 中定義
// 恢復現場:恢復 r1~r31 暫存器,條件暫存器 cr1 和中斷計數器 cr5 中斷前的資料 lw r1, [SP,1*4]
lw r2, [SP,2*4]
lw r3, [SP,3*4]
lw r4, [SP,4*4]
lw r5, [SP,5*4]
lw r6, [SP,6*4]
lw r7, [SP,7*4]
lw r8, [SP,8*4]
lw r9, [SP,9*4]
lw r10, [SP,10*4]
lw r11, [SP,11*4]
lw r12, [SP,12*4]
lw r13, [SP,13*4]
lw r14, [SP,14*4]
lw r15, [SP,15*4]
lw r16, [SP,16*4]
lw r17, [SP,17*4]
lw r18, [SP,18*4]
lw r19, [SP,19*4]
lw r20, [SP,20*4]
lw r21, [SP,21*4]
lw r22, [SP,22*4]
lw r23, [SP,23*4]
lw r24, [SP,24*4]
lw r25, [SP,25*4]
lw r26, [SP,26*4]
lw r27, [SP,27*4]
lw r28, [SP,28*4]
lw r29, [SP,29*4]
lw r30, [SP,30*4]
lw r31, [SP,31*4]
lw r30, [SP,33*4]
lw r31, [SP,35*4]
mtcr r30, cr1 mtcr r31, cr5 addi SP, 38*4 rte
Sys_IRQ.c 定義了 irq_dispatch(cp0_cause)函數和 intmsg()函數:irq_dispatch(cp0_cause)
函數在 Sys_isr.S 檔案中的 save_reg 函數中調用,為中斷的分支函數,cp0_cause 為 cr2 的
內容,根據 cr2 的內容調用 IRQ63()~IRQ24()中的相應中斷服務程式;intmsg()函數函數在
Sys_isr.S 檔案中的 norm_debug_service 函數、general_service 函數和 int_service 函數中
調用,為兩個軟體中斷和除 SPCE3200 的 40 個硬體中斷外的其他硬體中斷的處理程式。程
式段如下:
嵌入式微處理器 SPCE3200 原理及應用
© Sunplus Technology Co., Ltd. PAGE 132 V1.1 - Agu 29, 2007
//========================================================================
//文 件 名:Sys_IRQ.c
//功能描述:SPCE3200 40 個中斷源(硬體)的中斷向量分支及軟體中斷處理。
// 使用時,用戶不需要修改此檔中的內容
//========================================================================
//========================================================================
// 語法格式:void intmsg(void)
// 功能描述:軟體中斷及除 SPCE3200 40 個硬體中斷之外的 // S+core7內核硬體中斷處理程式
// 入口參數:無 // 出口參數:無
//========================================================================
void intmsg(void) {
while(1);
}
//========================================================================
// 語法格式:void irq_dispatch(unsigned int cp0_cause) // 功能描述:取 SPCE3200 40 個硬體中斷的中斷向量號,
// 根據中斷向量號調用相應中斷服務程式
// 入口參數:cp0_cause 為 S+core7 內核暫存器 cr2 的內容
// 其中第 23~18 位元為 63 個硬體中斷的中斷請求狀態(中斷向量號)
// 出口參數:無
//========================================================================
void irq_dispatch(unsigned int cp0_cause) {
int intvec=0;
intvec = (cp0_cause & 0x00FC0000)>>18; // 取中斷向量號
switch (intvec) {
case 63: // DAC中斷
IRQ63(); // IRQ63()函數在 User_IRQ.c 檔中定義 break;
case 62: // 保留
IRQ62(); // IRQ62()函數在 User_IRQ.c 檔中定義 break;
……
case 56: // Timer中斷
IRQ56(); // IRQ56()函數在 User_IRQ.c 檔中定義 break;
……
case 25: // 保留
IRQ25(); // IRQ25()函數在 User_IRQ.c 檔中定義 break;
case 24: // 保留
IRQ24(); // IRQ24()函數在 User_IRQ.c 檔中定義 break;
default:
break;
} return;
}
嵌入式微處理器 SPCE3200 原理及應用
© Sunplus Technology Co., Ltd. PAGE 133 V1.1 - Agu 29, 2007
User_IRQ.c 中定義了 IRQ63()~IRQ24()四十個中斷服務函數,為一個用戶介面函數檔,用戶 可以在其中添加用戶中斷服務函數。
//========================================================================
//文 件 名:User_IRQ.c
//功能描述:SPCE3200 40 個中斷源的用戶中斷服務函數。
// 根據中斷向量號,用戶可編寫相應中斷服務函數
//========================================================================
#include "SPCE3200_Register.h"
#include "SPCE3200_Constant.h"
//========================================================================
// 語法格式:void IRQ63(void) // 功能描述:DAC 中斷服務函數 // 入口參數:無
// 出口參數:無
//========================================================================
void IRQ63(void) {
}
//========================================================================
// 語法格式:void IRQ62(void) // 功能描述:保留中斷向量中斷服務函數 // 入口參數:無
// 出口參數:無
//========================================================================
void IRQ62(void) {
}
……
//========================================================================
// 語法格式:void IRQ56(void)
// 功能描述:計時器(Timer)中斷服務函數 // 入口參數:無
// 出口參數:無
//========================================================================
void IRQ56(void) {
}
……
//========================================================================
// 語法格式:void IRQ25(void) // 功能描述:保留中斷向量中斷服務函數 // 入口參數:無
// 出口參數:無
//========================================================================
void IRQ25(void) {
}
//========================================================================
嵌入式微處理器 SPCE3200 原理及應用
© Sunplus Technology Co., Ltd. PAGE 134 V1.1 - Agu 29, 2007
// 語法格式:void IRQ24(void) // 功能描述:保留中斷向量中斷服務函數 // 入口參數:無
// 出口參數:無
//========================================================================
void IRQ24(void) {
}
在使用 SPCE3200 的 40 個中斷(63~24)時,各函數之間的調用關係如下:
當有中斷請求時,先按照位址從 IntX_vec 入口,IntX_vec 為 Int63_vec~Int24_vec;在 IntX_vec 中調用 save_reg 函數進行中斷服務的處理;在 save_reg 函數中先保存現場,取中斷向量號 並把中斷向量號作為參數,調用 irq_dispatch 函數;save_reg 函數中把中斷向量號作為參數 傳遞給 irq_dispatch 函數,irq_dispatch 函數按照中斷向量號調用相應的中斷服務函數 IRQX(),IRQX 為 IRQ24()~IRQ63()。
所以 SPCE3200 的中斷處理過程也可看作的處理過程:
的調用關係為中斷從回應入口到處理完中斷服務程式的過程,即左邊粗箭頭的處理過程;處 理中斷服務程式後,按照右邊粗箭頭的過程恢復現場,完成一次中斷的處理過程。
save_reg
irq_dispatch (cp0_cause)
IRQ63() IRQ62() IRQ61() IRQ25() IRQ24()
Int63_vec Int62_vec Int61_vec Int25_vec Int24_vec
Sys_isr.S
Sys_IRQ.c
User_IRQ.c
圖 3-7
中斷各函數的調用關係圖
嵌入式微處理器 SPCE3200 原理及應用
© Sunplus Technology Co., Ltd. PAGE 135 V1.1 - Agu 29, 2007
save_reg
irq_ dispatch(cp0_ cause)
IRQ63() IRQ62() IRQ61() IRQ25() IRQ24()
Int63_ vec Int62_vec Int61_ vec Int25_ vec Int24_vec
中断服务出口 中断响应入口/ 出口 中斷回應入口/出口
中斷服務入口 中斷服務出口
保護現場 恢復現場
中斷服務處理完成 根據中斷向量號調用
中斷服務程式
圖 3-8
中斷服務處理過程圖
注意:
如果沒有特別說明,IRQ24()~IRQ63()中斷服務函數中都需要手動清除中斷旗標。