我正在为延迟关键应用程序中的 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_ReUse
和UsbK_IsoReadPipe
),然后再指向提示中的下一个传输,环绕。
这一切似乎都奏效了。我的问题是我每秒处理 1000 次传输,而我期望 8k。似乎我只得到 1ms 帧而不是微帧。每次传输我可以轻松获得更多包,但我的应用程序对延迟至关重要。
我究竟做错了什么?libusbK 是否有只能处理 1ms 帧的限制?