導航:首頁 > 操作系統 > linux中斷注冊

linux中斷注冊

發布時間:2022-12-12 13:59:37

linux內核中斷之中斷申請介面

本文基於 RockPI 4A 單板Linux4.4內核介紹中斷申請的常用介面函數。

1、文件

2、定義

說明:

1)、 irq :要申請的中斷號,可通過 platform_get_irq() 獲取,見「Linux內核中斷之獲取中斷號」。

2)、 handler :中斷處理函數,發生中斷時,先處理中斷處理函數,然後返回 IRQ_WAKE_THREAD 喚醒中斷處理線程。中斷處理函數盡可能簡單。

中斷處理函數定義: typedef irqreturn_t (*irq_handler_t)(int, void *);

中斷返回值如下:

3)、 thread_fn :中斷處理線程,該參數可為NULL。類似於中斷處理函數的下半部分。

4)、 irqflags :中斷類型標志。

定義文件: include/linux/interrupt.h ,內容如下:

5)、 devname :中斷名稱,可使用 cat /proc/interrupts 命令查看。

6)、 dev_id :設備ID,該值唯一。

在使用共享中斷時(即設置 IRQF_SHARED ),必須傳入 dev_id ,在中斷處理和釋放函數中都會使用該參數。

註:

1、 request_threaded_irq() 函數可替代 request_irq 加 tasklet 或 workqueue 的方式。

2、對應的中斷釋放函數為: void free_irq(unsigned int, void *) ,需要和中斷申請函數成對出現。

1、文件

2、定義

說明:

1)、 __must_check :指調用函數一定要處理函數的返回值,否則編譯器會給出警告。

2)、 request_irq() 函數本質上是中斷處理線程 thread_fn 為空的 request_threaded_irq() 函數。

對應的中斷釋放函數為: void free_irq(unsigned int, void *) ,需要和中斷申請函數成對出現。

1、文件

2、定義

說明

devm_request_threaded_irq() 本質上還是使用 request_threaded_irq() 函數實現中斷申請。

兩者區別:

1)多了一個 dev 參數;

2)在設備驅動卸載時,中斷會自動釋放;

3)如果想單獨釋放中斷,可使用 void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id) 函數。

1、文件

2、定義

devm_request_irq() 函數本質上是中斷處理線程 thread_fn 為空的 devm_request_threaded_irq() 函數。

1、獲取中斷號

2、申請中斷

3、中斷處理函數

4、中斷處理線程

5、查看中斷

Ⅱ Linux內核中斷之獲取中斷號

Linux內核中可使用 platform_get_irq() 函數獲取 dts 文件中設置的中斷號。

函數原型: int platform_get_irq(struct platform_device *dev, unsigned int num)

定義文件: driversaseplatform.c

中斷號獲取函數 platform_get_irq() 調用流程如下:

rk3399 使用的是 GICv3 ,對應 irq_domain->name 。

文件: drivers/irqchip/irq-gic-v3.c 。

translate() 函數實現如下:

以 RockPI 4A 單板 Debian 系統Linux 4.4內核中的獲取 HDMI 中斷號為例。

1、查找中斷號

從手冊「Rockchip RK3399 TRM V1.3 Part1.pdf」中,可以查到 HDMI_IRQ 中斷號,即55。

2、 dts 配置

文件: arch/arm64/boot/dts/rockchip/rk3399.dtsi

hdmi 使用的是 GIC_SPI 中斷,按照 gic_irq_domain_translate() 函數中處理,需要將中斷號55減去32,得到 dts 中的中斷號23。

註: interrupts = <中斷類型 中斷號 中斷觸發類型 中斷分區(對應哪個CPU cluster,PPI類型中斷特有)>

3、驅動函數

文件: driversgpudrm ockchipdw_hdmi-rockchip.c

此時, irq 返回值為55。

後續會介紹 GIC 和中斷注冊等實現函數。

Ⅲ linux中,中斷注冊和中斷服務程序只能寫在驅動層還是能寫在應用層

我也不完全理解,但是比你知道的多點。
Linux中,分內核態和用戶態。
你寫的所有的驅動,都是出於內核態->可以直接使用內核相關資源;
應用層,都是用戶態->無法直接操作底層的東西 -> 想要操作,比如獲得許可權,切換到內核態,然後才能操作。

你這里的需求,我的理解是:
對應你這句

「在中斷服務程序中操作另一個外設」
不知道你的目的和打算用的手段是啥
一般的,ISR中,操作別的設備,常見的是:
設置對應的(比如該硬體本身,或者別的設備B的)寄存器的對應的位,以便通知其某種事情發送或狀態變化了。
然後設備B會:
要麼是由於(被修改了寄存器而)發生了中斷,然後可以接著處理其所要做的事情;
要麼是一直輪訓,檢測對應的某種資源釋放變化,比如上面被改的寄存器的對應的位,發現變化了,再去調用你的函數,做對應的處理。

