vinqi.com

嵌入式软件工程师面试题及答题要点(含驱动开发高频问题)

嵌入式软件工程师面试通常 2-4 轮:一轮笔试或技术面考 C 语言和数据结构,一轮深挖项目里的驱动和 RTOS 细节,可能还有一轮主管面或 HR 面。最容易挂的不是答不出难题,而是项目细节被追问三层就露馅——比如说不清自己写的驱动里中断和轮询是怎么选的。

专业基础(C 语言与底层)

讲讲 static 和 volatile 关键字,你在什么场景下用过 volatile?

考察点:考察对编译器优化和内存模型的真实理解,volatile 是嵌入式必考点。

答题要点:
  1. static 分修饰局部变量和全局变量两种情况说:生命周期延长和限制作用域,各举一个项目里的例子。
  2. volatile 说清三点:禁止编译器优化、每次都从内存读取、典型场景是寄存器映射和中断服务程序修改的共享变量。
  3. 主动补一句边界:volatile 不保证原子性,也不解决多核可见性问题,这能体现深度。
  4. 如果被追问,可以延伸到 memory barrier 和编译器重排,但不确定就别硬说。

别踩:只会背定义、举不出自己项目里的真实用例,会被判断为没写过底层代码。

大端和小端是什么?怎么用代码判断当前机器的字节序?

考察点:考察对内存布局的理解,通信协议解析场景下这是实际问题。

答题要点:
  1. 先说概念:低字节存低地址是小端,反之是大端,x86 多为小端,很多 MCU 也是小端。
  2. 写法一:用联合体,int 和 char 数组共享内存,看第一个字节即可。
  3. 写法二:用指针强转,取 int 地址转成 char* 解引用比较。
  4. 补充实际意义:网络字节序是大端,所以有字节序转换函数,协议解析时要统一。

别踩:只背概念写不出代码,或者写出来后解释不清为什么这样能判断。

结构体对齐是怎么回事?sizeof 一个结构体你怎么算?

考察点:考察内存布局功底,嵌入式资源紧张时对齐直接影响内存和通信。

答题要点:
  1. 说清规则:成员按自身大小对齐,结构体整体大小是最大成员对齐值的整数倍。
  2. 现场推演一个例子,比如 char 加 int 加 short,逐步算出偏移。
  3. 提实际用途:跨平台通信时用编译器指令指定对齐或手动填充,避免两边解析不一致。
  4. 可以补充:调整成员声明顺序能省内存,这是真实项目里会做的优化。

别踩:只说『编译器会自动对齐』却说不出对齐规则,追问一步就答不上。

中断服务程序里有哪些事不能做?为什么?

考察点:考察对中断上下文限制的理解,这是嵌入式和纯应用开发的分水岭。

答题要点:
  1. 核心原则:中断里要快进快出,不能有阻塞和耗时操作。
  2. 不能做的:调用可能阻塞的函数、大量打印日志、忙等待、申请内存等不确定时长的操作。
  3. 正确做法:中断里只做标记或往队列发数据,复杂处理放到任务或下半部去做。
  4. 如果项目用过 RTOS,提一下哪些 API 可以在中断里调用、哪些不行,体现实战。

别踩:只说『不能太长』却说不清原因,或答不出具体哪些操作危险。

驱动与硬件方向

你写过的那个驱动,讲一下从上电到你的代码跑起来的整个过程?

考察点:考察是否真正理解驱动在整个系统里的位置,而不是只改过别人的代码。

答题要点:
  1. 按时间线讲:硬件上电、引导程序加载、内核或固件初始化、总线枚举设备、匹配驱动、调用初始化函数。
  2. 说清自己负责的边界:哪些是你写的,哪些是平台已有的,别把别人的工作说成自己的。
  3. 点出关键交互点:你的驱动怎么拿到硬件资源(地址、中断号、时钟)。
  4. 控制在两分钟内讲完主线,细节等面试官追问再展开。

别踩:只讲『我调了什么函数实现了什么功能』,暴露对系统整体启动流程不熟。

操作一个外设寄存器,轮询、中断、DMA 三种方式你怎么选?

考察点:考察工程权衡能力,没有标准答案,看你的判断依据。

答题要点:
  1. 轮询:实现简单、延迟确定,但浪费 CPU,适合低速或初始化阶段。
  2. 中断:CPU 利用率高,但有上下文切换开销,适合中速、事件驱动的场景。
  3. DMA:大数据量搬运首选,CPU 只管配置和等完成通知,适合采样、显示缓冲这类场景。
  4. 落到自己项目:说一个你实际做过的选择和原因,比如为什么把某处轮询改成了中断。

别踩:三种方式各背一遍优缺点,但说不出自己项目里为什么那样选。

