Микрофрейм 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 мс?

0 ответов

Другие вопросы по тегам