一、引言

如果你正在准备嵌入式校招或跳槽面试,面对海量的八股文资料,最常遇到的困惑是:

  • "C、C++、OS、Linux、通信协议……这么多科目,优先级怎么排?"

  • "华为考什么?大疆考什么?不同公司侧重点差多少?"

  • "项目经历和八股文怎么平衡?背了后面忘了前面怎么办?"

这篇文章不做零散的知识点罗列,而是从全局视角出发,帮你建立完整的嵌入式面试知识体系地图。你首先需要看到全貌,然后才知道每一块知识处在什么位置、占多大权重、该怎么分配时间。


二、嵌入式面试的"七层知识体系"

从底层到顶层,嵌入式面试的知识体系可以分为 7 个层次。这 7 层从硬件逐步上升到软件、从原理逐步过渡到实践:

┌──────────────────────────────────────────────────────┐
│                  第七层:面试工程学                    │
│         简历编写 / 自我介绍 / 薪资谈判 / 心态         │
├──────────────────────────────────────────────────────┤
│                  第六层:项目与综合                    │
│         大厂面经 / 开放设计题 / 项目深挖              │
├──────────────────────────────────────────────────────┤
│                  第五层:Linux 生态                    │
│        Linux 应用开发 / 驱动开发 / 网络编程           │
├──────────────────────────────────────────────────────┤
│                  第四层:RTOS 与 OS 原理              │
│     FreeRTOS / 进程线程 / 同步互斥 / 死锁 / 调度      │
├──────────────────────────────────────────────────────┤
│                  第三层:通信与协议                    │
│        I2C / SPI / UART / CAN / 网络协议栈            │
├──────────────────────────────────────────────────────┤
│                  第二层:MCU 与体系结构                │
│     ARM Cortex-M / 中断NVIC / 启动流程 / 外设驱动     │
├──────────────────────────────────────────────────────┤
│                  第一层:编程语言基础                  │
│          C语言内核 / C++核心特性 / 数据结构           │
└──────────────────────────────────────────────────────┘
​
自底向上学习,自顶向下复习——下面逐层展开。

三、各层知识详解与面试权重

第一层:编程语言基础(权重:★★★★★)

一句话:这是面试的"入场券",任何公司、任何岗位必考。

C 语言是嵌入式面试中最重要的科目,没有之一。从华为到大疆,从蔚来到高通,第一轮技术面几乎都是以 C 语言开场。

核心知识点与面试频率
知识点出现频率典型考题
指针与数组⭐⭐⭐⭐⭐sizeof 数组/指针区别、函数指针、数组传参退化
内存布局⭐⭐⭐⭐⭐堆/栈/全局/常量区、大小端、内存对齐
volatile⭐⭐⭐⭐⭐中断变量、硬件寄存器、多线程共享变量
static⭐⭐⭐⭐⭐修饰局部/全局/函数三种场景
const⭐⭐⭐⭐指针与 const 四种组合
关键字综合⭐⭐⭐⭐extern、sizeof vs strlen、typedef vs #define
位操作⭐⭐⭐⭐宏定义置位/清零、位域、大小端转换
回调函数⭐⭐⭐⭐函数指针、回调注册机制、qsort 实现
链表操作⭐⭐⭐⭐反转链表、判断环、合并有序链表
内存管理⭐⭐⭐⭐malloc/free 实现原理、碎片、内存泄漏排查
编译链接⭐⭐⭐预处理/编译/汇编/链接、attribute、#pragma
C++ 在嵌入式面试中的位置

C++ 的权重取决于目标公司。华为/大疆/蔚来等大厂的高端岗位会重点考察:

