Chinaunix
标题:
外部中断处理中的几个问题
[打印本页]
作者:
q631951221
时间:
2011-10-30 14:09
标题:
外部中断处理中的几个问题
1 当有外部中断时,硬件自动关闭了cpu的中断,并保存关键的上下文,那么是不是在执行我们用request_irq()注册的中断函数是也是在关中断的情况下进行的?因为我再源代码中没有找到开中断的代码啊!
2 在外部中断处理完成后,要调用irq_exit()进行软终端的处理,软终端处理不会也是在关中断情况下进行的吧?没有看到开中断的代码啊!
在irq_exit()函数中的代码
if (!in_interrupt() && local_softirq_pending())
invoke_softirq();
只有不在中断中时才执行软终端处理,如果之前没有开中断的话,那不就是在中断状态了,就不可能执行软终端处理了?
找不到开中断到底在什么时候,想找到代码作证。
作者:
amarant
时间:
2011-10-30 16:09
看看desc->chip->... 做了什么吧
作者:
smalloc
时间:
2011-10-30 20:20
回复
1#
q631951221
这一行是判断有没有嵌套。
作者:
chishanmingshen
时间:
2011-10-30 20:46
楼上2位说得没错.都比较靠里层.
那外层呢?
进中断门后关中断,出中断门时开中断么?
作者:
tempname2
时间:
2011-10-31 09:07
本帖最后由 tempname2 于 2011-10-31 09:15 编辑
1。老版本在__do_IRQ --> handle_IRQ_event里打开了。新版本的Generic IRQ调用irq_desc->handle_irq,比如边沿触发中断对应的就是handle_edge_irq,这个里面再滑到handle_IRQ_event。
2。那个是说,如果当前中断打断的是另一个中断或者是已在执行softirq我就不处理softirq了。最后的效果是softirq不会抢占softirq或者中断。
__do_softirq里会打开中断。
作者:
q631951221
时间:
2011-11-02 00:01
回复
2#
amarant
这里面的函数是先开中断,然后在执行完成中断处理函数后又关中断了,问题就是后面还要执行软终端啊,为什么就关中断了,应该一直开着啊?
作者:
amarant
时间:
2011-11-02 07:55
回复
6#
q631951221
5楼说的明白 多跟跟代码就知道了。觉得疑惑就继续跟到__do_softirq里面去
作者:
瀚海书香
时间:
2011-11-02 08:18
回复
6#
q631951221
问题就是后面还要执行软终端啊,为什么就关中断了,应该一直开着啊
软中断执行的时候,会重新打开中断的。
作者:
tempname2
时间:
2011-11-02 11:37
回复
1#
q631951221
现在中断线程化了,执行中断处理函数前不会开中断了,在处理函数里开了中断,出来后还会发出警告。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2