嵌入式面试都需要准备啥 —— 一份硬核系统清单
嵌入式岗位的面试,本质是对底层能力 + 工程能力 + 系统思维 + 实战经验的综合考察。不同公司侧重点不同:做消费电子、工业控制、汽车电子、物联网、芯片原厂,考察深度差异很大。但核心能力框架是稳定的。
下面给出一份尽可能全面、硬核的准备清单。
一、C语言与底层编程能力(重中之重)
嵌入式的根基是 C。面试时默认你是“熟练掌握”,不是“会用”。
1. 指针与内存模型
必须做到:
- 指针本质(地址、类型决定步长)
- 多级指针
- 函数指针
- 指针数组 vs 数组指针
- const 的四种组合
- volatile 的真实语义(不是防止优化这么简单)
- 内存对齐
- 结构体字节布局
- 位域的风险
- 内存别名问题(strict aliasing)
- 野指针、悬空指针
- 栈 vs 堆 vs 全局区 vs BSS 区
常见面试题:
- 写一个安全的 memcpy
- 手写链表
- 写一个环形缓冲区
- 解释 volatile 在寄存器访问中的意义
- 结构体大小计算
嵌入式八股文靠这套专栏可以完全拿下:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk(涵盖各类大厂面试题,以及基础八股文资料)
来源:牛客网2. 编译与链接机制
很多人死在这里。
必须理解:
- 预处理阶段
- 编译阶段
- 汇编阶段
- 链接阶段
- 静态库 vs 动态库
- 符号表
- extern / static
- 链接脚本(.ld 文件)
- 段:.text / .data / .bss / .rodata
延伸:
- weak 符号
- 内联函数与宏区别
- GCC 属性(attribute)
- 内存映射
3. 数据结构与算法(基础但不能太弱)
虽然不是算法岗,但不能太差。
至少熟练:
- 链表
- 队列
- 栈
- 哈希
- 二叉树
- 排序算法
- 查找算法
- 时间复杂度
有些公司会问:
- 实现 LRU
- 实现环形队列
- 实现任务调度简单模型
二、操作系统与RTOS
嵌入式几乎都涉及 RTOS。
必须掌握:
- 任务调度原理
- 抢占式 vs 协作式
- 优先级反转
- 互斥锁 vs 信号量
- 事件标志组
- 消息队列
- 任务栈大小设计
- 上下文切换
常见 RTOS:
- FreeRTOS
- RT-Thread
- Zephyr
- uC/OS-II
面试常问:
- 优先级反转如何解决(优先级继承)
- 如何分析死锁
- 中断里能不能调用阻塞 API
- 任务和中断如何通信
三、ARM 架构与 MCU 知识
嵌入式几乎绕不开 ARM。
1. ARM 基础
- RISC 架构
- 寄存器模型
- 异常向量表
- 中断响应流程
- Thumb 指令集
- 堆栈模型
- 裸机启动流程
常见 MCU:
- STM32F103
- STM32F407
- ESP32
- NXP i.MX6
必须会讲:
- 上电启动过程
- Bootloader 做什么
- 中断向量表如何重定位
- NVIC 工作原理
2. 外设原理(面试必问)
串口 UART
- 波特率计算
- FIFO
- 中断方式 vs DMA
- 半双工
SPI
- CPOL / CPHA
- 主从模式
- 全双工
I2C
- 起始位
- ACK/NACK
- 仲裁机制
CAN
- 报文格式
- 仲裁优先级
- 错误帧
USB
- 枚举流程
- 描述符
Ethernet
- MAC vs PHY
- TCP/IP 基本流程
四、Linux 嵌入式(进阶岗位必考)
如果是 Linux 方向,必须准备:
1. Linux 基础
- 进程与线程
- fork / exec
- mmap
- 文件系统
- select / poll / epoll
- Socket 编程
2. 驱动开发
- 字符设备驱动
- platform driver
- device tree
- 中断处理
- 内核态 vs 用户态
涉及内核版本常见:
- Linux kernel
五、硬件基础(不会硬件基本凉)
嵌入式不是纯软件。
必须掌握:
- 电压、电流、功率
- 上拉电阻
- 下拉电阻
- MOS 管
- 三极管
- 运放
- ADC / DAC 原理
- 时钟电路
- 看懂原理图
面试常问:
- I2C 为什么要上拉
- 复位电路怎么设计
- 看门狗原理
六、调试能力(非常关键)
企业看重“解决问题能力”。
必须熟悉:
- JTAG
- SWD
- GDB
- 逻辑分析仪
- 示波器
- 串口日志
- Core dump
常见工具:
- Keil uVision
- IAR Embedded Workbench
- STM32CubeMX
面试常问:
- 程序跑飞怎么查
- 栈溢出如何定位
- 死机如何分析
七、工程能力与项目表达
技术之外,表达能力决定上限。
你必须准备:
- 至少 2 个完整项目
- 能讲清:架构设计技术选型遇到的问题如何定位如何优化如何验证
不要只说“我做了什么”,要说:
- 为什么这么设计?
- 有没有更优解?
- 你承担多少责任?
- 性能指标多少?
- 稳定性如何验证?
八、常见高频问题
- volatile 和 const 区别
- 中断和线程区别
- 任务调度原理
- 优先级反转
- malloc 在嵌入式是否推荐
- 如何降低功耗
- 如何优化启动时间
- 如何设计一个高可靠系统
- Bootloader 如何设计
- 代码如何做单元测试
九、不同阶段准备重点
初级(0-2 年)
- C 基础扎实
- 熟悉一个 MCU
- 会用 RTOS
- 有实际项目
中级(2-5 年)
- 能独立架构
- 熟悉多种通信协议
- 能定位复杂问题
- 熟悉驱动
高级(5+ 年)
- 系统架构能力
- 性能优化能力
- 稳定性设计
- 安全设计
- 代码规范体系
- 跨部门协作能力
十、真正拉开差距的能力
- 内存模型理解深度
- 中断与调度的本质理解
- 工程调试能力
- 对异常情况的敏感度
- 硬件与软件结合能力
嵌入式面试不是背八股,而是:
你是否真的理解系统如何运行?
最后总结
嵌入式面试准备可以浓缩为五句话:
- C 语言必须扎实到位
- 必须理解内存与编译链接
- 必须掌握 RTOS 原理
- 必须懂硬件基础
- 必须有真实项目与问题解决能力
如果这些都具备,无论是做 MCU 裸机、RTOS、Linux 嵌入式还是驱动开发,都会非常有竞争力。
真正的硬核,不是会写代码,而是理解系统的运行本质。