标签:灾难 升级 结构体 替换 ... 代码实现 开发人员 总结 项目开发
选择嵌入式行业,意味着初期进行很大的付出,希望找到一份满意的工作也是理所当然的,最近正好离开原公司,面试了几家企业,基本参加的都给了offer,这里总结下面试遇到的事情,也是一种积累。我也经历过刚踏入嵌入式行业啥都不会的时候,那时面试都是以基础C语言为主,再以简单的模块如AD的精度,串口, SPI接口的应用调试特性为主,我下面分享的则是结合上面的知识,告诉你们一般公司对5年左右工程师的需求,我以有代表性的面试流程总结来讲诉。
1. 基础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等)在这份工作并没有任何涉及,你是怎么考虑的
其实嵌入式内部也是分很多行业的,像我之前在的通讯,安全行业,基本上知识涉及偏差也很大,但这么多项目做下来,也经历了很多产品,可以明白这些接口,模块在实际的项目开发中是占比很小的一部分,实际工作集中在任务管理,协议处理,功能需求实现这部分,虽然这些模块在这份工作没有涉及,可调试这些模块,实现功能的过程中,积累的C语言知识,硬件驱动开发能力,软件设计思路是相通,这部分才是积累的知识。
说明:这个问题其实很难回答,基本上是否定你明面上的技术栈,让你回答你还有什么对这份工作有利的部分,我的回答算中规中矩。
还有些问题因为印象不深刻就不一一赘述了,上面的这些聊完,在穿插些结构图的绘画和讲解,基本上一个小时也过去了,面试是不是就不知不觉完成了,纵观流程就会发现,对于一个成熟的工程师,基础的研发能力,功能开发的思路,对产品的认知(稳定性和项目流程), 与他人的配合,还有对行业和自己的认知都是考察的内容,如果没有充分的经验,是很困难的,这里以此共勉,希望有帮助。
标签:灾难 升级 结构体 替换 ... 代码实现 开发人员 总结 项目开发
原文地址:https://www.cnblogs.com/zc110747/p/10739703.html