知识点出现频率典型考题
虚函数与 vtable⭐⭐⭐⭐⭐虚函数表布局、纯虚函数、虚析构函数(virtual destructor)
智能指针⭐⭐⭐⭐unique_ptr/shared_ptr/weak_ptr 选型(主要适用于 Linux 应用开发岗;纯 MCU 岗较少涉及 shared_ptr/weak_ptr)
多态实现原理⭐⭐⭐⭐静态多态(模板) vs 动态多态(虚函数)
RAII⭐⭐⭐⭐资源管理、异常安全
移动语义⭐⭐⭐右值引用、std::move、完美转发
嵌入式 C++ 子集⭐⭐⭐哪些特性可用、哪些必须禁用
数据结构与算法
知识点出现频率说明
数组/链表⭐⭐⭐⭐⭐手撕代码常规题
栈/队列⭐⭐⭐⭐循环队列、双栈实现队列
排序⭐⭐⭐⭐快排、归并、插入排序原理与复杂度
树⭐⭐⭐二叉树遍历、平衡树概念
哈希表⭐⭐⭐冲突解决、负载因子
复杂度分析⭐⭐⭐⭐时间/空间复杂度

备考策略: C 语言是底线,必须每道题都能手写;C++ 根据目标公司决定深度;数据结构重点练链表和排序的手撕代码。


第二层:MCU 与体系结构(权重:★★★★★)

一句话:80% 的嵌入式岗位是 MCU 开发,这部分决定了你能不能干好活。

核心知识点
知识模块面试频率核心考题
ARM Cortex-M 架构⭐⭐⭐⭐⭐寄存器组、MSP/PSP、操作模式、异常号
启动流程⭐⭐⭐⭐⭐向量表→Reset_Handler→SystemInit→__main→main
中断系统 NVIC⭐⭐⭐⭐⭐优先级分组、抢占/响应优先级、中断延迟
GPIO 八种模式⭐⭐⭐⭐推挽/开漏/浮空/上拉下拉/复用
定时器⭐⭐⭐⭐PSC+ARR 定时计算、PWM 生成、输入捕获
DMA⭐⭐⭐传输模式、外设→内存配置、循环模式
ADC⭐⭐⭐分辨率、采样时间、DMA 连续采样
看门狗⭐⭐⭐IWDG vs WWDG、超时计算、喂狗策略
存储器映射⭐⭐⭐Flash/SRAM/外设地址范围、位带操作
关于启动流程的面试高频追问
面试官:"说说 MCU 上电到 main() 的执行过程。"
    ↓ 初级回答:描述向量表→Reset_Handler→SystemInit→__main
    ↓ 中级回答:提及 .data 拷贝、.bss 清零、栈初始化
    ↓ 高级回答:提及 VTOR 寄存器、AAPCS 调用约定、堆栈碰撞检测

备考策略: 中断和启动流程是最高频考点,必须能画图说明。PSC+ARR 定时计算是必考题——每次面试前自己手算一遍加深记忆。


第三层:通信与协议(权重:★★★★☆)

一句话:面试中区分"会单片机"和"懂系统"的分水岭。

核心知识点
协议面试频率核心考点
UART⭐⭐⭐⭐⭐帧格式(8N1)、波特率误差、RS-485 差分、流控
SPI⭐⭐⭐⭐⭐4 种模式(CPOL/CPHA)、拓扑、全双工机制
I2C⭐⭐⭐⭐⭐时序(起始/停止/ACK)、开漏+上拉、7/10位地址
CAN⭐⭐⭐显性/隐性、仲裁机制、帧格式
Modbus⭐⭐⭐RTU/ASCII 帧格式、功能码
TCP/IP⭐⭐⭐⭐三次握手/四次挥手、流量控制、拥塞控制
1-Wire⭐⭐单总线协议、DHT11/DS18B20
面试中的典型追问链
"UART 和 SPI 的区别?"
  ↓ "SPI 的四种模式怎么区分?"
  ↓ "I2C 为什么要开漏输出 + 上拉电阻?"
  ↓ "一个系统里挂 10 个 I2C 从机,总线电容会不会太大?"
  ↓ "你平时用硬件 I2C 还是软件模拟?为什么?"

⚠️ 一个常见误区: 很多同学把时序图画出来了就觉得 OK 了,但面试官接下来问的是"STM32F103 的硬件 I2C 有什么问题?"——答不上来就露馅了。

