USB: низкая задержка (<1 мс) с передачей прерываний и необработанным HID
У меня есть проект, который требует регулярного чтения данных внешнего гироскопа IMU и отправки данных на телефон Android.
Я использую плату Teensy 2.0 для запроса IMU через I2C и отправки его через USB с использованием необработанного HID. Я использую переменную RawHID, которая объявлена в usb_api.h usb_rawhid teensyduino.
Я читал, что у высокоскоростного USB, использующего передачу прерывания, может быть максимальная задержка 1 мс, и я хотел бы достичь этой максимальной задержки 1 мс. Я не уверен, что искать для достижения этой максимальной задержки, и хотел бы знать о указателях. Моя конечная цель - получать данные гироскопа каждые 2 мс (500 Гц).
Я знаю несколько вещей, которые могут иметь значение:
1) Я изменил RAWHID_TX_SIZE на 6 байтов (мне нужно только 6 байтов для значения гироскопа), а RAWHID_TX_INTERVAL установлен на 1 мс (самый быстрый). Конечная точка OUT в настоящее время указывается в интерфейсе, который мне не нужен, я не уверен, что удаление может улучшить задержку.
2) Android распознает подростка как «устройство hiddev USB HID v1.11». Я не уверен, что это полный сырой HID или он пытается разобрать его. Teensy использует сырой HID, как указано выше.
3) В Android определенный поток пытается выполнить queue () в UsbRequest, а затем requestWait (). Обработка, когда данные поступают, очень быстрая (то есть: сохранить их в глобальной переменной), но я во власти планировщика потоков.
Так что это некоторые указатели, которые я знаю (и не совсем уверен, как они влияют на максимальную задержку). Я хотел бы услышать отзывы людей и, возможно, указать новые направления, как улучшить максимальную задержку USB. Поиск информации об уменьшении латентности USB при передаче прерываний пугает.