在具體的
arm 晶元中會有很多的中斷型別,每一種型別的中斷用以上結構來表示:
struct irqdesc irq_desc[nr_irqs]; /* nr_irqs
根據不同的
mcu 會有所區別*/
在通過request_irq()
函式註冊中斷服務程式的時候,將會把中斷向量和中斷服務程式對應起來。
我們來看一下
request_irq
的原始碼:
intrequest_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),
unsigned long irq_flags, const char * devname, void *dev_id)
其中第乙個引數
irq 就是中斷向量,第二個引數即是要註冊的中斷服務程式。很多同仁可能疑惑的是,我們要註冊的中斷向量號是怎麼確定的呢?這要根據具體晶元的中斷控制器,比如三星的
s3c2410
,需要通過讀取其中的中斷狀態暫存器,來獲得是哪個裝置發生了中斷:
if defined(config_arch_s3c2410)
#include
.macro disable_fiq
.endm
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
mov r4, #intbase @ virtual address of irq registers
ldr /irqnr, [r4, #0x8] @ read intmsk
中斷掩碼暫存器
ldr /irqstat, [r4, #0x10] @ read intpnd
中斷暫存器
bics /irqstat, /irqstat, /irqnr
bics /irqstat, /irqstat, /irqnr
beq 1002f
mov /irqnr, #0
1001: tst /irqstat, #1
bne 1002f @ found irq
add /irqnr, /irqnr, #1
mov /irqstat, /irqstat, lsr #1
cmp /irqnr, #32
bcc 1001b
1002:
.endm
.macro irq_prio_table
.endm
arm linux 中斷分析2
裝置一般都比cpu慢得多。因此一般情況下,當乙個程序通過裝置驅動程式向裝置發出讀寫請求後,cpu並不等待i o操作的完成,而是讓正在執行的程序去睡眠,cpu自己做別的事情,例如喚醒另乙個程序執行。當裝置完成i o操作需要通知cpu時,會向cpu發出乙個中斷請求 然後cpu根據中斷請求來決定呼叫相應的...
ARM Linux驅動 ADC驅動(中斷方式)
硬體平台 fl2440 核心版本 2.6.28 主機平台 ubuntu 11.04 核心版本 2.6.39 這個驅動寫了好久,因為原來的linux核心編譯的時候將觸控螢幕驅動編譯進核心了,而觸控螢幕驅動裡的adc中斷在註冊的時候型別選擇的是 irqf sample random,不是共享型別,所以,...
ARM Linux驅動 ADC驅動(中斷方式)
硬體平台 fl2440 核心版本 2.6.28 主機平台 ubuntu 11.04 核心版本 2.6.39 這個驅動寫了好久,因為原來的linux核心編譯的時候將觸控螢幕驅動編譯進核心了,而觸控螢幕驅動裡的adc中斷在註冊的時候型別選擇的是 irqf sample random,不是共享型別,所以,...