因为一些个人关系,2022年初我从北京回到了石家庄。在找工作,包括后续的研发工作中,不同地点的经历在对比中我逐渐总结出了一些经验。关于“人”方面的感悟我就不赘述了,下面主要在这里总结一些找工作,做工作的经验,希望能够帮助到各位读者。
当面试官问这些问题时,他们究竟在问什么?
实现一个链表的过程。
现在无论是在哪个平台,用哪种语言,都没人手写链表了,Linux内核中自带list.h的使用、详解文章都变得很少了。那为什么面试官还是喜欢问链表、数组、排序等问题?他们其实都在问对《数据结构》的理解。我还记得我在学这门课程的时候印象比较深下图的哈希表。
再延展一点,面试官可能会问一些有现实背景的智力题,大部分也可以在《离散结构》中找到答案。《数据库系统》问的就少了,我至今,连个mysql用作嵌入式数据库的项目都没有碰到过。《计算机组成》算得上是计算机这行的童子功了,问的比较多的也就是大小端(字节序)的问题。
什么是实时操作系统?
这个问题的题眼很明显是实时,但是你同时需要对《操作系统》这门课程有一定认识,才能说明白这个问题。常见的FreeRTOS,
首先需要能够提供多优先级区分的任务(有独立的任务栈)线,这也是为什么要上操作系统的原因,大部分业务简单情况下裸跑代码都是最优解。
高精度计时系统以及实时调度系统,例如Systick定时器来实现精准的系统节拍。
硬件平台支持多级的中断嵌套机制。
再延展一点,面试官可能会提一些实时操作系统项目开发过程中遇到的一些问题,就比较细节了,诸如同步信号量/互斥锁的使用,任务优先级选择的原则,以及一些任务间通信的机制。这块具体问题就具体分析了,最好是结合自己实际遇到的情况,讲述一个问题解决的过程。
你掌握的技术栈都有哪些?
这个问题一般会需要你结合着项目过程中不同技能的使用情况串起来讲一下,当你讲到某一项面试官觉得跟当前岗位有交叉的地方,会让你展开讲讲。下图是某培训机构总结的嵌入式书库。
我就不按单项目来走了,我顺着上边的思路来简单说说各项是怎么再项目中应用的。
编程语言在嵌入式项目中大部分用的都是C语言,而C语言现在很多高校都不再教了。理解一下指针,用递归求一下累加,其实从基础语法和标准库来看,C语言自学确实比较合适。但是C语言真正的魅力在于不同环境下的使用,从操作系统编程,到UNIX环境高编,再到网络编程,大型工业控制软件,你会发现同样是C语言,却各有各的特色美丽。
如果面试公司是搞Linux的,大概率会问一些shell命令以及脚本语言或者Vim快捷键这些细碎但是你要是干过一定熟悉的命令。如果面试公司是搞裸跑单片机的,一般会问一些编译选项的问题,常见的就是不同优化等级对代码的影响。如果是搞Android的,那adb命令肯定也会问两嘴。
《嵌入式操作系统》我们学的就是《深入理解Linux内核》和《Linux内核设计与实现》,非常理论,我还记得最后一道论述题考的是编写一个简单的字符设备驱动。我个人是没有什么内核开发的经验,顶多是进行一些功能的裁剪,驱动的加载适配等,这块我就不误人子弟了。
上图对嵌入式应用开发的细分就比较狭隘了,大部分都是基于POSIX提供的系统接口开发路线。其实作为一个嵌入式工程师,接触到的接口种类,语言类型都是比较广泛的,像是基于无线蓝牙协议栈,抑或是使用python或者C++的标准库,甚至还有基于安卓平台的业务开发,都是能接触到的。最常见的还是各种私有协议,或者一些成熟协议栈的再次开发。
嵌入式驱动开发这块我是很早以前搞的了,像是Linux和Android下边几种类型驱动的整个流程都能说得清楚,驱动的调试方法也说的明白基本就差不多了。驱动这几年貌似改动挺大的,我就不误人子弟了,如果读者您能知道面试部门所开发的驱动类型(视频芯片、存储设备),所用的操作系统和中间件,提前准备准备会事倍功半。
有没有一些硬件基础?
问这个问题,一方面是因为作为嵌入式工程师,调试新板卡,与硬件工程师沟通都是免不了的工作内容,要对《电路分析》,数电模电有一定了解。能够看懂SCH(原理图),调试板卡的时候能供使用诸如万用表,示波器等仪器,分析一些常见硬件问题的原因。一般的公司不会要求能够绘制PCB(板图),当然,会画一些简单的调试板卡,焊接等技能都会根据公司岗位特性相应的加些分。
这个问题有时还有一个小的侧面,那就是《EDA技术与电子CAD》这门课程涉及的东西,因为嵌入式这行往硬件偏的有在用Verilog做FPGA开发的,还有做PLC编程的,这些东西如果有一些经验的话,会对嵌入式驱动开发有一定的指导意义。
一些关于你简历上项目的问题
如果面试官在你的简历上的项目描述看到了自己感兴趣的技术,他就会着重的问题,这个时候你不用着急,慢慢说就可以,也不要因为它一点反馈没有而着急,因为可能他真的也不太懂。还有就是每一次的项目多多少少都会牵扯到业务上的事情,这些东西干过类似的项目都会相通的,多说些细节有助于给到面试官一些正反馈。
我如何完成领导交代的任务
工欲善其事必先利其器,快速搭建一个完整的嵌入式开发环境对于完成领导交代的任务,显得尤为重要。我这里简单粗暴一点,分硬件环境和软件环境,两小节说明一下常见的环境搭建过程以及遇到的一些问题。
硬件环境
常见的硬件环境第一个主体是板卡,这个板卡可以是从芯片厂商买的开发板,抑或是公司内部硬件工程师绘制的PCBA,为了将硬件环境搭建完成,由以下几点需要注意:
供电。根据板卡入口电压芯片手册或者开发板手册,调整稳压源供电电压(稳压源选择能够显示通道电流),根据供电线正负引脚定义,正确连接板卡至稳压源(这步可能需要我们自己用剥线钳拨一根黑的和一根红的线,并焊接一段至板卡上),将板卡妥善放置(如果调试系统涉及有多个板卡,建议用亚克力板搭一个调试塔),上电前测量电地是否短路。
连接仿真器至板卡,常见的仿真器有Jlink,ST-link等,他们通过板卡上预留的接口与电脑相连,电脑在使用仿真器之前需要安装相应的驱动,仿真器能够提供固件下载,在线仿真等功能。Jlink内部有一个跳线帽,可以跳接选择是否供电。
调试口连接。一般的板卡都会留有调试串口供MCU向外打印调试信息,一般都是TTL电平输出,需要我们准备TTL转USB的小板,按照线序正确连接小板至我们需要调试的板卡(一般是TXRX交叉连接),然后将小板USB接口插入电脑,并正确安装小板驱动。常见的驱动安装问题在网络上都能搜索到。串口如果不通,先判断线是否接对,可以尝试TXRX交换。然后判断包括波特率在内的一些基本参数板卡与电脑配置是否一致。
软件环境
集成开发环境(IDE)。STM32的片子用Keil,也有一些用IAR;Ti的片子用CCS;NXP的用MCUXpresso;不同的芯片厂商针对自己的芯片会提供不同的集成开发环境,但是所有的集成开发环境都有工程管理、代码编辑、编译、下载、程序在线仿真等功能。利用程序在线仿真,我们能调试一些诸如死机等疑难杂症。不要害怕接触一个新的集成开发环境,这对我们嵌入式工程师来说是常态。
调试工具。一些通用的串口/网口调试工具,能够帮助我们看到原始的网络报文信息,建立TCP链接发送\接收业务协议,或者发送一些AT指令和打印一些Log信息。我们还需要准备一个上位机开发的环境,看您是C#还是QT,抑或是Python熟悉,因为我们仅在一些开发默契可能需要提供给测试一些小的工具,所以用什么语言无所谓,看您什么顺手。
虚拟机。如果您的板卡上跑的是Linux系统,那么大概率您需要在电脑上安装一个虚拟机,并在虚拟机上运行Ubuntu操作系统。我们需要在虚拟机上编译裁剪Linux系统代码,并将其烧录到板卡上,同时我们还需要搭建交叉编译环境,将我们开发的业务软件安装到系统上。
一些年初和年终的想法
2022年这一年,工作地的调整让我本人除了技术方面,其实更多的是一些“情商”方面的提升。我学习到了很多工作上的方式方法和处理原则,单每一条都再写一篇博文了。同时我还认识了不少与我有着相似学习,工作和生活经历的人,让我对我现在的生活又有了一些新的认识。
厚积薄发,只有不断的积累才能不惧改变。
知行合一,只有全力以赴才能不留遗憾。
宽以待人,只有善良的交际才能留下真诚的朋友。
2023年,预测一下我们这个嵌入式这个行当的一些关键字吧。
L2级别自动驾驶前装渗透率不断提升,逐渐迈向L3/4
工业物联网数字化
国产替代
融合
最后,让我用下面用一段Matlab代码,来结束这一篇博文吧。
f=@(x,y,z)(x.^2+ (9./4).*y.^2 + z.^2 - 1).^3 - x.^2.*z.^3 - (9./80).*y.^2.*z.^3;
[x,y,z]=meshgrid(linspace(-3,3));
val=f(x,y,z);
[p,v]=isosurface(x,y,z,val,0);
patch('faces',p,'vertices',v,'facevertexcdata',jet(size(v,1)),'facecolor','w','edgecolor','flat');
view(3);grid on;axis equal;