阅读:1289回复:10
100分,各位,帮帮忙,驱动里怎么实现延时
我是用DS写的ISA卡的NT式的驱动,应用层发DEVICEIOCTL给驱动,驱动里相应的分发例程直接写我的端口,应用和驱动采用METHOD_IN_DIRECT的方式和驱动通信,应用层分配的缓冲区是90K,ISA板上有个单片机通过FIFO接收ISA总线传来的数据,我的FIFO是512B的,可是从FIFO的输出端接受到很少的数据,说明我的ISA总线传输速度很快,每次传了90K,单片机的接收速度很慢,所以我在驱动里,要用个延时函数,就是每次写512或者更少的数据给FIFO,延时一段时间,然后再写,这种应当能解决数据覆盖的问题,那么在DS里,什么函数能实现延时这个功能??
很着急,期盼大虾们的回答! |
|
|
沙发#
发布于:2003-08-06 15:30
你用的是AUTO模式(速度会快些)吗?如果是,为什么不先尝试出来的数据先通过一块外加的FIFO,再送到68013的FIFO中呢?个人认为用延时没什么用,再或者设置一下FIFO的FLAG,我觉得都比延时要好的多。
|
|
板凳#
发布于:2003-08-06 18:46
你用的是AUTO模式(速度会快些)吗?如果是,为什么不先尝试出来的数据先通过一块外加的FIFO,再送到68013的FIFO中呢?个人认为用延时没什么用,再或者设置一下FIFO的FLAG,我觉得都比延时要好的多。 首先非常地感谢这位大哥的回答,你说的都是硬件。硬件不是我设计的,具体那个FIFO怎么用,我也不了解,但我很想好好地弄清楚它怎么工作,你说的AUTO模式,应当是指FIFO的工作模式吧?那68013是什么呢?能不能详细地讲讲FLAG怎么设置这些问题! |
|
|
地板#
发布于:2003-08-06 19:09
你用的USB芯片不是CY的68013吗?(usb2.0)AUTO是SLAVE FIFO模式,至于FLAG,有FULL,EMPTY标志位,可以用一下。
|
|
地下室#
发布于: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传输相比,速度能差多少?? |
|
|
5楼#
发布于:2003-08-06 19:39
我个人不推荐在驱动里去延时,不过如果一定要延时的话,可以这么做:
随便创建一个KEvent,创建完并初始化之后,调用这个对象的Wait函数,Wait函数声明如下: NTSTATUS Wait( KPROCESSOR_MODE mode, BOOLEAN bAlertable, PLARGE_INTEGER pTimeOut, KWAIT_REASON reason ); 第三个参数是设置超时的,你设一个值上去就可以实现延时了。当然这个EVENT不要用在别的地方。 |
|
6楼#
发布于:2003-08-06 19:59
我个人不推荐在驱动里去延时,不过如果一定要延时的话,可以这么做: 能说明一下为什么不推荐在驱动里延时? 还有,这个事件对象,我想只能是是局部变量! |
|
|
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 |
|
|
8楼#
发布于:2003-08-06 21:38
硬件不是我做的,FIFO的满状态标志,他接到了ISA总线的IOCHRDY上,说是延迟一段总线周期,可是这段时间我的写端口函数还在执行,但硬件不响应,也就是应用程序发给我的数据丢失了,不是在FIFO中丢失的,是在驱动中丢失的,应用层发过来的数据覆盖了原来的数据.我是这样理解的.不知道有什么办法能解决!
|
|
|
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; |
|
10楼#
发布于:2003-08-08 09:20
谢谢你的回答,关键问题是硬件不响应,就是我的写端口函数在执行,但硬件不响应,没把数写进FIFO,我怎么知道硬件不响应?我怎么检测FIFO的满标志,没有这样的寄存器来让我读,而且DS的KIoRange 的成员函数outb() 的返回值是VOID,如果是NTSTATUS的话,我还能判断我写的是否成功! |
|
|