
这两年一直在做嵌入式相关产品的研发也陆陆续续面试过不少候选人同时自己也被面试过。嵌入式面试这件事网上叫八股文说法很多但真正能帮你通过面试的不是背题而是把底层逻辑吃透。这篇总结我不打算罗列标准答案而是站在面试官和求职者双重角度把嵌入式面试里真正会问、真正值得准备的东西拆开讲清楚。嵌入式面试和其他技术岗面试最大的区别在于它既要考你的软件功底又要考硬件直觉还要看你在资源受限条件下做工程决策的能力。一个典型的嵌入式岗位面试可能会从C语言指针一路追问到操作系统调度再从串口波形问到Linux设备树跨度非常大。所以准备工作不能是零散的背八股而是要建立一套完整的知识框架。这篇文章适合正在准备嵌入式软件工程师、嵌入式Linux开发工程师、单片机开发工程师等岗位面试的同学也适合刚入行想系统梳理嵌入式知识体系的初学者。我会从面试全局分析、C语言底层、操作系统、硬件接口、Linux驱动、项目经验呈现、手撕代码这七个维度展开最后附上高频真题速查。1. 面试前必须想明白的事嵌入式岗位到底在考什么1.1 嵌入式面试不等于刷题能力模型拆解很多人把嵌入式面试理解为背八股文以为把static、volatile、指针数组这些概念背熟就能过关。实际上资深面试官考察的从来不是知识点本身而是你对知识点背后的为什么理解到什么程度。嵌入式开发的核心矛盾是资源有限CPU主频低、内存小、Flash有限但实时性、稳定性要求极高。这就决定了嵌入式工程师必须具备三种核心能力第一底层硬件感知能力看到代码能想象出寄存器的变化、信号的时序第二资源管理意识知道栈有多大、堆够不够、中断延迟能不能接受第三系统调试能力能在没有标准输出、没有调试器的情况下定位问题。所以面试官的提问逻辑通常是先抛出一个基础概念比如volatile然后层层追问volatile能保证原子性吗什么时候必须用volatile中断里改了标志位为什么必须加volatile。这个追问过程才是真正的考察重点它检验的是你脑子里有没有一套完整的机理模型而不是碎片化的考点记忆。1.2 岗位方向不同考点权重完全不同嵌入式这个方向其实是个大筐内部细分非常多。我建议准备面试前先看清目标岗位的具体职责再分配复习精力。单片机/裸机开发岗位重点考察C语言功底、寄存器操作、中断系统、外设驱动UART、I2C、SPI、ADC、PWM、低功耗设计、状态机编程。这类岗位更看重对硬件细节的把控能力比如这个I2C时序为什么要在时钟低电平期间改变数据。RTOS方向岗位重点考察FreeRTOS、RT-Thread、UCOS这类实时操作系统的任务调度机制、信号量/互斥量/消息队列的原理与使用场景、中断与任务的交互、优先级翻转问题、内存管理策略。嵌入式Linux岗位重点考察Linux应用编程进程线程、IPC、网络编程、驱动开发字符设备、platform总线、设备树、中断下半部、内核机制内存管理、调度器、并发同步、系统移植U-Boot、内核裁剪、根文件系统。嵌入式AI/智能硬件岗位还额外涉及模型推理框架如TFLite Micro、NPU/DSP的使用、内存带宽优化等。如果你时间有限至少要把目标岗位对应的核心考点准备扎实。面试官最反感的就是候选人什么都了解但什么都说不深。2. C语言与底层基本功嵌入式八股文的高频区2.1 指针、内存与volatile最容易翻车的三块C语言是嵌入式开发的母语几乎每一轮技术面都会从C语言开始。指针是C语言的重中之重但面试官不会问指针是什么而是会问数组名和指针的区别函数指针怎么用二级指针在什么场景下必须使用这类落地问题。数组名和指针的区别是高频送分其实也是送命题题。数组名是地址常量不是指针变量sizeof(arr)和sizeof(ptr)结果不同arr是非法的。但更深一层的追问是作为函数参数时数组名会退化为指针所以在函数内无法通过sizeof得到数组长度这也是为什么嵌入式代码里经常需要显式传入长度参数。volatile是嵌入式面试的钉子户。它告诉编译器这个变量可能被意想不到地修改禁止优化掉对该变量的访问。经典场景有三个硬件寄存器映射、中断服务程序修改的全局变量、多线程环境下的共享标志位。面试官一定会追问volatile能保证原子性吗答案是绝对不能volatile只是防止编译器优化不涉及CPU指令级别的原子操作。在Cortex-M内核上对一个32位对齐变量的读写通常是原子的但对64位变量、或非对齐访问就需要额外保护。动态内存也是高频区。嵌入式里用malloc/free要格外小心碎片化问题、非线程安全问题、不确定性延迟问题。很多嵌入式项目干脆禁止在初始化完成后使用动态内存。如果面试官问RTOS里为什么建议用内存池而不是malloc你要能答出内存池是预分配固定大小块分配释放时间确定、无碎片、天然支持线程安全。2.2 结构体、字节对齐与大小端现场编译才能暴露的问题结构体相关的题目非常能区分候选人的实战水平因为如果没在真机上踩过坑单纯看书很难真正理解。字节对齐几乎是必考题。比如struct test { char a; // 1字节 int b; // 4字节 char c; // 1字节 };在默认4字节对齐下sizeof(struct test)是12而不是6。因为a占偏移0b需要对齐到4字节边界所以从偏移4开始、占4字节c占偏移8整个结构体还要对齐到4的倍数最终是12。如果改成char a; char c; int b;大小就变成8。这个例子非常经典能讲明白对齐规则和顺序影响大小的人基本可以判断有实际工程经验。大小端问题是嵌入式面试的另一道硬菜。小端模式低字节存在低地址大端模式高字节存在低地址。ARM Cortex-M默认小端但很多通信协议如网络字节序是大端的。所以面试官会顺带问字节序转换你要能说出htons/ntohs这类函数背后的逻辑就是把多字节数据的字节顺序做反转。如果现场写代码判断当前系统是大端还是小端一个经典解法是用联合体typedef union { uint16_t value; uint8_t bytes[2]; } endian_test_t; int is_little_endian(void) { endian_test_t t; t.value 0x1234; return t.bytes[0] 0x34; }2.3 static、const、宏与位操作定义清楚就赢了static关键字在嵌入式里至少有三种用法面试官会考察你是否能全部说全修饰局部变量时变量存储在静态区生命周期贯穿整个程序但作用域不变修饰全局变量时限制外部文件访问实现文件级封装修饰函数时限制函数只在当前文件可见。const的核心在于只读语义。面试官常问const修饰指针的两种形式const char *p和char *const p的区别前者是指向常量的指针指针本身可变指向的内容不能通过它修改后者是指针常量指针本身不可变指向的内容可以修改。还有一个容易被忽略的点const在嵌入式里经常用来把变量放到只读区Flash节省RAM空间这个说法能体现你的硬件落地意识。宏定义在嵌入式C里非常常见面试官会考宏和函数的区别。宏有类型无关、无调用开销的优势但有副作用风险、无类型检查、调试信息缺失等缺陷。经典的宏陷阱是参数多次求值比如#define SQUARE(x) ((x)*(x))如果调用SQUARE(i)i会被自增两次。嵌入式老手会提醒尽量用inline函数替代宏或者至少把宏参数加上括号。位操作是嵌入式工程师的日常面试中常让现场写代码实现对一个寄存器的bit3~bit5清零其他位保持不变reg ~(0x7 3);以及设置某几位为指定值比如把bit3~bit5设为101reg (reg ~(0x7 3)) | (0x5 3);这类题目考察的是你是否习惯用移位和掩码而不是直接给整数值因为直接给整数值可读性差且容易出错。3. 操作系统与并发从进程线程到中断上下文3.1 进程线程的本质区别与上下文切换的开销嵌入式Linux岗位面试进程线程是绕不开的主题。很多人机械地背诵进程是资源分配的最小单位线程是调度的最小单位但如果面试官追问一句为什么线程切换比进程切换开销小就卡壳了。这个问题的核心在于地址空间。每个进程有独立的虚拟地址空间需要维护页表线程共享进程的地址空间。进程切换时CPU需要切换页表、刷新TLB快表这部分开销非常大而且不同进程的地址空间是隔离的一个进程崩溃不会直接拖垮另一个进程。线程切换则几乎不涉及地址空间切换只需要保存/恢复寄存器上下文和内核栈所以更轻量。嵌入式场景下的一个具体考虑是多线程虽然是共享内存效率高但也引入了同步问题多进程虽然安全但IPC进程间通信本身有额外开销。在设计系统架构时要根据实时性、安全隔离、数据流大小来权衡。比如汽车电子的功能安全等级高的模块倾向用进程隔离而传感器数据采集这种高频小数据流场景用线程加共享内存更合理。3.2 同步与互斥信号量、互斥量、自旋锁的适用边界同步与互斥的考点几乎是必出的而且面试官一定会追问信号量和互斥量有什么区别。这个问题能筛掉至少一半的候选人。互斥量Mutex本质是排他性访问拥有所有权概念谁上锁谁解锁还支持优先级继承机制。信号量Semaphore本质是资源计数不要求同一个任务执行release适合生产者和消费者模型。还有一个经典追问二进制信号量能不能当互斥量用答案是不建议。因为没有所有权概念可能出现A任务获取、B任务释放这种混乱而且没有优先级继承可能出现优先级翻转问题。自旋锁也是嵌入式面试常客尤其在Linux驱动面试中。自旋锁的特点是忙等待——获取不到锁就在原地循环检测。它适合临界区极短、不允许睡眠的场景比如中断上下文或SMP对称多处理内核代码。而在单核CPU上自旋锁的获取往往通过关中断/关抢占来实现。RTOS里的临界区保护则常用关中断方式实现但关中断过长会破坏实时性所以临界区要短。还有一个常考的概念是优先级翻转和优先级继承。优先级翻转就是高优先级任务被低优先级任务间接阻塞的现象最经典的案例是Mars Pathfinder火星探测器的复位事故。解决方案就是优先级继承互斥量或者优先级天花板协议。3.3 中断处理与下半部机制嵌入式系统里中断无处不在面试官爱问中断服务函数里能不能调用printf能不能调用malloc能不能睡眠这些都是陷阱题正确答案是都不能。中断上下文与进程上下文完全不同中断处理程序运行在中断上下文没有进程概念所以不能睡眠、不能调度、不能获取用户态锁、不能调用可能阻塞的函数。printf这类重I/O操作耗时极大长时间关中断会直接破坏实时性。正确的做法是中断里只做最必要的事读取硬件状态、清除中断标志、记录数据然后通过内核机制把重活推迟到下半部执行。Linux内核提供多种中断下半部机制包括软中断softirq、tasklet、工作队列workqueue。从面试概率来说重点掌握tasklet和工作队列的区别tasklet运行在中断上下文不能睡眠工作队列运行在进程上下文可以睡眠。如果是一个耗时且可能阻塞的任务比如通过I2C总线读取外部传感器的数据就不能直接在中断里做应该放到工作队列。STM32这类MCU的中断编程同样有讲究。面试官常问中断服务函数处理时间太长会有什么后果一是影响实时性其他同优先级或低优先级中断得不到响应二是可能造成数据丢失比如UART接收中断来不及读取数据寄存器后续数据覆盖旧数据。所以MCU编程里也有中断只设置标志位主循环处理数据的实践。4. 硬件接口与嵌入式操作系统串口、I2C/SPI与Linux驱动4.1 串口与常见总线协议面试官怎么追问硬件接口知识是嵌入式工程师的底盘面试官一般会挑你最熟悉的接口从浅到深问。我把常见的几个接口的核心追问点整理一下。串口UART是最基础也最常考的接口。基础问题是UART通信的帧格式包括起始位、数据位、校验位、停止位、波特率。进阶问题是波特率误差怎么算比如STM32的USART波特率由时钟源和USARTDIV寄存器决定如果选择的时钟频率不能整除目标波特率会产生误差误差超过3%~4%通信就可能不稳定。更实战的问题是串口接收一帧不定长数据怎么办这考察的是你的工程经验答案通常是用空闲中断接收中断或轮询超时判断配合环形缓冲区。I2C重点是它的两种线SCL时钟线、SDA数据线、开漏结构、上拉电阻、7位/10位地址、读写时序起始条件、停止条件、ACK机制。面试官爱问I2C为什么需要上拉电阻——因为I2C设备是开漏输出只能拉低不能主动拉高所以必须靠上拉电阻把电平拉高。另一个高频追问是I2C和SPI的区别你要能对比出I2C两线制、速度慢标准模式100Kbps快速模式400Kbps、支持多设备多主机、有应答机制、有地址概念SPI四线制SCK、MOSI、MISO、CS、速度快几十MHz、无应答、靠片选信号选设备、全双工。选型逻辑很重要I2C适合连接低速外设、引脚紧张的场景SPI适合高速数据采集比如Flash读写、SD卡、显示屏。SPI还有一个高频考点是四种工作模式CPOL和CPHA组合实际调试时如果屏幕或Flash不出数据第一件事就要排查时钟极性和相位是否匹配。CAN总线在汽车电子和工业控制里是标配。面试常问CAN总线为什么是差分信号答案是为了抗共模干扰CAN_H和CAN_L的差值决定显性/隐性电平。也会问到CAN的数据帧格式帧起始、仲裁段、控制段、数据段、CRC、ACK、帧结束、位填充机制、多主机仲裁机制ID值越小优先级越高。ADC和DAC也是常见考点。面试官常问ADC采样频率和信号频率之间要满足什么关系这是奈奎斯特采样定理采样频率必须大于信号最高频率的两倍。4.2 嵌入式Linux驱动开发的高频考点嵌入式Linux方向如果面试到驱动开发基本会围绕字符设备驱动框架展开。最简单的字符设备驱动需要一个file_operations结构体实现open、read、write、release等接口然后通过register_chrdev或cdev_add注册到内核。面试官可能会让手写成千上万的框架代码但更重要的是理解设备号的概念主设备号次设备号、设备文件/dev下与驱动的对应关系。接下来大概率会问platform总线驱动模型。platform总线是Linux内核为了方便管理那些不在标准总线上的设备而引入的虚拟总线。它把设备和驱动分开匹配匹配方式有设备树、ACPI高级配置与电源管理接口、platform ID表等。匹配成功后probe函数被调用驱动在这里完成资源的申请和初始化。理解platform总线的关键是理解驱动与设备分离的设计哲学这样同一份驱动代码可以支持多个同类型硬件只需要改设备树描述即可。设备树Device Tree是嵌入式Linux面试的另一个重头戏。你可以把设备树理解成硬件配置的数据库内核通过它知道板子上有哪些外设、寄存器地址、中断号。面试官常问设备树为什么要存在而不是直接在驱动里写死硬件信息。答案是为了支持多平台通用内核内核镜像不绑定具体板卡启动时解析设备树来适配不同的硬件配置。就像一台电脑装系统时读取BIOS里的硬件信息一样。设备树中常用的几样东西要会看compatible属性用于匹配驱动、reg属性寄存器地址和大小、interrupts属性中断号和触发方式、status属性设备使能状态。如果有实际移植经验还要能说明GPIO和中断号对应的dts设备树源文件节点怎么写。4.3 从源码到移植内核、Uboot与启动流程面试官如果问板子上电到运行到main函数经历了什么这是一个非常大的综合题。以常见的嵌入式Linux系统为例上电后先执行固化在ROM里的BootROM代码初始化时钟和内存控制器然后加载U-BootU-Boot是Bootloader负责初始化DDR、串口、Flash等外设读取内核镜像和设备树到内存设置启动参数跳转到内核内核启动后先完成架构相关的初始化setup_arch、初始化内存管理、注册中断、初始化驱动模型然后挂载根文件系统最后启动第一个用户进程init也就是PID 1。如果只做MCU裸机开发这个问题的版本就是STM32上电后怎么运行的从Flash的0x08000000地址开始首先加载向量表取出栈顶地址给MSP主堆栈指针取出复位向量地址给PC跳到Reset_Handler先复制数据段、清零BSS段然后调用SystemInit配置时钟最后跳转到main函数。移植工作也是嵌入式Linux面试的高频话题。你至少要知道整个移植链条交叉编译工具链如arm-linux-gnueabihf-gcc负责在PC上编译出ARM架构的可执行文件U-Boot要针对具体板卡配置包括源码、头文件、设备树内核要配置和裁剪make menuconfig、选择架构和平台make ARCHarm、编译设备树make dtbs根文件系统可以用BusyBox构建最小系统包含init进程和常用命令。面试中还有一个常问的坑题x86的编译产物能不能直接在ARM板子上运行答案是不能因为指令集架构不同必须用交叉编译器重新编译。这也是嵌入式开发和普通软件开发最重要的区别之一。5. 项目经验与技术栈呈现如何从做过讲到做好了5.1 一句话讲清项目定位面试中项目介绍几乎是决定你能否通过的关键环节但很多候选人在这块栽了跟头。最常见的毛病是把项目经历念成流水账——我做了个温湿度监测系统用DHT11传感器采集数据通过LCD显示超过阈值就报警。这种介绍最大的问题是没有重点、没有量化、没有个人贡献。项目介绍应该遵循一句话定位系统架构图个人职责难点与解决。一句话定位要回答这个产品是做什么的、解决什么痛点。比如这是一个用于数据中心机房的温湿度环境监控系统可以实时采集30个节点的温湿度数据在异常时通过短信报警整体方案比传统方案成本降低了40%左右。接下去用系统架构图展示数据流向传感器节点→主控MCU→通信模块→云平台→客户端。然后明确说出你负责的部分你写了哪些驱动、设计了什么协议、解决了什么问题。最后也是最重要的是难点与解决这部分最能体现技术深度。我以基于STM32F4的FFT频谱分析系统这个项目举个例子。你要讲清楚五个层次为什么做这个项目比如音频信号处理的入门实践、系统架构是什么STM32F4采集ADC数据-进行FFT运算-LCD显示频谱、个人承担什么角色硬件事先准备好了主要做软件、核心难点是什么FFT的点数与内存冲突怎么解决、如何在MCU上优化FFT速度、结果量化64点FFT一次运算耗时多少毫秒、频率分辨率达到多少Hz。这个讲法比用STM32做了个频谱分析仪高下立判。5.2 量化指标与数据思维资深面试官眼里做好和做了的区别很大程度体现在量化上。你最好在准备项目介绍时把每个关键环节都配上数字。比如你做了一个串口协议解析模块可以量化成支持12种命令帧可同时缓存4路数据在115200波特率下连续接收500帧无丢包。你优化了一个图像采集流程可以说将关键路径耗时从280ms降到95ms通过引入DMA双缓冲机制实现采集与处理并行。如果你的项目还没有经过严谨测量建议面试前补测一些关键指标。比如用逻辑分析仪抓一下I2C通信的时序和速率用示波器量一下GPIO翻转频率用串口打印统计任务调度周期抖动。这些数据不需要多好看但能证明你是那个真的动手调过板子的人而不是只看了别人博客就写进简历。这里有一点经验分享面试时的项目真实性校验会以两种形式出现。一种是快速追问法——面试官突然问你你的DMA buffer设了多大为什么设这么大如果你没真正做过很难临场编出合理的数字。另一种是深挖法——让你画出关键模块的流程图或时序图、说明某个bug的排查过程。所以项目复盘时别只刷正确结论要把当时的调试过程、踩坑、翻车经历一并回忆。5.3 手撕代码的常见雷区嵌入式面试的手撕代码环节和互联网大厂算法题风格不太一样通常更偏工程化、偏底层。常见题目包括字符串相关操作、链表反转或删除节点、内存拷贝函数实现、位操作类题目、环形缓冲区实现、状态机实现。这里我要提醒几个嵌入式特有的雷区。第一轻视边界检查。比如手写memcpy或strcpy时忘了处理源地址和目的地址重叠的情况。正确的做法是先判断内存重叠必要时从后往前拷贝。这个细节在嵌入式应用里很常见比如把上层协议栈的数据搬到更低的缓冲区时很可能出现重叠。第二忽略指针合法性。很多初学者写的链表删除函数不考虑传入的head是否为NULL也不考虑要删除的节点是否真的在链表里。嵌入式代码跑在工业现场稳定性第一防御性编程是必须的。第三不重视时间复杂度和资源开销的权衡。嵌入式场景下空间换时间、时间换空间都有实际意义。比如查表法用空间换时间在嵌入式里非常常见FFT用查表方式预计算旋转因子就是典型例子。如果面试官让你实现一个功能你抛出O(n^2)的算法而你的MCU是主频72MHz的Cortex-M3面试官可能会让你重新思考。第四手写代码没考虑编译优化带来的影响。比如上一节提到的volatile问题如果你手写一个软件消抖函数时对GPIO寄存器指针没加volatile编译器可能把循环变成死循环。这类看起来对了但跑起来是错的代码最能暴露工程经验的不足。我建议面试前以手写三块代码为底线目标一是实现一个带互斥保护的环形缓冲区这个代码量不大但涵盖指针、内存操作、临界区保护性价比极高二是用状态机实现一个简单的按键扫描程序体现MCU编程思维三是实现一个带校验和与转义处理的串口数据帧解析器体现协议设计和防御性编程意识。6. 高频真题速答与避坑备忘6.1 值得反复练习的经典真题这里我按出现频率整理一份嵌入式面试的高频题速查表你在准备时可以逐条自查看能否不看资料当场讲清楚模块高频问题核心回答要点C语言sizeof和strlen的区别sizeof是编译期运算符strlen是运行期函数sizeof计算总内存大小、包含\\0strlen直到遇到\\0C语言结构体字节对齐规则每个成员按自身对齐模数对齐结构体总大小按最大对齐模数对齐内存栈和堆的区别栈由编译器管理、连续分配、容量小堆由程序员管理、容易碎片化中断中断服务函数为什么不能调用printfprintf耗时、不可重入、可能阻塞会导致中断阻塞过长RTOS信号量和互斥量的区别互斥量有所有权、支持优先级继承信号量无所有权、用于计数同步RTOS什么是优先级翻转高优先级任务被低优先级任务间接阻塞可用优先级继承解决驱动字符设备驱动注册流程分配设备号→cdev_init→cdev_add→创建设备节点或自动创建类设备树compatible属性有什么用用于设备与驱动的匹配驱动通过of_match_table声明支持的compatible总线I2C和SPI有什么区别引脚数、速率、地址机制、应答机制、全双工/半双工差异总线CAN为什么用差分信号抗共模干扰两根线的差分电压决定显性/隐性电平这个表格只是自测清单更重要的是每一个问题你都能被追问两层。比如表中栈和堆的区别面试官如果接着问在嵌入式裸机环境下栈溢出会发生什么、如何检测栈溢出你要能答出来内核有MPU内存保护单元等机制、RTOS里可以用高水位标记方式检查栈使用峰值。6.2 面试现场的几个实用建议技术面不仅考技术也在考沟通方式和思维方式有几点是我面试别人和被人面试后切身体会到的值得单独拿出来说。第一不会的题目不要硬编。嵌入式方向的知识面太广遇到不懂的问题非常正常。比较好的应对方式是先坦诚说这块我在实际项目中接触不多然后讲讲你的初步理解和排查思路最后表示面试后我会去补一下。这种姿态比编造答案好得多。有经验的面试官几乎都能听出编和不会但态度诚恳的区别。第二被问到项目细节时主动引导到你最有把握的领域。比如面试官问到你不太熟的操作系统调度算法你可以说调度算法这块我理论了解有限但在我的项目里实际处理过类似问题当时是任务B阻塞了任务A的执行我通过调整优先级和改用互斥量解决了……这种引导能展现你的解决思路也能把面试节奏带到你熟悉的领域。第三动手题手撕代码或现场配置先把思路讲清楚再动手。面试官让你写环形缓冲区时先花半分钟说我计划用读写索引和计数字段缓冲区空和满的状态分别处理加锁的粒度我会控制在临界区尽可能短然后再写代码。这会让面试官看到你的工程设计思维而不仅仅是机械地写代码。第四诚恳对待自己挖的坑。如果你在写代码时发现了一个边界情况没处理不要装作没看到应该主动提出来这里还需要处理一个特殊场景。这种诚实和细致恰恰是嵌入式开发最需要的品质因为嵌入式系统的bug藏在角角落落用户不会遇到但车规、工规场景随时可能崩。6.3 长期主义者面试后的持续积累方向面试不是终点而是暴露知识盲区的机会。每次面试结束后我建议你立刻记录下面试中被问住的问题然后花一个周末时间把相关内容彻底搞清楚。从长期成长的角度嵌入式工程师如果你想持续提升竞争力我特别推荐三个方向作为后续学习路线参考第一个是深入某一类工业总线或通信协议。不管是CAN、Modbus、EtherCAT还是MQTT把协议栈源码完整读懂并移植到自己的板子上跑通收获是巨大的。面试时如果你能讲清楚怎么把SNMP协议栈移植到嵌入式平台上怎么裁剪协议栈里的无用模块绝对是加分项。第二个是掌握RTOS的原理和实现。不要只停留在会调用API而是尝试阅读FreeRTOS源码弄懂任务调度的核心机制就绪表怎么用位图查最快任务、tick中断如何处理时间片轮转、消息队列是怎么用环形缓冲区实现的。如果你能完整讲清楚FreeRTOS的任务切换流程在这个领域你已经超过90%的候选人了。第三个是折腾一块Linux开发板。不用太高的配置A7/A53内核的板子就够。从交叉编译环境搭建、U-Boot编译、内核裁剪、设备树编写、根文件系统制作到驱动模块编写完整走一遍。这个过程的工程量和踩坑量都很大但它是嵌入式Linux岗位面试信心的来源。说回面试这件事本身——我在实际参与面试和被人面试的过程中最深的体会是嵌入式这个行业装是装不来的。项目是不是自己做的、问题是不是真的遇到过几个追问就能露馅。所以与其到处找面试秘籍不如踏踏实实把一块板子玩透把一个项目从原理图看到最终量产问题把一个bug从头到尾调明白。有了这个底子面试对你来说只是聊天。希望这份总结能帮你少走一些弯路。