阅读:1543回复:4
关于DriverWorks中断共享的问题求助
下面这封信本来是发给站长的,站长让贴出来,看看大家有没有什么
好的办法? 前年(1999年),我们公司用PCI9054做了一块数据采集卡,当时我负责硬件部分设计,另外一个同事负责驱动程序的设计(当时是用DriverWorks的Driverwizard生成的驱动程序框架)。当时,整个系统设计是成功的。后来,我的这个做驱动程序的同事跳槽了。到了今年,出了一些新的主板。我们的驱动程序在这些主板上出了问题。具体的现象是:第一次安装设备驱动程序,运行应用程序没有任何问题。但重新启动以后,Windows2000出现死机(还没有到出现登陆对话框的那一步,有时出现在用户登陆以后)现象。公司决定由我来负责驱动程序的维护和改进工作。对于象我这样第一次接触驱动程序来说,确实是太困难了!没办法,只是为了混口饭吃!!! 经过多次的尝试,发现了下面的事实。必须让我的PCI卡独占某一个中断号,这样什么问题都没有。如果有其他的设备,比如声卡、网卡或USB驱动程序,出现多个设备共享一个中断号的情况,就会出现 上面描述的怪现象。所以,我现在初步断定问题时出在中断共享的地方。 在使用DriverWorks的DriverWizard的step 8 of 10中,IO和Memory资源可以选择是否该资源允许共享还是独占,但IRQ资源的选项却是灰化的(不可用)。这个会影响生成的驱动程序框架吗? 我想,Numega公司的DriverStudio出道有些年头了。软件应该没有问题。但后来我找来一块Win2000不能识别的声卡,根据Vendor ID和Device ID等其他相关信息产生了驱动程序框架,将生成的驱动程序安装到声卡上,也出现了一样的毛病。后来又尝试了AMCC 5933DK1中的PCI卡以及RTL8139的网卡,情况都是一样的。这样一来,我有开始怀疑是软件的问题。 我深信,凡是使用DriverWorks做驱动的开发人员都或多或少地会碰到这个问题。那么他们是怎么解决的呢?是通过Numega的技术支持吗?我想,这是一个很普遍的问题。不知站长对这个问题,有 没有什么高见?能否把这个问题正式地提到论坛上大家一起讨论,共同来提供解决方案。 |
|
沙发#
发布于:2001-12-04 16:12
看看你的中断处理程序中处理是否合理。能不能将这段程序写在这上面来。
|
|
板凳#
发布于:2001-12-04 17:26
中断服务程序使用的是Driverworks的DriverWizard生成的代码,我
自己没有做任何的修改。 下面是源代码: BOOLEAN PciHwusDevice::Isr_Irq(void) { // TODO: Verify that the interrupt was caused by our device. // Replace \"FALSE\" in next line with actual test. if (FALSE) { // Return FALSE to indicate that this device did not cause the interrupt. return FALSE; } // TODO: Service the device. // Minimal processing may be done here in the ISR, but // most processing should be deferred to a DPC. // Generally, you should: // o stop the device from generating interrupts // o perform any additional time-critical functions // o schedule a DPC to perform the bulk of the work. // // Request deferred procedure call // The arguments to Request may be any values that you choose if (!m_DpcFor_Irq.Request(NULL, NULL)) { // TODO: Request is already in the queue // You may want to set flags or perform // other actions in this case } // Return TRUE to indicate that our device caused the interrupt return TRUE; } |
|
地板#
发布于:2001-12-05 08:15
if(FALSE)
return FALSE; 此地方应具体判断,如果不是自己硬件的中断,则返回FALSE; 如果是自己的硬件中断,则处理后返回TRUE; 如: if(yourInterruptSourece==1) { //handle return TRUE; } else return FALSE; |
|
|
地下室#
发布于:2005-01-21 15:03
DriverStudio 3.1生成的代码是这样的,除了TRUE外,都是一样的。
同样的更深一步的问题,如何Verify that the interrupt? 我看楼住的程序的if(false)没有问题,关键是!m_DpcFor_Irq.Request(NULL, NULL)是否自动处理了中断,因为中断不需要我们输入(在pci配置空间自动取得),我们又如何判断了? BOOLEAN PCINEWDevice::Isr_Irq(void) { // TODO: Verify that the interrupt was caused by our device. // Replace "TRUE" in next line with actual test. if (TRUE) { // Return FALSE to indicate that this device did not cause the interrupt. return FALSE; } // TODO: Service the device. // Minimal processing may be done here in the ISR, but // most processing should be deferred to a DPC. // Generally, you should: // o stop the device from generating interrupts // o perform any additional time-critical functions // o schedule a DPC to perform the bulk of the work. // // Request deferred procedure call // The arguments to Request may be any values that you choose if (!m_DpcFor_Irq.Request(NULL, NULL)) { // TODO: Request is already in the queue // You may want to set flags or perform // other actions in this case } // Return TRUE to indicate that our device caused the interrupt return TRUE; } |
|
|