排查:注释其他干扰程序,只有v4l2线程执行,发现仍然只能拍32张照片
加printf打印信息,发现在第33次拍照片的时候poll超时(应该意识要这是没有buffer可用)
修改申请的buffer为64,现象还是如此
此时的疑问点:1.为什么只能拍摄32张照片 2.为什么修改了申请的buffer,拍摄的照片数量不变
查看文档:
对比程序发现,处理完数据后,并没有把buffer放入空闲链表,导致buffer已满,poll查询时超时,所以只能拍摄32张照片,
添加代码:
//fds[4]为我的文件描述符,struct v4l2_buffer buf
if (0 != ioctl(fds[4], VIDIOC_QBUF, &buf))
{
perror("Unable to queue buffer");
}
为了解决另一个疑问,修改申请的buffer为64个之后,把刚刚添加的代码注释,执行应用程序发现同样只能拍摄32张照片,再次查看文档
得到答案:申请的buffer,APP可以申请很多个buffer,但是驱动程序不一定能申请到
有个疑问点:为什么驱动程序申请不到,ioctl返回正确的值,
百度得到了结果:ioctl的返回值并不一定表示请求被完全满足,而只是指示ioctl调用本身是否成功,所以为什么驱动程序申请不到,ioctl返回正确的值
反思:在知道第33次拍照片的时候poll超时,应该意识到这是没有buffer可用,应该先解决代码逻辑是否有问题