注意:
中斷,不論是哪個設備的中斷,都不應該佔用(CPU)太長時間
-> 導致別的中斷或服務無法及時運行

僅供參考。

Ⅳ Linux內核中斷之中斷調用流程

本文基於 RockPI 4A 單板Linux4.4內核介紹中斷調用流程。

ARMv8包括兩種運行狀態:AArch64和AArch32。

AArch64中不再使用AArch32中的7種特權模式,而是提出了Exception Levels的概念,包括:

1)EL0:用於用戶態程序,許可權最低

2)EL1:給內核使用,許可權稍高

3)EL2:虛擬化相關,許可權更高

4)EL3:安全相關,許可權最高

Linux內核中一般只使用EL0和EL1。

AArch64異常向量表中的異常包括:

1)Synchronous exception(同步異常)

2)SError

3)IRQ

4)FIQ

註:SError、IRQ和FIQ屬於非同步異常。

在Linux內核中,在 arch/arm64/kernel/entry.S 文件中定義了異常向量表,內容如下:

選取 el1_irq() 函數介紹Linux內核中斷的調用流程。

文件: arch/arm64/kernel/entry.S ,調用流程如下:

1、handle_irq()初始化

在 DTS 解析階段完成 handle_irq() 函數的初始化,流程如下:

gic_irq_domain_map() 函數中完成了 handle_irq() 函數的賦值,具體執行如下:

2、handle_irq()實現

以共享外設中斷 SPI 的中斷處理函數 handle_fasteoi_irq() 為例,繼續跟蹤中斷的執行過程。

handle_irq_event_percpu() 函數會調用已經注冊的中斷處理函數,同時喚醒 irq_thread 線程。

3、中斷處理線程

在使用 request_threaded_irq() 函數申請中斷時,會創建一個 irq_thread 線程,調用流程如下:

irq_thread 線程平時在睡眠狀態,等待 handle_irq_event_percpu() 函數喚醒,進一步執行已注冊的中斷處理線程函數。

使用 DRM 框架中 HDMI 中斷驗證中斷調用流程。

文件: driversgpudrmridgesynopsysdw-hdmi.c

在中斷處理函數 dw_hdmi_hardirq() 和中斷處理線程函數 dw_hdmi_irq 中增加 mp_stack() 調用( 註:僅限於調試驗證 )。

插入 HDMI 線,系統啟動後,顯示中斷調用流程的日誌如下:

Ⅳ 關於linux注冊的中斷函數

我也不完全理解,但是比你知道的多點。
Linux中,分內核態和用戶態。
你寫的所有的驅動,都是出於內核態->可以直接使用內核相關資源;
應用層,都是用戶態->無法直接操作底層的東西 -> 想要操作,比如獲得許可權,切換到內核態,然後才能操作。

你這里的需求,我的理解是:
對應你這句

「在中斷服務程序中操作另一個外設」
不知道你的目的和打算用的手段是啥
一般的,ISR中,操作別的設備,常見的是:
設置對應的(比如該硬體本身,或者別的設備B的)寄存器的對應的位,以便通知其某種事情發送或狀態變化了。
然後設備B會:
要麼是由於(被修改了寄存器而)發生了中斷,然後可以接著處理其所要做的事情;
要麼是一直輪訓,檢測對應的某種資源釋放變化,比如上面被改的寄存器的對應的位,發現變化了,再去調用你的函數,做對應的處理。

注意:
中斷,不論是哪個設備的中斷,都不應該佔用(CPU)太長時間
-> 導致別的中斷或服務無法及時運行

僅供參考。
1
從內核空間返回用戶空間時,kernel檢查是否有pending signal,如果有,執行。

Ⅵ 《Linux設備驅動程序》(十六)-中斷處理

設備與處理器之間的工作通常來說是非同步,設備數據要傳遞給處理器通常來說有以下幾種方法:輪詢、等待和中斷。

讓CPU進行輪詢等待總是不能讓人滿意,所以通常都採用中斷的形式,讓設備來通知CPU讀取數據。

2.6內核的函數參數與現在的參數有所區別,這里都主要介紹概念,具體實現方法需要結合具體的內核版本。

request_irq函數申請中斷,返回0表示申請成功,其他返回值表示申請失敗,其具體參數解釋如下:

flags 掩碼可以使用以下幾個:

快速和慢速處理常式 :現代內核中基本沒有這兩個概念了,使用SA_INTERRUPT位後,當中斷被執行時,當前處理器的其他中斷都將被禁止。通常不要使用SA_INTERRUPT標志位,除非自己明確知道會發生什麼。

