2019嵌入式之路的反思

1 嵌入式岗位的总结

嵌入式的定义很模糊,尤其是这几年发展出众多的应用形式,让人摸不着头脑。对于想进入这个地方的新人,有种望而却步的感觉。我来总结一下有关于嵌入式,从最根源开始到最终端的岗位:

1.1 半导体公司的芯片级工作

编译器->BSP包->AE职位->FAE职位

我们在使用嵌入式的时候,使用STM32会有各种各样的库,这些库的开发都是原厂提供了。那么在半导体公司涉及嵌入式的岗位有什么呢?大体上可以分为四大环节,编译器、板级支持包和demo开发及技术支持,每个里面还有子系列,就不具体说了。

1)编译器岗位

底层纯指令集平台,处理器编译工具链开发,

2)BSP/Firmware工程师

arm公司的CPU Embedded System Solution Engineers/ CPU Software / CPU IP / SoC solution 就是处理这个岗位的, 职能就是为芯片提供板级支持包,开发系统Linux/Android这些固件驱动、处理器和操作系统级的贴合,比如OMAPL平台的多核通信组件就是这个职位开发。

3)AE-应用工程师

出demo的工程师各种各样的示例代码,芯片资料里面的example都是这个职位开发的。

4) FAE-现场支持技术应用工程师

现场技术支持工程师,把AE的开发的代码交给下游客户公司,并且反馈下游公司的需求。

1.2 B应用级-社会最多的岗位

裸机(无操作系统)->(应用级->驱动级)(有操作系统)

这个就是比较普遍,在社会上比比皆是,他们可以称为:嵌入式软件工程师、嵌入式应用工程师、嵌入式技术工程师这类的,也有一些公司把物联网工程师也划到这里面,工作环节为:把握主流处理器特性,和业务对接,根据需求选择最高性价比的解决方案,利用半导体公司开发的示例demo进行评估,修改,扩充或者组合。

1)裸机开发工程师

数字电路+单片机接口+C语言开发+stm32这类的单片机裸机开发,实现最基本的业务,能看懂原理图,也会动手画一些简单的模拟数字的板子,焊一些板子(这是一般的毕业大学生的水平)

2)Linux/Android系统嵌入式工程师

这一部分人上系统了,不太拘泥于接口如何,但裸机开发工程师的工作都会,重点还会放在系统上面,移植Linux,配置开发环境,移植boot,好一点的能删减一些内核,删减一下boot这类的,在嵌入式linux上搭建一些服务。然后会C++,可以使用Qt,GTK框架开发软件解决基本需求,移植常用的openCV这些开源库做要求不高和不细的工作。

3)驱动开发工程师

这部分在Linux/Android的基础上开始进行内核级驱动的开发,调用Linux内核中的各个机制,理解死锁、并发、原子操作,能够开发字符驱动、块驱动完成嵌入式系统的深度定制。

1.3 算法级:专业算法+平台

算法不同于计算机或者大数据这类的算法工程师,那个工程师把重点放在算法内容本身不考虑平台特性。而嵌入式的算法工程师做起来就比较别扭,因为需要和嵌入式应用工程师配合,也要基于嵌入式平台,嵌入式本身就是一个阉割的计算机,性能和内存不如一般计算机大,故考虑的问题比较多。算法级常常是图像、通信、控制专业领域。

2 嵌入式行业的一些预测看法

从关注上游半导体公司的角度,来说一下对嵌入式行业的预测:

(一)嵌入式的发展大方向-SoC将是主流

当前的主流可以按照两个类型进行分割:裸机系列和有系统系列。第一种,裸机系列很容易理解,比如C51、MSP430、PIC这样的品种繁多的单片机,开发过程和方法基本相同,使用半导体厂商提供的BSP包,按照手册进行寄存器配置,对周围数字芯片的各个协议工作方式了解,就能解决一些功能单一的需求;跑系统系列基本上就是Linux、Android这样的非实时操作系统和一些实时操作系统,操作系统的多任务、完善管理机制就开始谈及芯片的架构和指令,PowerPC、ARM,MIPS等等等,这些处理器芯片常常用于解决复杂的需求,并将需求定制交给熟悉业务和技术的嵌入式应用工程师或者CS行业工程师,这样就可以完美和计算机开发者相结合制造出多种多样的功能设备。这样看的话,操作系统可以说是在嵌入式行业和计算机行业打通的一个桥梁。

传统的嵌入式基本上就是这样的,稍微的预测一下呢?

C51、MSP430、PIC这类的开发必定会淘汰,不是说它们不够锋利,而是由半导体行业的特性所决定的。半导体器件生产成本是按照规生产模数量所摊薄的,生产的越多,需求越多,成本越低,未来基于MSP430、C51的这样的实时性稍微有松弛的场景,也会可能选择一个ARM的以Cortex-M为核心的处理器(arm的授权费真的低到不行了,真算是业界良心),生产规模上升,成本则下降,且方便日后扩展,再然后Cortex-M核心arm公司也是在不断投入成本优化,上上的选择。

