您的位置:首页 > 运维架构 > Linux

Linux2.6 中断处理函数和申请中断函数的变化

2010-10-01 16:49 218 查看
Linux2.6 中断处理函数和申请中断函数的变化
2009-07-29 08:46
今天练习了中断。
Linux设备驱动开发技术及应用 ,作者使用的是2.6.4,现在看来也很古老了,
按照书上的例子,免不了很多错。
例如代码里
自己定义的中断处理函数
irqreturn_t int_interrupt(int irq,void * dev_id,struct pt_regs *regs);
注册中断函数
request_irq(PRINT_IRQ,int_interrupt,SA_INTERRUPT,INT_DEV_NAME,NULL);

编译提示
警告:‘deprecated_irq_flag’ 已过时(于 include/linux/interrupt.h:64 声明)
警告:传递参数 2 (属于 ‘request_irq’)时在不兼容的指针类型间转换

既然如此,那就到头文件里看看request_irq,
http://lxr.linux.no/linux+v2.6.23.10/include/linux/interrupt.h#L94

extern int __must_check request_irq(unsigned int, irq_handler_t handler,
unsigned long, const char *, void *);
没发现什么,再看看
typedef irqreturn_t (*irq_handler_t)(int, void *);

原来中断处理函数现在只有2个参数了,第三个参数struct pt_regs *regs保存的是中断发生时寄存器的值,
但是通常没有用,最后还是被取消了。

修改irqreturn_t int_interrupt(int irq,void * dev_id,struct pt_regs *regs);
为irqreturn_t int_interrupt(int irq,void * dev_id);
之后还是警告

原来头文件里没有SA_INTERRUPT了,一般使用IRQF_SHARED 了。
request_irq(PRINT_IRQ,int_interrupt,IRQF_SHARED,INT_DEV_NAME,NULL);

这样就可以了。网上看到很多人编译驱动也是这个问题,我想以后我做驱动移植的时候就可以直接改代码解决问题。

Linux内核给源代码,每个版本之间的变化,就像你写的代码,进行了修改,就需要修改其他的相关代码来配合变化。
既是折磨又是享受。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: