近来好多童鞋投票并咨询怎样从单片机转做嵌入式Linux开发。看来读者圈中做单片机,RTOS的不少。虽然火哥目前从事Linux/Android方面的嵌入式开发工作,可是读书的时侯也有5年左右单片机裸机和RTOS经验,之前笔试也拿过一些做单片机stm32开发的offer,所以昨晚分享一些关于单片机是否要转嵌入式Linux的一些观点。

一、你真的决定要转嵌入式Linux吗?

要不要从单片机转嵌入式Linux是一个影响到职业发展的严肃决策,火哥不能帮你拿主意,只能帮你列举优劣,你须要依照自身的各类环境(例如所在城市Linux嵌入式相关岗位多吗?是否决定背井离乡去北上深发展等等)作出最有利的决策。火哥的观点并不是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的大厂,对年纪问题比较忍让一些(可能因为单片机有点历史了,大龄从业者也多)。

嵌入式linux应用开发_linux嵌入式开发 语言_嵌入式linux开发视频教程

4.单片机也有一些较高薪职位。在单片机工程师眼里,20k以上即使是高薪,以这个为标准,火哥也见过一些较高薪的职位,并且这儿面有些特殊的要求。某家做智能锁具STM32RTOS的公司给火哥开过20K的offer,主要是由于公司希望招的技术人员都有985211以上学历背景,这样沟通上去可能观念比较一致,所以工资能给到20k。另外还有一家名星独角兽创业公司给过25K的单片机offer,并且前提要求是能在Linux环境下开发单片机,但是笔试难度较高,原本25K要价超出她们预期了,她们不乐意给那么多,后来火哥吊着她们一个礼拜,声称领到华为同等价位的offer,她们才最终答应给25K的offer。剩下火哥还了解到有月薪80w的单片机中级工程师(把握个别行业特殊的认证标准)。并且整体来说,单片机较高薪的offer确实不容易领到,但是领到也不仅仅是由于你的单片机技术好,解bug能力强,而是由于你的背景,学历,有其它offer杀价,把握特殊的业务竞争力等等(关于嵌入式业务竞争力可以读读火哥上一篇关于嵌入式竞争力的文章),这种特殊业务和文凭,背景都不是能靠当下自己砸时间努力看书学习写代码能够轻易获取的。倘若能单单靠自己砸时间努力才能获取的技术就不是啥门槛性的技术。

列出了以上这几点,要不要从单片机开发转嵌入式Linux相信你也应当可以下决定了。

二、单片机和嵌入式Linux开发究竟有哪些优缺

1.单片机转嵌入式Linux保留的优势主要在于熟练的C语言编程能力以及丰富的底层软件与硬件插口的调试经验。由于Linux内核本身就是C语言编撰的,Linux底层应用程序大部份也是C语言的linux嵌入式开发 语言,通常有单片机开发经验的,C语言应当不是问题,所以在切换的过程中,不须要考虑语言的切换,其实假如没有系统学过数据结构(火哥觉得数据结构是熟悉C语言必不可少的内容,哪怕单片机也要懂数据结构),可能须要补补,另外有uCOSFreeRTOS这类的实时操作系统开发经验就更好,起码在看大规模C语言代码的时侯不担心(虽然懂uCOS内核也不代表能马上把握Linux内核,Linux内核真的复杂太多,设计理念也很不一样)。另外丰富的单片机底层调试与寄存器配置经验,可能帮助你在学习Linux嵌入式开发的时侯能快速定位底层的一些问题,节省一些时间。

