嵌入式大厂面经 V4L2常见面试题(持续更新中!)

这是一个嵌入式大厂面试题专栏,每天更新高频面试题。专栏将包含题目描述、详细解析、相关知识点扩展以及实际代码示例。内容涵盖操作系统、驱动开发、通信协议等核心领域,并结合实际项目经验进行分析。每道题目都会附带面试官可能的追问方向,帮助大家更好地准备面试!

V4L2常见面试题总结

基础概念

1. V4L2是什么?

V4L2(Video for Linux 2)是Linux系统下的视频捕获API,是V4L的第二个版本。它提供了一套标准接口,用于访问视频采集设备,如摄像头、电视卡等。V4L2是Linux内核中的一个子系统,通过设备文件(/dev/video*)与用户空间程序交互。

2. V4L2的主要特点

  • 支持多种视频设备:摄像头、电视卡、视频采集卡等
  • 提供统一的设备访问接口
  • 支持多种图像格式和压缩标准
  • 支持视频流控制和参数调整
  • 支持同步和异步I/O操作
  • 支持内存映射和用户指针等内存共享机制

3. V4L2设备文件

V4L2设备在Linux系统中以字符设备的形式存在,通常路径为/dev/video0/dev/video1等。每个设备文件对应一个物理或虚拟的视频设备。

核心概念

1. V4L2的基本工作流程

  1. 打开设备文件
  2. 查询设备能力
  3. 设置视频格式
  4. 请求并分配缓冲区
  5. 开始视频流
  6. 循环获取帧数据
  7. 停止视频流
  8. 关闭设备

2. V4L2的主要数据结构

  • v4l2_capability: 设备能力信息
  • v4l2_format: 视频格式信息
  • v4l2_buffer: 缓冲区信息
  • v4l2_requestbuffers: 缓冲区请求信息
  • v4l2_control: 控制参数信息

3. V4L2的主要IOCTL命令

  • VIDIOC_QUERYCAP: 查询设备能力
  • VIDIOC_ENUM_FMT: 枚举支持的图像格式
  • VIDIOC_S_FMT: 设置图像格式
  • VIDIOC_REQBUFS: 请求缓冲区
  • VIDIOC_QUERYBUF: 查询缓冲区信息
  • VIDIOC_QBUF: 将缓冲区加入队列
  • VIDIOC_DQBUF: 从队列中取出已填充的缓冲区
  • VIDIOC_STREAMON/STREAMOFF: 开启/关闭视频流

内存管理

1. V4L2支持的内存映射方式

  • 内存映射(Memory Mapping): 最常用的方式,内核分配缓冲区,应用程序通过mmap映射到用户空间
  • 用户指针(User Pointer): 应用程序分配缓冲区,将指针传递给内核
  • DMA缓冲区(DMA Buffer): 使用DMA共享缓冲区,适用于硬件加速场景

2. 内存映射(mmap)的实现步骤

  1. 使用VIDIOC_REQBUFS请求缓冲区
  2. 使用VIDIOC_QUERYBUF查询缓冲区信息
  3. 使用mmap将内核缓冲区映射到用户空间
  4. 使用VIDIOC_QBUF将缓冲区加入队列
  5. 使用VIDIOC_DQBUF从队列中取出已填充的缓冲区

3. 用户指针方式的实现步骤

  1. 使用VIDIOC_REQBUFS请求缓冲区,类型设为V4L2_MEMORY_USERPTR
  2. 应用程序分配内存缓冲区
  3. 设置v4l2_buffer结构体的m.userptr字段指向用户缓冲区
  4. 使用VIDIOC_QBUF将缓冲区加入队列
  5. 使用VIDIOC_DQBUF从队列中取出已填充的缓冲区

图像格式

1. V4L2常用的图像格式

  • YUV格式: YUV420(I420/YU12)、YUV422(YUYV)、NV12、NV21等
  • RGB格式: RGB24、RGB32、BGR24等
  • 压缩格式: MJPEG、H.264等

