<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

arm處理器異常處理swi

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò ) 收藏
ARM處理器共有7中運行模式:

用戶(hù)模式(usr) -- 正常程序執行模式

本文引用地址:http://dyxdggzs.com/article/201611/317943.htm

|-- |-- 快速中斷模式(fiq) -- 用于高速數據傳輸和通道處理

特 | 異 | 外部中斷模式(irq) -- 用于通常的中斷處理
權 --| 常 --| 管理員模式(svc) -- 供操作系統使用的一種保護模式
模 | 模 | 數據訪(fǎng)問(wèn)中止模式(abt) -- 用于虛擬存儲及存儲保護
式 | 式 |-- 未定義指令中止模式(und) -- 用于支持通過(guò)軟件仿真硬件的協(xié)處理器
|-- 系統模式(sys) -- 用于運行特權級的操作系統任務(wù)

特權模式:fiq、irq、svc、abt、und、sys -- 程序可以訪(fǎng)問(wèn)所有的系統資源,也可以任意切換處理器模式
異常模式:fiq、irq、svc、abt、und

ARM異常中斷種類(lèi)及優(yōu)先級:
優(yōu)先級 異常中斷名稱(chēng)
高 復位(reset)
|| 數據訪(fǎng)問(wèn)中止(data abort)
|| 快速中斷請求(FIQ)
|| 外部中斷請求(IRQ)
/||/ 指令預取中止(prefetch abort)
// 軟中斷(SWI)
低 未定義指令(undefined instruction)

異常向量表:
地址 異常中斷名稱(chēng) 優(yōu)先級
. .
. .
. .
0x1c FIQ 3
0x18 IRQ 4
0x14 Reserved X
0x10 Data Abort 2
0x0c Prefetch Abort 4
0x08 SWI 5
0x04 Undefined Instruction 6
0x00 Reset 1
Vector Table可以位于0x0或者0xFFFF0000處(ARM720T、ARM9、ARM10..)
優(yōu)先級為3的FIQ為什么放在地址0x1c處呢?當初這么設計應該是為了更加快速地響應FIQ中斷,也就是說(shuō)不在0x1c地
址放跳轉指令,而是直接存放最關(guān)鍵的FIQ處理代碼在0x1c開(kāi)始一段地址區域內。

異常進(jìn)入及返回:
當異常產(chǎn)生時(shí):
1. 拷貝當前模式的CPSR值到相應異常模式的SPSR_,如:CPSR(usr) --> SPSR_svc(svc)。
2. 設置適當的CPSR位:
改變處理器狀態(tài)進(jìn)入ARM狀態(tài)
改變處理器模式進(jìn)入相應的異常模式
如果需要可以設置中斷禁止位禁止相應中斷
3. 保存返回地址(pc-4)到LR_。
4. 設置pc為相應的異常向量。
異常返回時(shí),需要:
1. 從SPSR_恢復CPSR。
2. 從LR_恢復pc
(只能在A(yíng)RM狀態(tài)下實(shí)現該返回操作)
異常返回的指令分析:
* 使用一數據處理指令實(shí)現,該指令帶“S”后綴,同時(shí)pc作為目的寄存器
* 在特權模式下不僅僅要更新pc,而且還要拷貝SPSR到CPSR
1. 從SWI和Undef異常返回:
movs pc , lr
這兩種異常都會(huì )在導致異常的指令執行周期中就進(jìn)入異常,沒(méi)有等到下個(gè)時(shí)鐘周期才進(jìn)入異常,另外這兩種異常都是返回到產(chǎn)生異常指令的下一條指令去繼續執行。我從前面可以知道lr中保存的就是pc-4(該pc值是產(chǎn)生異常指令的下下一條指令的地址),所以可以直接將lr的值送入pc。
2. 從FIQ、IRQ和Prefect Abort返回:
subs pc , lr , #4
這三種異常都會(huì )等待產(chǎn)生異常的指令執行完才會(huì )進(jìn)入異常,所以此刻的pc已經(jīng)更新,比如:
...
subs r3, r3, #1 << 26 @ 0x100
bcs 2b @ 0x104
subs r1, r1, #1 << 5 @ 0x108
bcs 1b @ 0x10b
...
如果在執行第1行地址為0x100指令時(shí),發(fā)生了上面三種異常,此刻的pc值為0x108,等第1行執行完之后,pc更新為0x10b。同時(shí)進(jìn)入異常處理,在異常進(jìn)入時(shí)將lr值保存為pc-4,即0x108。那么在異常返回后,需要接著(zhù)執行發(fā)生異常指令的下一條指令的話(huà)就必須將lr的值減去4才能得到正確的地址,lr-4 = 0x108 - 4 = 0x104。
3. 從數據異常(Data Abort)異常返回:
該異常也是會(huì )等待產(chǎn)生異常的那條指令執行完才會(huì )進(jìn)入異常,情況類(lèi)似于第2類(lèi)的三種異常,但是有一點(diǎn)不同的是:數據異常返回地址不是產(chǎn)生異常的下一條指令,而是產(chǎn)生異常的那條指令,所以,它的返回指令應該是:
subs pc , lr , #8
按照上面的例子就應該返回到地址0x100處繼續執行。為什么會(huì )這樣,因為數據異常返回后會(huì )繼續去取數據,想想缺頁(yè)異常。
4. 如果lr在進(jìn)入異常后被壓棧的話(huà),就需要使用下面的指令來(lái)彈出。
LDMFD sp! , {pc}^
(^同時(shí)拷貝SPSR到CPSR中,這里的lr在壓棧之前已經(jīng)做了前面3中情況對應的處理了)