设备树或者硬件描述这块你接触过吗?改一个引脚配置你会怎么做?

考察点:考察是否做过真实的板级适配,区分只写应用和做过底层移植的人。

答题要点:
  1. 如实说明接触深度:是改过配置还是从零写过,别夸大。
  2. 讲流程:找到对应节点、确认引脚复用和电气属性、改完重新编译烧录验证。
  3. 强调验证手段:怎么用示波器或日志确认引脚状态真的变了。
  4. 如果没做过,就说清楚自己了解概念但实操有限,并说明学过哪些相近的东西。

别踩:没做过硬说做过,追问『改完怎么验证』『复用寄存器在哪看』就露馅。

I2C 或 SPI 总线通信出问题,你的排查思路是什么?

考察点:考察调试方法论,嵌入式日常一半时间在排查问题。

答题要点:
  1. 先分层:物理层(接线、上拉、电平)、协议层(时序、地址、模式)、软件层(配置、代码逻辑)。
  2. 物理层用示波器或逻辑分析仪看波形,确认有没有起始信号和应答。
  3. 软件层先确认从机地址、时钟速率、模式配置这些常见低级错误。
  4. 讲一个自己真实排查过的案例,包括当时的现象、怀疑过程和最终原因。

别踩:只说『加打印看看』,没有分层思路,也没用过任何波形工具。

RTOS 与系统方向

裸机和 RTOS 你都用过吗?什么时候必须上 RTOS?

考察点:考察技术选型判断力,以及是否真用 RTOS 解决过问题。

答题要点:
  1. 给出判断标准:任务数量、实时性要求、任务间是否有复杂依赖,而不是简单说『复杂就上 RTOS』。
  2. 裸机适合逻辑简单、前后台架构够用的场景,成本和资源开销低。
  3. RTOS 适合多任务并发、有优先级抢占需求、需要队列信号量做任务通信的场景。
  4. 最好补一句代价:RTOS 带来内存开销和切换开销,还有优先级反转等新问题要处理。

别踩:把 RTOS 说得只有优点,答不出引入 RTOS 之后新增的问题。

说说优先级反转,你听说过怎么解决吗?

考察点:考察 RTOS 理论深度,这是经典必考题,答不出会明显减分。

答题要点:
  1. 先讲现象:低优先级任务持有资源,高优先级任务被阻塞,中优先级任务反而先跑。
  2. 讲危害:高优先级任务的实时性被破坏,严重时导致看门狗复位。
  3. 解决方案:优先级继承或优先级天花板,说清继承的基本机制即可。
  4. 有实战就补:比如自己项目里怎么设置互斥量属性避免这个问题。

别踩:概念背出来了,但被问『你自己项目里怎么防』就接不上。

任务间通信的方式有哪些?你在项目里用的是哪种,为什么?

考察点:考察是否理解各种机制的适用场景,而不是只会调 API。

答题要点:
  1. 列举主要方式:信号量、互斥量、消息队列、事件标志、共享内存加锁。
  2. 区分用途:互斥保护资源、信号量做同步、消息队列传数据,别混着说。
  3. 落到项目:说清当时为什么选消息队列而不是共享内存,比如解耦和避免锁的复杂度。
  4. 提一句踩过的坑更好,比如队列满了怎么处理、消息大小怎么定。

别踩:把信号量和互斥量混为一谈,或者说『都差不多,看习惯』。

项目经历深挖

挑一个你最有代表性的项目,讲讲你具体负责的部分。

考察点:考察表达结构和对项目的真实参与度,这是技术面的核心环节。

答题要点:
  1. 用固定结构:项目背景一句话、目标一句话、你负责的模块两三句、结果一句话。
  2. 明确边界:说清团队几个人、你写的是哪部分代码,别模糊成『我们做了』。
  3. 预埋亮点:故意留一两个技术难点不展开,引导面试官往你准备好的方向追问。
  4. 总时长控制在三分钟内,先讲主线再等追问。

别踩:讲成流水账,从立项讲到收尾,面试官抓不到你的个人贡献点。

这个项目里最难的一个问题是什么?你是怎么解决的?

考察点:考察解决问题的真实过程和韧性,也验证项目是不是你亲手做的。

答题要点:
  1. 选真问题:挑一个有技术含量、你确实主导解决的,不要选需求变更这种。
  2. 按过程讲:现象、排查路径、排除的错误假设、定位手段、最终原因、修复方案。
  3. 突出定位手段:用了什么工具、加了什么观测手段,这最能体现能力。
  4. 收尾加反思:这个问题让你沉淀了什么,比如后来加了什么防护。