2. 如何枚举设备支持的格式

使用VIDIOC_ENUM_FMT命令可以枚举设备支持的所有格式:

struct v4l2_fmtdesc fmtdesc;
memset(&fmtdesc, 0, sizeof(fmtdesc));
fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

while (ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) == 0) {
    printf("Format: %s\n", fmtdesc.description);
    fmtdesc.index++;
}

3. 格式转换

V4L2本身不提供格式转换功能,通常需要使用其他库(如FFmpeg、OpenCV)或自行实现格式转换算法。

异步I/O和多路复用

1. V4L2支持的I/O模式

  • 阻塞I/O: 默认模式,VIDIOC_DQBUF会阻塞直到有数据可用
  • 非阻塞I/O: 设置O_NONBLOCK标志,VIDIOC_DQBUF立即返回
  • 多路复用: 使用select/poll/epoll监控设备文件描述符
  • 异步通知: 使用信号(SIGIO)通知应用程序

2. 如何使用select实现多路复用

fd_set fds;
struct timeval tv;

FD_ZERO(&fds);
FD_SET(fd, &fds);

tv.tv_sec = 2;
tv.tv_usec = 0;

int r = select(fd + 1, &fds, NULL, NULL, &tv);
if (r > 0) {
    // 有数据可读,调用VIDIOC_DQBUF
    if (ioctl(fd, VIDIOC_DQBUF, &buf) == -1) {
        // 错误处理
    }
}

控制接口

1. V4L2控制接口的作用

V4L2控制接口用于调整设备参数,如亮度、对比度、曝光、白平衡等。

2. 如何设置和获取控制参数

// 设置亮度
struct v4l2_control control;
control.id = V4L2_CID_BRIGHTNESS;
control.value = 128;  // 亮度值
if (ioctl(fd, VIDIOC_S_CTRL, &control) == -1) {
    // 错误处理
}

// 获取亮度
struct v4l2_control control;
control.id = V4L2_CID

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式面试八股文全集 文章被收录于专栏

这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论
耐挂王
点赞 回复 分享
发布于 04-25 21:43 黑龙江

相关推荐