2.单片机转Linux嵌入式须要熟悉一套风格迥异的开发环境。对于大部份单片机工程师而言,都是在Windows上用IDE环境开发单片机程序为主(不排除有些公司早已使用Linux开发单片机了),Ubuntu这类Linux系统接触比较少,所以大家要跨过的第一关并不是Linux内核源码,而是怎么使用Ubuntu这些Linux系统。由于在DebianUbuntuCentOS等各类Linux系统做软件开发,主要都是通过命令行操作,而不是键盘界面点击。而且Linux系统上面的应用软件不像Windows上面的IDE这样给你集成好了,点击才能用,Linux上面好多Makefile之类的编译脚本以及Samba,SSHServer等各类服务,arm-linux-gcc等各类编译链接工具,如同IDE软件上面的各个组件,须要自己重新组装使用,而且用的时侯可能有各类环境甚至编译问题(开源软件猛糙快就是这样),须要自己折腾耗费不少时间,所以对于Linux入门者,哪怕你有丰富的单片机C语言经验,折腾上去也挺历时间,须要克服心理的障碍,Linux系统开发环境犹如一匹不听话的烈马,驯服他能够发挥出它的价值,而Windows系统开发环境更像一匹听话的普通马。

3.嵌入式Linux开发代码的掌控程度远高于单片机开发,单片机转Linux须要适应怎样在这些低掌控度的不安全感中进行开发。做单片机开发,包括RTOS,通常代码量最多几万行,哪怕不是每行代码都读过linux开发培训,也基本才能精确掌控每位模块,大约那里出了bug,作为开发者很容易定位。而做嵌入式Linux开发,单独Linux内核就有几百万甚至上千万行,还不包括各类你不熟悉的应用层的开源库,这引起大部份代码都不可能掌控。嵌入式Linux的开发模式就是在这些大部份代码都不是你开发的,你也掌控不了大部份代码的情况下开发驱动或则应用,你常常会不熟悉的东西须要各类搜索问人,这些开发模式,会把人放在一种不安之谷当中,好多你使用的函数你并不晓得它的实现细节,可能工作机制都只是略懂。在这些模式下开发须要挺好的搜索,沟通,团队协作能力,不能再像单片机那样一个人全局掌控,蒙着头开发了,这些不可掌控的不安全感是单片机工程师往Linux嵌入式工程师发展过程中最须要适应的。

嵌入式linux开发视频教程_linux嵌入式开发 语言_嵌入式linux应用开发

4.嵌入式Linux开发须要有大局观,不用迷失在细节的丛林找不到方向和出口。好多单片机工程师有个思维习惯,编程时喜欢细抠到每位寄存器的工作原理,每位功能的实现细节逻辑,每位ifelse都不放过。这在Linux嵌入式学习少将十分花费时间,事倍功半的做法。重视细节尚且好,而且当系统庞大到一种程度的时侯,过分重视细节的人,常常很难驾驭这个系统。我看见好多初学者,每位寄存器,链接脚本的每种写法都要去苦恼许久,芯片启动方法更上生搬硬套把2440的启动流程作为芯片启动的惟一真理,处处往其他芯片套。殊不知好多东西都是人为约定的一些习惯性做法,每家公司的芯片有自己的特性,流程是死的,人是活的。把握大局观,让自己迅速熟悉整个系统的知识,好多细节上习惯性的东西自然而然就明白了,对整个系统的掌控力度就高了,遇见具体制约你前进的细节问题,再去尝试处理。掌控并不意味着你晓得每行代码每位寄存器的意思,而且你能让整个系统根据你的看法去运行。

三、单片机转嵌入式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视频,总共有一二三四期等,有免费试看,也有付费的,直接X宝联系买家可以了解,火哥就不贴广告链接了。另外还有其它视频,火哥没有看过的,就不随意推荐了,在嵌入式Linux学习这块,理论性的知识须要渐渐看书,并且实践性的知识还是须要视频资料带你操作快速入门,看书和实践循环渐进。

