<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM處理器的SWI異常中斷響應過(guò)程

ARM處理器的SWI異常中斷響應過(guò)程

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò ) 收藏
通過(guò)SWI異常中斷指令,在用戶(hù)模式下應用程序可以調用系統模式下的代碼,在操作系統中表現為系統調用,
那這個(gè)過(guò)程又是如何實(shí)現的呢?帶著(zhù)疑問(wèn)讓我們來(lái)學(xué)習吧!

在SWI指令中包括一個(gè)24位的立即數(中斷調用號),該立即數指示了用戶(hù)要請求的特定的調用功能,所以在SWI的異常中斷中要讀取這個(gè)中斷調用號,然后根據中斷號,來(lái)調用相應的處理程序。這個(gè)過(guò)程可以分兩個(gè)步驟:

1.SWI異常中斷處理程序
由于是在底層操作所以這個(gè)異常中斷處理程序得用匯編語(yǔ)言編寫(xiě),描述如下:

area top_swi code readonly
export swi_headler
swi_headler
stmfd sp!, {r0-r12, lr} ; 保存r0至r12,lr的寄存器值
ldr r0, [lr, #-4]; 從存儲器中取得SWI指令的所在地址
bic r0, r0, #FF000000; 讀取24位中斷調用號
mov r1, sp
;================================================
bl swi_service_func; 調用功能服務(wù)函數,見(jiàn)下面
; 中斷調用號通過(guò)r0寄存器傳入
; 參數通過(guò)r1寄存器傳入
;================================================
ldmfd sp!, {r0-r12, pc}^ ;恢復調用前的r0至r12,離開(kāi)中斷處理程序
end

2.功能服務(wù)程序
編寫(xiě)利用從中斷處理函數獲得的中斷調用號我們可以寫(xiě)出如下服務(wù)函數(為了簡(jiǎn)單我們用C語(yǔ)言)
void swi_service_func(unsigned int number, unsigned int *reg)
{
unsigned int reg1, reg2, reg3, reg4;
//獲取SWI前傳入的參數
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
}
}
// 更新結果存入r0-r3
reg[0] = updata_reg1;
reg[1] = updata_reg2;
reg[2] = updata_reg3;
reg[3] = updata_reg4;
}

這樣一來(lái)只要中調用斷號不同就可以實(shí)現不同的功能調用了,是不是很簡(jiǎn)單?


評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>