阅读:1702回复:12
一个关于ISR的问题
在win2000下,用driverworks开发一个PCI的驱动,用wizard生成了框架,两个版本,一个支持中断服务程序,另一个不支持,但是前者安装以后系统起不来,后者就没问题,迷惑!但我不能不用中断啊!
谢谢各位大侠援手! |
|
沙发#
发布于:2002-11-13 10:08
我的也一样。 启动到75%就不动了! :mad:
|
|
|
板凳#
发布于:2002-11-13 10:13
NIKKO 你还能看见它启动到75%啊 我的根本就黑屏
|
|
地板#
发布于:2002-11-13 10:13
估计中断资源有冲突!
找找版上有这样的帖子 |
|
地下室#
发布于:2002-11-13 10:15
和网卡中断冲突 但是我已经把网卡屏蔽掉了
|
|
5楼#
发布于:2002-11-13 10:17
你的寄存器初始化成功了吗?
不至于黑平呀! 刚才mirosoft 回的,可能能用! 绝对符合要求,这是个AMCC5933的驱程中的ISR程序,来自OSR,我的DRIVER也就在上面修改一下就成的。有问题可再问。 /////////////////////////////////////////////////////////////////////////////// // // OsrHandleInterrupt // // When the AMCC device generates an interrupt, this function is called. // Note that in our simple model of the world here, every transfer is // completed successfully. We just don\'t bother with error detection // and handling. If you wanted this to be a REAL driver, you\'d have to // do the appropriate error detection and handling. // // INPUTS: // // Interupt - Address of the KINTERRUPT Object for our device. // // ServiceContext - Address of our device extension. // // OUTPUTS: // // None. // // RETURNS: // // TRUE if our device is interrupting, FALSE otherwise. // // IRQL: // // This routine is called at IRQL == DIRQL. // // NOTES: // // As is true for all ISR\'s in NT, this routine is called with the // interrupt spin lock held. // /////////////////////////////////////////////////////////////////////////////// BOOLEAN OsrHandleInterrupt(PKINTERRUPT Interupt, PVOID ServiceContext) { BOOLEAN ourDeviceInterrupting = FALSE; POSR_DEVICE_EXT devExt = (POSR_DEVICE_EXT)ServiceContext; ULONG intRegister; ULONG csrRegister; #if DBG DbgPrint(\"OSRPCI: ISR entered\\n\"); #endif // // Get the current interrupt CSR from our device // intRegister = READ_PORT_ULONG(devExt->AmccBaseRegisterAddress+ICSR_OFF); #if DBG DbgPrint(\"*****************AMCC INTCSR = 0x%0x\\n\",intRegister); OsrPrintIntcsr(intRegister); #endif // // Is our device presently interrupting? // if (intRegister & AMCC_INT_INTERRUPTED) { // // Yes, it is! // ourDeviceInterrupting = TRUE; #if DBG DbgPrint(\"\\tInterrupt is ours.\\n\"); #endif // // Store away some context so when we get to our DpcForIsr we\'ll know // what caused the interrupt. Specifically, we accumulate bits in the // \"IntCsr\" field of our device extenstion indicating what interrupts // we\'ve seen from the device. Note that since we support simultaneous // read and write DMA operations, we could get both a read complete // interrupt and a write complete interrupt before the DpcForIsr has // had a chance to execute. Thus, we must carefully ACCUMULATE the // bits. // // N.B. We guard these bits with the Interrupt Spin Lock. The bits // cannot be set or cleared unless holding that lock. // devExt->IntCsr |= (intRegister & AMCC_INT_ACK_BITS); // // Acknowledge the interrupt on the device // WRITE_PORT_ULONG(devExt->AmccBaseRegisterAddress+ICSR_OFF, intRegister); // // IF the interrupt was as a result of a READ or WRITE operation // completing (either with success or error) request our DpcForIsr. // if(intRegister & (AMCC_INT_READ_COMP | AMCC_INT_WRITE_COMP)) { #if DBG DbgPrint(\"Requesting DPC\\n\"); #endif IoRequestDpc(devExt->DeviceObject, 0, NULL); } } return(ourDeviceInterrupting); } ____________________ :o |
|
|
6楼#
发布于:2002-11-13 10:18
是不是没有判断终端原呀?
|
|
|
7楼#
发布于:2002-11-13 10:20
NIKKO 你说的初始化寄存器是指什么?
|
|
8楼#
发布于:2002-11-13 10:33
我在想,一个干净的由wizard生成的框架,不加任何东西,不指望硬件能干活,安装应该是没有问题的。
我的理解对吗? |
|
9楼#
发布于:2002-11-13 11:07
应该是不行的! 起码中断是一定要处理的!
具体我也在想,有结果告诉你! 其实我也很弱,到这里来学习的! :D |
|
|
10楼#
发布于:2002-11-14 17:07
这个问题以前说过了的,再说中断寄存器初始化是bios自己搞定的了。假如没有初始化的话,不就是中断没有共享,没有共享怎么回有冲突呢?
|
|
|
11楼#
发布于:2002-11-19 09:03
用ds做得是吧。
在中断处理callback函式Isr_Irq(void)中 有 if (false) { // Return FALSE to indicate that this device did not cause // the interrupt. return FALSE; } //上面条件永远不会满足,是吧。问题就出在这儿。在启动时,一些 //不是你的中断跑到这儿,而你没return false,拜托,我要死 //了。。。。 //如果你要使用中断你就改成 if(!是我的中断) return false; //如果你只简单用一下,不做任何处理 可改为 if(true) return false; 或直接return false 就可以了。呵呵 return false 就是不对中断做任何处理,将它传下去,交由其他驱动程序处理。 如果对中断处理,完整的应这样: Isr_Irq(void)//中断处理callback函式 { //先判是不是自己的中断 if(!是我的中断)//如何判断,问设计这个硬件的人 return false; //现在肯定是自己的中断了,那末先关掉中断源吧,也就是清除中 //断标志,以免中断重入。。 clrirq();//你自己编的一个关/清除/屏蔽中断函数 //接下来调用中断延时处理函式 if (!m_DpcFor_Irq.Request(NULL, NULL)) //可用你要传输 //的参数代替NULL,如果dpc中没有队列,那么将会立即调用中断延 //时处理函式,否则将在dpc排队 { //如果有错就在这里解决 } //接下来再打开中断屏蔽,允许中断继续发生。。 openirq();//你自己编的 // 一切ok,就。。。 return true; } //你要在中断时做得事在中断延时处理函式中完成就行了 DpcFor_Irq(PVOID Arg1, PVOID Arg2)//中断延时处理函式 { //中断发生时,你要做得事,象采集数据了什么得。。就在这儿做 //在此时如发生中断也没问题,中断将会在dpc排队,执行完这个 //接着就可执行下一个,中断永不会丢掉-----当然中断时间需大于 //Isr_Irq(void)中断处理callback函式这段代码执行的时间---中断 //不会这么快吧--------我晕! } [编辑 - 11/19/02 by hglzw] |
|
|
12楼#
发布于:2002-11-19 10:44
IoRequestDpc(devExt->DeviceObject, 0, NULL);
上面这句对吗?为什么要传为0 的Irp进去? |
|