ARM異常處理程式設計(初級)

2021-06-29 03:07:43 字數 4266 閱讀 5195

1、異常處理:

arm處理器的執行模式有:

svc(管理模式):復位、執行swi指令,供作業系統使用的一種保護模式

fiq(快速中斷模式):發生高優先順序中斷,用於高速資料傳輸或通道處理

irq(中斷模式):發生低優先順序的中斷,使用者通用的中斷處理

abort(中止模式):用於虛擬儲存或儲存保護

undef(未定義模式):當未定義的指令執行時進入該模式

user(使用者模式):正常程式執行的模式,用於應用程式

system(系統模式):用於執行特權級的作業系統任務

另外,在除user(使用者模式)外的其他6種處理器模式成為特權模式,則user模式為非特權模式。

user、system成為非異常模式,其他5種則稱之為異常模式。

擴充套件:

處理器的模式通過軟體進行切換,也可以通過外部中斷或異常處理過程進行切換。大多數的使用者程式執行在使用者模式下,這時,應用程式不能訪問一些受到作業系統保護的資源,應用程式也不能直接進行處理器的模式切換。當需要進行處理器的模式切換時,用用程式可以產生異常,在異常處理的過程中進行處理器模式的切換。這種體系結構可以使作業系統控制整個的系統資源。

當程式發生異常中斷使,處理器進入相應的異常模式。在每一種異常模式中都有一組暫存器,提供相應的異常程式使用,這樣可以保證進入異常模式時,使用者模式下的暫存器不被破壞。

系統模式並不是通過異常過程進入的,它和使用者模式具有一樣的暫存器,但是系統模式資料特權模式,可以訪問所有的系統資源,也可以直接進行處理器模式的切換,它主要提供系統任務使用。

異常:

1)復位異常,進入到管理模式(svc)

2)未定義指令異常,進入未定義模式

3)軟中斷異常,執行swi模式,進入svc管理模式

4)預取指令異常,沒有取到指定的指令,進入中止模式

5)資料中指異常,沒有取到指定的資料,進入中止模式

6)中斷,進入中斷模式

7)快速中斷,進入快速中斷模式

2、異常發生時如何處理異常:

cpu做:

1)拷貝cpsr到相應的異常模式的spsr,spsr_mode=cpsr

2)設定適當的cpsr位:

a、將處理器的狀態改為arm狀態,cpsr的bit[5]=0

b、改變處理器的工作模式,進入到相應的異常模式,改變cpsr的bit[4:0]到對應的異常模式

c、設定中斷禁止位

3)保護返回位址到 lr_mode = pc - 4

4)設定pc為相應的異常向量的位址

5)處理異常,執行異常處理程式

6)異常處理完畢,返回

3、中斷處理

1)預取指令異常:

…… sub r1, r1, #0x6

add r0, r0, #0x1

bic r0, r0, #0xf

cmp r0, r1

…… a、當sub取指,根本沒有取到,直到sub進入執行階段,發生異常

b、lr=pc-4(pc=bic)

=add

c、異常返回,再次取指sub指令,subs pc, lr , #4

2)軟中斷swi指令

…… sub r1, r1, #0x6

swi 1 @發生軟中斷異常

add r0, r0, #0x1

bic r0, r0, #0xf

…… 取指,解碼,執行,在swi指令的第三個階段,執行階段,發生異常

a、spsr_svc=cpsr

b、改cpsr的t位,0,即arm狀態

c、改cpsr的mode位[4:0],改到svc管理模式

d、禁止中斷位

e、儲存返回位址lr_mode = pc – 4 (pc = bic) = add

f、pc=0x8

g、處理異常,執行異常處理程式

h、異常處理完畢,異常返回,返回到add指令繼續執行,

movs pc, lr ,cpsr=spsr_svc

3)未定義指令異常

…… sub r1, r1, #0x6

abc #3 @發生未定義指令異常

add r0, r0, #0x1

bic r0, r0, #0xf

…… 取指,解碼,執行,當abc未定義指令進入執行階段,發生異常

a.spsr_und = cpsr

b.改cpsr的t位,0

c.改cpsr的mode[4:0],改到未定義模式

d.禁止中斷位

e.lr=pc-4 (pc=bit)

=add

f.pc=未定義異常的向量表入口

