linux 下的中断采用的是中断向量的方式,每一个中断对应一个中
断描述数组当中的一项, 结构为 struct irqdesc,其当中对应一成员结构为 struct irqactionr 的成
员 act ion, 这个即表示此中断向量对应的中断处理动作,这里引用从网上下载的一幅图讲明
中断向量表与中断动作之间的关系:
struct irqaction {
void (*handler)(int, void *, struct pt_regs *);
unsigned long flags;
unsigned long mask;
const char *name;
void *dev_id;
struct irqaction *next;
8
};
从上面的结构体与图当中,我们就可以很清楚的看到,一个中断向量表可以对应一个
irqaction,
也可能对应多个由链表链在一起的一个链表 irqaction, 这当中主要在安装中断
的时候通过中断的标志位来决定:
安装中断处理,不可共享:
retval = request_irq(port->irq, w83697uart_int, 0, "w83697_uart3", port);
安装中断处理,可共享:
retval = request_irq(port->irq, w83697uart_int2, SA_SHIRQ, "w83977_uart5", port);
由上即可知,
安装共享中断时,
只须指定安装的中断标志位 flag 为 SA_SHIRQ, 进入分析
安装中断的处理可知,在安装时,会检测已经安装的中断是否支持共享中断,如果不支持,
则新的中断安装动作失败;
如果已经安装的中断支持共享中断,
则还必须检测将要安装的新
中断是否支持中断共享,
如果不支持则安装还是会失败,
如果支持则将此新的中断处理链接
到此中断向量对应的中断动作处理链表当中.
在产生中断时,
共享中断向量中对应的中断处理程序链表中的每一个都会被调用,
依据
链表的次序来,
这样处理虽然会有影响到效率,
但是一般情况下中断传到用户的中断处理服
务程序中时,
由用户根据硬件的状态来决定是否处理中断,
所以能常情况下都是立即就返回
了,效率的影响不会是大的问题.
断描述数组当中的一项, 结构为 struct irqdesc,其当中对应一成员结构为 struct irqactionr 的成
员 act
中断向量表与中断动作之间的关系:
struct irqaction {
void (*handler)(int, void *, struct pt_regs *);
unsigned long flags;
unsigned long mask;
const char *name;
void *dev_id;
struct irqaction *next;
8
};
从上面的结构体与图当中,我们就可以很清楚的看到,一个中断向量表可以对应一个
irqaction,
也可能对应多个由链表链在一起的一个链表 irqaction, 这当中主要在安装中断
的时候通过中断的标志位来决定:
安装中断处理,不可共享:
retval = request_irq(port->irq, w83697uart_int, 0, "w83697_uart3", port);
安装中断处理,可共享:
retval = request_irq(port->irq, w83697uart_int2, SA_SHIRQ, "w83977_uart5", port);
由上即可知,
安装共享中断时,
只须指定安装的中断标志位 flag 为 SA_SHIRQ, 进入分析
安装中断的处理可知,在安装时,会检测已经安装的中断是否支持共享中断,如果不支持,
则新的中断安装动作失败;
如果已经安装的中断支持共享中断,
则还必须检测将要安装的新
中断是否支持中断共享,
如果不支持则安装还是会失败,
如果支持则将此新的中断处理链接
到此中断向量对应的中断动作处理链表当中.
在产生中断时,
共享中断向量中对应的中断处理程序链表中的每一个都会被调用,
依据
链表的次序来,
这样处理虽然会有影响到效率,
但是一般情况下中断传到用户的中断处理服
务程序中时,
由用户根据硬件的状态来决定是否处理中断,
所以能常情况下都是立即就返回
了,效率的影响不会是大的问题.