Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
USB:低延迟(<;1ms),带中断传输和原始HID_Usb_Latency_Hid_Low Latency_Teensy - Fatal编程技术网

USB:低延迟(<;1ms),带中断传输和原始HID

USB:低延迟(<;1ms),带中断传输和原始HID,usb,latency,hid,low-latency,teensy,Usb,Latency,Hid,Low Latency,Teensy,我有一个项目,需要定期读取外部IMU陀螺仪数据,并将数据发送到Android手机 我使用teensy 2.0板通过I2C查询IMU,并使用原始HID通过USB发送。我使用的是RawHID变量,它在teensyduino的usb_RawHID的usb_api.h中声明 我已经读到,使用中断传输的全速USB可以有1ms的最大延迟,并且希望达到1ms的最大延迟。我不确定要寻找什么来达到这个最大延迟,我想请您了解一下指针。我的最终目标是每2毫秒(500赫兹)接收一次陀螺仪数据 我知道可能存在问题的几件事

我有一个项目,需要定期读取外部IMU陀螺仪数据,并将数据发送到Android手机

我使用teensy 2.0板通过I2C查询IMU,并使用原始HID通过USB发送。我使用的是RawHID变量,它在teensyduino的usb_RawHID的usb_api.h中声明

我已经读到,使用中断传输的全速USB可以有1ms的最大延迟,并且希望达到1ms的最大延迟。我不确定要寻找什么来达到这个最大延迟,我想请您了解一下指针。我的最终目标是每2毫秒(500赫兹)接收一次陀螺仪数据

我知道可能存在问题的几件事:

1) 我已将RAWHID_TX_大小更改为6字节(陀螺仪值仅需要6字节),并且RAWHID_TX_间隔设置为1毫秒(最快)。 接口中当前指定了我不需要的OUT端点,我不确定删除它是否可以改善延迟

2) Android将teensy识别为“hiddev USB HID v1.11设备”。我不确定这是完整的原始HID还是正在尝试解析它。Teensy使用上述规定的原始HID

3) 在Android中,一个特定的线程正在尝试在UsbRequest上排队(),后面跟着requestWait()。数据到达时的处理速度非常快(即:将其存储在全局变量中),但我受线程调度器的支配


因此,这些是我知道的一些指针(但不完全确定它们是如何影响最大延迟的)。我很想听到人们的反馈,也许可以指出如何提高我的最大USB延迟的新方向。查找有关减少中断传输的USB延迟的信息非常困难。

对于USB,这都是轮询。每1毫秒,您就有一个“帧”,其中包含一个或多个传输描述符,每个传输描述符告诉USB控制器要轮询哪个USB设备

一般来说,USB控制器以传输描述符开始帧,用于中断传输。这意味着,使用一个中断传输描述符,你(几乎)可以保证每毫秒轮询一次。如果你的设备有一个要发送的中断,它会在轮询时返回;因此,最坏的情况是1毫秒的延迟

可以要求USB控制器减少轮询设备的频率(例如,同步传输)。也可以要求USB控制器在同一1ms帧内多次轮询设备;然而,因为它通常会首先中断传输描述符,所以您可能希望在几乎相同的时间内得到两次轮询,两次轮询之间有“几乎1毫秒”的间隔,所以这对最坏情况下的延迟没有帮助

大多数情况下,据我所知,对于“<2 ms”的要求,USB规范/协议、USB控制器、内核的USB控制器驱动程序和内核的USB HID驱动程序根本不是问题。问题在于及时将数据从USB HID驱动程序获取到用户空间进程/线程

不幸的是,Linux/Andriod不是一个实时操作系统。它没有提供任何保证。您将受线程调度器(也可能是JVM的垃圾收集器)的支配。你可能对此无能为力


我建议首先找出为什么需要每2毫秒接收一次陀螺仪数据。举个简单的例子,你能给陀螺仪数据添加一个时间戳,让接收线程从这些时间戳“重建历史”,这样接收线程就不需要低延迟了吗?

非常感谢Brendan,这是一个非常好的解释。有几件事我不太清楚,你说“单中断传输”,你是指定一个端点还是一个接口?如果我理解正确的话,您的意思是,如果描述了多个接口,它将从我的框架中占用一些时间(因此我应该只描述一个中断传输接口,可能只在端点中?),不幸的是,我的用例需要有限的延迟,因为我正在尝试对手机进行实时跟踪。我可以应用“预测”之类的工件来平滑抖动或延迟,但以固定的间隔获得延迟非常低的数据是我的最终目标。