做者:嵌入式老鸟火哥 受权转载于公众号嵌入式老鸟的职场之道(ID: ict_embedded),有增长内容和修改。linux
最近不少童鞋投票并咨询如何从单片机转为嵌入式Linux开发。看来读者圈中作单片机,RTOS的很多。尽管火哥目前从事Linux/Android方面的嵌入式开发工做,可是读书的时候也有5年左右单片机裸机和RTOS经验,以前面试也拿过一些作单片机stm32开发的offer, 因此今天分享关于单片机是否要转嵌入式Linux的一些观点。面试
1、你真的决定要转嵌入式Linux吗?算法
要不要从单片机转嵌入式Linux是一个影响到职业发展的严肃决策,火哥不能帮你拿主意,只能帮你列出利弊,你须要根据自身的各类环境(好比所在城市Linux嵌入式相关岗位多吗?是否决定背井离乡去北上深发展等等)作出最有利的决策。shell
火哥的观点并非Linux嵌入式绝对比单片机开发职业发展好,只是根据自身的一些经历,给出一些见解。数据库
1. 单片机开发相对于Linux嵌入式最大的劣势在于基层的打工岗位平均薪资偏低编程
我想这是大部分单片机工程师想转嵌入式Linux的最主要的缘由。技术自己各有优劣,可是就基层打工而言,在同一座城市,就打工而言,单片机的薪资比嵌入式Linux低30%到50%。安全
也许不少有会拿某些作单片机的高薪的老板(好比野火的火哥,周立功等)或者一些公司高管的薪资和作嵌入式Linux打工的工程师对比,证实单片机也能够拿高薪。服务器
可是他们都犯了田忌赛马的错误,拿别人的上等马和本身的中等马对比,火哥认为这种田忌赛马的比较很是不切实际,基层打工的就应该和基层打工的的对比。网络
目前火哥调查到状况来看,在深圳的基层就业市场,单片机(含RTOS)开发的起步薪资在6K-7K, 通常人到15K就是高薪,很难突破。数据结构
20K以上的单片机offer也有,可是不多,最多也见过25K的单片机offer,可是那都是有名企,名校或者其余业务背景换来的,通常人真拿不到。嵌入式Linux/Android这块,薪资相对高很多,起步价12K很正常,工做2年通常都能突破15K,3-5年突破20K甚至到25K也是不少的,5年以上去一线土豪大厂(华为、OPPO、VIVO等)能够到30K,若是在手机大厂作到模块owner专家,突破40K也是能够有,可是在往上就有点难了。
总体来看,同档次的基层打工者,嵌入式Linux薪资比单片机开发仍是高很多,单片机15K就会遇到瓶颈,突破20K就很难了,嵌入式Linux突破20K并非难事,到25K以上才遇到瓶颈。
2. 你所在的城市嵌入式Linux岗位多吗?
我以为这是影响你作决定的另外一个大问题。咱们学嵌入式Linux这门技术,绝大部分人是为了从事相关的工做,而不是陶冶情操。可是根据火哥统计来看,嵌入式Linux的广泛薪资虽然高于单片机,可是就业岗位并无单片机那么多。
深圳目测是嵌入式Linux就业机会最多的城市,可是单片机机会看起来彷佛更多,在深圳,单片机和Linux岗位数量对比大概6比4。
从嵌入式Linux城市的岗位数量来看,依次是深圳 > 上海 > 北京 > 成都 = 杭州 = 苏州 > 东莞(华为加持)>= 珠海 >= 南京 = 广州 = 武汉 = 西安 = 福州 = 厦门 > 佛山 = 长沙 = 天津 = 合肥 > 其它, 在其它城市我就不多了解到作嵌入式Linux开发相关的岗位。
因此若是你要考虑转行,首先考虑是否愿意背景离乡去以上几个城市工做。不然哪怕你学了牛逼的Linux技术,可能也会在当地找不到对口不得不继续从事单片机开发。
3. 单片机虽然待遇较低,可是就业机会更多,对大龄求职者相对友好
这点其实并不矛盾,作单片机各行各业的小公司特别多 (固然像格力,美的这种传统家电大厂也有,可是华为、商汤等新兴高科技大厂不多招单片机),业务多种多样,须要的人更多,可是通常小厂可能资金并不充裕,给不起人才高价,加上单片机开发门槛较低(不考虑产品稳定性,EMC等有工做经验天然会知道的概念,仅指学习使用单片机干活编程的培养门槛), 培养周期比较短(大二学生一个暑假的功夫),因此致使中低端能干活的人仍是挺多,拉低平均薪资。
但这就像富士康同样,招人多,但抱怨缺人,老板就是不想把待遇提上去,要控制成本,这是缺人可是待遇低之间一种永远存在的矛盾。可是对大龄求职者来讲,因为单片机岗位实在是多,不少小厂真的很难以高的性价比招到优秀的人,在小厂也没有HR插手作人力资源规划、年龄梯队建设,反而在年龄上卡的不严,大龄求职者只要薪资不挑,也能找到一份工做,因此相对于作Linux的大厂,对年龄问题比较宽容一些(可能因为单片机有点历史了,大龄从业者也多)。
4. 单片机也有一些较高薪职位
在单片机工程师眼中,20k以上就算是高薪,以这个为标准,火哥也见过一些较高薪的职位,可是这里面有些特殊的要求。
某家作智能门锁STM32 RTOS的公司给火哥开过20K的offer,主要是由于公司但愿招的技术人员都有985 211以上学历背景,这样沟通起来可能观念比较一致,因此薪资能给到20k。
另外还有一家明星独角兽创业公司给过25K的单片机offer, 可是前提要求是能在Linux环境下开发单片机,并且面试难度较高,原本25K要价超出他们预期了,他们不肯意给这么多,后来火哥吊着他们一个星期,谎称拿到华为同等价格的offer,他们才最终答应给25K的offer。
剩下火哥还了解到有年薪80w的单片机高级工程师(掌握某些行业特殊的认证标准)。可是总体来讲,单片机较高薪的offer确实不容易拿到,并且拿到也不只仅是由于你的单片机技术好,解bug能力强,而是由于你的背景,学历,有其它offer抬价,掌握特殊的业务竞争力等等(关于嵌入式业务竞争力能够读读火哥上一篇关于嵌入式竞争力的文章),这些特殊业务和文凭,背景都不是能靠当下本身砸时间努力看书学习写代码就能轻易获取的。若是能单单靠本身砸时间努力就能获取的技术就不是啥门槛性的技术。
列举了以上这几点,要不要从单片机开发转嵌入式Linux相信你也应该能够下决定了。
2、 单片机和嵌入式Linux开发到底有什么异同
1. 单片机转嵌入式Linux保留的优点主要在于熟练的C语言编程能力以及丰富的底层软件与硬件接口的调试经验。
由于Linux内核自己就是C语言编写的,Linux底层应用程序大部分也是C语言的,通常有单片机开发经验的,C语言应该不是问题,因此在切换的过程当中,不须要考虑语言的切换,固然若是没有系统学过数据结构(火哥认为数据结构是熟悉C语言必不可少的内容,哪怕单片机也要懂数据结构),可能须要补补。
另外有uCOS FreeRTOS这类的实时操做系统开发经验就更好,至少在看大规模C语言代码的时候不惧怕(其实懂uCOS内核也不表明能立刻掌握Linux内核,Linux内核真的复杂太多,设计理念也很不同)。
另外丰富的单片机底层调试与寄存器配置经验,可能帮助你在学习Linux嵌入式开发的时候能快速定位底层的一些问题,节约时间。
2. 单片机转Linux嵌入式须要熟悉一套风格迥异的开发环境
对于大部分单片机工程师而言,都是在Windows上用IDE环境开发单片机程序为主(不排除有些公司已经使用Linux开发单片机了),Ubuntu这类Linux系统接触比较少,因此大家要越过的第一关并非Linux内核源码,而是如何使用Ubuntu这种Linux系统。
由于在Debian Ubuntu CentOS 等各类Linux系统作软件开发,主要都是经过命令行操做,而不是鼠标界面点击。而且Linux系统里面的应用软件不像Windows里面的IDE这样给你集成好了,点击就能用,Linux里面不少Makefile之类的编译脚本以及Samba, SSH Server等各类服务,arm-linux-gcc等各类编译连接工具,就像IDE软件里面的各个组件,须要本身从新组装使用,而且用的时候可能有各类环境甚至编译问题(开源软件猛糙快就是这样),须要本身折腾花费很多时间。
因此对于Linux入门者,哪怕你有丰富的单片机C语言经验,折腾起来也挺耗时间,须要克服心理的障碍,Linux系统开发环境就像一匹不听话的烈马,驯服他才能发挥出它的价值,而Windows系统开发环境更像一匹听话的普通马。
3. 嵌入式Linux开发代码的掌控程度远低于单片机开发,单片机转Linux须要适应如何在这种低掌控度的不安全感中进行开发
作单片机开发,包括RTOS, 通常代码量最多几万行,哪怕不是每行代码都读过,也基本可以精确掌控每一个模块,大概哪里出了bug,做为开发者很容易定位。
而作嵌入式Linux开发,单独Linux内核就有几百万甚至上千万行,还不包括各类你不熟悉的应用层的开源库,这致使大部分代码都不可能掌控。
嵌入式Linux的开发模式就是在这种大部分代码都不是你开发的,你也掌控不了大部分代码的状况下开发驱动或者应用,你常常会遇到不熟悉的东西须要各类搜索问人,这种开发模式,会把人置于一种不安之谷当中,不少你使用的函数你并不知道它的实现细节,可能工做机制都只是略懂。
在这种模式下开发须要很好的搜索,沟通,团队协做能力,不能再像单片机那样一我的全局掌控,蒙着头开发了,这种不可掌控的不安全感是单片机工程师往Linux嵌入式工程师发展过程当中最须要适应的。
4. 嵌入式Linux开发须要有大局观,不用迷失在细节的丛林找不到方向和出口
不少单片机工程师有个思惟习惯,编程时喜欢细抠到每一个寄存器的工做原理,每一个功能的实现细节逻辑,每一个if else都不放过。
这在Linux嵌入式学习中将很是耗费时间,是事倍功半的作法。注重细节当然好,可是当系统庞大到一种程度的时候,过于注重细节的人,每每很难驾驭这个系统。
我看到不少初学者,每一个寄存器,连接脚本的每种写法都要去纠结好久,好比芯片启动方式,生搬硬套把2440的启动流程做为芯片启动的惟一真理,到处往其余芯片套。却不知不少东西都是人为约定的一些习惯性作法,每家公司的芯片有本身的特色,流程是死的,人是活的。
掌握大局观,让本身迅速熟悉整个系统的知识,不少细节上习惯性的东西天然而然就明白了,对整个系统的掌控力度就高了,遇到具体阻碍你前进的细节问题,再去尝试处理。掌控并不意味着你知道每行代码每一个寄存器的意思,可是你能让整个系统按照你的想法去运行。
3、 单片机转嵌入式Linux大概须要学哪些基本的知识
吹了这么多水,到了真正上干货的时候了,从单片机转Linux嵌入式到底须要学些啥。若是没有这一段,火哥真怕你下定转行决心以后,立刻拿起一本Linux内核架构与实现的书,觉得像学uCOS等RTOS系统同样,都是C语言代码,而后看得云里雾里,从入门到放弃。其实火哥在刚学习Linux嵌入式的,也犯过相似的错误,于是总结了一些经验教训。
1. 你须要花必定时间熟悉如何使用Linux系统进行编程开发
相信不少童鞋都是从小使用Windows电脑长大的,在学计算机编程以前,应该没有接触过Ubuntu等Linux系统,而这个系统又不像Windows那样点点鼠标就听话,须要各类命令行操做。并且系统里面有各类服务和应用工具须要你本身按照需求去配置。
因此学习嵌入式Linux开发不是急于钻进Linux内核代码的海洋中,而是先用好Linux系统。
你能够参考《鸟哥的Linux私房菜》等Linux系统如何安装使用等书籍,学会使用命令行。可是火哥认为学习要有目标性,若是对着《鸟哥的Linux私房菜》一页一页每一个命令学下去,看几天就会枯草乏味了。
因此火哥建议由单片机开发经验的童鞋,第一个目标就是在Linux系统上如何搭建你的单片机开发板交叉环境,编译出一个裸机的Led点灯的程序(不须要跑Linux内核) , 并经过开发板产商提供的工具烧写。
这件事情并不难,网上已经有不少如何在Linux系统下交叉编译单片机程序的文章,尤为是stm32系列的,你能够参考别人的文章作一遍,在这过程当中你将会熟悉各类经常使用的命令,shell, arm-linux-gcc交叉编译工具链,Makefile(能够单独参考陈皓的文章)等Linux编程环境相关的知识,从而开始进入Linux的世界。
2. 你须要知道嵌入式Linux系统是怎么跑起来的,通常由哪些组成部分
相信大部分人转行嵌入式Linux开发并非为了在Linux系统上开发单片机程序,而是想作Linux驱动或者应用开发。在走完入门第一步以后,就不要太纠结那些编译,连接脚本那些文件格式怎么写,而是尽快把精力专一到Linux系统开发。
学习嵌入式Linux系统开发,首先就得知道一个Linux系统如何跑起来,如何把一个Linux系统环境在开发板上搭起来。这牵涉到bootrom, bootloader, uboot, dts, Linux内核,cmdline, rootfs等一系列组件,以及nand启动,nor启动等各类不一样的方式,知道一个Linux嵌入式系统如何工做,再进一步修改添加本身的驱动和应用。
这里有不少实践性的东西,可能须要视频资料带你跑一遍,才能快速入门,火哥以前看的是韦东山老师的嵌入式Linux视频,总共有一二三四期等,有免费试看,也有付费的,直接淘宝联系卖家能够了解,火哥就不贴广告连接了。
另外还有其它视频,火哥没有看过的,就不随便推荐了,在嵌入式Linux学习这块,理论性的知识须要慢慢看书,可是实践性的知识仍是须要视频资料带你操做快速入门,看书和实践循环渐进。
3. 你能够尝试作一些简单的Linux应用和驱动开发了
走完了前面两个步骤,相信你对嵌入式Linux开发有必定专业性认识了。在嵌入式Linux学习这块,火哥更倾向于在作中学,60%实践+40%理论。由于嵌入式Linux里面不少系统环境相关的东西,并非书本上那种严格的理论公式,经过看书很难找到规律,并且在Linux内核里面有一整套GNU(GNU是啥意思本身搜)世界的行话,那些写Linux内核,驱动书籍的技术专家不可能全部行话都给你解释,全部在没有使用和开发经验的前提下就直接打开《Unix环境高级编程》、《Linux设备驱动程序》等大牛的经典书籍,容易让你云里雾里。
火哥建议是,跟着一个视频教程,好比韦东山老师的嵌入式Linux视频,从0开始写一个简单驱动和应用,让本身写的驱动和应用代码跑起来,点亮1个Led灯,先不用管Linux驱动中你调用的那些初始化,注册等框架函数如何实现。
经过实践的过程,熟悉整个代码的运行环境以及Linux开发中的各类行话(系统调用,vfs等等)。这也是让你一步一步取得学习正反馈,提高成就感和学习信心的方法。
其实Linux驱动开发自己并不难(难度不会超过你复变函数课本上的公式),也并不神秘,只不过它一整套行话术语,容易让初学者云里雾里,熟悉这套行话,摆脱恐惧心理,一个智商正常的普通本科生应该是可以掌握的。
4. 你须要补充一些计算机的理论知识
据火哥了解,大部分单片机工程师都是电子、通讯、自动化、机械等专业出身,不多计算机专业的。这些专业的童鞋,相对会缺少计算机专业的基本理论知识,如数据结构,操做系统,计算机组成原理,计算机网络,算法,编译连接的基本原理,数据库等等。
补充理论知识是一个长期的过程(可能须要2-3年),并非要等到计算机的专业理论都学完才能够去找工做,你能够一边补充基础知识一边面试一边找工做,同时检验本身的基础知识。这些基础知识不但能提升你的技术功底,也能帮你经过笔试面试,决定你可否在一线城市突破20K的薪水。
在有了计算机科班的基础知识,以及有必定Linux驱动开发经验以后,Linux内核的学习是有必要的,可是入门的初学者不用急于进入Linux内核源码,内核这块东西仍是挺多的挺艰深的,得花时间边看书边看代码慢慢啃,无法速成,可是Linux内核功底仍是可以提升你的薪资竞争力。
4、 给有工做经验的转行者的建议
1. 有工做的转行者,你的优点是有保底的工做和收入,劣势是没有足够的学习时间自由。有了当前的工做饭碗,不用急着找新工做,你能够保持一个良好的心态,不骄不躁,能够边学习边骑驴找马,找到合适的工做。
固然有工做的人,时间上并不自由,若是你想学的新东西和你当前工做内容并不直接相关,火哥建议你能够先选择一份加班少的工做,这样能够腾出下班后的业余时间来学习嵌入式Linux的新知识。
有工做的人,有了一些小积蓄,缺的是时间,那么在学习上能够适当买一些性价比高的付费视频,加快入门和学习进度,节约宝贵的时间,这也是用金钱换时间。
通常状况下,不须要学精通才出去找工做,学到能够self correct(这个词来源于一个TED关于如何快速自学的演讲), 可以干一些活的状态,就能够出去面试找相关的工做了,Linux嵌入式学习以通用基础知识为主,驱动里面的音视频,通讯协议相关的业务上的知识能够找到相关的工做再补充。
2. 如何在只有单片机经验,没有Linux开发经验的状况下,如何经过社招嵌入式Linux开发工做?
这个对于社招看中相关工做背景的求职者是个头疼的问题,火哥有如下几点建议:
首先,看看公司是否有Linux相关的部门和开发计划,能够主动尝试内部转岗。
第二,看看能不能建议公司技术负责人把单片机开发的环境迁移到Linux系统上,在Linux系统环境上开发单片机,这样至少你在工做中有使用Linux系统的机会。
第三,能够先尝试面一些在Linux环境下开发单片机的公司,面试后询问面试官是否在Linux环境下开发单片机,若是是,能够先加入用Linux开发单片机的公司继续作一段时间单片机,顺便再工做中熟悉一下Linux.
第四,尝试一下面试真正作Linux系统开发的公司一些Bootloader或者固件开发相关的岗位,由于Bootloader和存储控制器,电管管理等固件代码和单片机裸机rtos开发有不少相关性,甚至ARM SOC里面就有单片机核以及相关的固件,用于控制wifi,存储,电源休眠唤醒等相关的功能,这样能保证你可以在新工做中有必定输出贡献,而不是彻底的学习者。
第四,尝试面试一些流动性高,离职率高的真正作Linux公司。这样的公司一个词形容:“缺人”。火哥以前在珠海某IC原厂工做,因为珠海相关的从业者基数少,应届毕业生不少也不肯意来小城市发展,再加上公司近年业绩很差,离职率高,致使公司缺人,而且很难招到人,因此后来放开招人标准,愿意培养只有单片机经验,没有Linux经验社招者。
固然如今火哥在的深圳知名大厂,因为从业人口基数大,公司品牌和待遇都颇有竞争力,竞争较为激烈,虽然号称缺人(实际上是招人太挑剔了),可是通常不会给没有Linux经验的求职者机会。
最后,在学习Linux嵌入式的过程当中,遇到的问题和写的代码,最好有技术博客和GitHub记录下来,把相关连接贴在简历上,这也是像面试官证实你真的对嵌入式Linux有必定了解,面试官看完你的博客和GitHub,才能对你的技术水平有进一步了解,决定是否给你机会。
5、 给在校生转行者的建议
对在校生来讲,你多的是时间上的自由,缺的是金钱以及没有一份保底的工做。
固然时间这东西就像卫生纸,看起来多,可是用着用着就没有了,因此即便有充裕的时间,也要好好规划,尽可能多学一些东西。
在校生既然缺钱,火哥就不建议花好几万培训费去参加线下的嵌入式培训,实际上培训的内容都是嵌入式入门级知识,质量上可能还比不过几百块的韦东山嵌入式Linux视频。并且视频教程在时间上可能比培训更加灵活。
在校生的优点在于你们都没有行业相关经验,校招的时候,不会考察你行业相关的知识,而更加注重计算机基础知识的考察(火哥甚至是凭着操做系统,C语言,数据结构的笔试成绩,基本没有Linux开发经验的状况下拿到IC原厂Linux的offer, 固然校招以后还有大半年,买了韦东山付费视频狂补相关知识),因此在校生应该乘着宝贵的时间,把火哥上一节提到的第4点基础知识打牢固,这样工做以后就能够专一业务知识学习,更快升职加薪,不用由于基础知识不牢,回炉重造。
另外,在校生可能有各类单片机嵌入式的竞赛,在竞胜过程中,可能能够拿到不少奖,获得老师同窗的夸赞。可是切记戒骄戒躁,不要由于比普通的同窗多掌握2个技术就自觉得了不得(大家之后面试的竞争对手根本不是这些彻底没有技术的同窗),不要由于几个奖状就飘了,而不能静下心来学习数据结构,操做系统原理等基础知识。
若是不是在知名期刊发表高水平论文,或者国际上承认的ACM, Kaggle, ISLVRC图像竞赛中拿到那种高质量有分数和名次比赛结果的奖,其它国内竞赛的奖在面试与实际工做中并无太多说服力,面试官反而喜欢基本功扎实,可塑性强的学生,而不是国内各类奖一堆,结果对时间复杂度,链表堆栈,mmu虚拟地址空间等概念一问三不知的学生。
除了火哥的文章,我还想把最近韦东山老师近期对一学员的职场答疑内容贴出来,对比以上文章,或许更有感受。
学员cleo问:
韦东山老师答:
1.门槛高:
从技术角度来讲,须要懂硬件、懂英文,还要懂软件,因此门槛高;
从职位角度来讲,底层系统的职位确定少于APP的职位,而且须要有经验;
不少人学习LINUX有一个误区,只想作驱动。
实际上LINUX的范围那么广,驱动只是很小的一部分。
在实际工做中,特别是中小企业,须要你从上到下都掌握;
华为、中兴那种大厂的作法是每人专精一部分,
这些人离开大厂后很难适应外面的世界,
中小企业玩不起那么高的配置。
2. 实际工做中作的事情能够跟你的单片机开发类比,
只是运行linux系统以后能够作更多的事情
以智能家居开发为例吧。
假设这样的使用场景:
你能够经过手机远程操做遥控器来设计空调。
这涉及下面5个产品:
手机----服务器----家里的智能网关--------遥控器------空调。
因此这个完整的产品须要开发:
a. 手机APP
b. 服务器:是手机APP和家里智能网关的中介,还能够用来管理用户
c. 智能网关:手机APP跟它链接,它再去操做遥控器
d. 遥控器:接收网关的数据,再去发红外信号给空调
e. 空调:咱们须要去了解空调的红外协议
在这些产品中,遥控器就是单纯的单片机,它除了传统的功能外,
还能够经过蓝牙、zigbee等协议跟智能网关通讯。
智能网关通常就是运行LINUX的路由器,里面也有蓝牙模块或zigbee模块,
它承担起访问“互联网”的责任;
服务器:用户注册、设备管理(1个用户可能有多个智能硬件)、费用管理
你能够看到,这些涉及的软件开发不少,在单片机时代一我的能够作完全部的工做;
可是在LINUX领域,你们要合做。
在实际的开发过程当中,就是沟通、写代码、本身测试、联合测试。
之前是本身一我的作,如今要跟更多人打交道。
因此,你须要理解更多的概念。
从这个角度来讲,即便只作APP,也应该懂一些底层驱动的概念。
3.经验:
学习完123期视频,实际工做中碰到的知识你都有接触了。
可是你可能尚未经验,没办法灵活使用,
我建议你学习时就可使用另外一个不同的板子,把涉及中的程序在新板子上写出来。
最后,不要只看到驱动。
你要着眼于整个系统,你想作哪个行业,就这样去学习:
a. 底层系统、驱动是基础,先掌握这些概念
b. 再去学习这行业相关的APP开发,至少懂一些概念性的知识吧
之后不管你要作底层仍是APP开发,有整个系统的了解都更好找工做。
关注公众号百问科技(ID:baiwenkeji)第一时间阅读嵌入式干货。
技术交流加我的威信13266630429,验证: 博客园