首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能从WinUsb_ReadIsochPipeAsap获得全部带宽?

为什么我不能从WinUsb_ReadIsochPipeAsap获得全部带宽?
EN

Stack Overflow用户
提问于 2017-05-26 00:47:53
回答 1查看 215关注 0票数 2

我一次有多个WinUsb_ReadIsochPipeAsap在飞行,每次WinUsb_GetOverlappedResult成功的时候,总是排下一个队列。根据文档

WinUsb_ReadIsochPipeAsap允许USB驱动程序堆栈为传输选择起始帧号。如果端点上已经有一个或多个传输挂起,则将将传输调度为帧号,该帧号紧跟在上一个当前挂起的传输的最后一个帧号之后。

(强调后加)

当我测量主机上的数据速率(读取完成率)时,我只看到6 is的轮询率(每6帧),即使描述符bInterval1,6ms甚至不是同步端点的可能轮询间隔。文档让我认为我应该看到每个帧上的传输,因为我总是有多个挂起的传输。

如果我用USB分析器查看总线,我看不到设备上的任何IN-NAK,所以我怀疑Windows甚至没有提出请求。

为什么我看不到整个1000赫兹的传输速率?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-26 00:47:53

WinUsb_ReadIsochPipeAsap的参数

代码语言:javascript
复制
BOOL __stdcall WinUsb_ReadIsochPipeAsap(
  _In_     PWINUSB_ISOCH_BUFFER_HANDLE BufferHandle,
  _In_     ULONG                       Offset,
  _In_     ULONG                       Length,
  _In_     BOOL                        ContinueStream,
  _In_     PULONG                      NumberOfPackets,
           PUSBD_ISO_PACKET_DESCRIPTOR IsoPacketDescriptors,
  _In_opt_ LPOVERLAPPED                Overlapped
);

根据文档ContinueStream的意思是:

ContinueStream [in] 指示如果只能在最后一次挂起的传输之后的第一个帧中调度,则应该只提交。

(强调后加)

这是真的。例如,如果您对WinUsb_ReadIsochPipeAsap的第一次调用通过了TRUE,您将得到ERROR_INVALID_PARAMETER,因为没有什么可继续的。如果您允许超过1帧时间(全速1ms)并通过TRUE,您将得到ERROR_INVALID_PARAMETER,因为“最后挂起的传输后的第一个帧”不再可用。

然而,尽管默认行为是关于“最后一次未决传输后的第一帧”的非常相似的语言,但ContinueStream实际上将传输安排在顺序帧中的唯一方法是如果ContinueStream设置为 TRUE.无论您调用WinUsb_ReadIsochPipeAsap的速度有多快,或者您打了多少个重叠的电话,都不重要。

解决方案是始终尝试ContinueStream,但如果出现故障,请回到不继续的状态(否则,在第一个失败的ContinueStream之后,您将永远失败):

代码语言:javascript
复制
ContinueStream = FALSE;

while (...)
{
    if ( !WinUsb_ReadIsochPipeAsap( ..., ContinueStream, ... ) )
    {
        DWORD lastError = GetLastError();

        if ( lastError == ERROR_INVALID_PARAMETER && ContinueStream)
        {
            ContinueStream = FALSE;
            continue;
        }
    }
    ContinueStream = TRUE;
    ...
}

或者,您可以重写您的循环以使用WinUsb_ReadIsochPipe (非sequential ),但这只需要您自己管理顺序帧号。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44191893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档