ARM處理器的SWI異常中斷響應(yīng)過程
那這個(gè)過程又是如何實(shí)現(xiàn)的呢?帶著疑問讓我們來學(xué)習(xí)吧!
在SWI指令中包括一個(gè)24位的立即數(shù)(中斷調(diào)用號(hào)),該立即數(shù)指示了用戶要請(qǐng)求的特定的調(diào)用功能,所以在SWI的異常中斷中要讀取這個(gè)中斷調(diào)用號(hào),然后根據(jù)中斷號(hào),來調(diào)用相應(yīng)的處理程序。這個(gè)過程可以分兩個(gè)步驟:
1.SWI異常中斷處理程序
由于是在底層操作所以這個(gè)異常中斷處理程序得用匯編語(yǔ)言編寫,描述如下:
area top_swi code readonly
export swi_headler
swi_headler
stmfd sp!, {r0-r12, lr} ; 保存r0至r12,lr的寄存器值
ldr r0, [lr, #-4]; 從存儲(chǔ)器中取得SWI指令的所在地址
bic r0, r0, #FF000000; 讀取24位中斷調(diào)用號(hào)
mov r1, sp
;================================================
bl swi_service_func; 調(diào)用功能服務(wù)函數(shù),見下面
; 中斷調(diào)用號(hào)通過r0寄存器傳入
; 參數(shù)通過r1寄存器傳入
;================================================
ldmfd sp!, {r0-r12, pc}^ ;恢復(fù)調(diào)用前的r0至r12,離開中斷處理程序
end
2.功能服務(wù)程序
編寫利用從中斷處理函數(shù)獲得的中斷調(diào)用號(hào)我們可以寫出如下服務(wù)函數(shù)(為了簡(jiǎn)單我們用C語(yǔ)言)
void swi_service_func(unsigned int number, unsigned int *reg)
{
unsigned int reg1, reg2, reg3, reg4;
//獲取SWI前傳入的參數(shù)
reg1 = reg[0];
reg2 = reg[1];
reg3 = reg[2];
reg4 = reg[3];
switch (number) {
case 0:
// do something
break;
case 1:
// do something
break;
.
.
.
case n:
// do something
break;
default:
// do something
}
}
// 更新結(jié)果存入r0-r3
reg[0] = updata_reg1;
reg[1] = updata_reg2;
reg[2] = updata_reg3;
reg[3] = updata_reg4;
}
這樣一來只要中調(diào)用斷號(hào)不同就可以實(shí)現(xiàn)不同的功能調(diào)用了,是不是很簡(jiǎn)單?
評(píng)論