阅读:1123回复:5
请帮我看看,谢谢拉~~
我现在在做PCI设备的驱动。因为应用程序是多线程发送命令请求的,所以我在驱动中将它们排入队列。在STARTIO函数中分派它们到相应的串行化处理函数中去。选用芯片是PCI2040和C6201。
对于写数据的请求,直接把数据写到DSP的某个地址单元。这样有一个问题,对于串行化的请求,我应该在上一次请求数据已经被取走后,再往这个地址单元写,这就要用到同步对象和硬件查询。 现行的方案是,在写数据的串行化处理函数中,先pEvent.wait()进入等待,再启动定时器,在定时器的DPC中对该地址单元进行查询,如果已经被取走就取消掉定时器,将pEvent设置成信号态。函数继续执行数据的传送。 对于读数据的请求,先m_pEvent.wait()等待,DSP程序在输出数据准备好后,发中断给驱动,在ISR中m_pEvent置成信号态。函数继续执行数据的读取。 上面是我的思路,不知可行与否,请各位大师指点。初次编写驱动,感到还有好多东西要学的。我的问题是: 1 可以在设备驱动程序中使用同步对象么?找了好久,没找到相应的例子,有的也是在系统线程中运用的。 2 上述方案是否可行。如果不可行,能否指点一下。十分感谢。 |
|
沙发#
发布于:2003-10-29 14:46
1.可以在驱动中使用同步对象
2.方案应该是可行的,但是应该不需要这么麻烦,既然你的dsp程序可以发中断给驱动,那为什么还要查询,完全可以驱动发送一段数据即处理一个串行化好的irp包后结束线程,然后dsp取走数据后再发中断给驱动,驱动在中断例程中判断中断类型,再执行下一次startio例程 |
|
|
板凳#
发布于:2003-10-29 20:31
可是硬件中只用了PCI2040的一个中断,接到了DSP的INTA管脚,已经接死了。这样的话,对于驱动,不能区别两种情况下的不同的中断类型了。不过这个方法蛮好的,我没有想到过,十分感谢!还想问一下,使用pEvent->Wait()等待pEvent的信号态好像不是很安全,如果陷入死等待,岂不是系统要DOWN掉了。
|
|
地板#
发布于:2003-10-29 20:47
不错 ,不过可以设置等待的时限,过时不候,呵呵。
|
|
|
地下室#
发布于:2003-10-29 20:49
那岂不是要丢失掉当前的IRP了,如何处理这样的情况?谢谢
|
|
5楼#
发布于:2003-10-29 21:52
是否可以这样处理:pEvent.wait()函数中设定一个超时时间。如果该函数返回的是STATUS_SUCCESS的话,执行传数操作,并调用PnpNextIrp(I)指向串行化队列中的下个IRP;如果返回的是STATUS_TIMEOUT的话,不作任何的操作。
这样的话,那么这个未执行的IRP是不是还在队列中呢,还是丢失掉了呢?谢谢~ |
|