您的位置:首页 > 其它

中断和中断处理程序

2010-05-25 17:03 190 查看
驱动程序可以通过下面的函数注册并激活一个中断处理程序,以便处理中断:

int request_irq(unsigned int irq,

irqreturn_t (*handler)(int ,void *,struct pt_regs *),

unsigned long irqflags,

const char * devname,

void *dev_id)

第一个参数表示分配的中断号。

第二个参数handler是一个指针,指向处理这个中断的实际中断处理程序。

第三个参数irqflags可以是0,也可以是下列一个或多个标志的位掩码:

SA_INTERRUPT:此标志表明给定的中断处理程序是一个快速中断处理程序(fast interrupt handler).在本地处理器上,快速中断处理程序在禁止所有中断的情况下运行。这使得快速中断处理程序能够不受其他中断的干扰,得以迅速执行。而默认情况下(没有这个标志),除了正运行的中断处理程序应的那条中断线被屏蔽外,其他所有中断都是激活的。除了时钟中断外,绝大多数中断都不使用该标志。

SA_SAMPLE_RANDOM:此标志表明这个设备产生的中断对内核熵池有贡献。内核熵池负责提供从各种随机事件导出的真正的随机数。如果制订了该标志,那么来自该设备的中断间隔时间就会作为熵填充到熵池。如果你的设备以预知的速率产生中断(比如系统定时器),或者可能受外部攻击者的影响,那么就不要设置这个标志。相反,有其他很多硬件产生中断的速率是不可预知的,所以都能成为一种较好的熵源。、

SA_SHIRQ:此标志表明可以在多个中断处理程序之间共享中断线。在同一个给定线上注册的每个处理程序必须指定这个标志;否则,在每条线上只能有一个处理程序。

第四个参数dev_id主要用于共享中断线。

卸载驱动程序时,需要注销相应的中断处理程序,并释放中断线。使用:

free_irq(unsigned int irq,void *dev_id)

编写中断处理程序

static irqreturn_t intr_handler(int irq,void *dev_id,struct pt_regs *regs)

第二个参数dev_id是一个通用指针,它与在中断处理程序注册时传递给request_irq()的参数dev_id必须一致。如果该值有唯一确定性,那么它就相当于一个cookie,可以用来区分共享同一中断处理程序的多个设备。

最后一个参数regs是一个指向结构的指针,该结构包含处理中断之前处理器的寄存器和状态。除了调试的时候,它们很少使用到。事实上,目前开发者的兴趣显示这个参数可能不再使用。

中断处理程序可能返回两个特殊的值

当中断处理程序检测到一个中断,但该中断对应的设备并不是在注册处理函数期间指定的产生源时,返回IRQ_NONE;

当中断处理程序被正确调用,且确实是它所对应的设备产生了中断时,返回IRQ_HANDLED.另外,也可以使用宏IRQ_RETVAL(x).如果x为非0值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: