大家好,今天来给大家分享一次粉丝真实的面试经历——来自大疆的嵌入式岗位一面真题合集。
说实话,这场面试的问题一个接一个,逻辑层层递进,完全不是那种“背八股文就能过”的类型。
嵌入式这几年真的挺火的,尤其是对于不想卷后端、又想有一份稳定且薪资不低工作的同学来说,绝对是个值得考虑的方向。而且从实际招聘来看,嵌入式对学历要求相对没那么苛刻,更看重动手能力和项目经验。
所以今天我就把这场面试的问题和参考思路都整理出来,供准备嵌入式方向的小伙伴们参考。如果你也在准备类似岗位的面试,这篇一定要收藏起来慢慢看!
Part1自我介绍
别只念简历,要讲出你的亮点
自我介绍是每场面试的开场白,也是展示你背景和能力的第一机会。
建议你重点突出:
-
教育背景中有没有学过嵌入式相关的课程(比如单片机原理、操作系统、计算机组成等)
-
是否参与过嵌入式项目开发(STM32、RTOS、裸机编程、驱动开发等)
-
掌握哪些技能(C语言、汇编、调试工具、通信协议等)
举个例子:
“我是电子信息工程专业毕业的,在校期间参与了一个基于 STM32 的智能小车项目,主要负责传感器数据采集和 PID 控制算法的实现。”
一句话说清楚你是谁,能干什么,干过什么。
Part2Linux 中线程是怎么调度的?
这个问题考的是你对操作系统的理解,尤其是多任务管理机制。
简单来说:
-
系统会根据线程的优先级和调度策略决定下一个运行的线程。
-
所有处于“可运行”状态的线程会被维护在一个队列里。
-
当 CPU 空闲时,系统从中选出优先级最高的线程执行。
-
如果线程阻塞或时间片用完,就会被暂停并放回队列等待下一轮调度。
一句话总结:调度靠优先级,切换靠状态变化,抢占靠调度策略。
Part3单核CPU上多个线程怎么调度?
单核 CPU 上没法真正“并行”,只能通过“时间片轮转”模拟并发。
也就是说:
-
每个线程分配一定的时间片
-
时间到了就换下一个线程运行
-
这就是所谓的 抢占式调度
但注意:这只是并发,不是并行。
Part4多个线程,谁先被执行?
这其实是考察你对调度算法的理解。
常见的调度策略包括:
名称 |
特点 |
先来先服务(FCFS) |
谁先到谁先跑 |
时间片轮转(RR) |
均分时间片轮流跑 |
优先级调度 |
高优先级先跑 |
抢占式调度 |
高优先级打断低优先级 |
最短作业优先(SJF) |
小任务先跑 |
不同场景下使用不同的策略,比如实时系统常用抢占式优先级调度。
Part5用过哪些STM32芯片?主频、Flash、RAM 分别是多少?
这个问题是在看你是否真的动手做过 STM32 开发。
几个常见系列如下:
芯片型号 |
主频 |
Flash |
RAM |
STM32F103C8T6 |
72MHz |
64KB~128KB |
20KB~48KB |
STM32F407VGT6 |
168MHz |
512KB~1MB |
192KB~256KB |
STM32L432KC |
80MHz |
256KB~512KB |
64KB~128KB |
这些参数在做项目前一定要查清楚,特别是 Flash 和 RAM 容量,决定了你能不能装下程序和变量。
Part6在STM32上做过哪些开发?
这部分你可以结合自己的项目经验展开讲,比如:
-
智能家居控制板
-
工业自动化设备控制器
-
IoT 设备通信模块
-
数据采集与处理系统
-
机器人控制系统
关键是要讲清楚你在其中的角色、做了什么、解决了什么问题。
Part7开发过哪些驱动?
如果你做过底层开发,可以列举以下几个方向:
-
显示驱动(OLED、LCD)
-
网络驱动(以太网、Wi-Fi)
-
音频驱动(DAC/ADC)
-
USB 驱动(HID、CDC)
-
存储设备驱动(SD卡、Flash)
建议选一两个你熟悉的详细讲讲,体现你的动手能力和问题解决能力。
Part8SPI通信过程了解吗?SPI几根线?速率配多少?
8. SPI 通信过程了解吗?SPI 几根线?速率配多少?
SPI 是一种常用的同步串行通信接口,通常需要四根线:
- SCLK:主设备发出的时钟信号
- MOSI:主设备输出,从设备输入
- MISO:主设备输入,从设备输出
- SS:从设备选择信号
SPI 的速率可以从几百 kHz 到几十 MHz 不等,具体取决于外设支持的最大速度和系统时钟源。
Part9使用过DMA吗?什么是DMA?
DMA(Direct Memory Access)是一种高效的内存访问机制。
传统做法是 CPU 搬运数据,效率低;而 DMA 可以让外设直接跟内存打交道,CPU 只需告诉它搬哪块数据、搬到哪就行了。
流程大致如下:
-
配置 DMA 参数(源地址、目标地址、长度)
-
外设触发 DMA 请求
-
DMA 控制器自动搬运数据
-
搬完后触发中断通知 CPU
DMA 可以大大提高传输效率,减少 CPU 占用率。
Part10SPI 有几种模式?分别是什么?
SPI 总共有四种工作模式,由两个参数决定:
- CPOL:空闲状态下时钟电平
- CPHA:采样边沿位置
组合如下:
模式 |
CPOL |
CPHA |
说明 |
0 |
0 |
0 |
空闲为低电平,第一个边沿采样 |
1 |
0 |
1 |
空闲为低电平,第二个边沿采样 |
2 |
1 |
0 |
空闲为高电平,第一个边沿采样 |
3 |
1 |
1 |
空闲为高电平,第二个边沿采样 |
不同设备可能支持不同模式,使用时要注意匹配。
Part11开发中遇到过哪些难以解决的问题?
这类问题主要是考察你面对复杂情况时的分析和解决能力。
可以举的例子包括:
-
死锁或竞态条件导致程序卡死
-
第三方库版本冲突
-
多线程资源竞争
-
跨平台移植行为不一致
-
硬件通信失败无法定位
描述问题时,最好能说出你是如何一步步排查、用了哪些工具、最终是如何解决的。
Part12做过比较大型的软件开发吗?涉及架构设计吗?
如果你参与过较复杂的项目,比如:
-
工业控制系统
-
实时数据采集系统
-
通信中间件开发
-
嵌入式 GUI 应用
就可以谈谈你在项目中是如何做系统设计的:
-
分层结构(UI / 业务逻辑 / 数据访问)
-
模块化划分
-
接口抽象与解耦
-
异常处理机制
-
日志记录与监控
这类项目考验的是你的整体把控能力和架构思维。
Part13中间层设计时考虑了哪些因素?
中间层是整个系统的“粘合剂”,设计时要注意以下几点:
- 功能分离:各模块职责明确,降低耦合度
- 可扩展性:方便后续添加新功能
- 松耦合:减少模块之间的强依赖
- 安全性:数据加密、权限验证
- 性能优化:缓存、异步处理、并发控制
- 日志与监控:便于后期运维和故障排查
- 可测试性:方便单元测试和集成测试
- 文档完整性:接口定义清晰,方便团队协作
Part14进程通信中有使用过锁和同步机制吗?
嵌入式开发中进程/线程同步是非常重要的一环,常用的机制包括:
- 互斥锁(Mutex)
- 信号量(Semaphore)
- 条件变量(Condition Variable)
- 屏障(Barrier)
- 读写锁(Read-Write Lock)
这些都是确保多线程或多进程安全访问共享资源的关键工具。
Part15多个进程获取不到锁会进入什么状态?
这取决于使用的锁机制和系统调度策略:
-
对于 互斥锁(Mutex):
-
如果锁已被占用,请求进程可能会阻塞等待
-
若设置了非阻塞标志,则立即返回失败
-
-
对于 信号量(Semaphore):
-
若计数器为 0,部分实现会让进程阻塞等待
-
计数器恢复后,可允许部分进程继续执行
-
Part16低优先级A拿到锁,高优先级B获取不到,B会阻塞吗?
通常情况下,是的,B 会被阻塞。
但有些系统提供了 优先级继承机制 或 优先级天花板机制,可以在一定程度上缓解这种阻塞问题。
Part17有一个优先级介于A和B之间的任务C,它会抢占CPU吗?
如果 C 的优先级高于当前运行的任务,并且处于就绪状态,那么它确实有可能抢占 CPU,这就是所谓的 抢占式调度机制。
Part18B是最高优先级却一直等不到资源,怎么办?
这种情况叫做 优先级反转,是嵌入式系统中非常经典的调度问题。
解决办法主要有:
- 优先级继承
- 优先级天花板
- 合理设计锁机制
Part19如何提高任务A的优先级?
可以通过以下方式:
-
修改调度策略,使用 实时调度策略
-
调整任务属性,手动提升其优先级数值
-
使用协同机制,让其他任务主动让出资源
Part20A的优先级应该提升到多少合适?
优先级的具体数值因系统而异。例如:
-
Linux 下优先级范围一般是 0~99,数字越小优先级越高
-
实时任务优先级通常设置在 1~49 之间
-
具体值应根据系统需求和资源竞争情况动态调整
Part21Linux是用户态开发还是内核态开发?
Linux 包括 用户态 和 内核态 两部分:
- 用户态:运行应用程序,不能直接访问硬件
- 内核态:管理硬件资源,提供系统调用接口
驱动开发、内核模块修改属于 内核态开发,而普通的应用编程则属于 用户态开发。
Part22用户态程序出现段错误,怎么定位?
可以用以下方法快速定位:
- GDB 调试器
- 打印日志观察执行路径
- Valgrind 检测内存访问错误
- 静态分析工具
- 回归测试
Part23运行态错误怎么调试?
常用手段包括:
-
打印日志观察执行路径
-
使用断言检查关键条件
-
二分法排除可疑代码
-
使用 GDB、LLDB 等调试器单步执行
-
查看 core dump 文件回溯崩溃原因
-
使用可视化调试工具辅助分析
Part24程序分成哪几个段?
一个程序通常包含以下几个段:
- 代码段(Text Segment)
- 数据段(Data Segment)
- BSS 段
- 堆(Heap)
- 栈(Stack)
- 其他特殊段
Part25堆和栈有什么区别?
对比项 |
堆(Heap) |
栈(Stack) |
分配方式 |
手动申请 |
自动分配 |
管理方式 |
手动释放 |
自动回收 |
空间大小 |
较大 |
有限 |
分配时机 |
运行时动态分配 |
编译期静态分配 |
访问速度 |
相对较慢 |
快 |
总结
面试虽难,但准备充分也能从容应对
这场大疆的嵌入式一面,虽然问题不少,但归根结底还是围绕 基础知识 + 实践能力 + 调试技巧 展开。
只要你:
-
熟练掌握 C 语言
-
熟悉 STM32 或其他 MCU 平台
-
理解操作系统基本原理
-
动手做过至少一个完整的小型嵌入式项目
-
练习调试工具的使用(GDB、Valgrind、core dump 等)
这些问题都能轻松应对。
点击下方关注【Linux教程】,获取编程学习路线、项目教程、简历模板、大厂面试题pdf文档、大厂面经、编程交流圈子等等。