海康威视嵌入式开发面试经历:C语言+RTOS+硬件基础全考察
2年嵌入式经验面试海康威视,三轮技术面深度考察C语言指针内存、RTOS调度机制、驱动开发实战,附真题汇总与备考建议
背景介绍
先说说我的情况吧,本科电子信息工程,毕业后在一家中小型安防公司做了2年嵌入式开发,主要做IPC(网络摄像机)的固件开发,用的芯片是海思的Hi3516,日常写C语言、调驱动、偶尔搞点RTOS的移植。说实话,海康威视一直是我心目中的嵌入式天花板之一,毕竟安防行业的老大,技术栈也跟我之前的工作非常对口。
投简历是在9月份的秋招补录阶段,HR回复还挺快的,大概3天就约了一面。整个面试流程是三轮技术面+一轮HR面,跨度大概两周。下面我按轮次详细复盘一下。
面试流程复盘
一面:C语言基础+内存管理(约60分钟)
一面是个看起来30岁左右的技术大哥,开场先让我自我介绍,然后直接进入技术环节。说实话,海康的一面真的很硬核,没有废话,全是干货。
指针相关:
第一个问题就让我有点紧张——"说一下指针和数组的区别"。这个我答得还行,从内存布局、sizeof的区别、能否自增等角度说了。但面试官追问了一个:"那指针数组 和数组指针 呢?"我愣了一下,好在之前复习过,赶紧说p1是数组,每个元素是int指针,p2是指针,指向一个int数组。面试官点了点头。
接着问了一个让我印象深刻的题:"写一个宏,求结构体中某成员的偏移量"。这个就是offsetof宏的实现原理,我写了个((size_t)&((type*)0)->member),面试官说可以,又问我为什么要用0地址,我解释了通过0地址强转可以避免实际创建对象,直接算偏移。
内存管理:
然后面试官问:"说一下malloc的底层实现原理"。我从brk/sbrk系统调用、内存池、chunk结构等方面说了,面试官又追问:"那free的时候是怎么知道要释放多大的内存的?"这个我答了malloc会在返回的指针前面存一个header记录分配大小,free根据这个header来释放。
还问了一个经典问题:"什么是内存对齐?为什么要内存对齐?"我从CPU访问效率、某些平台不支持非对齐访问、结构体填充等角度回答的。
volatile关键字:
"volatile有什么用?哪些场景下必须用?"我举了三个场景:中断服务程序中修改的变量、多线程共享的变量、内存映射寄存器。面试官追问:"那volatile能保证线程安全吗?"我明确说了不能,它只是防止编译器优化,不保证原子性。
二面:RTOS+驱动开发(约75分钟)
二面的面试官明显更资深,应该是部门的技术负责人。这轮面试的深度明显上了一个台阶。
RTOS相关:
先问了我之前用的RTOS是什么,我说FreeRTOS。然后问:"说一下FreeRTOS的任务调度机制"。我从优先级抢占调度、同优先级时间片轮转、就绪列表的数据结构(链表数组)等方面详细说了。面试官追问:"那任务切换的时候具体发生了什么?保存了哪些上下文?"我从PendSV中断、压栈保存寄存器、更新任务栈指针、恢复新任务上下文等步骤说了。
还问了一个很实际的问题:"FreeRTOS中任务间通信有哪些方式?各自适用什么场景?"我列举了队列、信号量(二值/计数)、互斥量(含优先级继承)、事件组、任务通知,并分别说了适用场景。
驱动开发:
面试官问:"你之前做过哪些驱动的开发?"我说了I2C、SPI、UART这些。然后他让我详细说一下I2C驱动的实现,我从GPIO模拟I2C时序、start/stop条件、ACK/NACK处理、7位地址等方面说了。追问:"I2C和SPI的区别是什么?各自优缺点?"我从线数、速率、多从机支持、全双工/半双工等角度对比了。
还问了一个关于中断的问题:"说一下Linux的中断上半部和下半部机制"。我从上半部快速处理、下半部延后处理的角度说了,列举了softirq、tasklet、workqueue等机制。
三面:项目深挖+综合考察(约60分钟)
三面是总监级别的面试,主要围绕项目经历深挖,同时考察系统思维。
面试官让我挑一个最有挑战的项目详细说。我选了之前做的低功耗IPC项目,从需求分析、方案选型、遇到的问题、解决方案等方面详细说了。面试官追问了好几个点:"你说的低功耗模式切换,具体是怎么实现的?唤醒延迟是多少?""视频编码的码率控制策略是什么?""如果让你重新设计,你会怎么优化?"
还问了一个开放性问题:"如果你负责的产品在客户现场出现了偶发的死机问题,你会怎么排查?"我从复现条件确认、日志分析、看门狗配置、内存泄漏排查、硬件信号抓取等方面系统地说了排查思路。
真题汇总
C语言:
1. 指针和数组的区别?指针数组和数组指针?
2. 写一个offsetof宏
3. malloc底层实现原理?free如何知道释放大小?
4. 什么是内存对齐?为什么要对齐?
5. volatile关键字的作用和适用场景
6. struct内存布局计算(给定一个结构体求sizeof)
RTOS:
7. FreeRTOS任务调度机制
8. 任务切换的上下文保存与恢复过程
9. 任务间通信方式及适用场景
10. 优先级反转问题及解决方案(优先级继承/天花板协议)
驱动开发:
11. I2C驱动实现细节
12. I2C与SPI的区别
13. Linux中断上半部/下半部机制
14. DMA的工作原理
综合:
15. 偶发死机问题的排查思路
16. 低功耗设计方案
17. 看门狗的原理和使用注意事项
心得建议
1. C语言基础一定要扎实。海康的一面几乎全是C语言,而且不是那种背八股文就能过的,很多题目需要你真正理解底层原理。比如offsetof宏、malloc实现这些,光背答案面试官一追问就露馅了。
2. RTOS要理解原理,不能只会用API。很多人用FreeRTOS就是调调vTaskCreate、xQueueSend,但面试官问的是调度机制、上下文切换这些底层原理。建议去看看FreeRTOS的源码,特别是tasks.c和list.c。
3. 驱动开发要有实战经验。海康非常看重实际动手能力,光看书不写代码是不行的。建议自己买个开发板,从GPIO点灯开始,到I2C/SPI驱动,再到完整的设备驱动框架,一步步来。
4. 项目经历要能讲清楚细节。三面主要就是聊项目,面试官会从各个角度追问,如果你的项目是自己做的,细节都能答上来;如果是包装的,很容易被问住。所以简历上写的东西一定要是真正做过的。
5. 系统性思维很重要。嵌入式开发不是只写代码,还要考虑硬件、功耗、稳定性、可维护性等多方面因素。面试中展现系统性思维会加分很多。
FAQ
Q:海康嵌入式面试对学历要求高吗?
A:本科及以上都有机会,但校招更看重985/211,社招的话更看重项目经验。我是双非本科,靠项目经验拿到的offer。
Q:需要准备Linux内核相关的知识吗?
A:看岗位,如果是做Linux驱动的岗位,内核知识是必须的;如果是做RTOS的,重点准备RTOS就行。但了解一些Linux内核知识总是加分的。
Q:面试中会写代码吗?
A:会。一面让我手写了offsetof宏和链表反转,二面让我写了一个生产者-消费者模型的伪代码。建议提前刷一下嵌入式相关的编程题。
Q:海康的嵌入式开发主要用什么芯片?
A:海康自研芯片和海思芯片都有,具体看部门。面试前建议了解一下海思的芯片架构,比如Hi3516/Hi3559这些。
Q:薪资待遇怎么样?
A:2年经验的话,海康给到的薪资在杭州算中上水平,具体要看谈的情况。福利方面五险一金是按全额交的,这点还是比较良心的。