面灵AI→

嵌入式秋招分轮次准备:一面考广度、二面挖深度、三面看视野

轮次
笔试+一面+二面+三面+HR面
时间
2026-10
来源
牛客网

《面试题目》

笔试 / 机考

  1. 算法题:数组、字符串、链表、栈与队列、双指针、哈希这类高频题型。
  2. C 语言选择题。
  3. 需要自己处理输入输出,不是刷题网站上那种给好函数框架的形式。

一面(广度与基本功)

  1. C 语言:volatile、static、const 和指针的几种写法、内存对齐与结构体大小、堆和栈、指针相关(野指针、二级指针、函数指针)、malloc/free、大小端。
  2. 单片机外设:中断、定时器,以及 I2C、SPI、UART 三者的对比。
  3. 手撕:反转链表、字符串处理;嵌入式还爱考结合场景的环形缓冲区、用位操作修改寄存器某几位。

二面(深度追问)

  1. volatile 保证原子性吗?能不能靠它做多线程同步?中断和主循环共享变量为什么非加不可?
  2. 互斥量和信号量的区别是什么?信号量释放之后内核怎么决定唤醒哪个线程?
  3. 操作系统:进程调度、上下文切换具体做了什么、虚拟内存和 MMU、页表。
  4. RTOS:任务切换保存了什么、优先级反转、FromISR 那套接口为什么存在。
  5. 锁与并发:自旋锁和互斥锁的区别、中断上下文为什么只能用自旋锁、原子操作怎么实现、内存屏障。
  6. Linux 驱动:设备驱动模型、中断上下半部、copy_to_user。
  7. 讲项目里最难定位的一个 bug,以及你是怎么定位的。

三面 / 交叉面(视野与判断)

  1. 为什么投这个方向?你怎么看这个行业?
  2. 一个系统里某个模块崩了,怎么保证整体不出问题?
  3. 代码质量怎么保证?有没有看过开源项目的源码?
  4. 以后想往底层走还是往应用走?
  5. 开放排查题:设备在现场出问题了你怎么定位?有什么手段能把信息捞回来?

HR 面

  1. 意向城市是哪里,能不能接受加班?
  2. 有没有别的 offer、怎么排序,期望薪资是多少,职业规划是什么?
  3. 行为面:讲一次最有成就感的事、遇到过最大的困难是怎么解决的。

《参考解析》

笔试是第一道闸,它的考察范围比很多人以为的宽:偏硬件的同学容易觉得嵌入式跟算法没关系,但笔试过不了,后面的轮次根本进不去。考点主要是算法题加一部分 C 语言选择题:算法不需要卷到竞赛难度,把数组、字符串、链表、栈与队列、双指针、哈希这些高频类型吃透就够用,如果目标是笔试强度大的公司,就得往上练到中等和困难题。有一个特别容易翻车的点:机考通常要自己处理输入输出,平时刷题习惯了现成的函数框架,上了机考连数据怎么读入都要现查,时间就丢在这里。准备方式是提前在本地按「从标准输入读、按格式输出」的形式完整写几道题,把模板和边界(多组输入、空输入、结尾换行、输出格式)练熟。原帖作者的背景是双非二本、长期待在实验室、有几个竞赛国奖,STM32 和 C 用得比较熟,但项目全是裸机,FreeRTOS 只补过理论没实际移植,Linux 也只会几个命令——这个起点在秋招里很典型,笔试往往是唯一能靠短期投入明显改善的一环。

一面考广度,目标是没有明显短板:一面通常是组里的开发来面,五十分钟到一小时,节奏固定:自我介绍、挑一个项目讲、一堆基础题、最后手撕。它问得密但不深,一道题问完就走,很少在一个点上死磕,考的是覆盖面。C 语言侧的高频点几乎是每家必问:volatile 的语义、static 的三种用法、const 修饰指针的几种写法、内存对齐与结构体大小怎么算、堆和栈的区别、野指针与二级指针与函数指针、malloc/free 的行为、大小端如何判断与转换。外设侧集中在中断、定时器,以及 I2C、SPI、UART 的对比——三者要能按「线数、同步还是异步、双工方式、速率、典型拓扑、适合挂什么器件」这套维度说清,而不是背一句「I2C 两根线」。手撕一般不难,反转链表、字符串处理是常客,嵌入式还偏爱结合场景的题:环形缓冲区的读写与满空判断、用位操作修改寄存器某几位且不影响其他位(读改写加掩码)。一面的淘汰往往不是因为某一块特别弱,而是有一个明显的洞被戳中,所以准备的重点是扫一遍高频点、把空白补上。

