嵌入式软件工程师去芯片公司好吗?

来自:老猿漫说(微信号:monkey-talk-view),作者:老猿

元旦已过,还有一个多月就是春节,每年的这个时候有心换份工作的、HR、猎头最为活跃,如果你有一定的工作经验,最近又在各大招聘网站上更新了简历,相信电话已经快被打爆了。

最近两年,IT行业比较火的方向大家也很清楚,比如大数据、机器学习、芯片相关的公司和行业。 

对于大部分嵌入式软件工程师,大数据和机器学习虽然薪水很高,但是不太适合,毕竟方向不同,而芯片公司(芯片设计公司)是最相关的,再加上这几年国家大力发展芯片行业,这方面的人才又不是非常多,所以待遇上相对比较丰厚。 

那么嵌入式软件工程师适合去芯片公司发展吗?以下一些拙见,希望对大家能有些参考价值。

背景

芯片应用产业的需求降低

这里的芯片应用指的是使用其它公司的芯片开发功能模块或者整机产品,比如蓝牙和WIFI模块、手机、工业控制系统等,产品中使用的全部都是其它公司的芯片。 

这个行业的变化趋势是,为了加速芯片使用方产品快速上市,芯片厂商都尽最大程度提供自己的开发套件或者应用源码,从无操作系统的裸机程序到Linux下的驱动或者整套BSP等。这就导致嵌入式软件工程师所需要开发的内容越来越少,10几年前很多ARM或者单片机芯片的接口驱动都不完整、不完善,需要应用的工程师根据datasheet和自己的需求再进行二次开发。而现在高端的芯片厂商都会提供Linux的源码,完美适配自己的芯片,而低端的像STM32系统又有完整的开发包,应用工程师只需要根据自己的需求调用相应的接口函数就可以,主要工作都在业务流程上,工作量比之前少了很多。

芯片研发产业的需求增加

由于国家政策大力发展芯片行业,再加上国内相关技术水平以及设备得到提高,芯片公司越来越多,嵌入式工程师可能听到的芯片公司有:展讯、海思、瑞芯微(由于方向不同,关注点不同,IC设计工程师最熟悉的不见得是这几家)。另外还有一些做专用芯片的公司,比如做蓝牙、USB通信芯片的公司等。 

来看几张图: 

[2007~2016 年 A 股半导体行业企业年均研发费用及其占平均营收比例持续增长]


[半导体产业分类]


[集成电路分类]


在集成电路分类中设计微处理器的芯片公司是需要嵌入式软件开发工程师去开发固件(firmware)和BSP的,上面的信息讲到的,芯片公司对固件和BSP的开发度越来越高,人才需求越来越大,另外,由于这方面的工作需要对芯片的总线、通信协议的时序等更加了解,所以对于应聘者的技术水平要求相对较高,待遇自然也会更高。

趋势

从以上两个因素能够看到,嵌入式软件工程师由于工作内容上的变化,以及自己能力足以满足芯片公司的需求,跳到芯片公司也许是一个不错的选择。

芯片公司嵌入式软件工程师的工作

既然提到是否适合去,那么就一定要先知道去了做什么。

工作内容

芯片公司的嵌入式软件开发工作内容大致分为两种:基础功能开发和BSP开发。

基础功能开发

指的是IC设计人员在FPGA上开发好相应的功能或者芯片流片完成后,嵌入式软件工程师负责用C语言来实现其功能达到验证的目的。比如,开发了一个UART功能,那么你就要写程序实现UART的通信,如果是I2C接口,就要实现I2C与外设的通信交互,这部分内容有些和很多年前的嵌入式软件工程师的部分工作很像。 

如果这个芯片是需要运行Linux等操作系统,那么基础功能开发的工程师工作基本至此为止,尤其是在比较大公司更是如此,适配BSP的工作是由BSP组来完成的。 

而如果这个芯片并不是那种高端的处理器,即不需要运行Linux操作系统的,只是实现WIFI、蓝牙等功能,那么就和早些年的嵌入式软件工程师完全相同了,基础功能加上适当的业务流程,就完成了整个芯片的开发任务。 

另外,如果是像以销售STM32这类芯片为目的公司,嵌入式软件工程师会负责开发全部的芯片应用包,提供芯片各种外设的驱动接口函数以及sample等。

BSP开发

如果是需要运行Linux操作系统的处理器,比如手机芯片,那么基础开发过后,还要有Linux BSP开发的任务,这个就非常全面了,包含芯片内核、时钟、电源管理、接口驱动等。

工作流程

这个通常是两个比较极端的状态,取决于所负责的模块是否为通用型以及是否为购买的成熟IP。 

  1. 如果是购买的成熟通用IP,比如I2C,那么只要测试一两个外设通信成功,证明IC设计人员总线连接正确基本就没有太大问题了,所需要额外注意的是关于中断异常等的处理是否正常。 

  2. 如果是自主开发的IP,不管其是否为通用型功能,都会复杂很多,你要连接很多时序不同的外设去验证其兼容性,充分考虑并验证各种可能出现的问题,这就需要有非常丰富的经验了。

