中断处理
中断指CPU在执行程序的过程中,出现了某些突发事件时CPU必须暂停执行当前的程序,转去处理突发事件,处理完毕后CPU又返回原程序被中断的位置并继续执行。
中断分类:
外部中断 VS 内部中断
可屏蔽中断 VS 不可屏蔽中断
向量中断 VS 非向量中断
LINUX中处理中断程序的架构
如果中断本身要处理的工作很少,则直接在顶半步完成。
中断实现
在Linux驱动程序中,为设备实现一个中断包含两个步骤:
1.向内核注册中断
2.实现中断处理函数
中断注册
在<linux/interrupt.h>头文件中申明的下列函数用于实现中断的注册功能:
int request_irq(unsigned int irq, irqreturn_t (*handler)(int irq, void *dev_id), unsigned long flags, const char *device, void *dev_id)
返回0表示成功,或者返回一个错误码
unsigned int irq : 中断号。
void (*handler)(int irq, void *dev_id): 中断处理函数。
unsigned long flags :与中断管理有关的各种选项。 对内部中断,是指快速中断或者共享中断,对外部中断,是指中断触发模式等,如IRQ_TYPE_EDGE_BOTH, IRQ_TYPE_EDGE_RISING
const char *device : 传递给request_irq的字符串,用于在/proc/interrupts中显示中断的拥有者
void *dev_id :共享中断时使用,该参数会传给中断函数,一般设为指向本设备的结构体指针或者直接为NULL。
unsigned long flags : 与中断管理有关的各种选项。
1、对内部中断,是指快速中断或者共享中断等,定义在linux/irq.h通常使用:SA_SHIRQ 该位表明中断可以在设备间共享。
如ADC中的中断申请:
ret = request_irq(IRQ_ADC, adcdone_int_handler, IRQF_SHARED, DEVICE_NAME, &adcdev);
2、对外部中断,是指中断触发模式等,如IRQ_TYPE_EDGE_BOTH, IRQ_TYPE_EDGE_RISING
如按键中断申请:
ret = request_irq(KeyIrqArray[3],key4_interrupt,IRQ_TYPE_EDGE_FALLING,“key_zsy”,NULL);