选择嵌入式行业,意味着初期进行很大的付出,希望找到一份满意的工作也是理所当然的,最近正好离开原公司,面试了几家企业,基本参加的都给了offer,这里总结下面试遇到的事情,也是一种积累。我也经历过刚踏入嵌入式行业啥都不会的时候,那时面试都是以基础C语言为主,再以简单的模块如AD的精度,串口, SPI接口的应用调试特性为主,我下面分享的则是结合上面的知识,告诉你们一般公司对5年左右工程师的需求,我以有代表性的面试流程总结来讲诉。
1. 基础C语言测试,常见的题目类似下面的:
- 定义一年有多少秒
- volatile,static用法
- 翻转指针链表
- 清除,置位,赋值数据位
- 中断函数,浮点
- 如何C代码实现判断大端,小端
- 指针,数组,强制转换
- 存储空间,堆,栈,全局变量区
- ...
- 函数的健壮性,代码改进
这些面试资料网上一大把,可能是公司流程问题,不过对于5年工程师面试,公司也不看重这些,基本上是个过场,对的多不加分,错的多是扣分项,当然如果是一线的嵌入式研发工程师,基本上1年以上经验这些都不该有大问题,可以某些笔误,但不应该有明显不了解,这部分只对于初/未入行业的开发人员还是有一定筛选意义的。
2. 与人事的面试
人事的面试在技术面试的前/后都有可能,这一步一般来说即重要,也不重要。重要的是在于这一步决定了你以后在公司的福利待遇,工作时长,餐补和交通补贴等,不重要是除非你有重大的错误,如欺瞒学历,态度不端正等,基本不会影响到面试录取的最终结果。这里面有个重要的技巧,那就是薪资范围一定要比你心理能接受的价位要高,如心理价位是1w,那至少要1w2-1w4,心理价位是1w5,那至少要1w8-2w;因为这并不得罪人,在工资上,负担对象是公司,而不是你对面的人事,这样给后期技术面成功后留下调整的空间,我至今还没遇到过要多少给多少的,后期都是通过沟通在预期薪资基础上少500-1500不等,千万不要要低了,因为这会影响到未来几年的收入,还影响调薪的基数。另外对于加班和现在深恶痛绝的996,可能是因为行业原因,加班我是接受的,在项目紧张的时候别说996了,997我都干过,但我不接受的是强制996,就是我有工作未完成,加班我愿意来,但不能强制,周六必须上班这种。当然我也因此直接拒绝了一些公司,甚至我所在行业的靠前企业,当然这是我的想法。我这么说就是告诉你不要把自己放的太低,即使是面试者,和面试官也是平等的,提出自己的诉求没问题,当然我不会说坚持不加班的,这就是对自己和工作需求博弈的定位。
3. 与技术的面试
在我刚踏入嵌入式行业的时候,技术面试对我简直就是灾难,现在回想起来,其实对于面试官来说,这种面试也很窄,只能从较少的小项目中来问一些很基础的东西,如各个模块的调试经历,涉及到C知识,对硬件开发的了解(这一部分是初期很薄弱的),关键是稍微问深点也很难答上来,因为这些模块我们都是调用芯片厂商库开发的,也没用覆盖性的测试,很难说出有亮点的问题和解决问题的思路,但当工作几年出来后,再去面试是很有趣的事情,基本上都是和比你强,或者至少一个水平的人来互相探讨交流,是一个吸收碰撞,整理自己不足,开拓视野的过程,这里分享下我遇到的面试问题。
技术面试很多都是以介绍自己的工作项目开始,在我工作3年后面试基本上自我介绍就可以完全把控流程,这种对于做过项目的人来说其实真的很简单,甚至通过一个项目,就大致可以整体了解一个人的水平,以我刚入行做的交换机管理模块为例,我大致阐述了产品的架构,由STM32芯片+新塘单片机+FPGA构成,我负责STM32芯片完整软件开发,支持远程网络在线升级,主要包含FreeRTOS移植,LWIP移植,http/telnet/snmp服务器实现,以及与新塘通过RS485接口,使用自定义协议通讯,这些简单一列出来,很多问题立马就提出来了,下面并非标准答案,只是我根据实际开发产品,所阐述最后得到offer的答案,这个要谨记。
1.项目中的任务是怎么分配的,任务间怎么通讯
LWIP占用两个任务,底层任务和LWIP内部管理任务,底层任务由信号量堵塞,由ETH中断触发产生信号量,读取ETH接收的数据;LWIP内部管理任务使用队列管理内部的所有消息。RS485任务单独创建任务,与UART和DMA中断配合,产生信号量来读取共享数据区的接收数据,用于轮询下位单片机提供的FPGA参数。http和telenet也都是单独任务管理,使用邮箱与LWIP内部管理任务进行TCP数据的交互。另外还有空闲任务用于LED指示灯的闪烁和看门狗喂狗。
说明:用来考察对项目的认知熟练程度,只有完整实现的才能理清楚内部整体架构信息。
2.项目使用了自定义协议,是什么结构,可以用C写下如何实现吗
这个如果学习了解过Modbus协议,那么我们这个自定义协议其实差不多,结构为:起始位+地址位+指令+数据长度+数据+CRC校验(具体代码实现较多,这里不在赘述,实现可参考《利用串口点亮/关闭LED灯》里面关于协议的实现)。
说明:即考察C知识(指针,数组), 也涉及到协议的理解,这在嵌入式行业里也是十分重要的大类分支。
3.项目使用RS485接口,是如何保证双机通讯的稳定性的
为了实现稳定性,主要包含了硬件/软件的方法,软件上当数据发送失败或等待返回超时,进行异常计数,继续轮询,当超过一定次数后(我们定义的是三次,成功则清零),此时则通过硬件引脚强制复位下位机芯片,并将下位机状态置为异常态,清零计数,在重复轮询过程,如果继续失败,则将下位机状态置为出错,修改内部错误码,并反映到外部的指示灯上和管理界面上,通知产品通讯故障。
说明:稳定性,即是技术问题,也是经验问题,这可以看出开发中的设计思路问题,对于一些要求比较高的行业,如电源管理,车辆管理中,冗余设计是必要了解的。
4.你们对于FLASH的配置数据存储有效性是怎么保证的
对于配置数据的存储有效性,也涉及到软件/硬件方法,硬件上我们使用备份页和备份标志区,将要写入区域的数据先写入备份区,同时置位备份标志位,然后在原地址执行解锁,擦除,写入流程,如果成功则擦除备份标志位,失败返回错误即可。软件上我们将写入FLASH的数据定义为结构体,并添加CRC校验位,读取后校验失败后则使用默认的配置数据。
说明:同上
5.你实现了在线升级功能,具体怎么实现的
在线升级主要实现bootload以及实现网页在线下载,产品中将FLASH划分成bootload和Application,以及更新代码暂存区,通过网页将固件更新到暂存区,并修改标志位,产品重启后,bootload如果检测标志位和校验都通过,则将代码移动到Application区域,然后在跳转执行,否则直接跳转执行(我这里只是简单说下流程,实际会复杂些,详情可以看之前的文章)。
说明:在线升级本身技术上来说不难,但从这可以考察对于设计的把控程度。
6.你们产品开发的流程是什么,你参与了什么
- 市场调研
- 项目立项,主要配合产品经理参与前期产品定义和项目规划
- 产品基本架构设计,主要配合芯片/模组选型和功能需求分析,初步文档完善
- 硬件实现和开发板软件搭建,软件部分负责前期开发板搭建基础框架实现,配合硬件解决设计问题
- 软件流程开发,在实际硬件板进行功能开发,并反馈结果,同时完善文档。
- 产品优化和需求更新,主要结合开发遇到的软/硬件问题,配合硬件完善产品的功能,并解决伴随开发的需求更新问题。
- 产品测试,配合测试工程师的电压稳定性,高低温,老化,产品需求方面的测试,解决反馈的问题。
- 开发文档,使用文档和后期维护文档完善
说明:参与正规的流程开发,熟练掌握流程,是从嵌入式工程师走向架构师的必要过程,为了未来更好发展,多听,多看,多参与是必须的,单纯的做技术其实很困难。
7.对于多人合作的项目,你们怎么进行管理的,如果你参与的项目,在客户现场需要更改别人维护的底层库,你怎么处理
我以前参与的项目是使用SVN管理,个人对自己负责的库进行维护管理,其它人需要更新的话需要提交问题给维护者,由对方经过全面测试进行更新。遇到你说的情况,之前采用的方法是如果客户要求不紧急,则现场人员将更新提交到库的维护人员,全面测试后进行库的更新,然后在客户这边进行整体库的替换,如果要求时间比较紧张,则现场提供测试版本分支,不直接并入库中,解决后在提交给库的维护人员,测试后进行版本更新,然后通知用户更新到正式版本。
说明:分支管理和客户需求的冲突对于大型项目是一个抉择问题,也是经常遇到的问题,很难有最优解,最好根据公司的制度处理,我这里说明的只是根据自己公司处理的解决办法,并不一定是最优的办法。
8.你掌握的这些接口,模块(SPI, I2C, USB, TCP/IP接口等)在这份工作可能并没有任何涉及,你是怎么看待的
其实嵌入式内部也是分很多行业的,像我之前在的通讯,安全行业,基本上知识涉及偏差也很大,但这么多项目做下来,也经历了很多产品,可以明白这些接口,模块在实际的项目开发中是占比很小的一部分,实际工作集中在任务管理,协议处理,功能需求实现这部分,虽然这些模块在这份工作没有涉及,可调试这些模块,实现功能的过程中,积累的C语言知识,硬件驱动开发能力,软件设计思路是相通,这部分才是积累的知识。
说明:对于刚入职的工程师来说,嵌入式本身可能就是一个方向,但是对于向架构师发现发展的嵌入式工程师来说,嵌入式本身就是一个大类,可能涉及的方向有通讯行业,安全行业(指纹,支付,视频监控,智能家居),电源管理等,如果想进一步发展,是需要既要了解嵌入式,也要更深层次的对于行业进行掌握,我也是做开发多年,换了2家公司才明白嵌入式内部的隔行如隔山,这个问题没有正确答案,但反映的问题倒是让我对自己进行了全面的总结,也算面试的意外之喜。
还有些问题因为印象不深刻就不一一赘述了,上面的这些聊完,在穿插些结构图的绘画和讲解,基本上一个小时也过去了,面试是不是就不知不觉完成了,纵观流程就会发现,对于一个成熟的工程师,基础的研发能力,功能开发的思路,对产品的认知(稳定性和项目流程), 与他人的配合,还有对行业和自己的认知都是考察的内容,如果没有充分的经验,是很困难的,这里以此共勉,希望有帮助。