
从过完年到现在我前前后后面了大概七八家做嵌入式的公司从消费电子到工业控制都有Offer拿了两三个也踩了不少坑。这篇文章算是我对自己这段时间面试经历的一次梳理把那些反复被问到、或者说真正能拉开差距的知识点整理出来。如果你想投嵌入式软件工程师、嵌入式Linux开发这类岗位这篇文章应该能帮你省不少事。我尽量不讲废话全部是实打实会考、会问的东西。1. 面试前的技术栈梳理1.1 嵌入式这个方向到底在考什么先说一个很多人容易搞错的事情嵌入式面试不像后端那样狂刷LeetCode也不像前端那样抠框架源码它考的是底层功底 项目实战 调试能力这三件事。你可以不会Redux但你必须知道寄存器是怎么映射的你可以不背HashMap源码但你必须说清楚中断上下文和进程上下文的区别。从我这几个月的面试经验来看面试官的考察路径基本是固定的先问C语言基础确认你有扎实的编码功底然后问操作系统和Linux确认你能处理多任务和资源管理接着问ARM体系结构和硬件接口确认你写的代码是真能跑在板子上的最后拿着你的项目往死里深挖看你是真做过还是背了别人的项目。这是一条完整的链路缺一环都会被问穿。还有一个很多人忽略的点嵌入式面试非常看重调试思维。面试官经常会抛出一个现象比如板子启动后串口没有输出然后让你现场分析可能的原因。这种题没有标准答案考的就是你遇到问题时的排查思路。1.2 面试之前怎么快速摸底我强烈建议你在投简历之前先对着下面这份清单自查一遍每项都能说出个一二三再去面试C语言指针、结构体、内存管理、链表、回调函数能不能手写操作系统进程线程区别、调度算法、同步互斥、死锁条件能不能讲透Linux常用命令、Makefile、交叉编译、驱动开发流程、设备树有没有实际用过硬件GPIO、UART、SPI、I2C、PWM、ADC原理和时序能不能画出来ARMCortex-M和Cortex-A的区别、启动流程、中断控制器、存储器映射心里有没有数项目你写在简历上的每个项目从总体架构到关键函数实现能不能经得起连珠炮式的追问如果你现在看到这份清单觉得心虚那我建议先花一到两周针对性补一补。面试不需要你每个方向都是专家但基础方向绝对不能有明显的短板。2. 嵌入式C语言与底层原理考点2.1 指针和内存是永远绕不开的坎C语言是嵌入式的母语而指针和内存管理是C语言里最让面试官上头的两个话题。我统计了一下几乎每场面试都有const关键字修饰指针有几种写法这种送分题但真正能完整答出来的人不多。const int *p; // p指向的内容不可变p本身可变 int * const p; // p本身不可变指向的内容可变 const int * const p; // 内容和指针都不可变这个题目看着简单但如果你能主动延伸到嵌入式里const变量放在哪个段为什么const变量能节省RAM这种层次面试官对你的印象会立刻不一样。const修饰的变量通常存放在只读数据段.rodata在MCU上往往被链接到Flash地址空间所以它不占用宝贵的RAM这是嵌入式里一个很实用的优化点。内存管理也是最容易被追问的话题。堆和栈的区别是基础但面试官真正想听的是你知不知道嵌入式里栈溢出怎么排查、堆碎片怎么避免、动态分配在MCU上为什么是禁忌。我在面试中被问到一个嵌入式系统里能不能用malloc答案是能用但尽量不要用原因有三个第一MCU的堆通常很小分配大块内存容易失败第二频繁分配释放会产生碎片时间长了系统就废了第三malloc不是确定性的实时性要求高的场景根本不敢用。替代方案是静态分配、内存池、环形缓冲区。2.2 位操作和字节序是嵌入式基本功嵌入式开发天天和寄存器打交道位操作可以说是家常便饭。面试中常见的一个题目是用宏定义实现将一个32位整数的第n位置1、清0、翻转这个必须写得又快又对。#define SET_BIT(x, n) ((x) | (1U (n))) #define CLEAR_BIT(x, n) ((x) ~(1U (n))) #define TOGGLE_BIT(x, n) ((x) ^ (1U (n)))追问环节经常是字节序大小端。我在一次面试中就被问过你写一个函数判断当前系统是大端还是小端而且要求用两种方式实现。第一种是用指针强制转换判断第二种是用联合体union判断因为union的所有成员共享同一块内存起始地址。int is_little_endian(void) { union { int i; char c; } u; u.i 1; return u.c 1; }更深一层的问题是大小端转换怎么做嵌入式中经常需要把收到的网络字节序数据转换为主机字节序面试官希望听到的是你懂得用htons、ntohl这类函数或者自己做移位转换的原理。我当时是这么答的如果要手动实现核心思路就是通过移位把字节重新排列比如把一个32位数从小端转大端可以((x 0xFF) 24) | ((x 0xFF00) 8) | ((x 8) 0xFF00) | ((x 24) 0xFF)。这个题答出来基本就是加分项。2.3 结构体对齐与volatile的妙用结构体字节对齐这个知识点我几乎每次面试都被问到而且每次都有人在这里翻车。核心规则其实就几条结构体每个成员的偏移量必须是其自身大小的整数倍结构体的总大小必须是最大成员大小的整数倍可以通过#pragma pack或__attribute__((packed))改变对齐方式。struct example { char a; // 偏移0 int b; // 偏移4 short c; // 偏移8 }; // 总大小12如果面试官问你为什么编译器要对齐你要答到点子上因为CPU访问对齐数据是一次总线周期不对齐的数据可能需要两次访问牺牲空间换时间。而在嵌入式里如果结构体要通过网络传输或者写入Flash就必须用__attribute__((packed))取消对齐否则不同编译器下结构体大小不一致数据解析就会出错。再说volatile这个关键字在嵌入式面试中出现的频率高得吓人。面试官一般会问volatile的作用是什么标准答案是告诉编译器不要对被修饰的变量做优化每次都必须从内存地址重新读取。然后他会追问三个典型场景硬件寄存器映射比如读取状态寄存器、中断服务程序和主循环共享的全局变量、多线程环境下的共享标志。最后一个场景要小心volatile只能保证读取的即时性不能保证原子性真正的线程安全还得靠锁或原子操作。我面试的时候主动补了这句话明显看到面试官眼神亮了一下。3. 操作系统与Linux核心知识3.1 进程、线程和调度策略现在的嵌入式设备几乎没有裸机跑的RTOS或者Linux是标配。所以操作系统相关的问题你绕不开尤其是进程线程的区别、任务调度、同步机制这些。进程是资源分配的最小单位线程是CPU调度的最小单位同一个进程内的线程共享地址空间和资源但进程之间是隔离的。嵌入式Linux里fork、vfork、clone的区别也是高频题。调度策略这里面试官喜欢问实时操作系统和Linux普通进程的调度差异。RTOS常见的调度算法有优先级抢占式调度和时间片轮转调度核心是保证高优先级任务能在确定时间内得到响应。比如FreeRTOS里优先级数字越大优先级越高同优先级任务按时间片轮转而Linux的CFS完全公平调度器是基于虚拟运行时间来的它追求的是公平性不是实时性。如果你做的是Linux实时应用就得了解PREEMPT_RT补丁或者使用实时调度策略SCHED_FIFO、SCHED_RR。面试中还经常有个连环问什么是优先级反转怎么解决这个必须好好准备因为它是嵌入式面试的经典题。优先级反转就是高优先级任务被低优先级任务阻塞而中优先级任务又抢占了低优先级任务的CPU导致高优先级任务迟迟得不到执行。经典案例是火星探路者任务就是优先权反转导致系统不断重置。解决办法有三个级别优先级继承、优先级天花板还有禁止中断或者使用互斥量而不是信号量。回答的时候能把火星探路者的案例讲出来基本就能镇住场面。3.2 同步互斥的机制对比互斥量Mutex和信号量Semaphore的区别也是面试官很喜欢的一个点。我遇到过一个相当有水平的问法一个二值信号量和一个互斥量你怎么选如果你只知道二值信号量是0和1互斥量也是0和1那这道题就废了。要答出以下几个关键区别互斥量有所有权概念谁上锁谁解锁而信号量没有互斥量支持优先级继承能解决优先级反转二值信号量不行互斥量通常用于互斥访问共享资源信号量更常用于任务同步和事件通知。从使用场景上说如果只是任务的同步通知信号量更轻量合适如果是保护临界区资源互斥量更加安全。死锁也是必考题四个必要条件——互斥、持有并等待、不可剥夺、循环等待——要背得滚瓜烂熟。而且面试官一定会问你怎么避免死锁你要能说出来破坏互斥条件不太现实、破坏持有并等待一次性申请所有资源、破坏不可剥夺申请不到就释放自己已有的、破坏循环等待给资源编号按序申请。我在项目里最常用的是锁的顺序必须全局一致这个原则在所有代码里规定如果同时需要两个互斥量必须先锁A再锁B从根源上消除循环等待的可能。3.3 Linux驱动开发的入门问题嵌入式Linux方向的岗位驱动开发是重头戏。面试官一般不会一上来就问你复杂的驱动怎么写而是从字符设备驱动的基本框架开始让你说说open、read、write、ioctl这些系统调用在内核里是怎么被路由到驱动函数的。这里面的核心就是struct file_operations结构体以及主设备号和次设备号的概念。设备树Device Tree现在已经是ARM Linux的标配了面试官十有八九会问设备树的作用是什么。你要回答设备树是一种描述硬件资源的数据结构它把硬件的寄存器地址、中断号、时钟频率等信息从内核源码中解耦出来使得同一个内核镜像可以支持多种不同的硬件平台。追问通常是你写过设备树节点吗如果你能现场写出一个简单的GPIO按键节点包括compatible属性、reg属性、interrupts属性那这道题就稳了。中断下半部机制也是Linux驱动的高频考点包括软中断、tasklet、工作队列这三种机制的区别。软中断运行在中断上下文不能睡眠tasklet基于软中断实现同一时刻一个tasklet只能在一个CPU上执行工作队列运行在进程上下文可以睡眠适合做耗时操作。在面试中我习惯用一句话总结中断上半部处理紧急的硬件操作下半部处理耗时的数据逻辑具体用哪个取决于你能不能睡觉睡眠。4. 硬件基础与通信协议4.1 常见通信接口你分得清吗嵌入式的本质是软硬结合所以面试一定会考察你对常用通信接口的掌握程度。最常问的是UART、SPI、I2C这三兄弟的区别。我从原理和面试话术两方面给你总结一下UART是异步串行通信全双工靠起始位和停止位同步通常就三根线——TX、RX、GNDSPI是同步串行通信全双工四根线——SCLK、MOSI、MISO、CS速度比UART快很多适合高速外设比如Flash芯片和屏幕驱动I2C是半双工两根线——SCL、SDA通过设备地址寻址支持多主机和总线仲裁适合接传感器这类低速设备。面试官特别喜欢问I2C和SPI怎么选。你要从速率、引脚数量、设备数量、全双工还是半双工、有无地址概念这几个维度去回答。比如你的板上要挂8个温湿度传感器每个传感器只需要几KB/s的速率那I2C更合适因为两根线就够了而且每个设备有自己的地址如果只有一个SPI Flash要高速读写那肯定选SPI速率高且是全双工。还有一个高频题是串口通信中波特率是什么波特率误差会导致什么问题。波特率就是每秒传输的码元数比如9600、115200。收发双方的波特率必须一致否则采样点会逐步偏移时间长了必然出现乱码或者数据错位。实际工程中晶振精度、分频误差都会导致实际波特率和理论值有偏差一般偏差在2%以内问题不大超过就可能出问题。我遇到过一个特别坑的情况板子上的晶振是12MHz给UART分频到115200会有一个不小的误差导致跑长了就开始乱码最后换了时钟频率才解决。4.2 中断处理与实时性分析中断系统的理解深度直接决定面试官把你归为会用MCU还是懂MCU。中断的流程是外设产生中断事件 - 中断控制器仲裁 - CPU保存现场 - 跳转到中断服务函数 - 清中断标志位 - 恢复现场并返回。面试官喜欢让你画出这个流程图然后追问为什么ISR里不能做耗时操作。答案核心是中断会打断当前正在执行的任务如果ISR执行时间太长其他中断就得不到及时响应实时性就无法保证。所以正确做法是ISR里只做最紧急的事比如读取数据到缓冲区、设置标志位耗时逻辑放到主循环或者任务里处理。FreeRTOS里还专门有从ISR安全调用的API版本比如xQueueSendFromISR因为普通版本的API可能导致任务阻塞而中断上下文里不能阻塞。嵌套中断也是一个进阶考点。Cortex-M3/M4内核的NVIC支持中断嵌套高优先级中断可以打断低优先级中断。但实际项目里嵌套深度要控制因为每次嵌套都要压栈更多的寄存器栈空间消耗大而且嵌套太深容易导致栈溢出。我一般建议裸机开发里减少中断嵌套尽量用关中断标志位的方式保护临界区。4.3 ARM体系结构与启动流程ARM相关的题目在嵌入式面试里分量不小。至少你要区分Cortex-M和Cortex-A两个系列M系列是单片机微控制器没有MMU跑的是裸机或者RTOS中断响应快是STM32这类芯片的内核A系列是应用处理器有MMU可以跑完整的Linux是树莓派、手机SoC的内核。启动流程也经常会问。STM32的启动过程大致是从Flash取向量表初始化SP和PC执行SystemInit时钟初始化然后跳到main函数。如果做的是Linux系统启动过程则是BootROM - BootloaderU-Boot- 内核 - 挂载根文件系统 - 用户进程。面试中能把两级启动都讲清楚的人不多你如果都能说会很加分。存储器的层次结构也值得准备从寄存器、Cache、SRAM、SDRAM到Flash速度递减、容量递增、价格递减。面试官可能会问Cache的作用是什么其实它就是为了填补CPU和主存之间的速度差距把经常访问的数据放到更快的存储器里。嵌入式里还有个经典优化思路是Cache一致性问题DMA和CPU共享数据时要注意Cache和内存里数据不一致需要做Cache刷新或者Invalidate操作。能答到这一层说明你是有实战经验的。5. 项目经验的复盘与表达5.1 怎么把项目讲出含金量简历上写了项目面试官就一定会深挖。我见过太多人项目写了一大堆基于XX的XX系统结果一被问就露馅。讲项目不是背流水账而是要有结构、有细节、有深度。我建议大家按照下面这个框架来准备每个项目一句话背景这个项目解决什么问题面向什么场景硬件选型为什么选这块板子、这个芯片资源够不够系统架构分几个模块任务怎么划分数据怎么流动核心难点你遇到的最大问题是什么怎么定位和解决的性能指标实时性、功耗、稳定性这些有数据支撑吗比如我自己做过的一个STM32F4的音视频频谱分析系统如果只是说用ADC采样然后做FFT然后显示那跟没说一样。我会准备到这一层ADC采样率是多少采样点数是多少FFT做了多久用的是什么库还是自己写的基2算法结果怎么映射到LCD屏幕上采样和显示之间用什么同步机制。面试官要验证的是你是否有真正的工程思维而不只是会用DSP库调用。5.2 引导面试官去问你擅长的方向讲项目时有个小技巧就是主动埋点引导面试官问你想展示的内容。比如我在讲项目的时候会顺带提一句当时IMU的数据老是有毛刺后来我在中断里加了均值滤波在应用层加了滑动窗口滤波才把数据平滑下来。这句话其实埋了两个钩子一个是你用过中断另一个是你懂滤波算法。面试官顺着问任何一个你都能展开讲占住节奏。但是埋点有个原则一定要真实。你埋的每个点都必须是你真研究过的不然面试官追问个两三轮你就崩了。宁可说自己没做过也不要硬编。我见过太多人在项目细节上吹牛然后被问穿场面非常尴尬而且基本就宣告这场面试结束了。5.3 开源项目参与经历的价值现在的嵌入式面试越来越看重求职者有没有接触过开源项目。热词里也提到了一些嵌入式开源项目这确实是简历上的加分项。面试官的逻辑很简单如果你能读懂别人的开源代码甚至提过PR说明你有独立学习的能力和代码阅读能力。我建议大家可以挑一两个知名度高、代码量适中的开源项目来读比如RTOS内核FreeRTOS、RT-Thread、嵌入式GUI框架AWTK、LVGL、通信协议栈lwIP、Snmp的嵌入式移植。读源码不是从头到尾一行一行看而是带着问题去看比如FreeRTOS的任务切换是怎么实现的找到源码里vTaskSwitchContext对应的位置分析一下PendSV异常处理流程再对比网上别人画的流程图。这种经历在面试中聊起来比你说看过某某教程要有说服力得多。6. 笔试与手写代码高频题型6.1 手写链表一定要过关嵌入式笔试里链表的出现频率高得离谱尤其是单链表的反转、查找倒数第K个节点、判断是否有环这三道题。下面我把单链表反转的迭代写法和递归写法都写出来你们直接背下来也行但最好能理解// 迭代法 struct ListNode* reverseList(struct ListNode* head) { struct ListNode *prev NULL, *curr head, *next NULL; while (curr ! NULL) { next curr-next; curr-next prev; prev curr; curr next; } return prev; }递归版写法更简洁但不太好想struct ListNode* reverseListRecursive(struct ListNode* head) { if (head NULL || head-next NULL) { return head; } struct ListNode* newHead reverseListRecursive(head-next); head-next-next head; head-next NULL; return newHead; }注意笔试时除了写出代码建议顺手把时间和空间复杂度写上。反转操作时间复杂度O(n)空间复杂度O(1)递归版空间复杂度是O(n)因为递归调用栈。有些公司要求你直接在纸上写递归版就是为了看你能不能注意到这个点。6.2 字符串和内存操作函数要能自己实现嵌入式笔试很少让你直接调库函数经常要求你手动实现strcpy、strcmp、memcpy这一类函数。市面上有大量参考实现但我想提醒一个细节memcpy不允许处理内存重叠如果要处理重叠区域就得用memmove。这两个函数很多初学者会搞混但面试官往往就喜欢在这里设陷阱。void *my_memcpy(void *dest, const void *src, size_t n) { unsigned char *d dest; const unsigned char *s src; while (n--) { *d *s; } return dest; }如果面试官追问如果src和dest有重叠怎么办你就应该答需要判断地址方向如果dest在src后面且范围重叠需要从后往前拷贝这正是memmove的实现思路。答到这里这个问题基本就满分了。另一个高频题是实现一个循环缓冲区。这太像嵌入式工作里的真实需求了串口接收、音频数据流都会用到而且能考察你对取模运算、读写指针、空满判断的理解。建议自己提前写一遍typedef struct { uint8_t *buffer; uint32_t size; uint32_t head; uint32_t tail; } ring_buf_t;空的判断条件是head tail满的判断条件有几种实现方式最简单的是保留一个空位即(tail 1) % size head。如果你能在讲代码的时候说明为什么要留一个空位面试官会非常满意因为这说明你清楚边界条件的坑。6.3 嵌入式笔试的调试题除了手写代码很多公司还会出一些找bug或者分析输出的题目。典型的一种是考察sizeof运算符和strlen的区别这个太经典了却总有人错。另一个常见的是考察静态变量的生命周期比如int func(void) { static int count 0; count; return count; }然后问你连续调用三次的输出是多少。答案是1、2、3因为static变量的初始化只执行一次它存放在数据段生命周期是整个程序运行期间。如果你能主动解释这个变量的存储位置在.bss或.data段而不是栈上那就能比同龄人多展示一点底层知识。还有一种笔试是给你一段中断处理代码让你指出问题。比如下面这种int flag 0; void ISR(void) { flag 1; printf(interrupt\n); } int main(void) { while(1) { if (flag) { flag 0; /* 处理逻辑 */ } } }问题很明显printf在ISR里执行耗时且不可重入flag没有加volatile主循环可能永远看不到变化主循环和ISR共享的变量需要用volatile修饰保证内存可见性。能找出这三个点笔试这道题基本就稳了。7. 高频场景题与排查思路7.1 板子不干活你怎么查面试官非常喜欢从一个故障现象切入考察你的实战排查能力。我被问到最多的一个场景是板子上电后程序不运行串口没有打印你怎么排查这道题没有标准答案但你的回答要有逻辑层次。我是这么答的先量电源确认各路电压是否正常核心电压、IO电压有没有短路或跌落然后确认时钟是否起振用示波器量晶振引脚确认时钟频率对不对接着检查复位电路复位引脚是不是一直处于复位状态再看启动模式配置引脚STM32的BOOT0和BOOT1是不是设置正确最后考虑程序本身有没有跑飞用调试器连上看看PC指针跑到了哪里或者检查看门狗是不是一直在复位芯片。从电源到时钟到复位到启动模式到程序这个排查顺序是通用的。追问一般是如果程序跑飞了怎么定位。你可以说使用硬件调试器J-Link、ST-Link在线调试设置断点或HardFault中断查看栈回溯来定位最后一次函数调用链检查是否是数组越界、野指针或者栈溢出导致的异常。在工程上我习惯在HardFault_Handler里把几个关键寄存器PC、LR、PSP/MSP的值存下来用调试器查看这样能直接定位到出错的汇编语句和对应的C代码行。7.2 数据错乱和通信不稳定怎么处理串口数据乱码是另一个常见的面试场景题。这道题我总结了一整套排查清单你按顺序答面试官基本挑不出毛病波特率是否匹配这个最先查通信双方的参考地是否连接GND没接好导致共模电压不对这种现象很隐蔽线的质量杜邦线太长或接触不良干扰问题特别是电机、继电器这类大电流设备启动时会不会干扰通信代码逻辑问题比如接收中断丢数据、环形缓冲区满了、溢出标志没清除。I2C通信偶尔失败也经常被拿出来问。常见的坑包括上拉电阻阻值不合适导致上升沿太慢总线上设备地址冲突总线处于死锁状态SDA被某个设备拉低不放。第三个问题很有意思有一种情况是某个设备异常后一直抢占总线可以把SCL翻转九次让总线释放这是I2C协议的标准处理手段面试时能说出这个细节说明你真调过I2C。7.3 Flash和看门狗相关的老坑Flash写入失败、擦除超时这些问题在实际项目里经常遇到面试时也可能作为场景题出现。Flash操作的核心注意点有几个写Flash之前必须先擦除而且擦除以扇区/块为单位不像写操作可以按字节Flash擦写次数有限制通常是十万次级别频繁擦写同一块区域会导致损坏擦写过程中不能断电否则Flash可能进入不可预测状态如果项目里用Flash存参数建议使用磨损均衡和双备份设计双备份的意思是写坏一块还有另一块能顶上。看门狗Watchdog也是一大考点面试官喜欢问喂狗为什么不能放在中断里。答案很典型如果喂狗在中断里即使主流程卡死了中断还能正常触发看门狗就永远不会被触发失去保护作用。正确做法是喂狗放在主循环里而且最好配合一个任务调度监视比如检测到一个关键任务超过多久没执行就故意不喂狗让系统复位。这个思路叫结构化喂狗比单纯在主循环里清狗计数器高级多了面试官会喜欢。8. 面试复盘与求职建议8.1 几个对我帮助很大的准备方法回顾这段时间的面试我觉得有几件事是做了之后见效特别明显的。第一是整理自己的八股文笔记不是从网上抄而是每道题先自己答一遍再去翻参考文档查漏补缺。比如volatile有什么用这道题我先写自己的理解再对比经典讲解最后补充了嵌入式里寄存器映射和中断共享变量两个例子。这样整理过的内容在面试中会形成肌肉记忆回答起来自然流畅。第二是刻意练习用项目讲知识点。面试官很少直接问你讲一下中断而是会让你结合你的项目谈谈中断的使用。如果你能顺手拈来地用自己项目里的实际场景去解释知识点比干巴巴背概念有说服力得多。我准备面试的时候每个核心知识点都准备了对应的项目案例比如讲DMA就会提到我做的AD采集里用DMA搬运数据减少CPU占用讲任务优先级的分配就提到我做的显示刷新和串口收发怎么划分。第三是多做模拟面试。找一个懂技术但不一定懂你项目的朋友让他拿着你的简历随机提问。这个过程中你会发现自己有很多以为知道但说不清楚的地方这些就是复习的重点。比一个人闷头看效率高很多。8.2 关于学习路线的建议如果你还在校或者是刚入行想走嵌入式这条路我建议分三步走先把C语言和单片机基础打牢用STM32做一两个小项目不贪多但每个项目都要吃透然后系统学习数据结构和操作系统原理推荐结合FreeRTOS源码来学看任务调度、消息队列、信号量具体是怎么实现的再往后如果你往嵌入式Linux方向走就要啃Linux应用编程和驱动开发理解进程、线程、网络编程、设备树、字符驱动这一整套东西。网上流传的各种嵌入式学习路线图我也看过很多五花八门但核心就这几板斧。需要注意的是嵌入式分支很多有偏向硬件的有偏向底层驱动的有偏向应用的也有偏向AI的。你不可能样样精通先在一个方向打出深度再横向扩展。我在面试中见过不少人是什么都会一点但什么都不精简历是很好看但面试官深挖两轮就露馅了。这个行业其实很包容你只要有某个方向能扛住三连问就有机会。8.3 关于薪资和Offer的选择嵌入式这个方向薪资不像互联网那么疯狂但目前看下来应届生和三年经验以内的岗位需求还是挺稳的尤其是汽车电子、工业控制、物联网这几个赛道。面试谈薪的时候要注意不要只看月薪要问清楚13薪还是14薪、年终奖占比、加班情况、公积金基数这些。另外也不要忽略平台的价值大公司可能薪资一般但流程规范、项目复杂、能学到东西小公司可能给得高但可能没人带全靠自己踩坑。Offer比较的时候我个人最看重的是项目方向和自己长期规划的匹配度。比如你未来想深耕Linux驱动那去一个主要用STM32做裸机开发的公司可能成长会比较慢反过来如果公司有大量的Linux和驱动业务就算起薪低一点成长空间也大得多。这个账要算长远一点。最后再分享一个很实际的技巧面试过程中如果被问住了不要直接说我不会你可以说这个我了解得不够深但我目前的理解是这样的……然后说出一个大概方向。大多数面试官不会因为你说不出完全正确的答案就直接否定你他们更看重你的思维方式和学习意愿。但前提是你真的要有一些积累连方向都说不出来就比较难了。希望大家都能拿到心仪的Offer在嵌入式这条路上越走越稳。