嵌入式裡的中斷解讀以及中斷服務函式

2021-09-01 23:08:35 字數 2141 閱讀 4191

不要年紀輕輕,就覺得自己進入了人生低谷,其實,後來你會發現你還有很大的下降空間。

從本質上來講,中斷是一種電訊號,當裝置有某種事件發生時,它就會產生中斷,通過匯流排把電訊號傳送給中斷控制器。如果中斷的線是啟用的,中斷控制器就把電訊號傳送給處理器的某個特定引腳。處理器於是立即停止自己正在做的事,跳到中斷處理程式的入口點,進行中斷處理。

(1) 硬中斷

由與系統相連的外設(比如網絡卡、硬碟)自動產生的。主要是用來通知作業系統系統外設狀態的變化。比如當網絡卡收到資料報的時候,就會發出乙個中斷。我們通常所說的中斷指的是硬中斷(hardirq)。

(2) 軟中斷

為了滿足實時系統的要求,中斷處理應該是越快越好。linux為了實現這個特點,當中斷發生的時候,硬中斷處理那些短時間就可以完成的工作,而將那些處理事件比較長的工作,放到中斷之後來完成,也就是軟中斷(softirq)來完成。

(5)硬中斷和軟中斷的區別

軟中斷是執行中斷指令產生的,而硬中斷是由外設引發的。

硬中斷的中斷號是由中斷控制器提供的,軟中斷的中斷號由指令直接指出,無需使用中斷控制器。

硬中斷是可遮蔽的,軟中斷不可遮蔽。

硬中斷處理程式要確保它能快速地完成任務,這樣程式執行時才不會等待較長時間,稱為上半部。

軟中斷處理硬中斷未完成的工作,是一種推後執行的機制,屬於下半部。

中斷是嵌入式系統中重要的組成部分,但是在標準c中不包含中斷。許多編譯開發商在標準c上增加了對中斷的支援,提供新的關鍵字用於標示中斷服務程式 (isr),類似於__interrupt、#program interrupt等。當乙個函式被定義為isr的時候,編譯器會自動為該函式增加中斷服務程式所需要的中斷現場入棧和出棧**。

isr程式編寫的要求:

(1)不能返回值;

(2)不能向isr傳遞引數;

(3) isr應該盡可能的短小精悍;

(4) printf(char * lpformatstring,…)以及浮點運算等函式會帶來函式重入和效能問題,不能在isr中採用。

a.為什麼不能有返回值?

中斷服務函式的呼叫是硬體級別的,當中斷產生,pc指標強制跳轉到對應的中斷服務函式入口,進入中斷具有隨機性,並不是某段**對其進行呼叫,那麼如果有返回值它的返回值返回給誰?顯然這個返回值毫無意義,如果有返回值,它必定需要進行壓棧操作,這樣一來何時出棧怎麼出棧將變得無法解決。

b.不能向isr傳遞引數?

同理,也是由於這樣會破壞棧的原因,因為函式傳遞引數必定會要求壓棧出棧操作,由於進入中斷服務函式的隨機行,誰給它傳遞引數都成問題

【ps】像stm32等,因為中斷都是些硬體自動呼叫,沒有程式去給他傳遞引數,也沒有硬體去接收引數。 那其它函式怎麼傳引數給它呢?一般都是通過全域性變數方式。不過為了避免中斷函式重入,我們可以在進入中斷服務函式之後將中斷關閉,處理完後再開中斷。

c.isr應盡可能的短小精悍?

如果某個中斷頻繁產生,而它對應的isr相當的耗時,那麼對中斷的響應就會無限的延遲,會丟掉很多的中斷請求

d.printf(char * lpformatstring,…)函式會帶來重入和效能問題,不能在isr中採用。

這就涉及到乙個中斷巢狀問題,由於printf之類的glibc函式採用的是緩衝機制,這個緩衝區是共享的,相當於乙個全域性變數,第一層中斷來時,它向緩衝裡面寫入一些部分內容,恰好這時來了個優先順序更高的中斷,它同樣呼叫了printf,也向緩衝裡面寫入一些內容,這樣緩衝區的內容就錯亂了。

__interrupt double compute_area (double radius)

這個函式有太多的錯誤了,以至讓人不知從何說起了:

1). isr 不能返回乙個值。如果你不懂這個,那麼你不會被雇用的。

2). isr 不能傳遞引數。如果你沒有看到這一點,你被雇用的機會等同第一項。

3). 在許多的處理器/編譯器中,浮點一般都是不可重入的。有些處理器/編譯器需要讓額處的暫存器入棧,有些處理器/編譯器就是不允許在isr 中做浮點運算。此外,isr 應該是短而有效率的,在isr 中做浮點運算是不明智的。

4). 與第三點一脈相承,printf() 經常有重入和效能上的問題。如果你丟掉了第三和第四點,我不會太為難你的。不用說,如果你能得到後兩點,那麼你的被雇用前景越來越光明了。【做嵌入式的必須記住】

嵌入式中斷

interrupt double compute area double radius 這個函式有太多的錯誤了,以至讓人不知從何說起了 1 isr 不能返回乙個值。如果你不懂這個,那麼你不會被雇用的。2 isr 不能傳遞引數。如果你沒有看到這一點,你被雇用的機會等同第一項。3 在許多的處理器 編譯器...

嵌入式的中斷服務程式

cortex m0處理器最多支援32個外部中斷 通常稱作irq 還有乙個被稱作不可遮蔽中斷的特殊中斷。中斷事件的異常處理通常被稱作中斷服務程式 isr 除此之外,m0處理器還支援許多系統異常,他們主要用於作業系統和錯誤處理。中斷是嵌入式系統中重要的組成部分,但是在標準 c 中不包含中斷。許多編譯開發...

嵌入式裡的中斷是什麼

參考總結了一下 中斷 微控制器在執行某個程式的時候,突然發生了另乙個事件,現在要先去處理突發的事件,就叫中斷。中斷源 引起中斷的事件。中斷字 微控制器為中斷源設計了中斷暫存器,中斷暫存器裡儲存了一些與中斷有關的資訊,這些資訊就叫中斷字。中斷型別 分為強迫性中斷和自願性中斷。自願性中斷是程式裡面安排好...