Hi3559AV100板载开发系列-pthread_create()下V4L2接口MJPEG像素格式的VIDIOC_DQBUF error问题解决-采用阻塞方式下select监听
最近一直加班加点进行基于Hi3559AV100平台的BOXER-8410AI板载开发,在开发的过程中,遇到了相当多的问题,其一是板载的开发资料没有且功能不完整,厂家不提供太多售后技术支持,厂家对部分硬件没有进行开发,如MIPI接口没有进行开发,且最基本的SDK版本包及环境搭建也需要自己去网上找且从头弄,好在之前有Hi3519A平台的开发经验,但还是遇到了很多问题;其二是网上相关H3559AV100平台开发资料很少,也导致了开发的周期拉长;其三是个人项目经验还是相对较少(虽然之前搞过电赛、robmaster等都拿了国奖,但是知识储备还是不够),之后将陆续记录基于Hi3559AV100平台的开发过程,希望能给您带来一些技术支持。早之前开发的记录将稍后推出,今天和大家说下关于pthread_create()下MJPEG格式的select监听。
参考man pthread_create,pthread_create()函数在调用中启动一个新线程处理,给出pthread_create的特征:
1 #include <pthread.h>
2
3 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
4 void *(*start_routine) (void *), void *arg);
5 //例如在VDEC 向视频解码通道发送码流数据 对函数 HI_MPI_VDEC_SendStream()进行操作时
6 pthread_create(&pVdecThread[i], 0, SAMPLE_COMM_VDEC_SendStream, (HI_VOID *)&pstVdecSend[i]);
新的线程通过调用start_routine()来开始执行,在此处,start_routine()为SAMPLE_COMM_VDEC_SendStream,arg<------->pstVdecSend[i]作为start_routine()的唯一参数传递;而thread这个标识符是用来引用在后续调用其他pthread功能,成功创建线程后,返回0。
线程分两类,一类是joinable,一类是detached,对于joinable线程,需要用pthread_join()来等待线程结束并获取状态;而对于detached线程终止,其所用的资源系统会自动回收的,不需要进行操作,对于线程创建来说,默认是joinable线程,如果大家需要detached线程,则需要修改attr参数。
创建SAMPLE_COMM_VDEC_SendStream线程后,其主要是实现了PT_MJPEG解码协议类型数据的帧头帧尾判别及数据发送,但是在线程中用了V4L2接口:
1 ioctl(video_fd, VIDIOC_DQBUF, &readbuffer)
出现了VIDIOC_DQBUF /capture data failed及Segmentation fault等等:

