QJE
QJE
驱动小牛
驱动小牛
  • 注册日期2001-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
阅读:1500回复:7

在DS中,一进入中断就死机

楼主#
更多 发布于:2002-07-11 16:01
我的9054卡,一进入中断就死机,中断服务函数里面一句话都没写。
直接返回TRUE;中断号没有共享,独占中断号9。

最新喜欢:

kiki_mekiki_m...
mengzi
驱动牛犊
驱动牛犊
  • 注册日期2001-08-02
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-07-11 17:14
   中断号没有共享,独占中断号9,这种情况下直接返回TRUE是没问题的,但是你忘了清中断,中断线INTA#一直保持低电平,如果你是操作系统,你会怎么认为呢?所以你应该写一个完整的ISR,首先是判断是否是我的设备发生了中断,这可通过查询9054的中断控制寄存器来获悉,如果是,就清中断,然后就把后续工作交给DPC,然后返回TRUE,如果不是,就简单返回FALSE可也。
QJE
QJE
驱动小牛
驱动小牛
  • 注册日期2001-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-07-11 17:58
很感谢上面的这位高手的回答。
我的9054外挂了一片FIFO,那么我是不是应该做如下操作
查看FIFO是否半满,如果是,他会给把中断控制寄存器其中的一位设置为1,然后关闭PCI中断,再把后续工作交给DPC,DPC里面做DMA操作,最后在开PCI中断;如果不是,则返回FALSE。
QJE
QJE
驱动小牛
驱动小牛
  • 注册日期2001-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-07-12 14:02
我发现不能在DPC中做DMA,要放在ISR里面才可以,不然会死机。
mengzi
驱动牛犊
驱动牛犊
  • 注册日期2001-08-02
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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()即可。




QJE
QJE
驱动小牛
驱动小牛
  • 注册日期2001-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-07-13 00:29
我是利用半满信号作为中断触发信号来给9054的,然后就是关中断源,再就是DMA(我没有使用9054的Scatter/Gather来做DMA),而这个DMA不能写在DPC里,不然会死机。还有我使用DS中的KCommonDmaBuffer来申请DMA缓冲区的,它得到的虚拟地址怎么好象不能传给上层的用户程序使用呢?
我没有使用事件或信号量等设置,就是最简单的传输数据。
wwqq012
驱动牛犊
驱动牛犊
  • 注册日期2002-02-17
  • 最后登录2005-03-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-07-13 20:08
最简单得避免司机的方法是在初始化的地方将中断连接的部分去掉。

不过这样虽然能不死机,但是中断处理功能也没了。
QJE
QJE
驱动小牛
驱动小牛
  • 注册日期2001-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-13 22:17
死机的故障已经解决。
其实原因就是中断重入,也就是再清中断源后要把FIFO的内容清空或者取走,不然它会老是发中断。
游客

返回顶部