大疆嵌入式一面太难?真实面经来了!

大家好,今天来给大家分享一次粉丝真实的面试经历——来自大疆的嵌入式岗位一面真题合集。

说实话,这场面试的问题一个接一个,逻辑层层递进,完全不是那种“背八股文就能过”的类型。

嵌入式这几年真的挺火的,尤其是对于不想卷后端、又想有一份稳定且薪资不低工作的同学来说,绝对是个值得考虑的方向。而且从实际招聘来看,嵌入式对学历要求相对没那么苛刻,更看重动手能力和项目经验。

所以今天我就把这场面试的问题和参考思路都整理出来,供准备嵌入式方向的小伙伴们参考。如果你也在准备类似岗位的面试,这篇一定要收藏起来慢慢看!

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 只需告诉它搬哪块数据、搬到哪就行了。

流程大致如下:

  1. 配置 DMA 参数(源地址、目标地址、长度)

  2. 外设触发 DMA 请求

  3. DMA 控制器自动搬运数据

  4. 搬完后触发中断通知 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文档、大厂面经、编程交流圈子等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值