备考策略: 协议面试的深度比广度更重要。选 2~3 个协议(推荐 I2C + SPI + UART)彻底吃透,能画时序图、能写驱动代码、能说工程坑。


第四层:RTOS 与 OS 原理(权重:★★★★☆)

一句话:有 RTOS 经验的项目在简历筛选中至少加 30% 的通过率。

RTOS 核心考点(FreeRTOS)
知识点频率典型考题
任务状态机⭐⭐⭐⭐⭐Ready/Running/Blocked/Suspended 转换
调度策略⭐⭐⭐⭐⭐抢占式 vs 时间片 vs 合作式
IPC 机制⭐⭐⭐⭐⭐队列/信号量/互斥量/任务通知选型对比
优先级反转⭐⭐⭐⭐⭐互斥量的优先级继承原理
任务切换⭐⭐⭐⭐PendSV + SysTick、pxTopOfStack
内存管理⭐⭐⭐⭐heap_1~heap_6 选型、碎片问题
临界区⭐⭐⭐⭐BASEPRI vs PRIMASK、关中断粒度
任务堆栈⭐⭐⭐⭐堆栈估算、溢出检测、High Water Mark
OS 原理核心考点
知识点频率典型考题
进程 vs 线程⭐⭐⭐⭐⭐地址空间、开销、通信、崩溃影响
死锁⭐⭐⭐⭐⭐四个必要条件、预防策略(固定锁顺序)
同步机制⭐⭐⭐⭐互斥量/信号量/条件变量对比
调度算法⭐⭐⭐⭐抢占式/时间片/EDF/RMS
内存管理⭐⭐⭐虚拟内存、页表、MMU vs MPU

高频追问:"FreeRTOS 中任务通知为什么比信号量快?" 答:因为信号量本质上是队列(Queue),而任务通知直接操作 TCB 中的通知值,省去了队列的入队/出队操作和链表管理,大约快 3~4 倍。


第五层:Linux 生态(权重:★★★☆☆)

一句话:Linux 岗位是 MCU 岗位的进阶方向,薪资通常高 30~50%,但门槛也更高。

Linux 应用开发
知识点频率核心考题
文件 I/O⭐⭐⭐⭐⭐open/read/write vs fopen/fread/fwrite
进程管理⭐⭐⭐⭐⭐fork(vfork 已 POSIX 废弃,现代 Linux 用 Copy-on-Write 优化 fork)、孤儿/僵尸进程
线程同步⭐⭐⭐⭐⭐mutex/条件变量/信号量、死锁
IPC⭐⭐⭐⭐管道/共享内存/消息队列/Socket
Socket 编程⭐⭐⭐⭐TCP 服务端/客户端、select/epoll
信号⭐⭐⭐signal/sigaction、异步信号安全
阻塞/非阻塞⭐⭐⭐⭐IO 多路复用、同步/异步
Linux 驱动开发
知识点频率核心考题
字符设备驱动⭐⭐⭐⭐⭐file_operations、register_chrdev
设备树⭐⭐⭐⭐dts 语法、platform 驱动匹配
中断下半部⭐⭐⭐⭐tasklet/workqueue/ threaded IRQ
并发控制⭐⭐⭐⭐自旋锁 vs 互斥体、原子操作
内存管理⭐⭐⭐kmalloc/vmalloc/dma_alloc_coherent
阻塞/非阻塞 IO⭐⭐⭐wait_queue、poll 机制

备考策略: Linux 应用开发的考点比驱动更广泛。如果时间有限,优先掌握进程/线程/同步(这组考点在嵌入式 Linux 面试中出现率 > 90%)。


第六层:项目与综合(权重:★★★★★)

一句话:八股文决定了你能否进入面试,项目决定了你能否通过面试。

面试官在技术面中通常花 50% 的时间在你的项目上。一个好的项目描述可以弥补八股文的不足,甚至掩盖部分薄弱知识点。

