免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2391 | 回复: 0
打印 上一主题 下一主题

[中断] handle_edge_irq(边沿触发函数) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-04-19 17:48 |只看该作者 |倒序浏览
本帖最后由 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是不是会同时被处理了呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP