minsoft
驱动小牛
驱动小牛
  • 注册日期2001-07-30
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2274回复: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,就少了全部
kxgchina
驱动小牛
驱动小牛
  • 注册日期2002-04-01
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-13 14:54
好就一个字!
建议其他大牛向minsoft兄学习,不要太吝啬!
snowfox
驱动小牛
驱动小牛
  • 注册日期2001-04-23
  • 最后登录2003-12-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-14 10:11
太好了!
感谢
h13
h13
驱动老牛
驱动老牛
  • 注册日期2002-07-10
  • 最后登录2008-10-24
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-25 11:04
不错,最好能每个步骤给一些详细一点的例子或说明
<table> [color=#8040FF]神,常虚以凝而灵明湛定 气,常静以养而充盈流通[/color] </table>
flying
驱动小牛
驱动小牛
  • 注册日期2002-08-01
  • 最后登录2016-06-19
  • 粉丝0
  • 关注0
  • 积分197分
  • 威望70点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2002-11-26 21:56
谢谢! minsoft~~
goodgoodwang
驱动牛犊
驱动牛犊
  • 注册日期2003-04-18
  • 最后登录2003-07-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-17 22:21
太好了
wangjisheng
驱动小牛
驱动小牛
  • 注册日期2002-11-06
  • 最后登录2011-07-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-18 16:23
顶顶。。。。。。。。。。。。。。。。
rain_pot
驱动牛犊
驱动牛犊
  • 注册日期2003-12-20
  • 最后登录2004-12-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-06 20:56
好人啊!
沙漠玫瑰
zxq80
驱动牛犊
驱动牛犊
  • 注册日期2004-06-16
  • 最后登录2012-02-07
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望12点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-06-18 11:26
好贴
myswin
驱动小牛
驱动小牛
  • 注册日期2003-10-13
  • 最后登录2005-11-21
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-06-18 14:52
再用DS开发的时候最好 把中断的Initialize 和Connect分开进行~~
=========== D =========== R =========== I =========== V =========== E ---------抵制日货-------
stephen_young
驱动牛犊
驱动牛犊
  • 注册日期2002-08-19
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-06-27 15:40
真是好文章,宝贵的经验!
三人行必有我师!
游客

返回顶部