一个嵌入式工程师的面试之路

时间:2022-04-21 06:49:13

经过一段艰难的找工作历程,我终于开始了新的生活
在面试那段时间我看到了一个面试经验分享的帖子:《一个五年Android开发者百度、阿里、聚美、映客的面试心经》,同样工作5年,我实在自愧不如。或许是因为嵌入式太繁杂,一个公司一种开发模式,导致我个人的积累有些单薄。

为了方便大家,我决定简单列出面试题目,而不做详细说明,大家可以自己去搜索答案。

背景:
我之前工作过两家公司,一家做智能卡芯片的,一家做蓝牙产品,基本是应用层的内容。可惜嵌入式开发会越来越向底层发展,没做过底层协议开发是我的一大软肋。
自学过TCP/IP,linux内核(0.11版)
使用过python

公司A

一面

项目模式(产品/模块)
蓝牙芯片在产品中的作用(MCU,控制外部DSP或其他芯片;或只作为蓝牙模块)
蓝牙软件成品模式(固件模式,通过SPI烧录)
蓝牙协议栈的架构和分层
蓝牙协议栈与网络协议栈(4层架构或7层架构)的对比
蓝牙芯片(是否基于Linux或其他常用架构)
蓝牙软件的软件架构(event-driven类型的,而不是单片机那种大while循环的)
函数指针与指针函数分别是什么?用简单的代码表示出来
Linux内核的版本;操作系统任务切换的关键是什么(保存上个任务的上下文,加载下个任务的上下文)

二面

说说经历过的最难的项目

分享

这个其实是我同学推荐的,虽然面试完全没有准备(因为个人原因还未开始投简历),但面试过程还算基本顺利。可惜该公司有个性格测试,没过

公司B

自我介绍
项目模式(产品/模块)
蓝牙芯片在产品中的作用(MCU,控制外部DSP或其他芯片;或只作为蓝牙模块)
蓝牙协议栈与TCP/IP模型的对比;描述一下TCP/IP模型(协议)的主要内容;蓝牙协议的细节
wifi与蓝牙的对比
蓝牙通信速率(面试时没答上来,基本没关注过……后来了解到现在最大24Mbps,一般也就几十k)
python的项目经历
I2C的通信模式(看来是答错了,我以为有个校验位(UART有校验位,是10位数据),结果每次传输是8bit,然后1bit应答),通信速率,工作时的挂载情况(最多5,6个设备)
USB的协议架构
git的使用
makefile的了解(编译的经过)
Linux内核的版本(推荐我看2.4版本……)
Linux驱动开发
socket

分享

总结了之前的经验,专门看了一些蓝牙底层协议和网络四层协议的对比,但是忽略了I2C,之前做I2C也不是做I2C的底层协议,主要是应用,抓取过一些I2C的通信数据,UART也是同样的,结果我在数据格式上没分清UART和I2C。USB协议也不太了解,只是在原来的公司做过一些基本是应用层的代码改动。

公司C

部门1

自我介绍
手机开发
手机架构分层
C开发平台
是否做过Linux驱动开发

部门2:

一面

自我介绍
最有挑战的项目
职业发展方向(我表示我想做Linux驱动开发或系统开发,不过面试官说他们的项目里并没有分的很详细)
我问的问题:项目的产品

二面

C程序,判断一个对称数
删除双链表中的一个已知节点p
好的代码应该有的特点

分享

部门1是做芯片开发的,可惜我完全没接触过。所以问了几个问题后感觉不合适,就结束了。

公司D

单片机经验(51或linux)
软件架构;个人负责的部分
我问的问题:公司的主控芯片和产品的关系

分享

这个公司是看到我的蓝牙经验,考虑他们的产品中可能会用到蓝牙才面试我的,但我做的不是蓝牙底层协议,他们了解到这个后就没怎么再问了

公司E

一面

好的编程习惯(结合C语言的测试题详细说明,第一个点出C变量的声明和初始化的位置应该在一起)
第一份工作的内容,负责的部分,拿到一个文档后如何开发/测试
第二份工作中影响最大的项目,为什么要实现蓝牙设备之间的连接?为什么不从主设备直接向2个蓝牙设备播放音乐?
这么多年编程有什么最宝贵的编程经验?

二面

影响最大的项目

分享

一面有点像压力测试,比如问题“为什么要实现蓝牙设备之间的连接?为什么不从主设备直接向2个蓝牙设备播放音乐?”产品设计并不是我做的,至于为什么我也不清楚。“为什么不从主设备直接向2个蓝牙设备播放音乐?”这是因为目前的任何一款手机还不支持同时向2个蓝牙设备播放音乐。看来大家都知道蓝牙,但是都没用过啊,如果面试官用过多个蓝牙设备,就不会问这种问题了。

公司F

volatile的作用(没答上来)
如何写一个无限循环?
如何跳出无限循环?(面试官说可以使用goto来跳出循环)
为什么一般C程序中不使用goto(面试官提示:如果从一个函数中使用goto到函数外,会有什么影响?)

UART,通信的细节:UART的数据格式?如何保证在侦听UART时不会一直判断接收到0?

2种CPU架构(不知道,面试官说是冯诺伊曼架构和哈佛架构,还提了一句图灵机……)
RISC和CISC的区别(没回答上来,面试官说是与指令长度有关。我说我只了解比如汇编中RET长度可能只有2字节,而jmp指令可能是4字节,这样汇编转换成机器码后,可能会做4字节对齐,如果一段指令刚好差2个字节,就会补2字节的0。所以有些机器码反汇编后就会出错,是因为刚好补0造成的。)

寄存器长度变小,寻址范围会变小么?(我答错了。应该是不会,考虑CPU上的地址总线和数据总线是分开的)

一个简单的C函数编程,如何把一个变量中的某一比特取反?

在软件上,有中断号,中断向量表,中断函数,3者的关系是什么?(学过linux 0.11版的同学们肯定都知道答案)

发生中断,芯片会做什么?(我回答的软件部分的东西:影响堆栈,任务会切换到内核态并执行中断。不清楚具体硬件上会做什么,印象里CPU只有中断标志位会被置位。其他芯片不太了解)

芯片如何降低功耗(sleep部分模块,具体的睡眠操作:断电还是取消时钟)
如何唤醒已经睡眠的模块?

时钟变慢的影响?(不太懂芯片……)

英文对话

我问的问题:项目的工作方向(了解到是做一个芯片内部的模块验证工作)

分享

这家公司是做芯片的,所以问的东西有点偏底层,微电子方向。虽然感觉面试官超有亲和力,但我还是想做软件开发方面的,所以有点对不住这位面试官。

总结

嵌入式开发还是相当繁杂的。从芯片级开发到嵌入式产品的开发,或许我投的还是有些广,但是有一点大家一定要知道,把自己写在简历上的内容掌握,无论别人怎么问都不会出错,这样才能正确体现自己的实力