edge中斷分析

2021-07-03 22:11:59 字數 2666 閱讀 4984

目前正在除錯msix

中斷,在測試過程中發現會概率性的丟失中斷。msix中斷預設是

edge

觸發的中斷,

edge

觸發的中斷是在中斷對應

pin發生電平訊號跳變的時候,會發出乙個中斷請求。因為跳變是一瞬間的,不會像

level

觸發中斷那樣一直保持電平不變,這樣就可能會漏掉某乙個跳變的瞬間,表現就是丟失了乙個中斷。

核心中處理edge

觸發中斷的函式為handle_edge_irq,此函式有do_irq

函式呼叫而來。

void 

handle_edge_irq

(unsigned int 

irq, 

struct

irq_desc *

desc) 

}  kstat_incr_irqs_this_cpu

(irq

, desc

);/*process/interrupts中對應

irq計算加

1*//*cpu對此

irq的回應,表示準備接收此

irq的下乙個中斷

*/desc

->irq_data.chip->irq_ack(&

desc

->irq_data

);  do

/*irq處於中斷掛起狀態*/

if(unlikely

(desc

->istate & 

irqs_pending)) 

/*處理中斷

*/handle_irq_event

(desc);

}while

((desc

->istate & 

irqs_pending

) &&

/*有掛起的中斷需要處理*/!

irqd_irq_disabled(&

desc

->irq_data

));/*irq沒有禁止

*/istate成員剛開始在irq_desc結構體中沒找到,其實它的定義如下

#define istate core_internal_state__do_not_mess_with_it

istate對應的是

core_internal_state__do_not_mess_with_it

成員。

irqs_replay標誌是用來挽救丟失的中斷。此標誌在check_irq_resend

函式中設定

,通過中斷控制器apic上的中斷訊號重新向cpu發中斷,而不是通過外設硬體來重發中斷。這裡進入到了

handle_edge_irq

函式表示已經收到了中斷,不需要重發,所以清除此標誌。

irqs_waiting標誌表示中斷的到來,這裡收到了中斷,因此也清除此標誌。此標誌在handle_

***_irq

函式的開始都會清除掉。

如果<1>

當前irq

被禁止,<2>

當前irq

正在處理中

,<3>

當前irq

沒有掛接處理函式

,則我們不處理接收到的此irq

。如果滿足上面的條件,我們就設定此

irq為irqs_pending掛起狀態,並遮蔽中斷,然後返回。放棄中斷的處理過程,留給正在處理此irq

中斷的cpu

來處理此次

pending

的中斷。

irq_ack函式的底層實現是寫eoi

暫存器,是

cpu對此

irq的回應,表示

irq希望清除此

irq的

pending

狀態(用於清除

apic irr

的pending

位),準備接收下乙個中斷。這樣其他的

cpu就可以接收此

irq進行處理了。

程式接下來是乙個while

迴圈,迴圈的條件是

此irq

沒有被禁止並且有

pending

的待處理的中斷

。因為在處理中斷的過程中,因為ack

了,可能其他的

cpu又接收到了此

irq新的中斷。

如果此irq

沒有掛接中斷處理函式,就直接遮蔽此

irq,返回。

如果irq

處於irqs_pending狀態,中斷沒有被禁止但是被遮蔽的情況下,呼叫unmask_irq取消遮蔽。想想為什麼會處於irqs_pending狀態,並這樣處理?前面講到當此irq

正在處理中,新接收到的中斷,就會設定irqs_pending狀態,並遮蔽此irq。

edge觸發方式的中斷容易丟中斷,因此在處理中斷時候不能長時間的遮蔽

irq。在handle_edge_irq函式一上來就判斷在irq

沒用被禁止,沒用正在處理的情況下,只是

ack回應了硬體,沒用遮蔽

irq,表示另外的

cpu可以接收此

irq的中斷。

ARM Linux 中斷分析

在具體的 arm 晶元中會有很多的中斷型別,每一種型別的中斷用以上結構來表示 struct irqdesc irq desc nr irqs nr irqs 根據不同的 mcu 會有所區別 在通過request irq 函式註冊中斷服務程式的時候,將會把中斷向量和中斷服務程式對應起來。我們來看一下 ...

中斷分析(五)

中斷分析 五 初始化中斷描述符表的具體實現 一 中斷描述符表的預初始化 用256個指向ignore int中斷門的入口位址填充中斷描述符表。它不是真正的初始化idt,等到分頁和核心跳轉到page offset處時才真正的進行初始化。確定所有相關的準備都已就緒之後,中斷可以在任何地方發生。setup ...

中斷型別分析

ibm公司的機器,通常把中斷源分為6類 1 重新啟動中斷 這是為操作人員重新啟動乙個重新用的,在一般情況下,處理機不能禁止這類中斷。2 機器檢驗錯中斷 當發生硬體或軟體故障時發生機器校驗錯中斷。用乙個64位的機器檢驗中斷碼儲存中斷的原因及其嚴重程度。在機器的檢驗儲存區中還儲存有更加詳細的中斷原因和故...