项目深挖的常见追问链
"介绍一下你的项目"
  ↓ "你在这个项目里负责哪个模块?"
  ↓ "为什么选择 FreeRTOS 而不是裸机?"
  ↓ "任务优先级怎么设计的?遇到过优先级反转吗?"
  ↓ "通信用的什么协议?为什么选 SPI 而不是 I2C?"
  ↓ "数据采样率是多少?内存够用吗?算过吗?"
  ↓ "量产了吗?遇到了哪些坑?"
项目描述的 STAR 法则
S (Situation): 一个基于 STM32F103 的多传感器环境监测终端
T (Task):     我负责嵌入式软件架构 + 通信协议设计
A (Action):   采用 FreeRTOS + 5 个任务,传感器用 I2C,数据用 SPI Flash 存储
R (Result):   采样率达到 1kHz,功耗降低 40%,通过了 72 小时压力测试

备考策略: 把自己简历上每个项目的每句话都准备好被追问。每个技术选型("为什么用这个?")都应该有合理解释。


第七层:面试工程学(权重:★★★★☆)

一句话:会做题和会面试是两回事。这一层决定你能不能把技术实力转化为 offer。

各公司面试风格对比
公司笔试难度技术面重点面试轮数特点
华为★★★★基础扎实 + 项目深度3~4 轮C 语言考到死,协议栈追问深
大疆★★★★★算法 + 系统设计3 轮笔试题量大,技术面手撕代码多
海康威视★★★项目经历 + C/C++2~3 轮稳定为主,项目问得细
蔚来/小鹏/理想★★★★OS + 驱动 + 算法3 轮汽车电子背景加分
地平线★★★★★算法 + AI 芯片3~4 轮门槛高,偏向异构计算
高通★★★★C/底层/通信协议3~4 轮英语口语要求
比亚迪★★硬件 + 通信协议2 轮流程快,看重综合潜力
影石 Insta360★★★项目 + RTOS + 驱动3 轮看重动手能力和创新
联发科★★★★C/OS/嵌入式底层3 轮底软问得深
汇川/宁德时代★★★MCU/电机控制/CAN2~3 轮工控赛道,看重行业背景
自我介绍模板
面试官你好,我是[姓名],来自[学校][专业]。
​
技术背景:主要掌握 C/C++ 和嵌入式开发,熟悉 STM32 MCU 平台和
FreeRTOS 实时操作系统,了解 ARM Cortex-M 体系结构和 Linux 基础。
​
项目经历:在校期间主要做了两个项目——
  ① 基于 STM32F103 的智能传感器终端(FreeRTOS + 多传感器 + 低功耗设计)
  ② 基于全志 Linux 平台的网关设备(Socket + 数据库 + 4G 通信)
​
对嵌入式底层开发方向很感兴趣,希望能在 XX 公司继续深耕。

一个实用的建议: 每次面试后记录下所有被问到但没答上来的问题,查漏补缺。面试 3~5 家公司后,你的知识覆盖就相当全面了。


四、1523 道题的优先级分级

基于面试实际频率,将 1523 道八股文题目分为三级:

S 级(必须掌握,不回就挂)

┌─────────────────────────────────────────────┐
│  C语言:volatile / static / const / 指针    │
│  指针与数组区别 / sizeof / 内存布局          │
│  中断 / NVIC / 优先级分组                   │
│  启动流程 / MSP vs PSP                      │
│  UART/SPI/I2C 时序与对比                    │
│  FreeRTOS 任务状态 / IPC / 优先级反转       │
│  进程 vs 线程 / 死锁四条件                   │
│  项目描述(STAR 法则准备好)                 │
└─────────────────────────────────────────────┘

A 级(高频出现,必须熟悉)

┌─────────────────────────────────────────────┐
│  C进阶:位操作 / 回调 / 链表 / 编译链接     │
│  C++:虚函数 / 智能指针 / RAII              │
│  定时器:PSC+ARR 计算 / PWM                 │
│  DMA 传输模式                               │
│  IWDG vs WWDG                               │
│  TCP 三次握手 / 四次挥手                     │
│  调度算法(抢占/时间片/RMS)                │
│  FreeRTOS heap 内存管理选型                  │
│  Linux 文件 I/O / fork / 线程同步           │
│  数据结构:链表反转 / 排序 / 栈队列         │
└─────────────────────────────────────────────┘