SWI異常:
執行SWI軟中斷指令即可產(chǎn)生軟中斷異常,進(jìn)入SWI異常時(shí)會(huì )做如下動(dòng)作:
CSPR保存到SPSR_svc。
改變處理器狀態(tài)進(jìn)入ARM狀態(tài)
改變處理器模式進(jìn)入相應的管理員模式(svc)
看需要禁止中斷
保存返回地址(pc-4)到LR_svc
設置pc為0x08或者0xFFFF0008
需要注意一點(diǎn)的是:如果在執行SWI指令時(shí)系統正處于svc模式時(shí),那么將會(huì )覆蓋掉原來(lái)LR_svc的值。所以
在SWI指令之前應該對LR_svc壓棧保存。
SWI異常返回時(shí),做如下動(dòng)作:
從SPSR_svc恢復CPSR
從LR_svc恢復pc,不需要修正

在c語(yǔ)言中使用關(guān)鍵字“__swi”來(lái)定義一個(gè)軟中斷函數:
__swi(0x30) void my_swi(void);
void fun(void)
{
my_swi();
}
-----> 轉換成匯編
fun
STMFD sp! , {lr}
swi 0x24
LDMFD sp! , {pc}

swi調用帶參和swi處理函數帶參:
swi調用帶參:
使用swi指令時(shí),通常有兩種方法來(lái)傳遞參數:
1. 使用swi號
swi指令的低24bits(ARM指令集)組成或者低8bits(Thumb指令集)來(lái)指定軟中斷號,
其余參數通過(guò)寄存器來(lái)傳遞。
2. r0決定軟中斷號,其余參數使用同樣寄存器傳遞。
c語(yǔ)言中,關(guān)鍵字“__swi”定義的軟中斷函數允許最多4個(gè)參數,使用r0~r4來(lái)傳遞。
swi處理函數帶參:
1. 匯編中,存取調用者設置的寄存器即可
2. 傳參給c,通常才用壓棧的方法:
將參數壓棧,給調用的函數傳遞一個(gè)指向這些參數的指針。

獲取SWI號:
ARM core不提供直接傳遞軟中斷號到處理程序的機制,SWI處理程序必須定位SWI指令并提取SWI指令中的常數域
1. 檢查SPSR_svc的Tbit,可以確定陷入swi異常之前的指令時(shí)ARM指令集還是Thumb指令集。
2. 然后通過(guò)LR_svc的值確定SWI指令的地址。ARM狀態(tài)下是LR-4,而Thumb狀態(tài)下是LR-2的位置。
3. SWI指令格式:
ARM態(tài):
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
| Cond |1 1 1 1 | SWI number |
Thumb態(tài)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
| 1 1 0 1 1 1 1 1| SWI number |



關(guān)鍵詞: arm處理器異常處理sw

評論


技術(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>