32 道,校招 14 道(C 语言、GPIO、串口、I2C / SPI、看门狗、启动流程、交叉编译),社招 18 道(RTOS、驱动、量产和工程判断)。每题三段:这题想听什么、要点、大多数人错在哪。
背下来没什么用。面试官会往下追问,第二问答不上,前面背的那些反而暴露得更多。
这题想听什么
校招最常问的一题,但答得好坏差距很大。想听的不是「数组就是指针」这句错话,而是你知不知道「退化」发生在什么时候。
要点
容易答错的地方
说「数组就是指针,只是大小不同」。它们连类型都不同,只是会退化——这个区别在算偏移、做类型检查、传参时全部暴露出来。
这题想听什么
三种用法各不相同,但只有真正写过模块化代码的人才答得顺。嵌入式里它还有第四种隐含用途:省 RAM。
要点
容易答错的地方
「static 变量放在静态存储区」说对了但答完了——面试官接着会问:有初值和无初值分别落在哪个段?为什么 .bss 不占 Flash 空间?
这题想听什么
不是考记忆,是考你有没有一套稳定的规则。规则比背四种写法更值钱。
要点
容易答错的地方
说「const 变量一定在 Flash 里」。它只是「不可改」,能否进 Flash 还得看链接脚本和是否有取地址传给非 const 形参。
这题想听什么
这题是「有没有吃过动态内存的苦」的分水岭。答「heap 大 stack 小」基本就结束了。
要点
容易答错的地方
说「栈溢出会抛异常」。裸机上没有这种东西,栈溢出通常表现为某个全局变量莫名其妙被改写、或者跳进 HardFault。
这题想听什么
经典送分题,但后面往往接一句「写个安全版的宏」——那才是真考点。
要点
容易答错的地方
说「inline 一定比普通函数快」。它省的是调用开销,代价是代码体积——在 Flash 只有 64KB 的片子上,滥用 inline 会撑爆。
这题想听什么
考你有没有「中断是稀缺资源」的概念。答「会卡住」太浅,要说到具体后果。
要点
容易答错的地方
答「ISR 里什么函数都不能调」。可以调,条件是可重入、执行时间确定、不阻塞——这些都是可以逐条讲清楚的判断标准。
这题想听什么
GPIO 配置里的第一个真问题。答不出来的人,基本没独立画过原理图。
要点
容易答错的地方
「开漏输出高电平就是高阻」——对,但接着说「所以读回来是悬空值」就错了。输入通道通常仍有效,悬空会被外部上拉拉高,若没上拉才是浮空。
这题想听什么
这题考的是「有没有被浮空输入坑过」。答「防止悬空」只是及格线。
要点
容易答错的地方
说「上拉是为了提高驱动能力」。上拉电阻是弱上拉,驱动能力很小,它解决的是电平确定性和线与,不是驱动。
这题想听什么
看你是不是只会调 HAL_UART_Init。能说清误差来源的人,通常自己配过时钟树。
要点
容易答错的地方
忽略帧格式:波特率只定义位时间,数据位、校验位、停止位不匹配照样收不对。调试时先确认 8N1,再怀疑波特率。
这题想听什么
选型题,考的是工程判断而不是参数罗列。能说出「为什么这个项目选了它」的加很多分。
要点
容易答错的地方
说「I2C 比 SPI 快」。方向反了——I2C 是这两者里慢的那个,它的优势是省引脚和支持多设备寻址。
这题想听什么
「喂狗」人人会写,「喂对位置」只有被现场问题教育过的人才知道。
要点
容易答错的地方
说「看门狗能防所有死机」。它只能兜住「没喂狗」这一类;堆踩坏、栈溢出后仍然正常喂狗的故障,它救不了。
这题想听什么
这题能区分「会写应用」和「理解芯片」。答得出来的人,遇到启动阶段就死机的问题不会束手无策。
要点
容易答错的地方
说「复位后直接跳 main」。中间的启动代码是汇编写的,就在 startup_xxx.s 里,翻一遍成本很低但收益很大。
这题想听什么
入门题,但第二问是实战题。答「估不出来就开大点」的人,通常没被 RAM 卡过。
要点
容易答错的地方
混淆「栈深度单位」。FreeRTOS 的栈大小参数单位是 字(StackType_t),不是字节,写 128 是 512 字节。
这题想听什么
嵌入式 Linux 的第一道门槛。答「跑不起来是因为架构不同」只是第一层,第二层是动态库依赖。
要点
容易答错的地方
遇到 No such file or directory 就去检查文件权限或路径。这个报错的十次里有九次是动态加载器缺失,不是文件不存在。
这题想听什么
不是让你背「告诉编译器不要优化」,而是看你知不知道编译器会做哪些合法假设,以及这些假设在什么时候是错的。
要点
容易答错的地方
说「volatile 用来做多线程同步」。它不是同步原语,不解决竞态——两个核同时自增一个 volatile 变量,照样丢更新。
这题想听什么
能不能手算 sizeof,以及知不知道「省空间」在嵌入式里要拿什么换。
要点
容易答错的地方
把 sizeof 当成成员大小相加。也有人答「packed 一定更快」——恰恰相反,非对齐访问在多数核上更慢。
这题想听什么
基础语法背后是链接属性和内存布局,答不出存储位置说明你只是会写,不理解它落在哪。
要点
容易答错的地方
只说「静态变量」。面试官接着问「它在哪个段、占不占 Flash」就答不上来了——初始化为非零的 static 会占 Flash(初值存在 .data 的加载副本里)。
这题想听什么
这是最能区分「调过库」和「出过事」的一道题。三个问题的答案都是「不能」,但理由各不相同。
要点
容易答错的地方
答「可以,只要够快」。速度不是理由,可重入性和阻塞语义才是。也有人忘了一点:Newlib 的 printf 需要 _sbrk,重定向不当直接进 HardFault。
这题想听什么
你排不排得了「程序进不去 main」这类问题。答得出流程,才谈得上定位。
要点
容易答错的地方
只说「初始化外设然后进 main」。外设初始化是 main 里的事,复位到 main 之间只有启动文件和 SystemInit。
这题想听什么
你知不知道栈上有什么,以及「没崩」和「没 bug」是两件事。
要点
容易答错的地方
答「因为编译器优化」。真正的原因是内存布局和栈深度在变,跟优化级别只是间接相关。
这题想听什么
你有没有想过「看门狗本身也会失效」。
要点
容易答错的地方
答「随便哪里,只要定期喂」。面试官会追问:「那如果喂狗的那个任务自己挂了呢?」
这题想听什么
这题几乎只出现在「做过量产」的人身上。没踩过就答不出恢复手法。
要点
容易答错的地方
答「重新初始化外设」。硬件已经把 SDA 拉死了,reinit 也没用——必须用时钟脉冲把从机状态机推出来。
这题想听什么
这题一半人答错在第一句:先确认平台有没有 D-Cache。
要点
容易答错的地方
答「加内存屏障就行」。屏障解决的是访问顺序,不解决「Cache 里是旧数据」。
这题想听什么
你有没有算过一行日志的代价。
要点
容易答错的地方
答「把波特率调高就行」。这只是把 3.5 ms 变成 0.3 ms,在高频控制回路里依然不可接受。
这题想听什么
这个概念的经典题,但真正区分人的是最后一句:你用的是互斥量还是信号量。
要点
容易答错的地方
只背定义,答不出「所以互斥量和二值信号量不能互换」。
这题想听什么
你有没有真的量过,还是拍脑袋给了个 512。
要点
容易答错的地方
答「给大一点就行」。RAM 有限的芯片上,栈给多了别的任务就没得用;而且「大一点」不能替代测量。
这题想听什么
你写过没有。写过的人会自然说出「反序注销」,没写过的人只会背前半段。
要点
容易答错的地方
只答前半段,不说注销顺序。面试官会追问「rmmod 之后再 insmod 报设备号被占用,为什么」——就是因为漏了 unregister。
这题想听什么
知其然,还是知道它替代了什么。
要点
容易答错的地方
答「设备树就是配置文件」。它是内核与 bootloader 之间的硬件描述接口,有版本和绑定(binding)规范,不是随便写的配置。
这题想听什么
你对「上下文」这个概念有没有实感。这是驱动里最常见的崩溃来源之一。
要点
容易答错的地方
答「内核态都不能睡眠」。这个误解在写驱动的第一年很常见,会导致到处用 GFP_ATOMIC,内存紧张时大量失败。
这题想听什么
这是嵌入式 Linux 的日常,答得清楚说明你独立部署过。
要点
容易答错的地方
答「重新编译一下」。这题考的是分类能力,不是运气。
这题想听什么
纯开放题。答得越有结构,说明你越独立处理过现场问题。这题没有标准答案,但有明显的「层次高低」。
要点
容易答错的地方
一上来就说「加日志」。日志会改变时序,很多时候把它藏起来——先固化现场再动手,顺序不能反。
这题想听什么
这是高级岗和普通岗的分水岭。答得出来的人,通常已经跟过量产。
要点
容易答错的地方
只答「优化代码、加注释」。样机只要求「能跑」,量产要求「在别人的电、别人的温度、别人的干扰下,三年不坏」——这是两个工程学科。
面试官很少只问一题。下面三条是我问过、也被问过的路径,从第二问开始才见真章。
一路问下去,考的是「编译器优化」和「硬件可见性」是两件事。第三问答不出来,前两问基本靠背。
报得出数字的人不少,报得出测量方法的不多。能说清溢出症状的,通常真被咬过。
第一问答「加日志」就危险了。日志本身会改时序,很多问题一加日志就消失,现场没了。
留言 / 提问
写你卡住的地方:什么芯片、什么现象、已经试过什么。频率高的问题我会写进页面。昵称不填也能发。