3.你可以尝试做一些简单的Linux应用和驱动开发了。走完了上面两个步骤,相信你对嵌入式Linux开发有一定专业性认识了。在嵌入式Linux学习这块,火哥更倾向于在做高中,60%实践+40%理论。由于嵌入式Linux上面好多系统环境相关的东西,并不是书本上那个严格的理论公式,通过看书很难找到规律,并且在Linux内核上面有一整套GNU(GNU是啥意思自己搜)世界的行话,这些写Linux内核,驱动书籍的技术专家不可能所有行话都给你解释,所有在没有使用和开发经验的前提下就直接打开《Unix环境中级编程》、《Linux设备驱动程序》等大牛的精典书籍,容易让你云里雾里。火哥建议是,跟随一个视频教程,例如韦东山老师的嵌入式Linux视频,从0开始写一个简单驱动和应用,让自己写的驱动和应用代码跑上去,照亮1个Led灯,先不用管Linux驱动中你调用的这些初始化,注册等框架函数怎样实现。通过实践的过程,熟悉整个代码的运行环境以及Linux开发中的各类行话(系统调用,vfs等等)。这也是让你一步一步取得学习正反馈,提高成就感和学习信心的方式。虽然Linux驱动开发本身并不难(难度不会超过你复变函数课本上的公式),也并不神秘,只不过它一整套行话术语,容易让初学者云里雾里,熟悉这套行话,甩掉焦虑心理,一个情商正常的普通专科生应当是能否把握的。

linux嵌入式开发 语言_嵌入式linux开发视频教程_嵌入式linux应用开发

4.你须要补充一些计算机的理论知识。据火哥了解,大部份单片机工程师都是电子、通信、自动化、机械等专业出身,甚少计算机专业的。这种专业的童鞋,相对会缺少计算机专业的基本理论知识,如数据结构,操作系统,计算机组成原理,计算机网路深度linux系统,算法,编译链接的基本原理,数据库等等。补充理论知识是一个常年的过程(可能须要2-3年),并不是要等到计算机的专业理论都学完才可以去找工作,你可以一边补充基础知识一边笔试一边找工作,同时检验自己的基础知识。这种基础知识不但能提升你的技术造诣,也能帮你通过面试笔试,决定你能够在一线城市突破20K的工资。在有了计算机科班的基础知识,以及有一定Linux驱动开发经验以后,Linux内核的学习是有必要的,并且入门的初学者不用急于步入Linux内核源码,内核这块东西还是挺多的挺深奥的,得花时间边看书边看代码渐渐啃,无法速成,并且Linux内核功力还是才能提升你的工资竞争力。

四、给有工作经验的改行者的建议

1.有工作的改行者,你的优势是有保底的工作和收入,劣势是没有足够的学习时间自由。有了当前的工作饭碗,不用急着找新工作,你可以保持一个良好的态度,不骄不躁,可以边学习边骑驴找马,找到合适的工作。其实有工作的人,时间上并不自由,假如你想学的新东西和你当前工作内容并不直接相关,火哥建议你可以先选择一份加班少的工作,这样可以腾出放学后的业余时间来学习嵌入式Linux的新知识。有工作的人,有了一些小积蓄,缺的是时间,这么在学习上可以适当买一些性价比高的付费视频,推动入门和学习进度,节省宝贵的时间,这也是用金钱换时间。通常情况下,不须要学精通才出去找工作,学到可以selfcorrect(这个词来始于一个TED关于怎么快速自学的讲演),才能干一些活的状态,就可以出去笔试找相关的工作了,Linux嵌入式学习以通用基础知识为主,驱动上面的音视频,通讯合同相关的业务上的知识可以找到相关的工作再补充。

2.怎样在只有单片机经验,没有Linux开发经验的情况下,怎样通过社招嵌入式Linux开发工作?这个对于社招看中相关工作背景的求职者是个头痛的问题,火哥有以下几点建议:

首先,瞧瞧公司是否有Linux相关的部门和开发计划,可以主动尝试内部转岗。

第二,瞧瞧能不能建议公司技术负责人把单片机开发的环境迁移到Linux系统上,在Linux系统环境上开发单片机,这样起码你在工作中有使用Linux系统的机会。

嵌入式linux应用开发_嵌入式linux开发视频教程_linux嵌入式开发 语言

