minsoft
驱动小牛
驱动小牛
  • 注册日期2001-07-30
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1989回复:10

有关中断的几点归纳

楼主#
更多 发布于:2002-11-13 13:36
在PCI/WDM驱程开发过程中,中断处理总是初学者出问题最多的地方,而许多蓝屏也是由于ISR处理不好所致。在此想将中断驱程中几个重要的地方归纳一下,以互相学习。

1、获得中断资源。有中断的设备其驱程必须先知道本设备使用的IRQL,才能正确处理设备的中断。在WDM中,这点很简单,StartDevice()已经将资源表传递过来了。而在NT KMD驱程中,必须用HalGetBusDataxxx读取设备配置寄存器并用HalGetInterrup()将取得的值进行系统转换(映射)。
2、关闭中断和清中断状态。在知道了设备的I/O、IRQ资源后应该立即清除设备已有中断并关闭断,尽管硬件设计时大多考虑开机时处于关中断状态。很多初学者会忽略此步,而ISR又没有考虑详细,结果在后面一调用IoConnectInterrupt就蓝屏。时下流行的PLX/AMCC桥都有相应中断允许/状态/清除寄存器,按相应的DATASHEET操作就行了。
3、挂接ISR。使用IoConnectInterrupt,如果之前没有关中断/清中断状态,很可能,已经有中断在等着你,该函数一调用即刻触发中断进入ISR。很多DRIVER就是这样,而ISR考虑不周全,系统极易蓝屏。
4、ISR:ISR是最为关键、最为重要的地方,出不得一点差错。
4、1:判断中断是否为本设备产生,读中断状态寄存器就知。如果不是应该立即返回FALSE。因为PCI中断允许共享,同一级中断可能有多个DRIVER的ISR,别人正等着呢。
4、2:紧急处理。做一些非在ISR中处理不可、尽可能少的处理。
4、3:清中断。这一点和ISA不同,PCI大都是电平触发方式,当中断产生时,总线上的PIN脚处于指定电平状态,如果不清除将一直存在导致系统不断的触发中断。在PLX/AMCC桥上都有相关的寄存器,部分要求清除LOCAL/ADDON BUS上的中断源。
4、4:触发DPC,返回TRUE。
5、开中断。有初学者问我什么开中断合适。理论时说在调用IoConnectInterrupt后任何地方开中断都是可以的。我建议在 CreateOpenDevice时开中断在CloseDevice时最后一个APP关闭句柄时关闭中断。这样可以减少很多无谓的、APP不感冒的中断。同时,在开中断前先检测是否已经有中断在等候,如果有一般先清除它,而后再开。

最新喜欢:

leavepeaceleavep... chinabirdchinab...
少了e,就少了全部
游客

返回顶部