别踩:只讲『最后解决了』,跳过排查过程,会被怀疑不是你解决的。

如果让你现在重新做这个模块,你会改哪些设计?

考察点:考察复盘能力和技术视野,看你是完成任务型还是持续思考型。

答题要点:
  1. 准备两三个真实的改进点:架构上的、可维护性上的、性能上的各备一个。
  2. 每个改进点说清当时为什么没这么做:时间紧、需求不明、资源限制,要合理。
  3. 避免全盘否定过去的方案,说明当时约束下的选择是合理的。
  4. 能提一句后来在新项目里真的用上了改进方案,效果最好。

别踩:说『我觉得当时做得挺好的没什么可改』,显得没有成长性。

行为面试与反问环节

说一次你和硬件同事对不上、互相甩锅的经历,最后怎么处理的?

考察点:考察跨部门协作能力,嵌入式岗位软硬件扯皮是日常。

答题要点:
  1. 选真实但结局正面的小冲突,别编一个完美故事。
  2. 重点讲怎么把『是谁的问题』变成『用数据定位问题』:一起抓波形、加日志对时间戳。
  3. 体现姿态:先验证自己这边没问题再去找对方,这是硬件同事最认可的做法。
  4. 结尾说结果:问题定位在哪一层、之后和该同事的协作有没有变化。

别踩:把故事讲成单方面吐槽硬件同事,暴露协作态度有问题。

为什么从上家公司离开?为什么选我们这个方向?

考察点:考察稳定性和动机真实性,嵌入式行业圈子小,别乱说前司坏话。

答题要点:
  1. 离职原因往成长空间和技术方向上靠:想深入某个方向、想接触更大规模的产品。
  2. 不说前司和前领导坏话,一句『平台和技术方向和我的规划不匹配』就够了。
  3. 选这家公司的理由要具体:产品方向、技术栈、团队规模,至少说对一个真实细节。
  4. 提前查一下对方产品线,别答『贵公司平台大机会多』这种套话。

别踩:抱怨前公司加班或领导,或者对目标公司的产品一无所知。

你有什么想问我们的吗?

考察点:考察你对这个岗位的认真程度,也是你收集信息的机会。

答题要点:
  1. 问技术:这个岗位主要维护现有代码还是开发新模块,团队用的技术栈和工具链。
  2. 问团队:嵌入式团队几个人,软硬件怎么分工,需求从哪来。
  3. 问成长:入职后前三个月的期望是什么,有没有导师或代码评审机制。
  4. 准备三到四个问题,面试官答完可以自然追问一句,别问完就沉默。

别踩:说『没什么想问的』,或者一上来就问加班和薪资(留到 HR 轮再谈)。

面试准备清单

什么时候要做什么
面试前 3 天把简历上每个项目按「背景—我负责的—难点—结果」写成一页纸,每个难点预演一遍被追问三层的问题。
面试前 3 天过一遍 C 语言高频考点:volatile、static、指针、结构体对齐、大小端,每个都手写一遍代码验证,别只看。
面试前 2 天复习自己项目用到的总线协议和 RTOS 机制,重点准备「为什么这样选」和「踩过什么坑」两类问题。
面试前一天查目标公司的产品和技术栈,准备一句具体的产品相关理由;把要问面试官的 3 个问题写下来。
面试前一天如果通知有笔试,练 2-3 道手写代码题:链表反转、字节序判断、位操作这类嵌入式常考题。
面试当天提前 10 分钟到场或上线,带上纸笔方便现场画框图;被问到不会的题,坦白说思路比硬编强。

常见问题

嵌入式软件工程师面试一般有几轮?
常见 2-4 轮:笔试或电话技术初筛、现场技术面(可能两人)、主管面或 HR 面。小公司可能一轮技术加一轮 HR 就定,大厂流程更长。技术面占权重最大,项目深挖环节往往决定结果。
没有驱动开发经验,只做过裸机开发能面吗?
可以。很多岗位明确接受裸机背景,关键是把裸机项目里的中断、定时器、外设操作讲透,展示底层功底。同时提前了解目标岗位用的平台和驱动框架的基本概念,面试时如实说明边界。
面试手写代码题一般考什么难度?
嵌入式手写题偏基础和底层:位操作、字节序判断、链表操作、字符串处理,偶尔有简单状态机。难度通常低于互联网算法岗,但对代码细节要求高,比如边界条件和可读性,写完主动检查一遍。
被问到完全不会的问题怎么办?
先别沉默也别硬编。可以说「这块我没实际用过,但我理解相关概念是……」,然后基于已知知识推一个思路。面试官往往看的是推理过程,坦诚加合理推理比装懂强得多,装懂被追问就崩了。

继续看这个岗位

相关岗位