B 级(根据目标公司选择性准备)

┌─────────────────────────────────────────────┐
│  CAN 总线 / Modbus 协议                      │
│  设备树 / platform 驱动框架                  │
│  Socket / select / epoll                    │
│  字符设备驱动 / 中断下半部                   │
│  MMU / Cache / TrustZone                    │
│  ARMv7 vs ARMv8 / AArch64                   │
│  RISC-V 与 ARM 对比                         │
│  Shell 脚本 / Makefile / CMake              │
│  GDB 调试 / 性能分析工具                     │
└─────────────────────────────────────────────┘

五、推荐的学习路径与时间分配

假设你有 3 个月准备时间,建议按以下节奏:

第 1 个月:打地基(每天 2~3 小时)

第 1~2 周:C 语言核心(指针/内存/关键字/位操作)
     每天 1 题手撕链表 + 10 道 C 语言题
     参考:01_C语言基础面试题(164 题)

第 3~4 周:MCU + ARM 体系结构
     中断系统、启动流程、GPIO/定时器/DMA
     参考:03_单片机原理 + 04_ARM体系结构(164 题)

第 2 个月:建框架(每天 2~3 小时)

第 5~6 周:RTOS + OS 原理
     FreeRTOS 任务/IPC/内存 + OS 进程/线程/死锁
     参考:09_FreeRTOS(152 题)+ 05_OS原理(77 题)

第 7~8 周:通信协议 + 数据结构
     UART/SPI/I2C 深度对比 + 链表/树/排序
     参考:10_低速通信协议(103 题)+ 11_数据结构(120 题)

第 3 个月:拓展 + 刷面经(每天 3~4 小时)

第 9~10 周:Linux + C++(按目标公司取舍)
     文件IO/进程线程/驱动基础/虚函数模板
     参考:06_Linux应用(130 题)+ 02_C++(164 题)

第 11~12 周:刷面经 + 模拟面试
     16_大厂面经(120 题真题)
     找同学模拟面试,练习 STAR 法则
     13_开发工具 + 14_面试技巧 + 15_简历编写

六、各专题之间的关联

理解知识之间的关联,比孤立背诵更有效:

C 语言的 volatile
  → 理解中断共享变量
  → 理解 FreeRTOS 临界区(BASEPRI)
  → 理解硬件寄存器映射

AAPCS 调用约定
  → 理解函数栈帧
  → 理解 PendSV 切换时为什么只保存 R4~R11
  → 理解 HardFault 栈回溯

互斥量的优先级继承
  → OS 原理中的优先级反转
  → FreeRTOS 互斥量的本质
  → 面试必问的经典问题

DMA + 环形缓冲区
  → 解决高速数据采集性能瓶颈
  → 项目中常见的设计模式
  → 体现系统设计能力

中断延迟(硬件中断延迟固定 12 cycles,与 RTOS 调度延迟不同——后者受临界区/BASEPRI 屏蔽时长影响)
  → NVIC 优先级配置
  → FreeRTOS 临界区设计(BASEPRI)
  → 实时系统设计的关键指标

七、最后的话

八股文的本质不是"背诵的负担",
而是前人踩过坑后提炼出来的知识点集合。

每道题的背后都是一个真实的问题场景:
  为什么要有 volatile?——因为有人忘了加,debug 了三天才发现是编译器优化了。
  为什么 I2C 要开漏?——因为多个主机同时拉低总线不会短路。
  为什么互斥量有优先级继承?——因为火星探测器就因为这个 bug 出了问题。

带着"理解问题根源"的心态去学,
而不是"背完这题就忘掉"。

祝大家 offer 多多!

本系列 12 篇文章全部完成,覆盖嵌入式面试七层知识体系,希望对你的学习有所帮助。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