鋒影
e-mail:
在作業系統中,對於中斷的處理一直是一件麻煩事,其實主要是對作業系統的中斷管理機制不熟悉。
當中斷產生時,核心去執行中斷服務程式
isr,中斷服務程式中要做盡量少的工作,以提高系統執行效率,
有些人在中斷服務程式中使用延時函式和
printf
函式和malloc
函式,其實是很不可取的。
延時函式不僅大大降低了中斷執行的效率,也可能會遮蔽下次中斷的產生,從而丟失對中斷的響應。 對於
printf
函式為什麼不行呢?可以從輸出原理上進行解釋。通過呼叫
printf
函式,將字串輸出到
console
的時候要呼叫到串列埠,
這裡涉及到身軀訊號量以及阻塞操作,會加大中斷服務程式的執行時間;
malloc
是不可重入函式,
如果在其還沒返回就再對其呼叫將出現災難性後果。為了儘量減少中斷服務程式執行的時間,
減小排程等待時間,那麼在作業系統中
isr最好的實現方式就是,發生中斷時,設定標誌,構造乙個盡量簡短的
isr,
其他工作單獨建立相應的執行緒去執行。就好比有人給你打**,當你突然接到任務指示時是一邊聽**一邊花大量時間做完,
還是掛掉**再去做具體的任務呢?當然是後者了,可是大部分人還是選擇把所有的事情都放在中斷服務程式中去處理,其實是很不科學的。
當硬體產生中斷後,會一直將中斷線拉高,直到
isr清中斷。然而如果中斷服務程式忘記清除中斷標誌,那麼當中斷程式執行完時,
pic又會因檢測到中斷而重複執行,這樣就出問題了!所以好的方法就是一進入中斷程式就先清除中斷標誌。
那麼在qnx中如何寫乙個中斷呢?
qnx提供了兩種連線中斷的方法:
int interruptattachevent (int intr, const struct sigevent *event, unsigned flags);
int interruptattach (int intr, const struct sigevent * (*handler) (void *arg, int id), const void *area, int size, unsigned flags); 其中
int intr
代表了中斷向量號,在
startup
中初始化
pic的時候按照資料手冊寫進去的,代表了哪個中斷發生時會執行相應的
isr。
首先看看第乙個函式,
interruptattachevent
,這個函式告訴系統在硬體發生中斷時要返回乙個
event
來指出由哪個執行緒去執行具體任務,
當然在這個執行緒中要先遮蔽這個中斷源以免在任務還沒處理完的時候再次發生中斷。
當呼叫這個函式的時候與查詢的機制類似,其主幹如下所示:
struct sigevent event;
intid = interruptattachevent (hw_serial_irq, &event, 0);
thread_a()
} 當中斷發生時,
interruptwait
都會捕獲到
event
,再針對不同的任務進行相應的處理。
可是對於上邊提到的主幹程式,可能會有所疑問,為什麼剛發現中斷就去開啟中斷遮蔽呢,而不是等中斷之行完再說呢?
考慮到如果乙個硬體產生的速度比較快,那麼我們先處理在開啟中斷遮蔽就有可能對丟失對中斷的處理。
這裡邊interruptwait
可以將所有收到的
event
排成佇列,對於不及時處理的中斷請求稍後再做處理,這就很好的解決了上述問題。
再看第二個函式,
interruptattach
,這個函式在發生中斷時直接呼叫了
handler
這個中斷處理函式,是真正的
isr,
在函式中使用的全域性變數要使用
volatile
關鍵字修飾,告訴編譯器這是乙個會在中斷中和其他執行緒中改變的變數,
對其的一切操作都要去源位址進行讀取,否則會出現錯誤。這個函式為什麼要返回乙個
event呢,
因為這樣可以喚醒相應的執行緒去做具體的事情。
那麼對於這兩個函式哪個更好一點呢?顯然每個函式都有自己的優缺點,視具體情況而定。
interruptattachevent(),用法簡單,執行在使用者空間,可以激發單獨的執行緒去處理特定的任務,
可是雖然好用,每當中斷時都會引起上下文切換,降低了效率。對於interruptattach(),
因為是isr將原執行緒中斷,產不產生新的程序由isr決定,所以對於不是自己要處理的中斷,可以減少上下文切換的開支。
驅動開發入門之中斷處理
驅動程式開發過程中對中斷的處理是很重要的一部分,直接關係程式的執行結果與效率,所以需要對其給予足夠的重視.中斷處理包含兩個方面,與ce系統相關的部分及與硬體相關的部分.ce系統特定的處理流程 與其它系統有所區別的,或者說這部分 在其它系統上是無法執行的 一般為 1.用createevent建立乙個自...
Linux 裝置驅動 中斷處理
為什麼需要中斷 1,外設的處理速度一般慢於 cpu 2,cpu 不能一直等待外部事件 所以裝置必須有一種方法來通知 cpu 它 的工作進度,這種方法就是中斷.在 linux 驅動程式中,為裝置實現乙個中斷包含兩個步驟 1,向核心註冊中斷 2,實現中斷處理函式 request irq 用於實現中斷的註...
中斷 按鍵中斷驅動程式
中斷處理 1 外設的處理速度一般慢於 cpu。2 cpu不能一直等待外部事件,所以裝置必須有一種方法來通知 cpu它的工作進度,這個方法就是中斷,外設與 cpu資訊互動的機制,提高 cpu利用率。處理之外還有查詢,但是查詢會一直占有 cpu資源,導致 cpu低利用率,好處是實現簡單。linux系統中...