首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >USB:具有中断传输和原始HID的低延迟(< 1ms)

USB:具有中断传输和原始HID的低延迟(< 1ms)
EN

Stack Overflow用户
提问于 2015-01-16 03:44:46
回答 1查看 6.1K关注 0票数 3

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

我正在使用Teensy2.0板通过I2C查询IMU,并使用原始HID通过USB发送它。我使用的是RawHID变量,它是在usb_api.h of usb_rawhid of usb_rawhid中声明的。

我读过使用中断传输的全速USB可以有1ms的最大延迟,并希望达到这1ms的最大延迟。我不知道该寻找什么来实现这个最大延迟,并希望了解有关指针。我的最终目标是每2毫秒(500赫兹)接收陀螺仪数据。

我知道有几件事可能是个问题:

1)我将RAWHID_TX_SIZE更改为6个字节(陀螺仪值只需6个字节),RAWHID_TX_INTERVAL设置为1ms(最快)。当前在接口中指定了一个不需要的OUT端点,我不确定删除它是否会提高延迟。

2) Android将teensy识别为"hiddev USB HID v1.11设备“。我不确定这是完整的原始隐藏,还是它试图解析它。如上文所述,Teensy正在使用原始HID。

3)在Android中,一个特定的线程试图在UsbRequest上排队(),然后是requestWait()。当数据到达时,处理非常快(即:将其存储在全局变量中),但我任由线程调度程序支配。

因此,这些是我所知道的一些指针(并且不完全确定它们如何影响最大延迟)。我很乐意听到人们的反馈,也许还会指出如何提高我最大的USB延迟。寻找减少中断传输的USB延迟的信息是很困难的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-16 05:45:18

对于USB来说,这都是轮询。每1毫秒你就有一个“帧”,它由一个或多个传输描述符组成,每个传输描述符都告诉USB控制器要轮询哪个USB设备。

通常,USB控制器以中断传输的传输描述符开始帧。这意味着,使用单个中断传输描述符,您(几乎)保证每毫秒就会被轮询一次。如果您的设备有一个中断发送,它将返回它时,轮询;因此,您将得到1ms的延迟作为您的最坏情况。

可以要求USB控制器更少地轮询设备(例如,等时传输)。还可以要求USB控制器在相同的1ms帧中多次轮询设备;但是,由于它通常首先会中断传输描述符,所以您希望在几乎同一时间被轮询两次,间隔为“几乎1ms”,因此这无助于最坏的情况延迟。

据我所知,对于"< 2ms“的需求,USB规范/协议、USB控制器、内核的USB控制器驱动程序和内核的USB HID驱动程序根本就不是问题。问题是如何及时从USB驱动程序获取数据到用户空间进程/线程。

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27976992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档