为什么我无法从WinUsb_ReadIsochPipeAsap获得全部带宽?

时间:2017-05-26 00:47:53

标签: windows usb winusb

我一次有多个WinUsb_ReadIsochPipeAsap在飞行中,并且只要WinUsb_GetOverlappedResult成功完成第一个bInterval,就会一直排队。根据{{​​3}}:

  

WinUsb_ReadIsochPipeAsap允许USB驱动程序堆栈选择传输的起始帧编号。如果端点上已有一个或多个传输已暂挂,则将在最后一个当前待处理传输的最后一个帧编号之后紧接着帧编号进行传输

(强调补充)

当我测量主机上的数据速率(读取完成率)时,我只看到6ms的轮询速率(每第6帧),即使描述符1IN-NAK,并且6ms甚至不是等时端点的可能轮询间隔。文档让我觉得我应该在每一帧都看到转移,因为我总是有多个未决转移。

如果我使用USB分析仪查看总线,我从设备上看不到任何WinUsb_ReadIsochPipeAsap,所以我怀疑Windows甚至没有提出请求。

为什么我没有看到完整的1000Hz传输速率?

1 个答案:

答案 0 :(得分:1)

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

根据documentationContinueStream [in]的含义是:

  

WinUsb_ReadIsochPipeAsap

     

表示转移提交如果可以在最后一次待处理转移后的第一帧中进行安排。

(强调补充)

这是事实。例如,如果您第一次拨打TRUE来通过ERROR_INVALID_PARAMETER,则会收到TRUE,因为没有任何内容可以继续。如果您允许超过1帧的时间(全速1毫秒)并通过ERROR_INVALID_PARAMETER,您将获得ContinueStream,因为"在最后一次待定转移后的第一帧"已不再可用。

然而,尽管语言非常相似"最后一次待定转移后的第一帧"作为默认行为,如果TRUE设置为WinUsb_ReadIsochPipeAsap ,则Windows实际将传输安排在连续帧中的唯一方法。您拨打ContinueStream的速度或拨打多少重叠电话并不重要。

解决方案是始终尝试ContinueStream,但如果出现故障则不再继续(否则在第一次失败ContinueStream = FALSE; while (...) { if ( !WinUsb_ReadIsochPipeAsap( ..., ContinueStream, ... ) ) { DWORD lastError = GetLastError(); if ( lastError == ERROR_INVALID_PARAMETER && ContinueStream) { ContinueStream = FALSE; continue; } } ContinueStream = TRUE; ... } 之后您将永远失败):

WinUsb_ReadIsochPipe

或者,您可以重写循环以使用<!DOCTYPE html> <html> <head> <title>Mac gallery</title> <link rel="stylesheet" type="text/css" href="css/nav.css"> <link rel="stylesheet" type="text/css" href="css/stylesheet.css"> <link rel="stylesheet" type="text/css" href="css/gallerystyles.css"> <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css"> <script src="js/nav.js"></script> <script src="js/javascript.js"></script> <script src="js/footer.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script> <script src="js/galleria/galleria-1.5.7.min.js"></script> <style> .galleria{ max-width: 700px; height: 400px; background: #000 } </style> <script> (function() { Galleria.loadTheme('js/galleria/themes/classic/galleria.classic.min.js'); Galleria.run('.galleria'); }()); </script> </head> <body onload="time()"> <nav> <ul class="topnav" id="myTopnav"> <a href="index.html"><li>Home</li></a> <div class="dropdown"> <li class="dropbtn" onclick="myFunction1()">Gallerys</li> <div class="dropdown-content" id="myDropdown"> <a href="iphonegallery.html"><li>Iphone Gallery</li></a> <a href="macgallery.html"><li>Mac Gallery</li></a> <a href="ipodgallery.html"><li>Ipad Gallery</li></a> </div> </div> <a href="contectus.html"><li>Contact US</li></a> <a href="javascript:void(0);" class="icon" onclick="myFunction()"><li>&#9776;</li></a> </ul> </nav> <div class="galleria"> <img src="img/macgallery/Imac.jpg"> <img src="img/macgallery/macbook.png"> <img src="img/macgallery/macbookpro.jpg"> <img src="img/macgallery/macmini.jpg"> </div> <footer> <p>Develop and maintain by Alastair Micallef (<span id="date"></span>)</p> <ul class="footernav"> <a href=""><li>Home</li></a> <a href=""><li>Gallery</li></a> <a href=""><li>Iphone gallery</li></a> <a href=""><li>Mac gallery</li></a> <a href=""><li>Ipad gallery</li></a> <a href=""><li>Iphone History</li></a> <a href=""><li>Mac Hostory</li></a> <a href=""><li>Ipod Histry</li></a> </ul> </footer> </body> </html> (非ASAP版本),但这只需要您自己管理顺序帧编号。