嵌入式暑期实习必备八股文:项目能进门,基础决定你能不能过
你简历上写着「熟悉 STM32、做过 FreeRTOS、会 SPI/I2C」,面试官下一句往往还是:
「
volatile到底解决什么问题?中断里能不能printf?信号量和互斥量差在哪?」
很多暑期实习挂掉,不是项目假,而是基础题答得散、答得浅——听起来「用过」,一追问就露馅。这篇文章按暑期实习考察权重整理一套八股主线:先告诉你该背什么、背到什么程度,再按模块展开。
先说结论:暑期实习八股怎么分配时间
P0 | C 语言(指针、内存、关键字) | 能画图、能举寄存器/中断例子 |
P0 | 项目深挖 | 架构、数据流、调试闭环、你的贡献 |
P1 | MCU + 外设 + 中断/定时器 | 原理 + 你板子上的引脚/时钟/DMA 选择 |
P1 | 通信协议 UART/SPI/I2C/CAN | 时序、模式、典型坑 |
P2 | RTOS(FreeRTOS 为主) | 调度、同步、优先级反转、栈大小 |
P2 | 计算机基础 | 链表、栈队列、常见排序与复杂度 |
P3 | Linux/驱动 | 投 BSP/驱动岗再加;纯 MCU 岗点到为止 |
一、C 语言:嵌入式面试的底线,也是分水岭
实习岗不会考你背完整 C99 标准,但会考和硬件、内存、并发相关的理解。
1. 指针与内存
必须能讲清:
- 指针和数组的区别(类型、sizeof、传参退化)
- 栈 / 堆 / 全局 / 常量区各放什么,嵌入式为什么慎用 malloc
- 结构体对齐:规则、
#pragma pack、为什么协议结构体要对齐 - 函数调用:参数压栈、返回地址、局部变量在栈上——栈溢出在嵌入式里多致命
2. const / volatile / static
高频,且要和场景绑定:
| 防止编译器优化;硬件寄存器、中断共享标志、多任务无锁读写的可见性(不替代互斥) |
| 只读语义、ROM 常量、接口契约 |
| 文件内链接、函数内静态局部变量生命周期 |
典型追问:中断里改 flag,主循环 while(flag==0),去掉 volatile 会怎样?
3. 位操作与宏
- 置位、清位、读位的宏写法
- 为什么寄存器操作用宏而不是随意魔法数
inline和宏的取舍(实习常问概念即可)
4. 什么程度算「扎实」
- 听过:能背堆栈区别
- 会用:能写驱动式位操作
- 过实习:能结合 中断 + DMA + 共享变量 讲清楚关键字和内存布局
嵌入式大厂面试题,基础八股文资料合集整理:
https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk
二、RTOS:有 FreeRTOS 项目就必须系统准备
没 RTOS 项目也可能被问概念;简历写了 OS,这块几乎必问。
1. 核心概念
- 任务 / 线程;就绪、运行、阻塞、挂起
- 抢占式 vs 时间片;FreeRTOS 默认抢占
- 调度时机:tick、主动 yield、阻塞 API
2. 同步与通信
二值/计数信号量 | 同步、资源计数 | 误当互斥用 |
互斥量 | 互斥访问共享资源 | 优先级继承、死锁 |
消息队列 | 传数据块 | 拷贝开销、长度设计 |
事件组 | 多事件等待 | 位标志设计 |
必背题链:信号量 vs 互斥量 → 优先级反转 → 如何避免(优先级继承、优先级天花板)→ 死锁四个条件。
3. 中断与任务边界
- 中断里只做短逻辑:清标志、发信号、唤醒任务
- 禁止:中断里
printf、阻塞 API、耗时循环 - FromISR 版本 API 为什么存在
4. 稳定性相关(加分)
- 任务栈怎么定(水位线
uxTaskGetStackHighWaterMark) configMAX_SYSCALL_INTERRUPT_PRIORITY大意- 看门狗 + 任务监控思路
三、MCU 与硬件基础:要能「讲机制」,不是只会调库
1. GPIO / 时钟 / 复位
- 推挽 / 开漏 / 上拉下拉适用场景
- 时钟树:HSE/HSI、PLL、外设时钟使能——波特率算错很多是时钟源没搞清
2. 中断
- NVIC、抢占优先级 vs 子优先级
- 中断流程:入口 → 服务 → 退出;延迟从哪来
- 中断 vs 轮询:实时性、CPU 占用、实现复杂度
3. 定时器 / PWM / 输入捕获
- 计数模式、预分频、ARR 与频率关系
- PWM 占空比怎么算;编码器测速常用捕获
4. DMA
- 减轻 CPU、适合大批量外设搬运
- 半传输/全传输完成中断;与 Cache 一致性(H7 等要懂一点)
5. ADC
- 采样时间、分辨率、参考电压、多次采样滤波
- 实习常问:为什么 ADC 值抖动,你怎么处理
6. 启动与存储(STM32 常考)
- 上电从哪执行:Boot 引脚、向量表、
.map里各段 - Flash 里代码 vs RAM 里运行(XIP、QSPI 外挂 Flash 等,结合你项目一句即可)
四、通信协议:UART / SPI / I2C / CAN
原则:会画时序、会说模式、能讲项目里选型理由。
UART
- 帧格式:起始位、数据位、校验、停止位
- 波特率误差容忍;RS232 / TTL 电平区别(了解即可)
- 环形缓冲区 + DMA + 空闲中断接收帧(项目加分点)
SPI
- 四线、主从、模式 0~3(CPOL/CPHA)
- 全双工、速度高;片选、多从设备
- vs I2C:距离、线数、速度、硬件复杂度
I2C
- 开漏、上拉、地址、ACK/NACK
- 400k / 1MHz;时钟拉伸;多主机了解即可
CAN(投车企/工控加分)
- 多主、仲裁 ID、帧类型
- 终端电阻、波特率与采样点(概念级)
五、计算机基础:实习会考,但权重低于 C 和项目
- 数据结构:单链表反转、环检测、队列实现(RTOS 消息队列能联系)
- 排序:快排思路、稳定性、O(n log n)
- 进程 vs 线程:投 Linux 岗必问;MCU 岗也可能顺带
- 大小端:协议组包、网络字节序
六、Linux / 驱动(定向准备,非人人必考)
岗位写 BSP、Linux 驱动、系统软件时再重点背:
- 用户态 / 内核态;系统调用大致过程
- 进程地址空间、虚拟内存为什么需要
- 字符设备 vs 块设备;
open/read/write/ioctl流程 - 设备树作用(ARM Linux 常见)
- 内核里为什么睡眠、中断上下文限制
纯 STM32 实习:知道分层即可,别和 MCU 八股抢时间。
七、项目深挖:和八股同等重要
面试官用项目判断你是不是「能上手的人」。
每个项目至少准备 6 条线(建议写下来口述 3 遍):
- 系统架构:几个任务/模块、谁调谁
- 数据流:传感器 → 滤波 → 协议 → 存储/上报
- 控制流:状态机、异常分支、复位策略
- 关键参数:栈大小、队列长度、波特率、采样率怎么定的
- 调试闭环:示波器 / 逻辑分析仪 / 日志 / Shell / 仿真器用过什么
- 你的贡献:哪些是你独立完成的,哪些是参考例程改的(诚实但突出改动)
危险回答:「就是调了 HAL 库」「参考正点原子例程」。
安全回答:「例程基础上我改了 XX,因为 YY 现象,用 ZZ 验证」。
八、两周冲刺怎么排
第 1 周
- 每天 2 小时:C 指针/内存/关键字 + 手绘栈帧
- 每天 1 小时:RTOS 同步 + 中断边界
- 每天 1 小时:协议时序 + 对照你项目原理图口述
第 2 周
- 每天 2 小时:项目 6 条线 + 模拟追问(同学互问)
- 每天 1 小时:过下面题单,只口述不默写
- 隔天 30 分钟:1~2 道链表/排序手写
每天收尾:用 3 分钟录音答一题,听自己是否啰嗦、是否缺「项目一句」。
九、常见误区
- 只背题不解项目 —— 实习面试官会立刻转到板子
- 项目堆砌模块名 —— OTA、MQTT、LVGL 全写上,却讲不清数据从哪来到哪去
- RTOS 只会创建任务 —— 一问优先级反转就卡壳
- 外设只会 CubeMX 点选 —— 一问 DMA 双缓冲就哑火
- 忽视口述 —— 嵌入式面试大量是电话/视频,卡顿比写不出更致命
