Микрофрейм libusbK OvlK_Wait
Я реализую драйвер для изохронного USB-устройства в приложении, критичном к задержке. Для своих тестов я использую комплект Cypress FX3 (пример USBIsoSourceSink). Конечная точка настроена на передачу данных на bInterval 1 (передача каждые 125 микрокадров ~= 8 кГц).
Мои пакеты данных очень маленькие (32 байта / пакет). Я разрешаю пересылку 8 пакетов. Теперь я пытаюсь продемонстрировать скорость передачи 8 кГц, чтобы добиться задержки передачи 125 мкс. Для конечной точки IN мой подход таков: у меня есть вектор из 4 объектов передачи, каждый сKOVL_HANDLE handle
и KISO_CONTEXT*
контекст:
struct Xfer {
UCHAR buffer[MAX_PACKETS_PR_XFER * PACKET_SIZE_IN];
KOVL_HANDLE overlapHandle;
KISO_CONTEXT* isoCtx;
Xfer(KOVL_POOL_HANDLE &poolHandle) {
IsoK_Init(&isoCtx, MAX_PACKETS_PR_XFER, 0); // StartFrame 0 = Asap
IsoK_SetPackets(isoCtx, PACKET_SIZE_IN);
OvlK_Acquire(&overlapHandle, poolHandle);
}
};
Я отправляю все 4 перевода OvlK_ReUse(xfer.overlapHandle)
а также
UsbK_IsoReadPipe(
usbHandle,
pipeID_IN,
xfer.buffer,
sizeof(xfer.buffer),
(LPOVERLAPPED)xfer.overlapHandle,
xfer.isoCtx);
Пока программа работает, я указываю на передачу в cue и OvlK_Wait(xferINiter->overlapHandle, 100, KOVL_WAIT_FLAG_RELEASE_ON_TIMEOUT, &transferred);
.
Затем я обрабатываю (сохраняю) данные из передачи и повторно отправляю их (OvlK_ReUse
а также UsbK_IsoReadPipe
) прежде, чем я укажу на следующую передачу в реплике, оборачиваясь вокруг.
Кажется, все это работает. Моя проблема в том, что я обрабатываю 1000 передач в секунду, в то время как ожидаю 8k. Кажется, я получаю только кадры 1 мс, а не микрофреймы. Я могу легко получить больше пакетов за одну передачу, но мое приложение критично по задержке.
Что я делаю неправильно? Есть ли у libusbK ограничение на обработку кадров только 1 мс?