| Предыдущий | Следующий |
| kIOReturnUnderrun | kIOReturnDeviceError |
kIOReturnOverrun
Буфер или очередь не смогли принять поток
kIOReturnOverrun означает, что данные превысили ёмкость соответствующего буфера ввода-вывода, FIFO, DMA-кольца или очереди. Это не обязательно ошибка USB, и код не указывает точный переполненный слой. Семейство драйверов определяет, произошло ли переполнение в оборудовании устройства, кольце контроллера, очереди ядра или пути передачи к пользовательскому пространству.
В отличие от kIOReturnUnderrun, здесь данные поступают или создаются быстрее, чем следующий этап успевает их потреблять. Немедленный повтор той же операции может усилить насыщение. Сначала выясните, были ли данные потеряны или драйвер остановил поток до необратимой потери.
Что следует проверить
- Сохраните ёмкости очередей, максимальные уровни заполнения, задержку завершения, размеры пакетов и число одновременно выполняемых передач.
- Проверьте, не заблокированы ли поток-потребитель, обратный вызов или путь хранения, пока устройство продолжает выдавать данные.
- Для периодических транспортов сопоставьте согласованные размер пакета и интервал с устойчивой скоростью, которую приложение способно обрабатывать.
- Используйте обратное давление, управление потоком или документированный режим с меньшей скоростью, если это допускает протокол; не отбрасывайте данные молча, если это не явное проектное решение.
Ссылки
- Apple Developer: kIOReturnOverrun
- Исходный код Apple XNU: IOReturn.h
- USB-IF: спецификация USB 2.0
- libusb: асинхронные и изохронные передачи
Нужно найти другой код? Найти другой код состояния или ошибки.