win10 64系统,libusb 1.0,用zadig安装的驱动。目标设备采用bulk传输,一问一答的方式,既PC向目标板(EndPoint 0x01)发一条数据,再从目标板(EndPoint 0x81)读回来一组数据。写的数据长度为8字节,读不到300字节。因为通讯很频繁,且对时间比较敏感,所以需要控制完成一次读写(一读一写)所需的时间。这个时间发现经常会在30ms左右,且很少有28ms~5ms之间的值(希望是在5ms以内,其中2ms是目标板卡执行指令的时间,这个时间是目标板定时器决定的)。已经设置数据交互进程的优先级为RealTime。用QueryPerformanceCounter和QueryPerformanceFrequency作定时器判断执行的时间.
主要部分代码如下:
int init()
{
....
if(libusb_init(&ctx))
{
return -1;
}
cnt = libusb_get_device_list(ctx, &dev_list);
if(cnt < 0)
{
libusb_exit(ctx);
return -2;
}
for(int i = 0; i < cnt; i ++)
{
if(libusb_get_device_descriptor(dev_list[i], &dev_desc[i]))
{
return -3;
}
.......
}
return cnt;
}
int open(int dev)
{
.......
libusb_open(...,...);
......
libusb_set_auto_detach_kernel_driver(......, 1);
libusb_claim_interface(......,0);
}
int write(int dev, uchar* buf, int len, int ot_ms)
{
......
rtn = libusb_bulk_transfer(h_dev[id],1, buf,len, &rel_len,ot_ms );
......
}
int read(int dev, uchar* buf, int len, int ot_ms)
{
{
......
rtn = libusb_bulk_transfer(h_dev[id],0X81, buf,len, &rel_len,ot_ms );
......
}
}
void test(int retry)
{
double ms;
for(int i = 0; i < retry; i ++)
{
timer_start();
EnterCriticalSection(&cs);
rtn = write(......);
if(rtn)
{
.......
}
//也曾经在这里timer_start,用来卡read的时间,发现实际上超时的都是read
rtn =read(......);
LeaveCriticalSection(&cs);
if(rtn)
{
..........
}
ms = timer_get_ms();
if(ms > 5)
{
..............
}
timer_dly_ms(1);
}
}
用程序卡时间,发现每次都是read超时。但用BUS Hound抓包,与程序的执行略有不同,每次超时之后,下一次write的时间点,与超时当次read的时间点差距,正好接近超时多出来的时间。怀疑只是Bus Hound计的时间点是write或者read的开始时间点所导致。即便超时,Bus Hound抓到的数据本身也是对的。尝试过缩短read每一包数据的长度到64字节以内,发现依然会有类似的情况。
请问这个可能是什么原因造成的?是否有改善的思路?如何改善?谢谢
补充一点,libusb_bulk_transfer函数 的超时时间其实为这里只设置了5ms,但是一次数据读写实际执行的时间却有可能超过28ms,这期间并没有发现libusb返回超时错误,这个超时是我自己用QueryPerformanceFrequency和QueryPerformanceCounter测量的时间超时。