二面考深度,同一个知识点往下追两层就空:二面通常换更资深的人,一小时往上,它几乎不问「会不会用」,直接问底层怎么实现、为什么这么设计。同一道题在两面里的落差最能说明问题:一面问 volatile 是干什么的,答「防止编译器优化」就过了;二面会追问它是否保证原子性、能不能用来做线程同步、中断与主循环共享的变量为什么非加不可、单核与多核下它的语义是否一样。正确的层次是:volatile 只约束编译器不要缓存或删除对该变量的访问,它不提供原子性、也不构成内存屏障,所以「读改写」和跨核可见性都要靠临界区、原子指令或屏障来解决;在裸机的中断场景里它足够用,是因为那里只有一个执行流会被异步打断,而不是因为它是同步原语。锁与并发同理:互斥量与信号量的区别要讲清所有权与用途(互斥量有归属、用于保护临界区;信号量是计数器、用于同步与资源计数),再往下追问「信号量释放后内核怎么决定唤醒哪个线程」就要答到就绪队列与优先级位图那层。操作系统与 RTOS 的重灾区也很集中:进程调度算法与切换开销、上下文切换具体保存了什么(通用寄存器、栈指针、状态字,而不是外设状态)、虚拟内存与 MMU 与页表的关系、任务切换与优先级反转(优先级继承或天花板怎么解)、FromISR 这类接口为什么存在(中断上下文不能调用会阻塞或依赖调度的 API,所以需要「带中断安全后缀」的版本,并在退出中断时再触发一次调度)。Linux 驱动侧常问设备驱动模型、中断上下半部(上半部只做最短的必要处理、下半部用 tasklet、工作队列或线程化中断)、copy_to_user 为什么要用专门接口(用户地址可能换出、需要校验与地址空间切换)。二面还有一类必问:让你讲项目里最难定位的一个 bug,然后顺着问怎么定位。这种题骗不了人,真调过的和照着例程改参数的,两句就能分出来。

三面考视野,深度反而降了:三面一般是别的组的人或更上一级,四十分钟左右,问题更杂:为什么投这个方向、怎么看这个行业、一个系统里某个模块崩了怎么保证整体不出问题、代码质量怎么保证、有没有看过开源项目的源码、以后想往底层还是往应用走。这里的答题结构应当是「结论 + 依据 + 边界」:比如稳定性问题,可以答分层隔离(故障域划分、任务监控与看门狗、心跳与超时、失败降级、重启策略与状态恢复),并说清哪些手段在资源受限的设备上代价太大、为什么不选。开放排查题(设备现场出问题怎么定位)没有标准答案,考的是脑子里有没有一条完整路径:先保现场(日志、core dump、看门狗与复位原因记录、串口输出),再分层排除(供电与硬件、总线时序、驱动、应用逻辑),用复现与二分缩小范围,最后补一层「下次怎么更快发现」(埋点、上报、自检)。这轮临时抱佛脚效果最差,但至少要想清楚两件事:你为什么选这个方向,以及你手上那个项目从系统角度还能怎么优化。不懂的就直说不懂,比硬编强。

HR 面不是走过场:三十分钟左右,问意向城市、能不能接受加班、有没有别的 offer 怎么排序、期望薪资、职业规划,再配几个行为面问题。氛围通常轻松,但它确认的是稳定性和匹配度,所以别在这里暴露「其实更想去别的地方」「可能会考研」这类信号;期望薪资提前查行情,给一个有依据的区间而不是随口报数。行为面问题用具体事例回答,说清情境、你的动作、结果与反思,别用形容词堆砌。反问环节别只问薪资:团队在做什么、新人怎么带、直属领导的技术背景,这些信息对判断要不要去比公司的名气有用得多。

最后是这场复盘里最值钱的一条:作者挂得多的核心原因只有一个——一直在补广度,从没补过深度。所谓「补广度」的典型动作是刷面经时看到一道题觉得「这个我会」就翻页,但「会」的判据是能往下讲两层,而不是认得这个名词。更麻烦的是这种状态自己在家发现不了,只能靠面试官现场问出来,等于拿一场场真实面试做体检,代价太高。可操作的替代办法有两个:一是对每个「会」的知识点自问两个问题——底层是怎么实现的、为什么这么设计,答不上来就说明还停在表面;二是提前把二面的追问链演一遍,把一面级别的知识点写成「一问一答一追问」的小卡片,让追问在自己脑子里先发生过。总结起来就是那句:一面别有短板,二面往深里扎,三面想清楚自己要什么。