这次是关于 io-usb...

好吧,我问了半年关于USB的问题。。。 :blush:

现象如下:
QNX版本是6.3.0,打了USB补丁。
通过自制的USB驱动以超过1M/s的速度持续从外部设备读取数据,这时候如果插入拔出普通的USB存储器,会使自制设备的数据读取出现短暂停顿(大概几百ms)导致数据读取出错。

一开始怀疑是自制驱动也在尝试识别USB存储器所致,于是把其中的回调函数 usb_insertion( ) 修改为只对特定设备(即前面说的自制设备)的插入有反应,但是问题依旧。

进一步怀疑是 io_usb,但是貌似 io_usb 是QNX的底层驱动,如果不加载的话就完全无法使用USB设备。。。

不知道以上的分析是否正确?有什么办法解决呢?

谢谢。

io-usb是usb协议栈。

感觉上是io-usb的问题。也许不是问题:)。插入一个存储器的话,因为io-usb要回调所有Class Driver,让他们来检查,是要花一些时间的,对于高速数据传输,会有影响的吧。

没什么方案,你自己的设备连的USB是ehci的吧。或者可以试试分开用几个io-usb,分别控制不同的USB口?或者,你可以给大点buffer,让硬件有更多的空间可以存数据?

因为是要求实时性,即使硬件有足够大的缓存,主机也只能得到延迟后的数据,随着USB存储器的多次插拔,延迟也会越来越严重。。。

这个方案貌似可行。指的是函数 usbd_connect() 所连接到的协议栈么?默认的就是 /dev/io-usb/io-usb 。但是如何“分开用几个 io-usb,分别控制不同的USB口“呢?没有找到相关资料。。。 :confused:

考虑了2种方案,请教各位。
1.当自制USB驱动正在执行的时候,暂时性地屏蔽掉 io-usb 对其它设备的识别,当系统空闲的时候再打开以便进行对USB存储器的识别等,这样应该就不会产生影响了。但是如何设置呢?

2.或者说靠优先级和时间片的设定能够避免这种问题?优先从自制USB设备读取数据(这个过程大约4.5ms),之后再识别其它USB设备。不过目前把自制驱动的优先级设置为了200,时间的话是1ms,也没什么作用。。。