阅读:2274回复:10
有关中断的几点归纳
在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不感冒的中断。同时,在开中断前先检测是否已经有中断在等候,如果有一般先清除它,而后再开。 |
|
|
沙发#
发布于:2002-11-13 14:54
好就一个字!
建议其他大牛向minsoft兄学习,不要太吝啬! |
|
板凳#
发布于:2002-11-14 10:11
太好了!
感谢 |
|
地板#
发布于:2002-11-25 11:04
不错,最好能每个步骤给一些详细一点的例子或说明
|
|
|
地下室#
发布于:2002-11-26 21:56
谢谢! minsoft~~
|
|
5楼#
发布于:2003-05-17 22:21
太好了
|
|
6楼#
发布于:2003-05-18 16:23
顶顶。。。。。。。。。。。。。。。。
|
|
7楼#
发布于:2004-06-06 20:56
好人啊!
|
|
|
8楼#
发布于:2004-06-18 11:26
好贴
|
|
9楼#
发布于:2004-06-18 14:52
再用DS开发的时候最好 把中断的Initialize 和Connect分开进行~~
|
|
|
10楼#
发布于:2004-06-27 15:40
真是好文章,宝贵的经验!
|
|
|