传音控股 C/C++ 驱动面经:V4L2、摄像头调试与 UI 性能优化
- 轮次
- 一面+二面
- base
- 重庆
- 结果
- 未通过
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍,确认岗位方向。
- 介绍实习项目,尤其是影像相关部分。
- 分离屏端的性能优化具体做了什么?分离和组合时有哪些优化?
- 分离屏和主机怎么保证操作和状态一致?
- 实习主要做上层开发还是底层驱动?
- 应用层开发怎么处理多线程同步和竞态?
- 除了互斥锁,还了解哪些同步机制?知道无锁编程吗?
- MCU 开发用过哪些通信协议?各自有什么特点?
- 为什么从原专业转到嵌入式和驱动开发?
- 介绍一下 V4L2。如果要添加一个摄像头设备,需要做哪些工作?
- 如果现在有两个 CMOS,应该怎么调试?
- 自己有没有实际写过摄像头驱动?
- 摄像头不出图,应该从哪里开始排查?
- 排查之前,是不是应该先确认设备有没有成功挂载?
- 有没有使用过 MIPI 接口的 Sensor?
- 了解摄像头 3A 吗?过曝应该调哪些参数?
- 是否了解 CMOS 成像原理和常见参数?EV 是什么?
- 了解哪些图像格式?YUV、RGB、NV12 有什么区别?YUV 为什么能减少色度数据量?
- 二面:分离屏 UI 性能优化怎么做?怎么发现瓶颈?用什么指标评价?
- 什么是脏矩形?
- 实习期间最大的收获是什么?平时怎么用 AI?怎么看 AI 对软件开发的影响?
- 有没有和同事沟通不顺畅、需求没对齐的时候?怎么处理?
- 课外看过哪些技术书籍?本科到硕士为什么有一年空档?为什么选现在的学校?
- 相比其他候选人,你的三个优势是什么?
《参考解析》
V4L2 与摄像头驱动:V4L2 是 Linux 的视频采集框架。用户态典型流程:open /dev/videoX → VIDIOC_QUERYCAP 查能力 → VIDIOC_S_FMT 设格式 → VIDIOC_REQBUFS 申请缓冲区 → mmap 映射 → VIDIOC_QBUF 入队 → VIDIOC_STREAMON 启动 → select/poll 等帧 → VIDIOC_DQBUF 取帧 → 处理后再 QBUF 循环 → STREAMOFF 停止。驱动侧要实现 v4l2_device、video_device、v4l2_subdev、vb2 队列和 file_operations,Sensor 通常作为 I2C subdev,通过 v4l2_async_register_subdev 与 CSI/ISP 绑定。添加一个摄像头:确认硬件供电、时钟、复位、I2C 地址;配设备树(MIPI CSI 端口、reg、时钟、GPIO);写/适配 Sensor 驱动(上电时序、寄存器初始化、曝光增益、格式);注册 media 实体并连线;用户态验证格式与出图。
不出图排查:按“电 → 时钟 → 复位 → I2C → Sensor ID → 寄存器 → MIPI → CSI/ISP → 缓冲区 → 用户态”逐层。先确认设备节点和 dmesg 里 probe 是否成功、i2cdetect 能否看到地址、读 chip id 是否正确;再看 MIPI 是否有错误计数、lane 数/速率是否匹配、时钟是否稳定;然后确认 Sensor 输出格式与 CSI 接收格式一致、曝光增益不是 0、镜头盖/光圈正常;最后看 vb2 缓冲区是否有人入队、应用是否 DQBUF。不要一上来改驱动,先用工具把问题分层。
MIPI、3A 与图像格式:MIPI CSI-2 是差分串行接口,包含时钟 lane 和数据 lane,传输 RAW/YUV 数据,注意 lane 数、速率、时序和阻抗匹配。3A 是自动曝光(AE)、自动白平衡(AWB)、自动对焦(AF);过曝先调曝光时间/增益、光圈或 ND,检查 AE 目标亮度与测光区域,避免只调 gamma 掩盖问题。EV 是曝光值,EV = log2(N²/t),加一档 EV 表示进光量翻倍。YUV 把亮度 Y 和色度 UV 分离,利用人眼对色度不敏感做下采样(4:2:0/4:2:2),所以数据量比 RGB 小;NV12 是 Y 平面 + UV 交错平面(4:2:0),YUV420P 是 Y/U/V 三个平面。RGB 每像素三个分量,适合显示;YUV 适合采集与编码。
分离屏 UI 性能:先定位瓶颈:用帧率、单帧耗时、卡顿次数、GPU/CPU 占用、布局与绘制耗时拆分;判断是事件处理、布局计算、绘制还是合成。优化手段:减少无效刷新、合并更新、异步加载、缓存位图、降低分辨率/帧率、把耗时任务移出 UI 线程。脏矩形是只重绘发生变化的区域,减少填充和合成开销;实现上要正确计算脏区并合并,避免漏绘。效果要用固定场景的前后对比数据证明,不能只说“感觉流畅”。
多线程与同步:互斥锁保护临界区;信号量控制并发数;条件变量做等待/通知;读写锁适合读多写少;原子操作做计数和标志;无锁编程常用 CAS + 内存序,但要处理 ABA 和内存回收。嵌入式和 UI 场景还要注意“谁在哪个线程回调”,跨线程更新 UI 要切回主线程或使用消息队列。
项目与沟通:二面大量问项目,准备时把“性能优化”讲成完整闭环:怎么发现、怎么定位、改了什么、怎么验证、有没有副作用。沟通不顺的例子要讲结果:先对齐目标和验收标准,再拆接口和时间点,遇到分歧用数据/原型决策,最后复盘。优势三点要具体,比如“能下沉到驱动层定位问题”“有影像链路经验”“能跨团队推动交付”。