不愿透露姓名的神秘牛友
10-30 14:26
-- 嵌入式 软件 20W 本科其他
点赞 评论 收藏
分享
11-06 13:05
已编辑
河海大学 嵌入式工程师
本人bg学院本二硕,嵌入式选手,本科做的mcu方面的内容,拿过国奖和不少竞赛,但似乎对秋招没啥用,研究生阶段无论文,接触了linux应用开发,暑假突击了一波linux驱动,秋招找工作也是两个方向都在找。研二一年是学校安排的实习(实际上啥也没干,简历上硬编了一小段实习经历,图像方向,对秋招基本无作用),建议能去实习就去实习,真的太重要了。感谢牛客上众多大佬分享的经验贴和面经,给我了很大帮助,所以秋招结束了也想简单分享一波,后续也会把我之前的面经分享出来。主要投递江浙沪这边的嵌入式岗位,以官网投递为主,boss、前程、猎聘也零散投了一些,除了boss基本无回应,共计投递150+,大厂基本简历挂(实习和学历真的很重要!),以下是一些进入面试流程的公司Timeline汇总:1、汇川经纬轨道-linux方向-苏州8.12投递,9.9一面,秋招的第一场面试,排在11:30面试,面之前就感觉没戏了,就面了十五分钟,可能不够契合后续没消息了。另外集团基本投了就挂。2、信捷电气-嵌入式软件工程师-linux方向-无锡8.27投递卓越工程师,后续被转到普通岗,9.11一面hr,面完也挂了,不知道哪里答的不好,很怪。3、华勤-驱动开发-无锡8.18投递,9.27线下一面,他家流程有点奇怪,我是改到27号面试的,结果那天好像基本都是复试的人,面试官也是复试的面试官,问了hr说每个人进度不一样,面试过程中对实习里的项目指标问的很细,卡了我半天说不上来,然后可能因为对加班的事情也不够认同,挂了4、华橙-linux软开-杭州笔试txt编程,做的很难受,不过好像基本不刷人,而且他们家池子实在是太深了,基本面了的都给泡池子了,开了的听说给的不少9.11投递,9.25一面,一面八股居多,二十分钟左右,面试官没开摄像头,感觉很忙。9.26南京线下二面三面,二面主管过了直接安排hr面,面试体验还行5、公牛-软开-宁波9.25来学校线下宣讲的,9.26群面,听说开13k左右,和华橙冲突了没去6、海德斯(海能达子公司,通信军工方向)-嵌软-南京boss投递,9.23一面,问的以mcu为主,岗位说是linux的开发。9.28二面hr,正常hr面。10.14线下主管面,很奇怪,十分钟左右,也没问啥,还问了不了解机器人,安卓啥的,我寻思这和之前面的那个岗不太一样吧。后续终面,但是是备选。7、梅特勒托利多这家没有进流程,但是我要狠狠吐槽,国庆后开了个线下宣讲,把一堆人都叫过去,那个领导在上面讲老半天,抽奖还抽他的签名书还是啥的,整个宣讲会开到下午五六点,开完还要笔试,排队交简历简短面试,特别特别浪费时间,最后还不招几个人,一股kpi的感觉,体验感及其差劲。8、龙旗-驱动-上海感谢龙旗给了我第一份offer,流程很快,三面基本一周就走完了,后续违约交了钱也是很快就给我开解约函了,虽然没去,但是也非常感谢龙旗能给我第一份offer。9.11投递,10.11一面,面试官问了英语口语咋样,如果过了能加1k,当时磕磕绊绊说了两句。10.14二面hr,常规面试。10.16终面,有主管面和英语口语面,主管面项目为主,英语口语为一些日常交流,我感觉当时答的比较糟糕,但是后面也过了。10.20发offer,当时还在高铁上谈薪的,确实挺开心的,后续审核了获奖,又加了1k。整体面试体验很好,流程也很迅速。9、影微创新-嵌软-上海好像是商汤的影像芯片业务分离出来的,强度应该也不小,一面是晚上面的。9.7投递,10.14一面,八股和项目为主,然后当初问了笔试时的编程题的一些思路。10.30二面,应该是主管面,主要问项目。后续暂时没有通知10、添可智能-mcu-苏州来学校宣讲直接参加的面试,我还特地晚上跑过去面的,结果好像hc不多,最后挂了。11、中电信无人科技-嵌入式-南京-签了通过中国电信官网投递,参加了第一批笔试,后续发了线下面试通知。10.21一面技术面,10.23二面技术面以及三面主管及hr面,10.30体检,11.4 offer。流程也很快,感谢收留。12、联宝科技-联想子公司-固件开发-合肥9.07投递,10.20笔试,10.31一面,问了十五分钟左右,暂无后续。13、壹阳能源-bms-无锡初创公司,主要做国外的业务,校园招聘会投递,10.24一面,有手撕,整个公司嵌入式好像就几个人,hc=1,无后续。除了这些有面试的,还有很多因为笔试没做好挂了的,常规中小厂嵌入式笔试主要还是考察c为主,可能有一些偏门的题,有空最好还是刷一刷这方面的题,不然可能错失良机。嵌入式这几年入行门槛越来越高了,我当时本科室友还能找驱动方向的工作,现在已经全都硕士起步了,学的东西也很杂,非科班入行需谨慎。还是要感谢牛客上大佬的专栏和各种经验分享,真的帮了我很多。最后祝大家都能找到心仪的工作。
投递公牛集团等公司10个岗位
点赞 评论 收藏
分享
评论
2
21
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务