• 沒有找到結果。

個位元組位址單元(字對齊) ,所以 63 個硬體中斷向量的入口位址為 0xa0000200+

在文檔中 嵌入式微處理器 (頁 130-136)

第 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()中斷服務函數中都需要手動清除中斷旗標。

3.6.7 應用舉例

在文檔中 嵌入式微處理器 (頁 130-136)