如果是自主开发且特殊功能的IP,这里有一个比较尴尬的工作流程,可能是这样的: 
1. FPGA上已经有IC设计人员开发的IP,你拿过来写C语言实现功能并验证。(寄存器说明是否完整?就当成完整吧,不完整再去问) 
2. 你写了一个小时的程序(这个程序也可以提前写),上电调试,什么?不正常? 
3. debug半个小时。 
4. 找IC设计工程师说“我调试了,一直不正常”,他跑过来跟和你一起看了10分钟代码,然后说“这个bit设置1试试…那个bit设置0试试…”。 
5. 20分钟后,还是没结果,找IC验证的人仿真波形看看吧。 
6. 1个小时后仿真波形出来了。 
7. IC人员看了半个小时波形,“哦,原来是这么回事”。 
8. 然后他继续花20分钟修改、编译代码并下载到FPGA上。 
9. 好了,你再调试看看。 
10. 如果这次没错,可以一次通过;如果有错,重复以上步骤,直至功能正常。 
所以有这样一个循环:

while(1// 注意,这里是while(1)
{    
    if (step1() == true)
        break;
    step2();
    step3();
    if (step4() == true)
        break;
    step5();
    step6();
    step7();
    step8();
    step9();
    step10();
}

解读

工作性质

所从事的工作很纯粹,其中做基础开发验证的人员表现更为明显,只需要实现所负责模块该有的功能,不需要管复杂的用户需求和业务流程。

所能掌握的核心技术

  • 通用型IP不能让你掌握什核心技术,在芯片应用的公司你也完全可以找一个Linux的BSP研究里边的各个环节。

  • 自主研发的IP,很抱歉,这很可能是公司的命脉、绝对机密,分别掌握在部分IC设计人员和算法工程师手中,嵌入式软件开发的工程师,只负责写C语言去实现功能和验证就好了。过程中想了解这个寄存器为什么这么设置?不能告诉你,你只需要知道这么设置就可以,正所谓“知其然,不知道其所以然”,其它公司同功能的芯片又完全是另一种实现方式,无法通用。

技能提升

如果想一直在芯片公司工作,那么在这里所提升的调试和分析问题的经验,以及总线知识,会对日后的工作有所帮助。 

而如果不想一直在芯片公司工作,芯片公司所特有的经验对以后的工作不会有太大帮助,而非特有的,大多在其它芯片应用类型的公司也能得到提升,比如BSP中接口驱动的开发。

待遇

因为岗位要求员工有比较丰富的底层经验,并且敢于做芯片的公司还是比较有资本的,所以薪资方面会比其它嵌入式工程师职位高。

压力

与其它公司的产品竞争问题是每个公司都需要面对的问题,在这方面芯片设计公司也不可逃避,差异是芯片公司相对来讲因为都是自有知识产权的方案,再加上芯片公司入门比较高和运作成本高,所以同行业竞争相对会小一些,也不用担心自己的方案刚出来就被其它公司抄去。(这里指的是特殊功能的芯片,通用处理器芯片竞争同样激烈) 

但是它也有自己的缺点,容错性非常的低,如果是开发一款APP,哪怕投入市场甚至到终端用户手中也可以再更新,而芯片一旦流片就不能再修改,流片之前如果没验证好,就意味着几百万的资金以及几个月的时间损失,所以压力也是不小的,即使IC设计人员会承担很大一部分责任。这就好比APP上线后发现重大BUG,测试部门会没有责任吗?

嵌入式软件工程师去芯片公司好吗?

交待完前边的这些背景和分析,终于回到这个问题上了,那么答案是什么? 

这个要根据自身情况来分析,有些人就是喜欢专心地写写代码,只想把自己的开发工作完成,不想与客户打交道,不想动不动就改需求,那么芯片公司是个不错的选择,且很多即使是芯片应用的大公司里的情况也基本上是这样,应该不会感到太不适应。 

相反的情况则不太适合,一位同事形容这份工作为“我们是制造积木的,不是用积木搭房子”。 

如果你想看到自己开发的整机产品,也就是房子,而非积木,并且在其中起到关键作用,那么最好是不要去芯片公司,因为你的架构能力不能得到充分发挥、你对产品的敏感度很难得以利用,专业技能上的提升也有限。

做选择时,我们不妨将分析的情况填入下表,然后找到自己更注重的几点进行评估。

 优点缺点

芯片公司

(芯片设计)

1.
2.
3.
1.
2.
3.

其它公司

(应用芯片)

1.
2.
3.
1.
2.
3.

结语

虽说,干一行爱一行,但是选择一份适合自己的工作才能发挥自己的最大潜能。 
以上是根据我在一家芯片公司就职一年半对于相关工作的理解,可能会有些片面,不过分析过程中已尽力保持客观,并且那是一家创业型公司,可能和成熟的大公司有些差别。

另外需要注意的是不管是芯片设计公司还是应用芯片的公司,规模不同、发展阶段不同(刚创业、融资X轮、已上市公司),工作的开展都会有一定差异,但是主要内容不会有太大偏差。

推荐↓↓↓
程序猿
上一篇:嵌入式软件工程师适合去芯片公司吗? 下一篇:三年半 Java 后端鹅厂面试经历