Linux驱动开发8——中断处理

中断包括软中断和硬中断两种,中断是一种异步I/O机制,即中断可以发生在任意时间点。

1、硬中断

硬件中断包括触发中断和处理中断两部分,而维系两者的是中断号,中断号是一种硬件资源。

1.1、注册和释放中断

#include <linux/interrupt.h>

注册中断处理函数,将中断号与中断处理函数绑定在一起,成功返回0,失败返回负错误码
int request_irq(
    unsigned int irq,
    irqreturn_t (*handler)(int irq, void *dev_id, struct pt_regs *regs),
    unsigned long flags,
    const char *dev_name,
    void *dev_id
);
参数说明:
irq - 中断号
handler - 中断服务函数
flags - SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM
dev_name - 设备驱动名称,在/proc/interrupts中可以显示设备驱动和中断号的对应关系
dev_id - 用作共享中断号的指针,如果中断号没有被共享,置为NULL 释放中断号
void free_irq(unsigned int irq, void *dev_id);

 1.2、使能和禁止中断

#include <asm/irq.h>

使能中断
void enable_irq(int irq);

等待当前执行的中断处理完成,然后禁止中断
void disable_irq(int irq);

不等待当前执行的中断处理完成,立即禁止中断
void disable_irq_nosync(int irq);

调用任一函数可能更新在PIC中特定IRQ的掩码,从而使能或者禁止特定中断。


#include <asm/system.h>

禁止所有中断,并保存中断状态
void local_irq_save(unsigned long flags);

禁止所有中断,不保存中断状态
void local_irq_disable(void);

恢复所有中断,并恢复中断状态
void local_irq_restore(unsigned long flags);

恢复所有中断
void local_irq_enable(void);

 1.3、中断顶半部和底半部

tasklet和工作队列,待补充

猜你喜欢

转载自www.cnblogs.com/justin-y-lin/p/10694505.html