- 论坛徽章:
- 0
|
本帖最后由 mxgsgtc 于 2017-04-19 17:54 编辑
请教:
此函数最开始的部分:
handle_edge_irq(unsigned int irq, struct irq_desc *desc)
{
raw_spin_lock(&desc->lock);
desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
/*
* If we're currently running this IRQ, or its disabled,
* we shouldn't process the IRQ. Mark it pending, handle
* the necessary masking and go out
*/
if (unlikely(irqd_irq_disabled(&desc->irq_data) ||
irqd_irq_inprogress(&desc->irq_data) || !desc->action)) {
if (!irq_check_poll(desc)) { //①
desc->istate |= IRQS_PENDING;
mask_ack_irq(desc);
goto out_unlock;
}
}
-----
-----
}
比如来了个中断A-->do_IRQ-->handle_edge_irq
此函数最初会判断
1.中断线是否被disable -->IRQD_IRQ_DISABLED
2.中断线是否正在处理其他中断-->IRQD_IRQ_INPROGRESS
3.ISR是否不存在
如果上述三种情况符合一种
则调用:
static bool irq_check_poll(struct irq_desc *desc)
{
if (!(desc->istate & IRQS_POLL_INPROGRESS))
return false;
return irq_wait_for_poll(desc);
}
问题:
1.IRQS_POLL_INPROGRESS代表什么意思?,不是太明白,中断线会被轮询吗?
2. 实际情况中IRQS_POLL_INPROGRESS的应用场景是什么?
3.如果正在处理一个中断A的情况下, 又来了一个中断B,B中断所在流程假设判断此中断线在IRQS_POLL_INPROGRESS中,此时①处不会执行if里面的内容,即handle_edge_irq函数不会退出,而会
继续往下执行,那样的话, A与B是不是会同时被处理了呢?
|
|