阅读:1210回复:0
[新手请教]中断服务历程处理同步对象问题
应上司要求改了一个PCI驱动代码,流程大致是:
1、像PCI卡相应寄存器发指令,PCI卡接收,并开始处理 2、处理完后产生中断,通知驱动取结果 3、驱动取结果 我做的实现大致是:(针对一次IO操作) 1、设置一KEvent对象初始化为无信号量,做控制用 2、向PCI卡发指令,后执行KeWaitForSingleObject等待,因为事件对象无信号量,所以程序会在这里一直等 3、PCI卡处理完后产生中断,中断服务历程里执行KeSetEvent置信号量,退出中断(OnInterrupt())并返回 4、KeWaitForSingleObject等到了信号量,向下执行读数据的程序断,最后将信号量置为无信号状态,退出 驱动中断采用的是上升沿触发,上层API封装的I/O函数为同步I/O方式。 现在问题是:一般小批量演示时一切正常,但疲劳测试时老死机,有时也有重启现象,最后逮到一个重启通过查看dump文件的方法得知,在OnInterrupt()中断服务历程中可以看到执行了KeSetEvent,然后又执行了两次自旋锁操作,之后就没有了。 请高手分析,中断处理历程中是否是KeSetEvent这句话出了问题,在中断服务历程里事件对象操作会产生什么问题,应如何避免及处理? 不胜感激..... |
|