
上海 70迈的嵌入式线上笔试在面经圈里一直属于“看着不难做起来翻车率不低”的那一类。整场笔试并不像互联网大厂那样直接怼一堆 LeetCode 困难题而是明显带着车载硬件和消费电子的味道C 语言、单片机外设、实时性思维、Linux 基础轮着来一遍中间还穿插着几道跟项目经验强绑定的开放题。今天这篇就把我这回线上笔试的经历、题目复盘、复习路线和踩坑经验一次性整理出来给后面准备投 70迈或者同类车载嵌入式岗位的同学做个参考。先说下适合谁看。如果你准备投的是嵌入式软件工程师、嵌入式 Linux 工程师、汽车电子相关的岗位或者你正在集中刷嵌入式八股文、笔试真题那这篇对你有直接帮助。如果你刚准备转嵌入式、还没系统性学过 MCU 开发和 C 语言也可以先拿去当一份考点清单用——至少知道这个行业笔试到底在筛什么。整篇内容没有任何平台性废话全部是我自己从实际做题过程中总结出来的经验可直接抄作业。1. 笔试整体画像时长、平台、难度和考察模块1.1 70迈是家什么样的公司笔试为什么值得专门准备70迈是小米生态链里做车载智能硬件起家的公司产品线覆盖行车记录仪、智能后视镜、车载充电器、胎压监测这类东西近几年也往智能座舱和车联网的方向在走。这就决定了它招嵌入式工程师的时候不是纯招“单片机调板子的人”也不是纯招“跑 Linux 的人”而是两种能力都要沾一点还得有消费电子量产那套思维——低成本、高可靠、能过 EMC、产线好生产这些在笔试题里都能感受到。我这次投的是嵌入式软件工程师岗线上笔试用的平台是常见的在线考试系统需要开摄像头、屏幕共享整个答题过程大概 90 分钟题量不算特别大但覆盖面很广。和很多公司直接给你一个链接、随便找地方做不同70迈的笔试对考试环境要求较严格考前会反复提醒调试摄像头这一点后面我单独讲。1.2 线上笔试的基本盘时间分配和题型结构整份卷子我粗略回忆了一下大概是四块内容选择题大约 20 道覆盖 C 语言、操作系统、单片机基础、Linux 命令每题分值不高但密度大。填空题5 到 8 道重点考宏定义、结构体对齐、volatile、字节序、位操作这类经典八股。编程题2 道一道纯 C 语言算法题一道偏嵌入式场景的逻辑题。问答题2 到 3 道基本围绕项目经历、Bug 排查思路、RTOS 任务设计展开。从时间分配来看选择题和填空题最好控制在 35 到 40 分钟内完成给编程题留足至少 30 分钟最后 10 到 15 分钟用来写问答题和检查。编程题如果卡住了不要死磕先把能拿的过程分写上去再回头处理。1.3 难度定位重基础、重经验、轻偏题说实话70迈笔试的题目难度上限并不高没有那种让所有人都做不出来的压轴题。它厉害的地方在于“平均压力”几乎每道题都在考察你有没有真正写过、调过、炸过代码。比如它不会直接问你“中断是什么”而是问“一个全局变量在中断和主循环里都被修改该用什么关键字修饰为什么”——这就是典型的做过项目才答得顺手的题。下表是我整理的几个考察模块在笔试里的大致占比可以当成复习权重参考考察模块大致占比说明C 语言与内存30%指针、结构体、字节序、宏定义、内存管理单片机与嵌入式基础25%中断、GPIO、定时器、UART/SPI/I2C、看门狗RTOS / Linux 基础20%任务调度、互斥、堆栈、常用命令数据结构和算法10%链表、字符串处理、状态机项目与开放题15%项目复盘、调试思路、方案设计这是个很典型的车载嵌入式岗位分布核心就是 C 和硬件意识。如果复习时间有限优先抓前两块性价比最高。2. 硬核知识储备我考前突击的五个重点2.1 C 语言必背清单指针、内存和经典坑笔试里 C 语言部分基本不考特别偏的语法但很爱考“看起来很简单、一写就错”的题。我考前重点过了几个方向指针和数组的关系尤其是函数传参时什么时候退化成指针、sizeof 会得到什么。malloc/free 和栈上数组的区别笔试中有一道题问“在函数里返回一个局部数组名是否可行”这就是典型的栈上内存释放陷阱。宏定义的副作用典型题目就是#define SQUARE(x) x*x然后问SQUARE(a1)等于多少。函数指针和回调函数虽然难度不大但嵌入式里用得非常频繁笔试和面试都有可能问。我个人的复习经验是不要只看八股文每看到一个知识点就自己写 10 行代码去验证。比如大小端、结构体对齐这种光背结论没意义笔试题目换个壳就不会了。C 语言是真的需要动手试错才能形成肌肉记忆的。2.2 结构体对齐、大小端与位操作嵌入式笔试的“钉子户”这三样东西几乎是所有嵌入式笔试的必考题70迈也不例外。结构体对齐考察的是你懂不懂内存布局大小端考察的是你写通信协议、解析报文时会不会踩坑位操作则是寄存器开发的基本功。结构体对齐那道题大致是这样一个结构体包含 char、int、short 三个成员问在默认 4 字节对齐下占用多少字节。答案是 12不是 7因为 int 要放在 4 字节对齐的地址上char 后面会先补 3 个字节。这类题目只要画一张内存分布图就一目了然。大小端的题则是给出一个 32 位整数0x12345678问在内存低地址存放的第一个字节是什么。大端是0x12小端是0x78。如果记混写一段小程序强制转换指针类型就能验证。笔试时没环境那就只能靠理解了。位操作基本就是置位、清位、翻转、取某几位以及用宏定义实现求一个数最高位、最低位这类问题。熟悉这几个操作后笔试基本没问题#define SET_BIT(x, n) ((x) | (1U (n))) #define CLEAR_BIT(x, n) ((x) ~(1U (n))) #define TOGGLE_BIT(x, n) ((x) ^ (1U (n))) #define GET_BIT(x, n) (((x) (n)) 1U)这不仅笔试要用实际写固件也天天用。建议所有准备嵌入职位的同学把这个背得像条件反射一样熟。2.3 外设与硬件基础中断、定时器、UART、I2C、SPI70迈的笔试对外设的考察不是让你默写寄存器而是考察你是怎么“用”的。比如中断嵌套、中断里能不能调用 printf、能不能做延时这些全是负面清单因为中断服务函数要求短小快不能阻塞不能调用不可重入函数。定时器的考察点集中在 PWM 输出、输入捕获、定时中断这几个经典场景。有一道题问的是“用定时器产生一个 1kHz、占空比 50% 的 PWM定时器的时钟是 72MHz分频和重装载值怎么定”——这就是典型的 STM32 开发基本题也说明 70迈这类公司默认你会 STM32 或者同类 MCU。答案就是先分频到 1MHz然后重装载值设为 999简单算一下就能出来。UART、I2C、SPI 则更多以“协议特点对比”的形式出现比如问 I2C 有几根线、有没有地址概念、通信速率一般多少。这些属于基础知识平时调过屏、连过传感器的基本都能答上来。关键是要理解各自的典型应用场景笔试可能会结合实际项目出场景题。2.4 RTOS 和 Linux嵌入式工程师的“第二曲线”现在纯裸机开发的岗位越来越少70迈的岗位描述里明确提到了 RTOS 和 Linux 方向笔试里也出现了相关题目。RTOS 方面考了两类一类是任务调度比如“两个任务共享一个 UART怎么保证数据不交叉”答案方向是互斥锁、关中断、串口发送队列另一类是优先级翻转经典题目是“低优先级任务持有锁高优先级任务等待中等优先级任务抢先运行导致高优先级被阻塞”——这就是互斥量与信号量的区别所在面试也爱追问。Linux 部分的笔试考察比较简单主要就是常用的文件操作命令、进程和线程的区别、进程间通信方式。没有让我直接写内核模块或者驱动但为了稳妥我还是刷了一遍常见命令ps、top、grep、find、netstat、ifconfig、chmod、kill 这种。以及 vim 的基本操作笔试偶尔也会出个填空。2.5 数据结构、算法和状态机思维编程题里有一道是链表反转非常经典。另一道偏嵌入式逻辑的题是按键消抖状态机这部分光会算法不够还得有状态机建模的能力。状态机在嵌入式里太重要了按键扫描、通信协议解析、充电管理逻辑都是典型的有限状态机场景。我建议准备时把以下内容练熟链表反转迭代和递归两种、判断链表是否有环、字符串反转、括号匹配、二分查找、移除数组元素。这些都是高频题难度不高但写错边界条件就很容易丢分。状态机方面自己写一个按键消抖的代码把空闲、按下确认、按住、释放确认几个状态理清楚笔试基本就稳了。3. 典型题型拆解与解题思路复盘3.1 一道 C 语言题volatile 的典型考法笔试里有一道选择题印象很深大概意思是一个全局变量在中断服务函数里被修改主函数里循环读取判断问这个变量需不需要加什么修饰为什么。答案当然是 volatile告诉编译器不要优化掉对这个变量的访问每次都从内存重新读取。关键是后面的追问只加 volatile 够不够这在单核 MCU 上没有中断嵌套、没有 DMA 访问的情况下是够的但如果这个变量要被多个上下文频繁访问尤其是 32 位变量在 8 位 MCU 上读写分多条指令完成可能会发生读到一半被打断的问题。这时候就需要考虑临界区保护比如关中断、用原子操作。这个追问笔试不一定会写但面试官很可能会问。我给出一个高分写法volatile uint8_t g_flag 0; void ISR(void) { g_flag 1; } int main(void) { while (1) { if (g_flag) { g_flag 0; process_event(); } } }这段代码核心是volatile 只是基础真正处理共享资源还要考虑原子性和临界区。答到这一层这道题的分就抓牢了。3.2 一道嵌入式场景题按键消抖状态机编程题第二道是按键消抖。硬件上按键按下和松开都会有机械抖动时间大约 5 到 20ms如果不对抖动做处理一次按下会被识别成多次触发。传统做法是延时 20ms 再读一次电平这在裸机简单程序里能用但在一个任务繁重的系统里延时就是浪费 CPU。更优解是用状态机加定时扫描。我的答题思路是这样的每 10ms 扫描一次按键电平。状态机包含四个状态空闲、等待稳定、确认按下、等待释放。只有在“等待稳定”状态连续两次读到按下电平才判定为有效按下并触发事件。松开同理需要连续读到释放电平才回到空闲状态。这个方案的好处是不阻塞、可扩展还能顺便做长按、短按、双击识别。笔试答题的时候光画状态图或者写伪代码都行但最好把关键的状态转移代码也写上。这类题考察的就是你能不能把一个实际硬件问题抽象成状态机去解决这也是嵌入式工程师最核心的能力之一。3.3 一道开放题设备偶发性死机怎么排查问答题里有一道题描述是一个设备量产之后客户反馈偶发性死机让你说说排查思路。这种题没有标准答案但很能看出一个人有没有实战经验。我当时的回答分了几步先复现问题通过故障率、操作序列、环境条件缩小范围。查看有没有看门狗如果没有先加一个同时让重启时保存现场关键信息。抓日志尤其是死机前的最后打印、中断调用序列、堆栈信息。检查内存有没有溢出动态分配有没有越界数组有没有写穿。检查中断优先级和共享资源保护这种偶发问题很多是中断抢占导致的。看电源、复位电路有没有毛刺硬件问题也会导致程序跑飞。这种题答得好不好不在于你背了多少名词而在于你有没有真的在产线或者实验室里被这种问题折磨过。我写完这个答案后总结了一个核心嵌入式里的偶发问题八成和内存、中断、时序有关系排查思路一定要系统化不能猜。3.4 开放题里的“项目深挖”项目难点怎么讲不翻车还有一道开放题是让你描述一个你参与过的项目重点是难点和解决方案。这题看起来好说其实很容易翻车因为很多人把“难点”写成了“功能点”比如“我做了个温控系统能显示温度”这叫功能不叫难点。我的写法是选一个你做过的项目按“背景-难点-方案-结果”四步来写难点必须讲清楚为什么难方案必须讲清楚为什么这个方案能解决。比如我写过的一个项目是低功耗温湿度采集设备难点是待机电流要控制在微安级方案是分时供电、深度睡眠、只在采样瞬间唤醒 MCU最后实测待机电流从 2mA 降到了 5uA 以下。这种以数字说话的项目描述面试官一眼就能看出你是有真东西的。4. 线上笔试实操细节与避坑经验4.1 考前环境准备摄像头和网络不是小事70迈的线上笔试要求开摄像头并且会全程录制屏幕。我建议考前一定提前半小时做一次完整的设备测试不要等到开考了才发现摄像头不工作。血泪教训是我有个同学考试时用的笔记本摄像头权限没开折腾了十分钟才进入考试页面本来时间就紧心态直接崩了。桌面清理也很重要。把浏览器多余标签页全部关掉只留考试页面手机静音放到够不到的地方。有些考试系统切屏次数多了会直接交卷这个真的不是开玩笑。建议准备一个干净整洁的桌面旁边放几张 A4 纸和笔方便打草稿和画内存分布图。4.2 做题顺序策略先拿稳分再攻坚难题我的做题顺序是先快速过一遍选择题会的立刻选不确定的先做标记不要在单题上卡超过 2 分钟。接着是填空题这类题答案短但正确率直接反映基础功底丢分很可惜。然后是编程题先审清题目要求确定输入输出格式再开始写代码写完一定要自己模拟几组测试数据走一遍。最后是问答题问答题不需要长篇大论但结构要清楚分点作答写到关键点上。这套策略的核心逻辑是笔试的时间是固定成本把单位时间的分值产出最大化。选择题 1 分一题编程题 20 分一题如果为了 1 分的选择题浪费了 10 分钟导致编程题没写完那就是亏的。先做分值效率高的题是应试的通用法则。4.3 编程题的线上提交边界条件和格式陷阱线上编程题最大的坑不是算法本身而是输入输出格式。有一次我因为没用scanf读入多组测试数据导致只通过了部分用例这种丢分真的很冤。笔试前一定要熟悉考试平台是使用标准输入输出还是函数调用以及是否支持本地编译器调试。写完代码后我习惯做三轮自查边界条件输入为空、数组长度为 0、只有一个元素、最大值最小值。数据类型int 是否会溢出要不要用 long。释放内存动态申请的空间记得释放虽然线上判题不检查但代码里体现出的习惯很重要。编程题的表达也很关键关键函数加注释命名用有意义的名字不要写一堆 a、b、c 这种变量名这体现的是代码可维护性。嵌入式开发是团队协作的活代码写得清清爽爽是一个很大的加分项。4.4 时间不够时的“保底”策略如果做到最后发现时间不够了也不要直接交白卷。编程题可以写思路、写伪代码、写关键的数据结构和核心函数问答题哪怕没时间详述也要把核心关键词和框架列出来。在线判题有时候不管你过程分但让你写思路的题目会看而且就算没有最终结果有思路的代码也会让后续面试环节的面试官更认可你的水平。碰到完全没思路的选择题先用排除法去掉明显错误的选项再用常识和工程经验去猜。嵌入式笔试总体偏应用很多题用现实逻辑去推也能推个八九不离十。只要不空题就有得分机会。5. 考后复盘与后续准备方向5.1 笔试后的即时复盘怎么把一套卷子用出十倍价值考完笔试后别急着松气趁记忆还热乎把能记下来的题目赶紧写在备忘录里。我当时会在手机里按知识点分类记录“结构体对齐 12 字节”“volatile 题答对了但追问临界区差点没想起来”“编程题的链表没写好迭代版”“开放题项目难点写得太啰嗦”。这种复盘比刷十套新题还有用因为它指向的是你个人的真实缺口。过三天左右再拿这些题目自测一遍如果还是答不上来说明是真没吃透要重点补。我在这个环节发现自己的结构体内存布局理解不够扎实于是专门花了一天画图、写代码验证之后遇到类似题目再也没错过。5.2 针对 70迈岗位方向的补充学习汽车电子与车载总线70迈做的是车载硬件笔试通过后如果进入面试环节大概率会问到车相关的技术点。我当时提前补了 CAN 总线的概念因为车内电子设备通信基本都是走 CAN行车记录仪、倒车影像、胎压模块之间的数据交互都离不开它。至少要了解 CAN 和 UART 的区别、CAN 的仲裁机制、常见波特率这些基础概念。另外车载产品对系统稳定性要求极高所以低功耗设计、掉电保存、固件升级和防变砖方案、以及产测流程这些都是 70迈这类公司很关心的点面试时极有可能会被深挖。可以挑一个方向准备一个自己的实际案例到时候有话说。5.3 如果笔试通过面试和项目深挖怎么准备笔试通过后面试环节通常会围绕你的简历项目和笔试中答得不完善的地方展开。我当时准备了一份项目复盘文档把项目架构画清楚标注每个模块用了什么 MCU 外设、什么问题导致方案变更、最终效果指标是多少。面试时能对着项目讲得越具体越好空话套话一句都不要有。还有一个准备方向是手写代码题。面试现场很常见的情况是面试官让你在共享文档里写一个字符串处理函数、链表操作或者一个简单的外设配置代码。我记得 70迈 这类公司喜欢看你对寄存器的熟悉程度所以 STM32 的 GPIO、定时器、串口、中断的基本配置流程最好背得滚瓜烂熟哪怕手写不出来完整代码也要能流程清晰地讲出来。我当时在面试前花了两天把手头用过的 MCU 外设初始化代码全部重新手写了一遍每个外设都能开口讲清楚分几步配置、每一步是干什么的、寄存器里哪些位是关键的。这种准备方式极其枯燥但效果也是实打实的因为你会发现面试官问来问去其实就围绕那些点你只要把这些问题串成体系回答时自然就有底气了。再说一个更实际的建议笔试结束后不管感觉好坏都顺手整理一下自己的错题形成一个“嵌入式笔试错题本”。后续投其他公司再遇到类似的题就是白送分。我自己就是用这个办法把 70迈笔试暴露出的 C 语言内存问题、结构体对齐问题、状态机建模问题逐条攻克后面再做别的笔试题明显轻松了很多。笔试本质上不是在考智商而是在考你过去有没有认真写代码、认真调 bug、认真总结项目。准备得越充分考场上的紧张感就越少遇到没见过的题目也能坦然写步骤拿过程分。