面灵AI→

传音控股 C/C++ 驱动面经:V4L2、摄像头调试与 UI 性能优化

轮次
一面+二面
base
重庆
结果
未通过
时间
2026-10
来源
牛客网

《面试题目》

  1. 自我介绍,确认岗位方向。
  2. 介绍实习项目,尤其是影像相关部分。
  3. 分离屏端的性能优化具体做了什么?分离和组合时有哪些优化?
  4. 分离屏和主机怎么保证操作和状态一致?
  5. 实习主要做上层开发还是底层驱动?
  6. 应用层开发怎么处理多线程同步和竞态?
  7. 除了互斥锁,还了解哪些同步机制?知道无锁编程吗?
  8. MCU 开发用过哪些通信协议?各自有什么特点?
  9. 为什么从原专业转到嵌入式和驱动开发?
  10. 介绍一下 V4L2。如果要添加一个摄像头设备,需要做哪些工作?
  11. 如果现在有两个 CMOS,应该怎么调试?
  12. 自己有没有实际写过摄像头驱动?
  13. 摄像头不出图,应该从哪里开始排查?
  14. 排查之前,是不是应该先确认设备有没有成功挂载?
  15. 有没有使用过 MIPI 接口的 Sensor?
  16. 了解摄像头 3A 吗?过曝应该调哪些参数?
  17. 是否了解 CMOS 成像原理和常见参数?EV 是什么?
  18. 了解哪些图像格式?YUV、RGB、NV12 有什么区别?YUV 为什么能减少色度数据量?
  19. 二面:分离屏 UI 性能优化怎么做?怎么发现瓶颈?用什么指标评价?
  20. 什么是脏矩形?
  21. 实习期间最大的收获是什么?平时怎么用 AI?怎么看 AI 对软件开发的影响?
  22. 有没有和同事沟通不顺畅、需求没对齐的时候?怎么处理?
  23. 课外看过哪些技术书籍?本科到硕士为什么有一年空档?为什么选现在的学校?
  24. 相比其他候选人,你的三个优势是什么?

《参考解析》

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 要切回主线程或使用消息队列。

项目与沟通:二面大量问项目,准备时把“性能优化”讲成完整闭环:怎么发现、怎么定位、改了什么、怎么验证、有没有副作用。沟通不顺的例子要讲结果:先对齐目标和验收标准,再拆接口和时间点,遇到分歧用数据/原型决策,最后复盘。优势三点要具体,比如“能下沉到驱动层定位问题”“有影像链路经验”“能跨团队推动交付”。