libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1289回复:10

100分,各位,帮帮忙,驱动里怎么实现延时

楼主#
更多 发布于:2003-08-06 15:19
我是用DS写的ISA卡的NT式的驱动,应用层发DEVICEIOCTL给驱动,驱动里相应的分发例程直接写我的端口,应用和驱动采用METHOD_IN_DIRECT的方式和驱动通信,应用层分配的缓冲区是90K,ISA板上有个单片机通过FIFO接收ISA总线传来的数据,我的FIFO是512B的,可是从FIFO的输出端接受到很少的数据,说明我的ISA总线传输速度很快,每次传了90K,单片机的接收速度很慢,所以我在驱动里,要用个延时函数,就是每次写512或者更少的数据给FIFO,延时一段时间,然后再写,这种应当能解决数据覆盖的问题,那么在DS里,什么函数能实现延时这个功能??
很着急,期盼大虾们的回答!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
flytomoon
驱动巨牛
驱动巨牛
  • 注册日期2003-07-09
  • 最后登录2004-10-18
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-08-06 15:30
你用的是AUTO模式(速度会快些)吗?如果是,为什么不先尝试出来的数据先通过一块外加的FIFO,再送到68013的FIFO中呢?个人认为用延时没什么用,再或者设置一下FIFO的FLAG,我觉得都比延时要好的多。
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-08-06 18:46
你用的是AUTO模式(速度会快些)吗?如果是,为什么不先尝试出来的数据先通过一块外加的FIFO,再送到68013的FIFO中呢?个人认为用延时没什么用,再或者设置一下FIFO的FLAG,我觉得都比延时要好的多。


首先非常地感谢这位大哥的回答,你说的都是硬件。硬件不是我设计的,具体那个FIFO怎么用,我也不了解,但我很想好好地弄清楚它怎么工作,你说的AUTO模式,应当是指FIFO的工作模式吧?那68013是什么呢?能不能详细地讲讲FLAG怎么设置这些问题!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
flytomoon
驱动巨牛
驱动巨牛
  • 注册日期2003-07-09
  • 最后登录2004-10-18
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-06 19:09
你用的USB芯片不是CY的68013吗?(usb2.0)AUTO是SLAVE FIFO模式,至于FLAG,有FULL,EMPTY标志位,可以用一下。
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-06 19:20
你用的USB芯片不是CY的68013吗?(usb2.0)AUTO是SLAVE FIFO模式,至于FLAG,有FULL,EMPTY标志位,可以用一下。


我的硬件是个简单的ISA的板子,没有USB,不存在你说的这些东西,我们用的FIFO是IDT公司出的512BYTE的异步的FIFO,我想知道怎么设置FIFO,使得单片机从FIFO取数的速度加快,另外,单片机是AVR的,这种单片机的速度和ISA总线的8位I/O传输相比,速度能差多少??
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2003-08-06 19:39
我个人不推荐在驱动里去延时,不过如果一定要延时的话,可以这么做:

随便创建一个KEvent,创建完并初始化之后,调用这个对象的Wait函数,Wait函数声明如下:
NTSTATUS Wait(
   KPROCESSOR_MODE mode,
   BOOLEAN bAlertable,
   PLARGE_INTEGER pTimeOut,
   KWAIT_REASON reason
);
第三个参数是设置超时的,你设一个值上去就可以实现延时了。当然这个EVENT不要用在别的地方。
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-08-06 19:59
我个人不推荐在驱动里去延时,不过如果一定要延时的话,可以这么做:

随便创建一个KEvent,创建完并初始化之后,调用这个对象的Wait函数,Wait函数声明如下:
NTSTATUS Wait(
   KPROCESSOR_MODE mode,
   BOOLEAN bAlertable,
   PLARGE_INTEGER pTimeOut,
   KWAIT_REASON reason
);
第三个参数是设置超时的,你设一个值上去就可以实现延时了。当然这个EVENT不要用在别的地方。


能说明一下为什么不推荐在驱动里延时?
还有,这个事件对象,我想只能是是局部变量!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-08-06 21:02
我是用DS写的ISA卡的NT式的驱动,应用层发DEVICEIOCTL给驱动,驱动里相应的分发例程直接写我的端口,应用和驱动采用METHOD_IN_DIRECT的方式和驱动通信,应用层分配的缓冲区是90K,ISA板上有个单片机通过FIFO接收ISA总线传来的数据,我的FIFO是512B的,可是从FIFO的输出端接受到很少的数据,说明我的ISA总线传输速度很快,每次传了90K,单片机的接收速度很慢,所以我在驱动里,要用个延时函数,就是每次写512或者更少的数据给FIFO,延时一段时间,然后再写,这种应当能解决数据覆盖的问题,那么在DS里,什么函数能实现延时这个功能??
很着急,期盼大虾们的回答!


用延时不太好,还有可能丢失数据,fifo的状态应该有标志位可以判断的,满,半满,空,一般是这三种状态,你可以根据fifo的状态决定是否进行下一次传输 :D
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-08-06 21:38
硬件不是我做的,FIFO的满状态标志,他接到了ISA总线的IOCHRDY上,说是延迟一段总线周期,可是这段时间我的写端口函数还在执行,但硬件不响应,也就是应用程序发给我的数据丢失了,不是在FIFO中丢失的,是在驱动中丢失的,应用层发过来的数据覆盖了原来的数据.我是这样理解的.不知道有什么办法能解决!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
hong
驱动小牛
驱动小牛
  • 注册日期2001-09-19
  • 最后登录2005-12-16
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-08-08 03:04

because \"硬件不是我做的\", you can try this with driver:

1. allocate a big enough buffer inside driver to hold the data from application;
2. create a thread inside driver: try to send data to hardware, if \"硬件不响应\" then wait and keep trying, when \"硬件响应\" then send data; repeat these operation until all data has been send to fifo. (if you have a way to read back the data to confirm will be better)
3.once driver receive data then start the thread;

libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-08-08 09:20

because \"硬件不是我做的\", you can try this with driver:

1. allocate a big enough buffer inside driver to hold the data from application;
2. create a thread inside driver: try to send data to hardware, if \"硬件不响应\" then wait and keep trying, when \"硬件响应\" then send data; repeat these operation until all data has been send to fifo. (if you have a way to read back the data to confirm will be better)
3.once driver receive data then start the thread;

 


谢谢你的回答,关键问题是硬件不响应,就是我的写端口函数在执行,但硬件不响应,没把数写进FIFO,我怎么知道硬件不响应?我怎么检测FIFO的满标志,没有这样的寄存器来让我读,而且DS的KIoRange 的成员函数outb() 的返回值是VOID,如果是NTSTATUS的话,我还能判断我写的是否成功!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
游客

返回顶部