从裸机的发展上我们就可以看到一个发展方向,SoC模式的思想。核心架构交给专业的公司去做,自己公司做擅长的一块,然后这些功能部件全部都集成在一个芯片里。比如,今年参加的arm公司关于芯片IP的培训,也认真听了一些新的创业半导体公司的介绍,学习到了很多,也打开了我另一个世界的大门。其中在一个物联网案例中,有一个公司他们是做NB无线传输的,处理器核心采用的是arm公司的,他还特意感谢了arm公司,arm公司在提供demo评估自己芯片到流片的时候是不收费用的,量产后才交费用,这大大的降低了做企业的风险。这个公司选择arm公司成熟的cortex-a系列处理器的核心的方案,自己专注做NB无线基带,调制解调算法MAC层,最后融合成一个芯片,然后流片,回片测试。这是一个物联网的芯片的案例,用的就是SoC模式。SoC模式将一整套系统做成一个芯片,就好像曾经把复杂的巨大模电数电的放大电路做成芯片一样。在物联网的应用上,嵌入式SoC,未来必然成趋势,嵌入式和物联网的关系实际上大家都清楚,很不负责任和不准确的说,嵌入式+CS+互联网,上中下组成的大规模网络可叫物联网,嵌入式在物联网布局中处于底层的地位,大规模布局这就有体积小、寿命长、低功耗这些基本要求,SoC模式肯定是首选,缺不了处理器,缺不了无线,做进一个芯片不刚刚好麽。

谈到SoC 模式,很多人都觉得大部分工作量其实在半导体上,嵌入式软件开发似乎没有用武之地,其实不然,反而对于嵌入式软件开发的要求又更上了一层楼。就说一个例子,多核、多层的SoC早在零几年的时候有这样成型的产品,比如TI公司的OMAPL138,DSP(C6748)+ARM(ARM9)架构的,在嵌入式软件上,面临的难以解决的问题就是核间通信,DSP和ARM如何通信,包括现在有名的ZYNQ,FPGA+ARM的多核异构平台,多核心之间通信如何解决,这始终需要去解决,还有,英伟达的TX2,SoC级上面ARM Cortex-A5x系列+自己的GPU。很多人采用的是Linux内核里面一个模型,IPC,常常用在裸机上。如果上操作系统,Linux系统对于多核异构的通信,TI使用syslink驱动级的组件,zynq采用ram内存读取的方法反包装出接口。这些开发对于多核通信应用级的都很难,更别说开发出这样的BSP支持的了。

未来嵌入式,不单单是对于传统的CPU+外设模块,通过外设总线驱动读取外部数据,而是打入到芯片内部,一块芯片,即一个系统。而开发的重点,也不单单是传统的那些嵌入式的知识,还要包含半导体SoC的知识。驱动开发需求会加大,嵌入式将越来越集成化,越来越脱离周边硬件,且深度整合,由外向内发展,SoC将是主流

(二)Linux内核重要性与嵌入式应用工程师的危机

应对上面SoC的发展趋势,一个单纯的嵌入式软件工程师已经满足不了需求,也随着技术迭代,这些名称的定义又赋予新的意义,这些传统的技能已跟不上潮流,身为行业人也要跟着风头做出转变。嵌入式是一个要不断学习不断反思的路线,个人的技术树上还要不断的开枝散叶,越来越集成化的开发平台过时的很快,就要求我们开出的技能枝叶更多,所以不能拘泥于某个公司的某个产品上,不能以C语言为天,但也应该注重基础。

Linux内核好厚的一本书,翻开第一页的前言那个作者告诉我们这还不是全部,如果把内核全部都写成书是不可能,只能去学习介绍最核心的东西。对于Linux内核,可以毫无遮掩的说这是全天下最好的工程师编写的最好的代码,一手的好学习资料。我们学习内核不是要学习内核怎么编写,而是要掌握里面的模型和机制,分页、内核调度和内存管理、死锁等等, 这些机制模型可以嵌套在我们的任何解决方案中,就比如上面异构多核通信的机制,使用的IPC概念反复在Linux内核中出现,在某些场景下就可以抽象成一些模型。当然了,以上说的只是内核的附带的好处,最重要的就是,Linux内核和处理器核心深深绑定,Linux驱动和SoC周边绑定。从这句话中,你是否能体会到,现在的嵌入式开发是,物理上用外设总线和外设相连,然后编写C语言程序,然后烧写到FLASH里,然后去驱动外设传感器实现某一个功能;而未来的嵌入式开发在SoC上都是一个芯片内,即将依托操作系统,开发将要不断的深入内核中和修改Linux驱动去实现功能,留出接口,高度集成之后那些应用层的开发东西交由CS去做,实现业务层面的黏连,出现了不同以往的分工。所以所谓的嵌入式应用工程师,这个职位很可能在未来会消失不见,这就是高级程度的体现后的变化。

