ATMEL精妙的IRQ中斷處理過程

2021-09-06 23:31:08 字數 1442 閱讀 1737

a:從棧位址開始,棧頂為at91sam7s64的16k片內ram盡頭0x00204000

irq_stack_size = 3*8*4

fiq_stack_size = 0x004

abt_stack_size = 0x004

und_stack_size = 0x004

svc_stack_size = 0x800

sys_stack_size = 0x400

irq棧為什麼用3*8*4=96b呢?因為irq最多8級巢狀,arm字長4b,而3,是由於每次進棧均破壞了3個暫存器r0、spsr、lr,所以需要壓棧儲存的也就是3。計算十分精準,沒有乙個字浪費,這是at第一牛x的地方。

當irq發生時,下列操作處理器自動完成:

1。r14(irq)=返回位址

2。spsr(irq)=cpsr(中斷發生前的模式)

3。改cpsr,成模式為irq,禁止irq中斷。

4。設pc,跳轉到0x00000018去

下面看中斷0x00000018指向的irq_handle**:

;因為要繼續呼叫函式,lr會被沖掉,所以壓irq棧

sub lr,lr,#4

stmfd sp!,

;將r0和spsr壓irq棧,因為下面用到r0,spsr

mrs r14,spsr

stmfd sp!,

;寫ivr,支援保護模式,普通模式無效

;釋放nirq,清除保護模式下中斷源

ldr r14,=at91c_base_aic

ldr r0,[r14,#aic_ivr]

str r14,[r14, #aic_ivr]

;允許中斷巢狀,由irq模式切換入svc模式

msr cpsr_c, #arm_mode_svc

;儲存scratch和被使用到的暫存器、lr入svc堆疊

stmfd sp!,

;跳轉到aic_ivr指向的中斷服務程式位址

mov r14,pc

bx r0

;恢復scratch、被用到的暫存器、lr

ldmia sp!,

;禁止irq中斷巢狀,由svc切換到irq模式。

msr cpsr_c,#i_bit | arm_mode_irq

;寫aic_eoicr

ldr r14,=at91c_base_aic

str r14,[r14, #aic_eoicr]

;恢復spsr、r0

ldmia sp!,

msr spsr_cxsf, r14

;中斷返回

ldmia sp!, ^

以上就是全部,讓我驚嘆的是如上做法支援了中斷巢狀,想了想,自己以前搞的東西還真是全部迴避回去了,也就是說,以前各個中斷並沒有優先順序區分,進了中斷就關門i->i。中斷服務程式執行完了再開啟,優點是簡單明瞭,缺點是中斷服務程式必須迅速處理完.

dispc的中斷處理

sprdfb dispc.c kernel drivers video sc8825 註冊中斷處理函式結構 static inline int must check request irq unsigned int irq,中斷號 irq handler t handler,中斷處理函式 unsig...

WinCE OAL中的中斷處理

這張圖想必很多人都見過,主要這張圖太經典了,所以還是貼出來嘮叨幾句,硬體中斷產生以後,會導致核心isr的執行,然後由oal中的isr來處理相應的中斷,最後導致相對應的ist執行完成真正的中斷處理。所以在wince中,中斷處理由isr和ist共同完成。isr主要完成中斷源的確定,遮蔽該中斷並返回給核心...

quartz的中斷恢復處理

使用jobstore來處理程式中斷後的恢復 先看下幾個處理時間點上的表狀態 生成任務時會往job details和triggers表插資料 這兩個表關聯的其它詳細表就不多說了 如果job還沒開始執行時程式就中斷了,下次程式啟動時會判斷當前時間 預計執行時間是否小於misfirethreshold,是...