ARM Linux 中斷分析

2021-05-06 07:02:01 字數 1700 閱讀 9666

在具體的

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,不是共享型別,所以,...