面试官顺着一个DMA追了我二十分钟,这才是嵌入式面试的真实难度
面过这么多场,最难的一场不是算法题,不是手写代码,是面试官指着我项目里一段DMA代码,追问了二十分钟。
那天的情况到现在还记得。
从他指代码开始
"这段DMA谁配置的?"我配的。"缓冲多大,在哪定义?"数组,64字节。"DMA搬完谁来处理?"进中断,置标志位,任务里读。"任务读的时候DMA还会写吗?"不会,等任务处理完再启动下一次。"那任务处理得慢呢?"……
问到这里我开始出汗。测试的时候数据量小,任务每次都来得及,我从没想过来不及会怎样。他接着问:队列满了是丢新的还是旧的?丢了要不要记?你怎么知道丢了?
一层一层,全是我在项目里没写、也没想过的分支。二十分钟下来,那段我自以为很熟的代码,被问得千疮百孔。
回去之后我把项目里每条数据通路都画了一遍
不是画框图,是画出每个缓冲的读写双方:谁写、谁读、什么时候写、什么时候读、写满了怎么办、读空了怎么办、中途出错了怎么办。
画完才发现,项目里四条数据通路,三条有窟窿。有的是缓冲区没有满的逻辑,有的是错误标志没检查,有的是任务挂了接收端还在灌数据。这些窟窿平时不炸,纯粹是因为测试场景太温柔——发送频率低、数据量小、从不拔线、从不掉电。
面试官的工作就是往这些窟窿里戳。我画的这张图,其实面试官脑子里的标准版本。
面试考的是异常路径,不是正常流程
这是那场面试最大的收获。正常流程谁都会讲,初始化、收发、处理、显示,背下来就行。面试官往深挖,挖的从来都是:通信堵了怎么办,内存不够怎么办,中途出错怎么办,突然掉电怎么办。
这些问题在八股里几乎找不到,在面经里也不多见,因为它们没有标准答案。考的是你有没有把"出问题的情况"真的想过一遍。
后来我养成了一个习惯:每写完一段数据通路,把正常流程旁边的异常分支列出来,一个一个想处理办法。想不出来的,就是代码里要补的地方,也是面试前要准备的地方。
讲项目,按数据讲不按代码讲
还有个改变是讲法。以前介绍项目按代码顺序:先初始化什么,再初始化什么,然后进主循环。讲得挺顺,但换个项目也能这么讲,面试官听完什么都记不住。
现在按一条数据讲:从哪进来,放哪,谁判断完整,交给谁,来不及怎么办。这条线讲清楚了,面试官的追问会顺着线走,每一站我都有准备。
反过来,如果哪一站答得含糊,他也顺着线找到了我的窟窿。
最后
嵌入式面试没有捷径,但方向要对:别只准备"能跑"的那条路,把每条路旁边分岔的坑都看一眼,面试官戳进来的时候才有话说。
我后来把这些整理成了专栏,按追问链写的,每种机制都带"用错了什么现象、出了bug从哪查",真题也是按这个路子来的。需要的可以看看:
嵌入式校速通专栏:https://www.nowcoder.com/creation/manager/columnDetail/0rvBo8
被问穿不丢人,被问穿了不知道哪里穿才丢人