mike_wang
驱动中牛
驱动中牛
  • 注册日期2003-01-22
  • 最后登录2012-01-04
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:1430回复:10

中断问题

楼主#
更多 发布于:2002-11-07 14:49
我查看以前的贴子中对中断的处理:
 其中有一条说先1、清掉中断 2、再调用dpc

我的问题是1、清中断 和 2、调用dpc  先后有什么区别??
望高手告知---------一定给分
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-07 15:06
ISR的主要工作就是清除中断,执行了这个主要任务之后就可以向HAL返回TRUE,表明你已经服务了该设备中断.

因为ISR执行在提升的IRQL上,所以它冻结了其CPU上所有低于或等于该IRQL的其它活动。基本上ISR,只做服务硬件所需的最小量的工作,然后立即返回。
如果有额外的工作需要做(例如完成一个IRP),才交给DPC来完成。
之后,内核在DISPATCH_LEVEL级上调用这个DPC例程。

所以先后关系不能颠倒!
生命驱动,活力无限!
mike_wang
驱动中牛
驱动中牛
  • 注册日期2003-01-22
  • 最后登录2012-01-04
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-07 15:18
非常感谢ydyuse的回答!我遇到的情况是:
1、     如果我先清掉interrupt再insert dpc。在处理若干个中断后就会出现死机。
2、     如果我将顺序颠倒不会死机,但会出现一个isr没有执行完就又出现一个中断的现象(偶然,但一定会出现)

//////////////////
请帮忙分析一下这两种情况!
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-07 15:32
如果在DPC例程真正运行前,你的设备又生成一个中断,并且如果你的ISR为此又请求了一个DPC,那么内核将简单地忽略第二个DPC请求。换句话说,不管ISR连续请求了多少个DPC,你的DPC对象仅在队列上一次,而且内核也仅调用你的回调例程一次。

what\'s this means?
在处理若干!!个中断后就会出现死机
生命驱动,活力无限!
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-07 15:33
非常感谢ydyuse的回答!我遇到的情况是:
1、     如果我先清掉interrupt再insert dpc。在处理若干个中断后就会出现死机。
2、     如果我将顺序颠倒不会死机,但会出现一个isr没有执行完就又出现一个中断的现象(偶然,但一定会出现)

//////////////////
请帮忙分析一下这两种情况!


会不会是dpc执行的太慢了,同一个dpc不能插入两次,是不是丢掉了一些dpc导致死机?用中断同步例程可以吗?
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-07 15:35
呵呵,有人答过了啊,还可以自己做个队列自己管理dpc试试
mike_wang
驱动中牛
驱动中牛
  • 注册日期2003-01-22
  • 最后登录2012-01-04
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-07 15:40
死机情况在一个isr执行完之后出现,只是没有什么规律!

中断同步例程怎么用啊!
mike_wang
驱动中牛
驱动中牛
  • 注册日期2003-01-22
  • 最后登录2012-01-04
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-07 15:54
我在isr中先屏蔽所有中断,等所有工作做完后再打开中断
这样就不会出现刚才的问题!
不过这样做会不会导致中断相应的效率问题啊!
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-07 16:41
死机情况在一个isr执行完之后出现,只是没有什么规律!

中断同步例程怎么用啊!


KeSynchronizeExecution 试试看
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-07 16:42
我在isr中先屏蔽所有中断,等所有工作做完后再打开中断
这样就不会出现刚才的问题!
不过这样做会不会导致中断相应的效率问题啊!


会丢中断吧
goodbill
驱动牛犊
驱动牛犊
  • 注册日期2002-11-13
  • 最后登录2017-07-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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.
游客

返回顶部