ARM處理器異常與中斷處理 學習總結

2021-06-14 08:18:45 字數 1973 閱讀 6781

今天學習《arm system developer's guide: designing and optimizing system software》第9章 異常與中斷處理,總結一下:

1. 異常處理

q1. 異常和中斷嘛關係啊?

中斷時異常的一種,中斷兩種:irq, fiq。異常好多種呢?reset,data abort, fiq,irq,prefetch abort, swi, undefined 。arm標準向量表中列出了以下異常:   

exception      mode     offset of vector table

reset svc +0x00

undefined und +0x04

swi svc +0x08

prefetch abort abt +0x0c

data abort abt +0x10

undefined - +0x14

irq/fiq irq/fiq +0x18/0x1c

通常說的異常主要來自cpu內部,abort,reset等; 中斷主要來自外設

q2. 怎麼進入異常?

兩種:改cpsr 和 發生相應異常。其中user mode 和 system mode只能通過該cpsr進入相應mode。上面的表都沒有這兩種mode。

reset handler:主要配置cpsr暫存器(關中斷),因為這時候interrupt handler還沒有初始化好;設定svc mode.

reset:

/* * set the cpu to svc32 mode

*/mrs r0, cpsr

bic r0, r0, #0x3f

orr r0, r0, #0xd3

msr cpsr, r0

q3.異常優先順序

除了簡單的reset,data abort, fiq,irq,prefetch abort, swi, undefined 依次優先順序下降外。

data abort 發生在mmu或umc指示訪問了無效的儲存器位址,或當前**沒有訪問許可權。data abort的handler裡沒有禁用fiq,在data abort的異常處理程式中,可以發生fiq,當fiq完成後,控制權交給data abort handler.

fiq 中斷處理時,禁 fiq和irq,所以所有的外部中斷都進不來。

irq : 只有當沒有fiq 和data abort 的時候,irq才能進來,然後關irq中斷

prefech abort: 在流水線中,如果某指令的「執行」階段沒有更高優先順序的異常出現,保持fiq不變(注意是不變),禁止irq。如果fiq enable,並且發生了fiq,可以了在處prefech abort handler的時候得到響應。

2. 中斷

1))分配中斷: 系統design哪些硬體可產生哪種中斷,可以通過硬體或軟體實現。

2)  irq與fiq異常 會使處理器硬體經過以下乙個標準流程(假設中斷未被遮蔽)

a. 處理器切換到乙個特定的mode,表明產生了中斷;

b. 前乙個mode的cpsr儲存到新mode的spsr

c. pc被儲存到新的中斷mode的lr

d. 關中斷 - 更改cpsr中的irq 或者fiq和irq都禁止。中斷請求是允許還是禁止,只有在msr指令已經完成了流水線的「執行」階段後才確定,理解這一點很重要!在msr指令完成前,中斷仍可能發生或者被遮蔽。

e. 處理器跳轉到響應向量表的入口

irq mode堆疊必須在中斷使能前設定好-通常是系統初始化**中(reset),思考為什麼fiq不用呢?

r13是堆疊暫存器,要在系統初始化的時候,設定好各個異常的堆疊。

ARM處理器異常返回位址

在arm處理器中一條指令的執行分為取指 解碼 執行三個階段,由於指令流水線的存在造成當前執行的指令的位址是pc 8 arm指令集 那麼當前執行指令的下一條指令的位址應該是pc 4,所以在異常產生時處理器會將pc 4的值儲存到對應模式的lr暫存器中,但是該返回位址是否能夠被使用還要看具體產生的異常的種...

ARM 異常中斷處理

在arm體系中,程式執行的流程有三種 要了解arm處理異常中斷的流程原理,就要先熟悉一下arm的工作模式與暫存器。如圖,arm有七種工作模式,大多數程式是工作在使用者模式usr下的,其他六種工作模式屬於特權模式,特權模式的存在是為了處理中斷 異常,或者訪問被保護的系統資源。不同模式之間的轉換可以通過...

異常處理學習

1 異常的使用場合 1 應用程式 2 庫 最好不要捕獲異常,除非某個異常表示的是 可以處理的情況 但要假定呼叫 可以處理他們。2 net 執行時可以把整個程式放在另乙個更大的 try塊中,如果發生的異常 沒有處理,程式流就會退出程式,由 net 執行時中的 catch 塊捕獲它。會導致程式執行中斷,...