查看原文
其他

工程之中无小事,一个嵌入式工程师面试之路

2017-11-14 嵌入式ARM 嵌入式ARM

经过一段艰难的找工作历程,我终于开始了新的生活 


在面试那段时间我看到了一个面试经验分享的帖子:《一个五年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部分模块,具体的睡眠操作:断电还是取消时钟) 
如何唤醒已经睡眠的模块?

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

英文对话

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

分享

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


总结

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


这里设计的技术难点还有一个FatFs文件系统的移植。文件系统是为了明确磁盘或分区上的文件的方法和数据结构。说起文件系统必须相对于存储设备才有意义。这里是用来管理Sd卡上面的文件。


文件系统的层次叫驱动程序要高一层,为什么这么说呢,上一张图你就明白了:

 


程序员需要给文件系统提供三个对底层硬件的操作函数,我们才能利用文件系统对硬盘(disk)上面的设备进行管理和使用。


这三个函数分别是:sd_read();sd_write();RTC();他们分别是SD读扇区,SD卡写扇区,系统时钟。(可能还需要提供更多的函数接口,但是SD卡读写扇区是必须要有的)。


文件系统接受了这三个资源便可以对Sd卡进行管理了。


应用程序就是实现了吧SD卡上面的MP3文件或者wma文件通过文件系统提供的函数接口找出来,发送到数据流设备上,也就是解码芯片上,解码流程我们不需要知道,这是芯片内部集成的,无需人工参与。输出到音频输出设备就行了。


说到这个里,我们的MP3就可以运行了——把程序下到单片机上面,上电,应用程序就开启了!听歌吧~~~


补充:

这里没有使用到操作系统,不能实现多进程同时进行工作,每次只能实现一个硬件工作。如果加入操作系统,我们可以看到的效果就会是MP3一边显示歌词,温度、时间,一边放歌曲,操作系统是个很好玩的东西,有兴趣的可以移植uCOS II,这个比较小,AVRX也可以,在做这些之前,花点时间去了解软件层面上的各个层之间的调度关系,少走弯路。

 







您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存