第三,可以先尝试面一些在Linux环境下开发单片机的公司,笔试后寻问笔试官是否在Linux环境下开发单片机,倘若是,可以先加入用Linux开发单片机的公司继续做一段时间单片机,顺便再工作中熟悉一下Linux.

第四,尝试一下笔试真正做Linux系统开发的公司一些Bootloader或则固件开发相关的岗位,由于Bootloader和储存控制器,电管管理等固件代码和单片机裸机rtos开发有好多相关性,甚至ARMSOC上面就有单片机核以及相关的固件,用于控制wifi,储存,电源休眠唤起等相关的功能,这样能保证你还能在新工作中有一定输出贡献,而不是完全的学习者。

第四,尝试笔试一些流动性高,辞职率高的真正做Linux公司。这样的公司一个词形容:“缺人”。火哥之前在广州某IC原厂工作,因为广州相关的从业者基数少,应届结业生好多也不乐意来小城市发展,再加上公司近些年业绩不好,辞职率高,造成公司缺人,而且很难招到人,所以后来放开招人标准,乐意培养只有单片机经验,没有Linux经验社招者。其实现今火哥在的上海著名大厂,因为从业人口基数大,公司品牌和待遇都很有竞争力,竞争较为激烈,即使堪称缺人(虽然是招人太挑剔了),而且通常不会给没有Linux经验的求职者机会。

最后,在学习Linux嵌入式的过程中,遇见的问题和写的代码,最好有技术博客和GitHub记录出来linux嵌入式开发 语言,把相关链接贴在简历上,这也是像笔试官证明你真的对嵌入式Linux有一定了解,笔试官看完你的博客和GitHub,能够对你的技术水平有进一步了解,决定是否给你机会。

五、给在校生改行者的建议

对在校生来说,你多的是时间上的自由,缺的是金钱以及没有一份保底的工作。

嵌入式linux开发视频教程_linux嵌入式开发 语言_嵌入式linux应用开发

其实时间这东西如同卫生纸,看上去多,并且用着用着就没有了,所以虽然有充沛的时间,也要好好规划,尽量多学一些东西。

在校生既然缺钱,火哥就不建议花好几万培训费去出席线下的嵌入式培训,实际上培训的内容都是嵌入式入门级知识,质量上可能还比不过几百块的韦东山嵌入式Linux视频。并且视频教程在时间上可能比培训愈发灵活。

在校生的优势在于你们都没有行业相关经验,校招的时侯,不会考察你行业相关的知识,而愈发重视计算机基础知识的考察(火哥甚至是凭借操作系统,C语言,数据结构的面试成绩,基本没有Linux开发经验的情况下领到IC原厂Linux的offer,其实校招以后还有大半年,买了韦东山付费视频狂补相关知识),所以在校生应当乘着宝贵的时间,把火哥上一节提及的第4点基础知识打牢靠,这样工作以后就可以专注业务知识学习,更快升职加薪,不用由于基础知识不牢,回炉重造。

另外,在校生可能有各类单片机嵌入式的大赛,在大赛过程中,可能可以领到好多奖,得到老师朋友的赞扬。并且谨记戒骄戒躁,不要由于比普通的朋友多把握2个技术就自以为了不起(大家之后笔试的竞争对手根本不是那些完全没有技术朋友),不要由于几个奖章就飘了,而不能静下心来学习数据结构,操作系统原理等基础知识。倘若不是在著名刊物发表高水平论文,或则国际上认可的ACM,Kaggle,ISLVRC图象大赛中领到那个高质量有分数和名次赛事结果的奖,其它国外大赛的奖在笔试与实际工作中并没有太多劝说力,笔试官反倒喜欢基本功扎实,可塑性强的中学生,而不是国外各类奖一堆,结果时间复杂度,数组堆栈,mmu虚拟地址空间等概念一问三不知的中学生。

最后,希望这篇文章才能帮助到正处于苦闷期的你。

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复