У меня есть проект, который требует регулярного чтения данных внешнего гироскопа 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 распознает teensy как «hiddev USB HID v1.11 Device». Я не уверен, что это полный необработанный HID или он пытается его проанализировать. Teensy использует необработанный HID, как указано выше.
3) В Android определенный поток пытается поставить очередь() на UsbRequest, за которой следует requestWait(). Обработка при поступлении данных происходит очень быстро (т. е. сохраняется в глобальной переменной), но я нахожусь во власти планировщика потоков.
Итак, это некоторые указатели, о которых я знаю (и не совсем уверен, как они влияют на максимальную задержку). Я хотел бы услышать отзывы людей и, возможно, указать новые направления, как улучшить мою максимальную задержку USB. Искать информацию о снижении задержки USB при передаче прерываний пугает.