g.處理未定義異常

h.異常處理完畢,異常返回到add指令繼續執行,

movs pc, lr cpsr=spsr_und

4)fiq irq

…… sub r1, r1, #0x6

add r0, r0, #0x1

bic r0, r0, #0xf

cmp r0, r1

…… 當執行到sub指令時,來了中斷,雖然中斷來了,等sub指令執行完畢,處理中斷

lr=pc-4 (pc=cmp)

=bic

異常返回時,執行add指令,subs pc, lr, #4 cpsr = spsr

5)資料異常

…… ldr r0, [r2] //取指,解碼,執行,訪存,回寫

sub r1, r1, #0x6

add r0, r0, #0x1

bic r0, r0, #0xf

cmp r0, r1

…… a.在ldr指令的訪存階段發生異常,pc=bic

b.lr=pc-4=add

c.異常返回,再次取指ldr指令,subs pc, lr ,#8

總結:異常的返回

swi軟中斷異常

未定義的指令異常

中斷 快速中斷

預取指令

資料異常

1、何時發生異常?

執行階段 8 (swi 、未定義、預取指令)

執行完畢階段 12(中斷、快速中斷)

訪存階段 12 (資料異常)

根據pc值確定當前的pc值

2、cpu:自動的將 lr = pc -4 確定當前lr儲存的誰的位址

3、異常處理完畢,返回時,執行的指令是哪一條

1)重新執行發生異常的指令(預取指令,資料異常)

2)執行發生異常的下一條指令

異常向量表

——————————————————————

0x1c | ldr pc,fiq_hdl | 快速中斷異常

0x18 | ldr pc,irq_hdl | 中斷異常

0x14 | b . | 保留

0x10 | ldr pc,dat_hdl | 資料異常

0xc | ldr pc,pre_hdl | 預取指令異常

0x8 | ldr pc,swi_hdl | 軟中斷異常

0x4 | ldr pc,und_hdl (修改pc) | 未定義異常

0x0 | b reset | 復位異常

—————————— |

異常向量表只是起到乙個異常跳轉的作用

4、異常優先順序

異常在當前指令執行完成後才被響應,多個異常可以在同一時刻產生

異常指定了優先順序的固定順序:

reset

data abort

fiq

irq

prefetch abort

swi

udefined instruction

5、軟中斷

系統在執行**,執行到swi 0x01指令,在該指令的執行階段,發生軟中斷異常

cpu:

1)備份cpsr ,spsr_svc = cpsr

2)修改cpsr

改狀態,arm狀態,cpsr 的bit[5]= 0

改模式,svc管理模式,cpsr的bit[4:0]= 10011

3) 儲存返回位址 lr_svc = pc - 4

4)儲存pc為異常向量表中對應的位址,pc = 0x8,對應的指令「

ldr pc,swi_hdl

5)swi_hdl就是swi

6)當c函式處理完畢之後,返回彙編swi_hdl,再做最後的異常返回

7)movs pc,lr   cpsr  = spsr

8)繼續執行swi_hdl之後下一條的指令

ARM異常處理

arm支援7種型別的異常,它們是 復位異常 未定義指令異常 軟中斷指令異常 預取指令異常 資料中止訪問異常 中斷異常 快速中斷異常 arm異常向量表 當異常發生時,arm將做如下事情 1 將異常發生處下條指令位址儲存到相應工作模式下lr暫存器中 2 將cpsr暫存器值複製到相應異常模式下的spsr暫...

ARM異常處理流程

在學習與開發arm處理器的過程中,乙個不能繞開的話題就是異常處理流程。它在arm的體系架構中,佔據著不可動搖的重要地位。此處就以coterx a系列的arm處理器簡單分析一下異常中斷處理流程。說異常處理流程之前,我們先說一下arm處理器的工作模式和異常源。在coterx a系列之前的arm處理器,一...

arm異常處理流程

1.什麼是異常?cpu正常執行的時候,出現一些突發事件,我們的cpu就必須暫停當前程式的執行,去處理這些異常 2.cpu中有哪些異常?1.reset 上電 重啟 2.undef 流水線中某個非法指令到達執行狀態的時候執行 3.swi 軟中斷指令 4.prefetch 當乙個指令被從記憶體中預取時,由...