阅读:1430回复:10
中断问题
我查看以前的贴子中对中断的处理:
其中有一条说先1、清掉中断 2、再调用dpc 我的问题是1、清中断 和 2、调用dpc 先后有什么区别?? 望高手告知---------一定给分 |
|
沙发#
发布于:2002-11-07 15:06
ISR的主要工作就是清除中断,执行了这个主要任务之后就可以向HAL返回TRUE,表明你已经服务了该设备中断.
因为ISR执行在提升的IRQL上,所以它冻结了其CPU上所有低于或等于该IRQL的其它活动。基本上ISR,只做服务硬件所需的最小量的工作,然后立即返回。 如果有额外的工作需要做(例如完成一个IRP),才交给DPC来完成。 之后,内核在DISPATCH_LEVEL级上调用这个DPC例程。 所以先后关系不能颠倒! |
|
|
板凳#
发布于:2002-11-07 15:18
非常感谢ydyuse的回答!我遇到的情况是:
1、 如果我先清掉interrupt再insert dpc。在处理若干个中断后就会出现死机。 2、 如果我将顺序颠倒不会死机,但会出现一个isr没有执行完就又出现一个中断的现象(偶然,但一定会出现) ////////////////// 请帮忙分析一下这两种情况! |
|
地板#
发布于:2002-11-07 15:32
如果在DPC例程真正运行前,你的设备又生成一个中断,并且如果你的ISR为此又请求了一个DPC,那么内核将简单地忽略第二个DPC请求。换句话说,不管ISR连续请求了多少个DPC,你的DPC对象仅在队列上一次,而且内核也仅调用你的回调例程一次。
what\'s this means? 在处理若干!!个中断后就会出现死机 |
|
|
地下室#
发布于:2002-11-07 15:33
非常感谢ydyuse的回答!我遇到的情况是: 会不会是dpc执行的太慢了,同一个dpc不能插入两次,是不是丢掉了一些dpc导致死机?用中断同步例程可以吗? |
|
5楼#
发布于:2002-11-07 15:35
呵呵,有人答过了啊,还可以自己做个队列自己管理dpc试试
|
|
6楼#
发布于:2002-11-07 15:40
死机情况在一个isr执行完之后出现,只是没有什么规律!
中断同步例程怎么用啊! |
|
7楼#
发布于:2002-11-07 15:54
我在isr中先屏蔽所有中断,等所有工作做完后再打开中断
这样就不会出现刚才的问题! 不过这样做会不会导致中断相应的效率问题啊! |
|
8楼#
发布于:2002-11-07 16:41
死机情况在一个isr执行完之后出现,只是没有什么规律! KeSynchronizeExecution 试试看 |
|
9楼#
发布于:2002-11-07 16:42
我在isr中先屏蔽所有中断,等所有工作做完后再打开中断 会丢中断吧 |
|
10楼#
发布于:2002-11-18 10:41
引用:
-------------------------------------------------------------------------------- 死机情况在一个isr执行完之后出现,只是没有什么规律! 中断同步例程怎么用啊! -------------------------------------------------------------------------------- KeSynchronizeExecution 试试看 //////////////////////////////////////////////////////// Does any other dispatch routine accessing the I/O port that also using in your ISR? If so try the KeSynchronizeExecution to synchronize accessing these I/O port. |
|