今天學習《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 塊捕獲它。會導致程式執行中斷,...