嵌入式开发的门槛即将越来越高,阶级也将割裂,产生一个泾渭分明的分水岭嵌入式和CS那些模糊不清的界限也会逐渐清晰。我举个例子,我真的很久很久没用STM32了,有幸参加了意法半导体组织的全国巡回一个会议,意法的工程师给我们展示了他们公司可视化开发的操作,鼠标一点那个引脚,时钟多少,用了什么外设,启动多少定时器,哪个会冲突,然后生成代码,这样向导式生成的代码又好用又标准。那一刻感慨道,还要嵌入式应用工程师做什么呢?点点鼠标钱就赚到了。可这件事情怎么可能,当意法开发出这样的工具时候,自己的芯片好卖了,一部分人乐了,一部分人也哭了。甄嬛传里面,姐姐杀了姐姐,这个也一样,程序员让程序员失业,挺搞笑的,也挺残酷的。是的,意法半导体这个已经能体现出对于裸机开发的风气,TI的网页版配置方法都不需要你下载任何软件。因此你也可以看到,处于上游公司的职位一定程度上可以决定下游公司职位的命运

嵌入式进程不断的进化,学习量也会迅猛增加,既然SoC前景这么好,直接从SoC学起可否?可要知道,在这个混沌不清的嵌入式年代,都要一步步学上来,硬件还是从电阻电容,然后到数字电路、单片机;软件还是要从printf hello world,到指针结构体,甚至要学C++;理论还是要数据结构到一些常规算法;Linux系统还是要从熟练应用到研究它的内核。一步都不能少。这也正是嵌入式所谓坑的一点原因吧,但还是中国老祖宗那种辩证思想,塞翁失马焉知非福,学这么多门槛也高,将来分水岭一形成,你来决定别人的命运,而学习少且赚钱的维持不了几年肯定人也是膨胀,寻常人不走的路才有好风景呀,相信你总有怡然自得和庆幸的时段。还有对于嵌入式行业把脉的人,预测其药丸,实际上还不如说他们看到的是静态的嵌入式,怎么说,就好比蛇脱皮,留下干涸的一层蛇形的皮,真身早跑了。嵌入式的概念也会随着时代迁移且与时俱进,形式也会变换,它是活的,不是固定的。

补充一下:

今年10月份的时候收到NVIDIA的职位邀请,基本上Linux驱动开发都是进SoC,而和HR沟通,他们Team Leader给的筛选简历关键词基本要有:内核,驱动 这样的词语

img

arm公司在深圳的核心团队,就是做cpu的,招收的cpu software应届毕业生工程师岗位:要么是C/C++系列,要么是Verilog系列,要求都是很变态的。

img

img

我们通过观察最上游的半导体公司,就能看出未来发展的路径,而看现在刚需的那些一列列职位看不出什么的。忘记谁跟我说的了,上游决定下游,且有一定的延迟,这个延迟时间正是给你的时间,否则就会被无情的淘汰掉。

所以给的建议是在下游公司做嵌入式应用的人做好应对,能上系统就上系统。

(三)一分感慨:那些“刻苦人”的思维定式

我可以大言不惭的说自己是一个比较刻苦的人吧,学业时段基本上没有什么娱乐项目,都是敲代码焊板子看看行业趋势这类的,就希望有朝一日进入职场里面能“笨鸟先飞”。其实这样或多或少的产生了一种思维定式,包括进入职场,我无法忘记曾经那些努力,不希望那些努力白费去从事一个完全陌生还有些许相关的职位,这样就会错过很多的机会。这种把持着的安全感实际上也不是很好,也非常希望那些刻苦的职场新人能够大胆的去尝试,open自己,毕竟在学校的眼界是狭窄的,我们也只是按照自己的路子和道听途书的路子再走,可实际面对自己的道路是不尽相同,机会也不尽相同。放弃自己所学是艰难的,可有的时候真的需要勇敢迈出这一步,去体验新的平台的知识,其实到最后发现,学习能力是关键的,自己曾经学的到后来都是相通的,没有白不白学一说。可能,我在学校学习的是嵌入式软件开发,可公司要求我学习半导体里面的ip知识,是有些许关联,但不应该去拒绝,而应该大胆尝试,毕竟公司平台要高于当时你的眼界,当时也是怀揣着对现在生活的猜想去努力的,现在到了这个平台上就该接受一切现实,努力踏实工作,而不是放不下过去。

猜你喜欢

转载自www.cnblogs.com/sigma0/p/10313827.html