unsigned int status = 0; if (!(action->flags & IRQF_DISABLED))
local_irq_enable_in_hardirq();
do {
。。。。。。
ret = action->handler(irq, action->dev_id); //执行中断处理函数。
。。。。。。
retval |= ret;
action = action->next;
} while (action); //调用该中断线上的所有例程
if (status & IRQF_SAMPLE_RANDOM)
add_interrupt_randomness(irq);
local_irq_disable();
return retval;
}
void
handle_level_irq(unsigned int irq, struct irq_desc *desc)
{
struct irqaction *action;
irqreturn_t action_ret;
。。。。。。
desc = irq_remap_to_desc(irq, desc);
。。。。。。
action = desc->action;
action_ret = handle_IRQ_event(irq, action);
。。。。。。
}
void
handle_edge_irq(unsigned int irq, struct irq_desc *desc)
{
spin_lock(&desc->lock); 。。。。。。
desc = irq_remap_to_desc(irq, desc);
。。。。。。
desc->status |= IRQ_INPROGRESS;
do {
struct irqaction *action = desc->action;
。。。。。。
desc->status &= ~IRQ_PENDING;
spin_unlock(&desc->lock);
action_ret = handle_IRQ_event(irq, action);
if (!noirqdebug)
note_interrupt(irq, desc, action_ret);
spin_lock(&desc->lock);
//该函数与函数handle_level_irq不太一样的是,该函数多了一个循环。即如果在本次中断
//的处理过程中该中断线上又有中断产生,则再次执行该中断线上的处理例程
#define IRQ_DISABLED 2
#define IRQ_PENDING 4
#define IRQ_REPLAY 8
#define IRQ_WAITING 32
*/
} while ((desc->status & (IRQ_PENDING | IRQ_DISABLED)) == IRQ_PENDING);
desc->status &= ~IRQ_INPROGRESS;
out_unlock:
spin_unlock(&desc->lock);
}