zoukankan      html  css  js  c++  java
  • 记录嵌入式面试的流程

     选择嵌入式行业,意味着初期进行很大的付出,希望找到一份满意的工作也是理所当然的,最近正好离开原公司,面试了几家企业,基本参加的都给了offer,这里总结下面试遇到的事情,也是一种积累。我也经历过刚踏入嵌入式行业啥都不会的时候,那时面试都是以基础C语言为主,再以简单的模块如AD的精度,串口, SPI接口的应用调试特性为主,我下面分享的则是结合上面的知识,告诉你们一般公司对3年左右工程师的需求,我以有代表性的面试流程总结来讲诉。

      1. 基础C语言测试,常见的题目类似下面的:

    • 定义一年有多少秒
    • volatile,static用法
    • 翻转指针链表
    • 清除,置位,赋值数据位
    • 中断函数,浮点
    • 如何C代码实现判断大端,小端
    • 指针,数组,强制转换
    • 存储空间,堆,栈,全局变量区
    • ...
    • 函数的健壮性,代码改进

      这些面试资料网上一大把,可能是公司流程问题,不过对于3年以上工程师面试,公司也不看重这些,基本上是个过场,对的多不加分,错的多是扣分项,当然如果是一线的嵌入式研发工程师,基本上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家公司才明白嵌入式内部的隔行如隔山,这个问题没有正确答案,但反映的问题倒是让我对自己进行了全面的总结,也算面试的意外之喜。

      还有些问题因为印象不深刻就不一一赘述了,上面的这些聊完,在穿插些结构图的绘画和讲解,基本上一个小时也过去了,面试是不是就不知不觉完成了,纵观流程就会发现,对于一个成熟的工程师,基础的研发能力,功能开发的思路,对产品的认知(稳定性和项目流程), 与他人的配合,还有对行业和自己的认知都是考察的内容,如果没有充分的经验,是很困难的,这里以此共勉,希望有帮助。

  • 相关阅读:
    ZOJ 1002 Fire Net
    Uva 12889 One-Two-Three
    URAL 1881 Long problem statement
    URAL 1880 Psych Up's Eigenvalues
    URAL 1877 Bicycle Codes
    URAL 1876 Centipede's Morning
    URAL 1873. GOV Chronicles
    Uva 839 Not so Mobile
    Uva 679 Dropping Balls
    An ac a day,keep wa away
  • 原文地址:https://www.cnblogs.com/zc110747/p/10739703.html
Copyright © 2011-2022 走看看