UVC摄像头驱动装调试总结
前几天发表了一篇文章 UVC PTZ和扩展单元的过滤与分发调试笔记,原文见: http://www.usbzh.com/article/detail-517.html ,本来想着应该没啥问题了,可没想到上周五在实际测试过程中,还是出现了问题:
经过长时间的UVC摄像头工作,突然驱动显示了大量数据包错误的问题,然后后续数据的大量丢弃导致上层摄像头的图像卡帧或静止不动的情况。
我当时的第一反应可能是数据接收不即时引起的.因为这种情况我熟,在做UAC麦克风的时候,就是由于接收数据的不即时导致音质有问题。后来将数据的链表插入当放到了完成例程中解决。所以本来想着也是什么大事,也因为是周五下班了,再周再改代码试试…
今天来上班,本着祖传代码能不动就不动的原则,我进行了代码结构的调整。和UAC音频一样,将UVC摄像头数据移到了完成合例程中,再进行测试。
想着应该是美好的一天,哼着我心爱的小摩托,完美地解决这个小BUG…
现实啪啪地打了我的脸,连续运行了大概不到20分钟,系统竟然黑屏,在Windbg中也打印了大量的错误帧信息…
喵的,看来是找错了方向了…
其实软件工程在调试的过程中,就是一个经验问题…
我又进行了一次怀疑:这玩意不会是内存溢出问题吧。不然系统咱这么卡
暴力地重新启动了测试机,现次测试,看到设备管理器,发现了系统的已使用内存在缓慢地增大,我将上层的应用停掉,发现内存并没有,看来这是我缓存数据这块的问题…
因为应用层是读取我缓存的数据的,我详细认真地把这一块写的代码看了一下,确定没有任何问题…
那么看来应该是应用层写数据的问题了,翻开代码一看,好像真的有问题
frame = Trans_GetVideoTempFrame(deviceExtension);
if (frame == NULL)
{
...
}
PCHAR packet_data = frame->data;
ULONG read_size = frame->size;
RtlCopyMemory(pData, packet_data, read_size);
*pLen = read_size;
return STATUS_SUCCESS;
竟然忘了释放frame的内存,我赶快的加上ExFreePool,再次编译,重新加载驱动,再次运行…
看着平稳的内存曲线,我又默默地哼起了我心爱的小摩托
这里我不得不再次说一下,技术交流群里的:UVC摄像头扩展单元调试工具(http://www.usbzh.com/article/detail-516.html ) 是真的好用,虽然第二次使用出现了GUID 00情况导致自己不能继续调试,但还是很感激临江仙大佬给我那么多的调试版本。
后面没办法还是用了自己写的扩展单元代码进行调试,不过我们最终还是到了GUID为00的问题,后续大佬也说会出新的版本
新的扩展单元代码工具界面如下: