drowsy
驱动牛犊
驱动牛犊
  • 注册日期2003-07-20
  • 最后登录2004-11-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1124回复:5

请帮我看看,谢谢拉~~

楼主#
更多 发布于:2003-10-29 13:35
我现在在做PCI设备的驱动。因为应用程序是多线程发送命令请求的,所以我在驱动中将它们排入队列。在STARTIO函数中分派它们到相应的串行化处理函数中去。选用芯片是PCI2040和C6201。
对于写数据的请求,直接把数据写到DSP的某个地址单元。这样有一个问题,对于串行化的请求,我应该在上一次请求数据已经被取走后,再往这个地址单元写,这就要用到同步对象和硬件查询。
现行的方案是,在写数据的串行化处理函数中,先pEvent.wait()进入等待,再启动定时器,在定时器的DPC中对该地址单元进行查询,如果已经被取走就取消掉定时器,将pEvent设置成信号态。函数继续执行数据的传送。
对于读数据的请求,先m_pEvent.wait()等待,DSP程序在输出数据准备好后,发中断给驱动,在ISR中m_pEvent置成信号态。函数继续执行数据的读取。
上面是我的思路,不知可行与否,请各位大师指点。初次编写驱动,感到还有好多东西要学的。我的问题是:
1 可以在设备驱动程序中使用同步对象么?找了好久,没找到相应的例子,有的也是在系统线程中运用的。
2 上述方案是否可行。如果不可行,能否指点一下。十分感谢。




 
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-10-29 14:46
1.可以在驱动中使用同步对象
2.方案应该是可行的,但是应该不需要这么麻烦,既然你的dsp程序可以发中断给驱动,那为什么还要查询,完全可以驱动发送一段数据即处理一个串行化好的irp包后结束线程,然后dsp取走数据后再发中断给驱动,驱动在中断例程中判断中断类型,再执行下一次startio例程
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
drowsy
驱动牛犊
驱动牛犊
  • 注册日期2003-07-20
  • 最后登录2004-11-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-29 20:31
可是硬件中只用了PCI2040的一个中断,接到了DSP的INTA管脚,已经接死了。这样的话,对于驱动,不能区别两种情况下的不同的中断类型了。不过这个方法蛮好的,我没有想到过,十分感谢!还想问一下,使用pEvent->Wait()等待pEvent的信号态好像不是很安全,如果陷入死等待,岂不是系统要DOWN掉了。


 
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2003-10-29 20:47
不错 ,不过可以设置等待的时限,过时不候,呵呵。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
drowsy
驱动牛犊
驱动牛犊
  • 注册日期2003-07-20
  • 最后登录2004-11-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-10-29 20:49
那岂不是要丢失掉当前的IRP了,如何处理这样的情况?谢谢
drowsy
驱动牛犊
驱动牛犊
  • 注册日期2003-07-20
  • 最后登录2004-11-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-10-29 21:52
  是否可以这样处理:pEvent.wait()函数中设定一个超时时间。如果该函数返回的是STATUS_SUCCESS的话,执行传数操作,并调用PnpNextIrp(I)指向串行化队列中的下个IRP;如果返回的是STATUS_TIMEOUT的话,不作任何的操作。
  这样的话,那么这个未执行的IRP是不是还在队列中呢,还是丢失掉了呢?谢谢~
游客

返回顶部