2012年(18)
分类: LINUX
2012-10-23 23:12:58
1、关于设备驱动中的中断问题
操作系统为了使得快速设备和慢速设备合适工作,需要中断来提高效率,一个外设要使用一个中断就必须注册中断号,获得跟这个中断号相关的一些资源,并且在中断发生的时候内核可以进行一些处理,例如:调用中断处理例程来真正的处理设备中断。Linux处理中断的方式很大程度上与它在用户空间处理信号的方式是一样的。
我们知道,从本质上讲,中断处理例程会和其他代码并发运行,这就会涉及到竞态和并发的问题。
接下来我们就来讲讲有关中断的实现和使用:
首先,我们需要注册一个中断,可如下注册,在
第一个参数:要申请的中断号,主要看硬件的连接方式决定;
第二个参数:中断处理例程,自己实现,在发生中断的时候调用,稍候详细说明;
第三个参数:中断管理的标志,是一个位掩码选项,例如可设置一个中断号在几个设备间共享,常见的就 是开发板上的ADC和Touch Screen共享ADC中断;
第四个参数:用来标示中断拥有者的名称,可自己设定;
第五个参数:用于共享的中断信号线,稍候详细说明。
调用request_irq的正确位置应该是设备第一次打开、硬件被告知产生中断之前。
接下来,注册后怎么注销呢?调用如下函数即可:
调用free_irq的位置应该是最后一次关闭设备、硬件被告知不用再中断处理器后。
有关中断处理例程:
首先看看irq_handler_t的定义,显然它应该是一个自定义类型,定义在:include/linux/interrupt.h中:
2、中断处理的示例
这里是友善之臂的按键设备驱动程序,做了一些注释,对比这上面的理论部分就比较好理解了。