合肥君正嵌入式 Linux 开发(视觉)秋招面经
- 结果
- 已挂
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 一个完整的 Modbus 数据帧结构?
- 为什么需要 CRC 校验?
- 项目中处理了几种功能码寄存器?
- 为什么要把寄存器分散使用改成连续使用?
- FreeRTOS 在项目中的作用?是放在哪一层?
- 车道识别项目负责的内容?摄像头是你自己点亮的还是买的一个成品模组?
- 图像采集的视觉模块是什么?
- 开发过程中是否存在图像上的问题?
- 有没有关注到色彩方面的内容?
- 你有没有对工程进行进一步的优化,比如调参这类?
- 补充:ISP / 图像处理相关的内容。
《参考解析》
完整数据帧与 CRC 的必要性。Modbus RTU 的一帧是「地址(1 字节)+ 功能码(1 字节)+ 数据(N 字节)+ CRC16(2 字节)」,帧与帧之间靠 3.5 个字符时间的总线静默分隔,所以没有起始位与结束符。CRC 的作用是检错:串口在工业现场容易受电磁干扰、线缆过长或波特率不匹配导致位翻转,CRC16 能覆盖整帧的错误检测(对随机错误的检错能力强),校验不过就整帧丢弃并重发,避免把被破坏的数据当成有效值写进寄存器或执行动作。它只检错不纠错,也没有身份认证能力——这是回答「为什么需要 CRC」时要分清的边界:它解决的是「数据在传输途中被改坏了」,不是「数据是不是伪造的」。
功能码与寄存器规划。常用功能码要能背出来并说清用途:01/02 读线圈与离散输入(位量),03/04 读保持寄存器与输入寄存器(字量),05/06 写单个线圈/寄存器,15/16 写多个线圈/寄存器。寄存器「分散使用改连续使用」是个典型的工程优化题:器件厂家常把功能相近的寄存器零散定义在地址空间各处,一次轮询要发很多条请求,串行总线上请求数直接决定刷新周期;把要周期性读取的寄存器整理成连续的一段,就能用一条 03 指令(一次最多读 125 个寄存器)批量取回,请求数大幅下降、总线占用减少、数据的时间一致性也更好(同一次读取的快照)。代价是需要在设备侧或上位机侧做一次地址映射表,并维护「值 → 物理量」的换算关系;如果厂家寄存器不连续、无法重排,那就只能在上位机侧合并请求做批处理。
FreeRTOS 在项目中的位置。RTOS 提供的是任务调度、任务间通信(队列、信号量、事件组、任务通知)与时间管理,它在项目里通常处于「中间层」:下面是硬件抽象与驱动(串口、I²C、SPI、AD、定时器与中断),上面是业务逻辑。这样划分的价值在于把时间敏感的事(中断服务、协议解析、实时控制)与耗时的事(图像处理、通信上报)拆到不同优先级的任务里,让实时性可控。回答时要能说清两件事:任务怎么划分、优先级怎么定(依据是响应时限,不是「重要程度」),以及任务之间怎么传数据(队列拷贝还是指针 + 静态内存,中断里用 FromISR 版本 API)。
车道识别与视觉链路的追问。这类问题在考「你是真的做过,还是只调过现成模块」。要能说清链路的每一环:摄像头是 MIPI CSI 还是 DVP、用的成品模组还是自己点亮的 sensor(sensor 自己点亮意味着你要写 I²C 配置序列、初始化时钟与 lane、调试出图);图像数据怎么进内存(DMA 搬运、帧缓冲的分配与乒乓缓冲);预处理(去噪、灰度化、ROI 裁剪、边沿或阈值分割);识别算法(传统方法是边缘检测 + 霍夫变换拟合车道线,深度学习方法则是模型推理加后处理);后处理与输出(车道线拟合、曲率与偏移计算、异常帧丢弃)。图像质量相关的问题要往 ISP 上靠:曝光与自动增益、白平衡、去马赛克、伽马与色彩校正、降噪与锐化,这些环节直接决定算法的输入质量;如果面试官问「有没有关注色彩」,可以说清色彩空间(RAW → RGB → YUV/gray)的转换与在哪个环节做灰度化更省算力。
工程优化与调参。被问「有没有做进一步的优化」,答法要具体到指标:把耗时函数移到高优先级任务或 DMA 里、把浮点运算换成定点或查表、减少内存拷贝(零拷贝的帧缓冲传递)、调整任务优先级与栈大小、用 uxTaskGetStackHighWaterMark 确认栈余量、用 GPIO 翻转 + 逻辑分析仪测量关键路径耗时。调参要说明「调什么、看什么指标、怎么验证」——比如阈值参数影响漏检与误检的权衡,要用一段有代表性的路测视频回归验证,而不是凭肉眼感觉。