免费注册 查看新帖 |

Chinaunix

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

中断处理程序的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-25 14:39 |只看该作者 |倒序浏览
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()处设置,会在何处设置呢。

论坛徽章:
0
2 [报告]
发表于 2009-05-25 15:57 |只看该作者
原帖由 yangyufeng507 于 2009-5-25 14:39 发表

上面的代码来自于ulk3 p167. 假设现在使用的是老式的pic,也就是串接的2个8259a芯片,这时候第2行代码对应的函数是mask_and_ack_8259A()
我的疑问是该函数会设置status的IRQ_DISABLED位吗。我认为此处是设置 ...

不会
mask_and_ack_8259A()是ack硬件,IRQ_DISABLED是个软件标志,你把两者混淆了

论坛徽章:
0
3 [报告]
发表于 2009-05-25 16:03 |只看该作者
前2天我找到了你以前的帖子,看到了关于设备驱动关中断和系统关中断的了(硬件关中断是指设置寄存器吗)。没有明白才来问一下。在这里既然硬件禁用了IRQ线为什么不设置为IRQ_DISABLED状态呢,那会在哪里和什么时候设置IRQ_DISABLED这个标志呢。谢谢

论坛徽章:
0
4 [报告]
发表于 2009-05-25 16:22 |只看该作者
原帖由 yangyufeng507 于 2009-5-25 16:03 发表
前2天我找到了你以前的帖子,看到了关于设备驱动关中断和系统关中断的了(硬件关中断是指设置寄存器吗)。没有明白才来问一下。在这里既然硬件禁用了IRQ线为什么不设置为IRQ_DISABLED状态呢,那会在哪里和什么时 ...

IRQ_DISABLED在disable_irq()类函数中设置,它代表OS不想处理这个中断,即使它已经发生了。同时也在硬件上关闭掉它。
mask_and_ack_8259A()不是用来关闭中断的,而是应答。你在函数中只要看到ack字样,都是应答。即使在应答的过程中可能会附带从硬件屏蔽掉这个中断,但这并不具有IRQ_DISABLED的意义。

论坛徽章:
0
5 [报告]
发表于 2009-05-25 16:33 |只看该作者
我明白些了,谢谢。
这么说的话,IRQ_DISABLED这个状态不是每次有中断给cpu都会被OS设置的了。mask_and_ack_8259A()是每有中断给cpu都会被调用的吧。
mask_and_ack_8259A()还是完成了2方面的功能吧:1)mask 2)ack。

论坛徽章:
0
6 [报告]
发表于 2009-05-25 16:59 |只看该作者
我明白些了,谢谢。
>>这么说的话,IRQ_DISABLED这个状态不是每次有中断给cpu都会被OS设置的了。

>>mask_and_ack_8259A()是每有中断给cpu都会被调用的吧。
对PIC是
>>mask_and_ack_8259A()还是完成了2方面的功能吧:1)mask 2)ack。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP