阅读:1500回复:7
在DS中,一进入中断就死机
我的9054卡,一进入中断就死机,中断服务函数里面一句话都没写。
直接返回TRUE;中断号没有共享,独占中断号9。 |
|
最新喜欢:![]() |
沙发#
发布于:2002-07-11 17:14
中断号没有共享,独占中断号9,这种情况下直接返回TRUE是没问题的,但是你忘了清中断,中断线INTA#一直保持低电平,如果你是操作系统,你会怎么认为呢?所以你应该写一个完整的ISR,首先是判断是否是我的设备发生了中断,这可通过查询9054的中断控制寄存器来获悉,如果是,就清中断,然后就把后续工作交给DPC,然后返回TRUE,如果不是,就简单返回FALSE可也。
|
|
板凳#
发布于:2002-07-11 17:58
很感谢上面的这位高手的回答。
我的9054外挂了一片FIFO,那么我是不是应该做如下操作 查看FIFO是否半满,如果是,他会给把中断控制寄存器其中的一位设置为1,然后关闭PCI中断,再把后续工作交给DPC,DPC里面做DMA操作,最后在开PCI中断;如果不是,则返回FALSE。 |
|
地板#
发布于:2002-07-12 14:02
我发现不能在DPC中做DMA,要放在ISR里面才可以,不然会死机。
|
|
地下室#
发布于:2002-07-12 16:38
查看FIFO是否半满,是查询方式,一般用中断方式,如果想在FIFO半满时开始DMA传输,可以用这个半满信号作为中断触发信号给9054,然后ISR,然后DPC,在DPC中通过对事件或信号量设置为信号态通知用户程序,用户程序再通过DeviceIoControl来执行DMA,而且必须是IRP排队,首先在DISPATCH IRQL启动DMA的第一次分割传输,如果你用的是DS开发,即调用Initiate(),这样做是为了将DMA与用户缓冲区联系起来,9054的DMA编程较麻烦,它支持Scatter/Gather传输。另外一个关键是回调函数的编写,如何编写请参看DriverWorks的帮助和它的pdf文件,pdf文件中有DMA编写的流程安排。有一点需要提醒的是回调函数的参数IRP,不要用,如果要获取当前的IRP,请参考DPC。还有就是,DeviceIoControl来的执行DMA传输的IRP的完成也是在回调函数中调用Terminate()之后调用队列的NextIrp()即可。
|
|
5楼#
发布于:2002-07-13 00:29
我是利用半满信号作为中断触发信号来给9054的,然后就是关中断源,再就是DMA(我没有使用9054的Scatter/Gather来做DMA),而这个DMA不能写在DPC里,不然会死机。还有我使用DS中的KCommonDmaBuffer来申请DMA缓冲区的,它得到的虚拟地址怎么好象不能传给上层的用户程序使用呢?
我没有使用事件或信号量等设置,就是最简单的传输数据。 |
|
6楼#
发布于:2002-07-13 20:08
最简单得避免司机的方法是在初始化的地方将中断连接的部分去掉。
不过这样虽然能不死机,但是中断处理功能也没了。 |
|
7楼#
发布于:2002-07-13 22:17
死机的故障已经解决。
其实原因就是中断重入,也就是再清中断源后要把FIFO的内容清空或者取走,不然它会老是发中断。 |
|