裸机中断: 1、有统一的入口,去中断向量表找对应中断
2、事先要注册中断处理程序
3、根据中断源的编号调用中断处理程序
linux系统中:1、也同样有统一入口,在irq_svc中 :①拿到产生中断源的编号
②根据中断号找到相应的irq_desc
③根据irp_desc找到事先注册好的中断处理程序去运行
与裸机不同就是linux系统更复杂一些,套入比裸机多的结构去查找处理程序。
linux中断处理程序设计: 1、注册中断:
使用request_irq函数用于注册中断
int request_irq(unsigned int irq,void (*handler)(int,void*,struct pt_regs *),
unsigned long flags,
const char *devname,
void *dev_id)
返回0表示成功,或者返回一个错误码
unsigned int irq:中断号
void (*handler)(int,void*,struct pt_regs *)中断处理函数
unsigned long flags:中断管理有关的选项
const char *devname:设备名
void *dev_id:共享中断时使用
2、中断处理
第一:检查设备是否产生了中断
第二:清除中断产生标志
第三:相应的硬件操作
注意:①中断处理中不可以使用引起阻塞的函数
②中断处理中不可以使用引起调度的函数
3、注册处理