中断包括软中断和硬中断两种,中断是一种异步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和工作队列,待补充