共享中斷 :使用共享中斷時,一方面要使用SA_SHIRQ位,另一個是request_irq中的dev_id必須是唯一的,不能為NULL。這個限制的原因是:內核為每個中斷維護了一個共享處理常式的列表,常式中的dev_id各不相同,就像設備簽名。如果dev_id相同,在卸載的時候引起混淆(卸載了另一個中斷),當中斷到達時會產生內核OOP消息。

共享中斷需要滿足以下一個條件才能申請成功:

當不需要使用該中斷時,需要使用free_irq釋放中斷。

通常我們會在模塊載入的時候申請安裝中斷處理常式,但書中建議:在設備第一次打開的時候安裝,在設備最後一次關閉的時候卸載。

如果要查看中斷觸發的次數,可以查看 /proc/interrupts 和 /proc/stat。

書中講述了如何自動檢測中斷號,在嵌入式開發中通常都是查看原理圖和datasheet來直接確定。

自動檢測的原理如下:驅動程序通知設備產生中斷,然後查看哪些中斷信號線被觸發了。Linux提供了以下方法來進行探測:

探測工作耗時較長,建議在模塊載入的時候做。

中斷處理函數和普通函數其實差不多,唯一的區別是其運行的中斷上下文中,在這個上下文中有以下注意事項:

中斷處理函數典型用法如下:

中斷處理函數的參數和返回值含義如下:

返回值主要有兩個:IRQ_NONE和IRQ_HANDLED。

對於中斷我們是可以進行開啟和關閉的,Linux中提供了以下函數操作單個中斷的開關:

該方法可以在所有處理器上禁止或啟用中斷。

需要注意的是:

如果要關閉當前處理器上所有的中斷,則可以調用以下方法:

local_irq_save 會將中斷狀態保持到flags中,然後禁用處理器上的中斷;如果明確知道中斷沒有在其他地方被禁用,則可以使用local_irq_disable,否則請使用local_irq_save。

locat_irq_restore 會根據上面獲取到flags來恢復中斷;local_irq_enable 會無條件打開所有中斷。

在中斷中需要做一些工作,如果工作內容太多,必然導致中斷處理所需的時間過長;而中斷處理又要求能夠盡快完成,這樣才不會影響正常的系統調度,這兩個之間就產生了矛盾。

現在很多操作系統將中斷分為兩個部分來處理上面的矛盾:頂半部和底半部。

頂半部就是我們用request_irq來注冊的中斷處理函數,這個函數要求能夠盡快結束,同時在其中調度底半部,讓底半部在之後來進行後續的耗時工作。

頂半部就不再說明了,就是上面的中斷處理函數,只是要求能夠盡快處理完成並返回,不要處理耗時工作。

底半部通常使用tasklet或者工作隊列來實現。

tasklet的特點和注意事項:

工作隊列的特點和注意事項:

Ⅶ Linux GPIO 中斷函數注冊

gpio中斷函數設置方法

1.使能中斷

2.聲明定義函數

3.請求中斷

Ⅷ 為什麼中斷注冊成功但LINUX內核沒有響應

中斷注冊成功了?
wince還是linux?
你是用gpio還是什麼做的按鍵?
linux,首先在你的開發板啟動後執行以下:cat /proc/interrupt,看哈你所要的中斷號是否存在
存在的話,看哈你的request_irq裡面的觸發條件是否設置正確,是否寫正確。
不存在,看哈你是否沒有初始化正確,request_irq是否沒有寫正確。
以上只是建議。若是你用示波器打你的硬體,真的可以看見你的中斷已經按照你的需求產生,那麼硬體是沒問題的。內核裡面的中斷組控制器初始化是沒問題的。唯一的問題就只有你的初始化了。

wince差不多,只不過函數名不一樣而已。

閱讀全文

與linux中斷注冊相關的資料

熱點內容
公司法pdf下載 瀏覽:379
linuxmarkdown 瀏覽:347
華為手機怎麼多選文件夾 瀏覽:679
如何取消命令方塊指令 瀏覽:345
風翼app為什麼進不去了 瀏覽:774
im4java壓縮圖片 瀏覽:358
數據查詢網站源碼 瀏覽:146
伊克塞爾文檔怎麼進行加密 瀏覽:886
app轉賬是什麼 瀏覽:159
php的基本語法 瀏覽:792
對外漢語pdf 瀏覽:516
如何用mamp本地web伺服器 瀏覽:869
如何加密自己js代碼 瀏覽:627
排列組合a與c的演算法 瀏覽:534
如何在文件夾中找到同名內容 瀏覽:786
有什麼app文字轉韓文配音 瀏覽:372
循環宏1命令 瀏覽:35
斐波那契數列矩陣演算法 瀏覽:674
公式保護後加密不了 瀏覽:82
java跳轉到jsp 瀏覽:819