Segmentation fault的原因很大程度上是数组的索引超界了,根据自己的程序修改相应的位置,我改的位置为:
1 pu8Buf = malloc(pic_size); //6144002 //pu8Buf = malloc(pstVdecThreadParam->s32MinBufSize);
而关于VIDIOC_DQBUF fault,网上说可能是使用非阻塞方式打开设备文件造成的,即对应用程序进行一些非阻塞(non-blocking)操作(对文件或者socket),如果使用非阻塞模式调用视频设备,即使尚未捕获到信息,驱动依旧会把缓存(DQBUFF)里的东西返回给应用程序。例如,以O_NONBLOCK的标志打开文件/socket/FIFO,如果你连续做read操作而没有数据可读。此时程序不会阻塞起来等待数据准备就绪返回,read函数会返回一个error。
因此open设备节点的时候(如open /dev/video*时),不建议用非阻塞形式打开,因为MJEPG格式时,每次去读取数据,底层数据不一定就绪了,因此会返回错误,串口会有茫茫多的错误打印。建议是阻塞方式打开,用select去监听所有的fd。
1 /* According to POSIX.1-2001, POSIX.1-2008 */
2 #include <sys/select.h>
3
4 /* According to earlier standards */
5 #include <sys/time.h>
6 #include <sys/types.h>
7 #include <unistd.h>
8
9 int select(int nfds, fd_set *readfds, fd_set *writefds,
10 fd_set *exceptfds, struct timeval *timeout);
首先和大家说一下select监听的机制:用阻塞的方式去open设备节点,select去监听所有的fd;select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型。select一旦发现监听的设备都不可用(不可读、也不可写、也没有异常),那么主进程进入休眠状态,一旦监听的设备中,只要有一个设备可用(可读或者可写或者有异常)都会唤醒休眠的主进程,select也就会返回。注意这个函数仅仅起到一个监听的功能,数据的后续处理,通过read,write,ioctl来进行的,本项目中测试实现:
1 s_value = select(fdmax + 1, &fds, NULL, NULL, &tv);
2
3 if(s_value == -1)
4 {
5 if(EINTR == errno)
6 {
7 perror("select");
8 continue;
9 }
10 SAMPLE_PRT("Fail to select\n");
11 break;
12 }
13 if(s_value == 0)
14 {
15 SAMPLE_PRT("select Timeout\n");
16 continue;
17 }
Hi3559AV100板载开发系列-pthread_create()下V4L2接口MJPEG像素格式的VIDIOC_DQBUF error问题解决-采用阻塞方式下select监听的更多相关文章
- C#.NET微信公众账号接口开发系列文章整理--微信接口开发目录,方便需要的博友查询
前言: 涉及微信接口开发比较早也做的挺多的,有时间的时候整理了开发过程中一些思路案例,供刚学习微信开发的朋友参考.其实微信接口开发还是比较简单的,但是由于调试比较麻烦,加上微信偶尔也会给开发者挖坑,并 ...
- openresty开发系列39--nginx+lua实现接口签名安全认证
一)需求背景现在app客户端请求后台服务是非常常用的请求方式,在我们写开放api接口时如何保证数据的安全,我们先看看有哪些安全性的问题 请求来源(身份)是否合法?请求参数被篡改?请求的唯一性(不可复制 ...
- JS系列1---节流,去抖(防抖)应用场景:intput请求优化,页面监听
在项目开发过程中经常遇到在input的change事件中发起请求,将用户最新输入的字符作为data传给后台,但是如果用户的输入频率过高,或者用户输入的字符还未拼成一个完整的字词,这时候发起请求会浪费网 ...
- Hi3559AV100 NNIE RFCN开发:V4L2->VDEC->VPSS->NNIE->VGS->VO系统整体动态调试实现
下面随笔将给出Hi3559AV100 NNIE RFCN开发:V4L2->VDEC->VPSS->NNIE->VGS->VO系统整体动态调试实现,最终的效果是:USB摄像 ...
- 微信程序开发系列教程(三)使用微信API给微信用户发文本消息
这个系列的第二篇教程,介绍的实际是被动方式给微信用户发文本消息,即微信用户关注您的公众号时,微信平台将这个关注事件通过一个HTTP post发送到您的微信消息服务器上.您对这个post请求做了应答(格 ...
- 第二百四十四节,Bootstrap下拉菜单和滚动监听插件
Bootstrap下拉菜单和滚动监听插件 学习要点: 1.下拉菜单 2.滚动监听 本节课我们主要学习一下 Bootstrap 中的下拉菜单插件,这个插件在以组件的形式我们 已经学习过,那么现在来看看怎 ...
- JavaFx 监听剪切板实现(Kotlin)
原文地址: JavaFx 监听剪切板实现(Kotlin) | Stars-One的杂货小窝 软件有个需求,想要实现监听剪切板的内容,若内容符合预期,则进行相关的操作,就可以免去用户手动粘贴的操作,提供 ...
- socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto
socket异步通信-如何设置成非阻塞模式.非阻塞模式下判断connect成功(失败).判断recv/recvfrom成功(失败).判断send/sendto 博客分类: Linux Socket s ...
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值(转载)
1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值 ...
随机推荐
- 【poj 2976】Dropping tests(算法效率--01分数规划 模版题+二分){附【转】01分数规划问题}
P.S.又是一个抽时间学了2个小时的新东西......讲解在上半部分,题解在下半部分. 先说一下转的原文:http://www.cnblogs.com/perseawe/archive/2012/05 ...
- 【noi 2.6_90】滑雪(DP)
题意:输出最长下降路径的长度. 解法:f[i][j]表示结尾于(i,j)的最长的长度.由于无法确定4个方位已修改到最佳,所以用递归实现. 1 #include<cstdio> 2 #inc ...
- POJ 1655 Balancing Act ( 树的重心板子题,链式前向星建图)
题意: 给你一个由n个节点n-1条边构成的一棵树,你需要输出树的重心是那个节点,以及重心删除后得到的最大子树的节点个数size,如果size相同就选取编号最小的 题解: 树的重心定义:找到一个点,其所 ...
- Linux系统编程【2】——编写who命令
学到的知识点 通过实现who命令,学到了: 1.使用man命令寻找相关信息 2.基于文件编程 3.体会到c库函数与系统调用的不同 4.加深对缓冲技术的理解 who命令的作用 who命令的使用 在控制终 ...
- Git管理远程仓库
一:使用远程仓库的目的 作用:备份,实现代码共享集中化管理: 二:将git本地仓库同步到远程仓库流程图 三:Git克隆操作 目的: 将远程仓库(github远程仓库项目代码)克隆到本地 如何克隆 1. ...
- kafka——集群安裝部署(自带zookeeper)
kafka系列文章 第一章 linux单机安装kafka 第二章 kafka--集群安裝部署(自带zookeeper) 一.kafka简介 kafka官网:http://kafka.apache.or ...
- Kubernets二进制安装(18)之安装部署Heapster
1.下载heapster镜像 在运维主机(mfyxw50.mfyxw.com)执行 [root@mfyxw50 ~]# docker pull quay.io/bitnami/heapster:1.5 ...
- 网站日志统计以及SOA架构
网站日志统计相关术语 PV(Page View):页面浏览量或点击量,衡量用户访问的网页数量 UV(Unique Visitor):独立设备的访问次数,根据客户端发送的 Cookie 区分 IP(In ...
- JAVA中高精度金额计算
一般java代码中遇到高精度金额计算,日常使用bigDecimal类型. 在使用BigDecimal类来进行计算的时候,主要分为以下步骤: 1.用float或者double变量构建BigDecimal ...
- RT-Thread学习笔记1-启动顺序与线程创建
目录 1. 启动顺序 2. 堆范围 3. 线程创建 3.1 线程代码(入口函数) 3.2 线程控制块 3.3 线程栈 4. 系统滴答时钟 5. GPIO驱动架构操作IO 6. 线程优先级 & ...