1

我正在为延迟关键应用程序中的 USB 同步设备实现驱动程序。对于我的测试,我使用的是 Cypress FX3 套件(USBIsoSourceSink 示例)。端点设置为在 bInterval 1 提供数据(每 125 微帧传输一次 ~= 8kHz)。

我的数据包非常小(32bytes/pck)。我允许 8 个包裹 pr 转移。现在,我尝试演示 8kHz 传输速率以实现 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);
    }
};

OvlK_ReUse(xfer.overlapHandle)我通过和提交所有 4 次转账

UsbK_IsoReadPipe( usbHandle, pipeID_IN, xfer.buffer, sizeof(xfer.buffer), (LPOVERLAPPED)xfer.overlapHandle, xfer.isoCtx);

当程序运行时,我指向提示中的一个转移,并且OvlK_Wait(xferINiter->overlapHandle, 100, KOVL_WAIT_FLAG_RELEASE_ON_TIMEOUT, &transferred);.

然后我处理(保存)来自传输的数据并重新提交它(OvlK_ReUseUsbK_IsoReadPipe),然后再指向提示中的下一个传输,环绕。

这一切似乎都奏效了。我的问题是我每秒处理 1000 次传输,而我期望 8k。似乎我只得到 1ms 帧而不是微帧。每次传输我可以轻松获得更多包,但我的应用程序对延迟至关重要。

我究竟做错了什么?libusbK 是否有只能处理 1ms 帧的限制?

4

0 回答 0