- 论坛徽章:
- 0
|
01 spin_lock(&(irq_desc[irq].lock));
02 irq_desc[irq].handler->ack(irq);
03 irq_desc[irq].status &= ~(IRQ_REPLAY | IRQ_WAITING);
04 irq_desc[irq].status |= IRQ_PENDING;
05 if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))
06 && irq_desc[irq].action) {
07 irq_desc[irq].status |= IRQ_INPROGRESS;
08 do {
09 irq_desc[irq].status &= ~IRQ_PENDING;
10 spin_unlock(&(irq_desc[irq].lock));
11 handle_IRQ_event(irq, regs, irq_desc[irq].action);
12 spin_lock(&(irq_desc[irq].lock));
13 } while (irq_desc[irq].status & IRQ_PENDING);
14 irq_desc[irq].status &= ~IRQ_INPROGRESS;15
15 }
16 irq_desc[irq].handler->end(irq);
17 spin_unlock(&(irq_desc[irq].lock));
上面的代码来自于ulk3 p167. 假设现在使用的是老式的pic,也就是串接的2个8259a芯片,这时候第2行代码对应的函数是mask_and_ack_8259A()
我的疑问是该函数会设置status的IRQ_DISABLED位吗。我认为此处是设置了,但如果设置了该位,就不会执行6-15行了吧,也就是中断处理程序得不到执行了,但这是不可能的呀。
对于pic,执行一个中断的时候,对应的中断线都应该是断开的吧,也就是会设置IRQ_DISABLED位,如果不是在上面mask_and_ack_8259A()处设置,会在何处设置呢。 |
|