最近有很多小朋友投票询问如何从单片机转向嵌入式Linux开发。 看来读者圈子里不少读者都在研究微控制器和RTOS。 霍哥虽然目前从事Linux/Android的嵌入式开发工作,但他在学习时也有5年左右的裸机单片机和RTOS经验。 他在之前的面试中也拿到了一些单片机stm32开发的offer,所以今天分享一下是否要转单片机。 对嵌入式Linux的一些看法。
1.您真的决定转向嵌入式Linux吗?
是否从微控制器转向嵌入式Linux是一个影响职业发展的严肃决定。 霍哥帮不了你出主意。 他只能帮你列出利弊。 你需要根据自己的各种环境(比如你所在城市的相关Linux嵌入式)来做出决定。 有很多工作吗? 你是否决定离开家乡去北京、深圳等)做出最有利的决定。
霍哥的观点并不是说Linux嵌入式一定比单片机开发职业发展更好,只是他根据自己的经验给出了一些看法。
1、单片机开发相比Linux嵌入式最大的劣势是基层岗位平均工资比较低。
我认为这是大多数微控制器工程师想要转向嵌入式Linux的主要原因。 技术本身各有优缺点,但就基层工作而言,在同一个城市,单片机的工资比嵌入式Linux低30%到50%。
可能很多人会拿一些做单片机的高薪老板(比如野火的火哥、周立功等)或者一些公司高管的工资和从事嵌入式Linux工作的工程师的工资进行比较,证明单片机也能赚高薪工资。
但他们都犯了田忌赛马的错误,将别人的优质马与自己的中等马进行比较。 霍哥认为,田忌赛马的这种比较是很不现实的,基层工作的人应该和基层工作的人进行比较。
根据霍哥目前的调查,在深圳的基层就业市场,单片机(含RTOS)开发的起薪为6K-7K。 对于大多数人来说,15K已经是很高的工资了,而且很难突破。
20K 以上的微控制器有报价,但很少。 我最多见过25K的单片机报价,但那都是名企、名校或者其他商业背景的报价,普通人实在拿不到。 嵌入式Linux/Android领域,薪资比较高。 起步价12K。 这是正常的。 一般工作2年就可以突破15K。 3-5年突破20K甚至25K也是很常见的。 5年多后,就可以去一线富豪厂商了。 (华为、OPPO、VIVO等)可以达到30K。 如果成为各大手机厂商的模组拥有者专家,可以突破40K,但是上去有点困难。
总体来说,对于同级别的基层工作者来说,嵌入式Linux的薪资远高于单片机开发。 如果单片机是15K,就会遇到瓶颈,很难突破20K。 嵌入式Linux突破20K并不难,而且会超过25K。 这才遇到了瓶颈。
2. 你所在的城市有很多嵌入式Linux工作吗?
我认为这是影响你决策的另一个大问题。 我们大多数人学习嵌入式Linux技术是为了从事相关工作,而不是为了陶冶情操。 不过,根据霍哥的统计,虽然嵌入式Linux的普遍薪资比MCU高,但岗位数量却没有MCU多。
深圳在视觉上是嵌入式Linux就业机会最多的城市,但微控制器的机会似乎更多。 在深圳,单片机和Linux的岗位数量大约是6到4个。
从嵌入式Linux城市就业人数来看,顺序是深圳>上海>北京>成都=杭州=苏州>东莞(华为加持)>=珠海>=南京=广州=武汉=西安=福州=厦门> 佛山=长沙=天津=合肥>其他,其他城市嵌入式Linux开发相关职位我很少知道。
所以如果你想考虑转行,首先考虑一下你是否愿意离开家乡到上述城市工作。 否则,即使你学习了很棒的 Linux 技术,你也可能无法找到本地同行,而不得不继续从事微控制器开发。
3、MCU虽然薪资较低,但就业机会较多,对年龄较大的求职者相对友好。
这其实并不矛盾。 各个行业做单片机的小公司有很多(当然也有格力、美的这样的传统家电厂商,但华为、商汤这样的新兴高科技公司却很少招单片机),而且业务量很大。 产品种类较多,需要的人才较多,但一般小厂可能资金不足,无法承担高额人才费用。 另外,单片机开发门槛低(无论产品稳定性、EMC等概念,有工作经验的人自然会明白,仅指学习使用单片机工作、编程的培训门槛),培训周期比较短(大二学生一个暑假),所以能从事中低端工作的人还是很多,这就拉低了平均工资。
但这就像富士康一样,招了很多人却抱怨人少。 老板只是不想加薪,想控制成本。 这是人少但工资低的矛盾。 但对于年龄较大的求职者来说,由于单片机岗位太多,很多小厂确实很难以高性价比招到优秀的人才。 小工厂没有HR介入人力资源规划和年龄梯队建设。 申请流程并不严格。 年长的求职者只要不选择薪资,还是可以找到工作的。 因此,与Linux大厂商相比,他们对年龄问题更加宽容(可能是因为单片机有一点历史,有很多老从业者)。
4、微控制器也有一些薪资较高的职位
在单片机工程师眼里,20k以上已经算是高薪了。 基于这个标准,霍哥也见过一些薪资较高的职位,但也有一些特殊的要求。
一家做智能门锁STM32 RTOS的公司给霍哥开出了20K的offer,主要是公司希望招聘985211以上学历的技术人员。 这样他们在沟通的时候可能会有比较一致的概念,所以工资可以是20K。 。
另外,一家明星独角兽创业公司提供了价值25K的单片机,但前提是能在Linux环境下开发单片机,面试难度很大。 原来要价25K超出了他们的预期,他们也不愿意给这么多。 后来霍哥又一直挂着他们一周,谎称拿到了华为同等价格的offer,最后他们同意了25K的offer。
霍哥还了解到,有一个高级单片机工程师,年薪80w(掌握某些行业特殊认证标准)。 但总体来说,拿到高薪MCU的offer确实不容易,而且得到它不仅是因为你的MCU技术好、解决bug的能力强,还因为你的背景、学历等其他offer。提高了价格。 掌握专项业务竞争力等(有关嵌入式业务竞争力的信息,可以阅读霍哥之前关于嵌入式竞争力的文章)。 这些特殊的业务和文凭不是靠自己花时间和精力就能学会的。 通过编写代码即可轻松获得。 如果你自己花时间和精力就能获得技术,那它就不是门槛技术。
列出以上几点后,相信你应该能够做出是否从单片机开发转向嵌入式Linux的决定了。
2、单片机和嵌入式Linux开发有何异同?
1、单片机转嵌入式Linux的主要优点是熟练的C语言编程能力和丰富的底层软硬件接口调试经验。
因为Linux内核本身是用C语言编写的,而且大部分Linux底层应用程序也是用C语言编写的。 一般来说,对于有单片机开发经验的人来说,C语言应该不成问题,所以在切换过程中,不需要考虑语言的切换。 当然,如果你还没有系统地学习过数据结构(霍兄认为熟悉C语言,数据结构是必不可少的,即使是单片机也必须了解数据结构),你可能需要进行弥补。
另外,如果有uCOS FreeRTOS等实时操作系统开发经验就更好了。 至少在看大规模的C语言代码时不会害怕。 (其实知道了uCOS内核并不代表你就能立刻掌握Linux内核,Linux内核实在是太复杂了,设计理念也大不相同)。
另外,丰富的单片机底层调试和寄存器配置经验可能会帮助你快速定位一些底层问题,节省学习Linux嵌入式开发的时间。
2、将单片机转换为Linux嵌入式需要熟悉一套不同风格的开发环境。
对于大多数单片机工程师来说,他们主要使用IDE环境在Windows上开发单片机程序(不排除有些公司已经使用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在内的微控制器时,代码量通常超过数万行。 即使不读每一行代码,也基本上可以准确地控制每个模块。 开发人员很容易找到可能的错误。
在做嵌入式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) kernel),并使用板卡制造商提供的工具通过编程进行开发。
这件事并不难。 网上有很多关于如何在Linux系统下交叉编译单片机程序的文章,尤其是stm32系列。 你可以参考别人的文章来做。 在这个过程中,你将熟悉各种常用的Command、shell、arm-linux-gcc交叉编译工具链、Makefile(可以单独参考陈浩的文章)等与Linux编程环境相关的知识,从而开始进入Linux的世界。
2.你需要了解嵌入式Linux系统是如何运行的以及它一般由哪些组件组成。
我相信大多数人转向嵌入式Linux开发并不是为了在Linux系统上开发单片机程序,而是为了开发Linux驱动程序或应用程序。 完成入门第一步后,不要过多担心编译、链接脚本以及如何编写文件格式,而是尽快专注于 Linux 系统开发。
学习嵌入式Linux系统开发,首先要知道如何运行Linux系统,以及如何在开发板上搭建Linux系统环境。 这涉及到bootrom、bootloader、uboot、dts、Linux kernel、cmdline、rootfs等一系列组件,以及nand启动、nor启动等各种不同的方式。 如果您了解Linux嵌入式系统的工作原理,您可以进一步修改和添加自己的驱动程序和应用程序。
这里有很多实用的东西,你可能需要视频材料来引导你快速入门。 霍哥之前看过魏东山老师的嵌入式Linux视频。 总共有一、二、三、四题。 有免费试用的,也有付费产品的,可以直接联系淘宝卖家了解。 霍哥不会发布广告链接。
还有其他视频。 霍哥没看过,我不会随便推荐。 在学习嵌入式Linux的时候,对于理论知识需要慢慢看书,但是对于实践知识,还是需要视频资料来帮助自己快速入门。 ,看书,逐步练习。
3.可以尝试做一些简单的Linux应用程序和驱动开发
完成前两步后,相信你对嵌入式Linux开发已经有了一定的专业了解。 说到学习嵌入式Linux,霍哥更喜欢边做边学,60%实践+40%理论。 因为嵌入式Linux中与系统环境相关的很多东西都不是书本上严格的理论公式,通过看书很难找到规律,而且Linux中还有一整套GNU(搜索一下GNU是什么意思)行话核心。 那些编写Linux内核和驱动书籍的技术专家不可能向你解释所有的术语。 全部都会直接打开《Unix环境高级编程》《Linux设备驱动》等著名经典,没有任何使用和开发经验。 书籍很容易让你感到困惑。
霍哥的建议是按照视频教程,比如魏东山老师的嵌入式Linux视频,从头开始写一个简单的驱动和应用程序,让你写的驱动和应用程序代码运行起来,点亮一个Led灯,不要使用首先。 关心如何实现您在Linux驱动程序中调用的初始化、注册和其他框架函数。
通过练习的过程,你会熟悉整个代码的运行环境以及Linux开发中的各种术语(系统调用、vfs等)。 这也是让你获得积极的学习反馈、增强成就感和学习信心的循序渐进的方法。
其实Linux驱动开发本身并不难(不会比你复杂变量函数课本上的公式难),也不神秘。 只是它有一整套行话术语,很容易让初学者感到困惑,而且他们对这套行话很熟悉。 一个智商正常的普通大学生应该能够摆脱恐惧。
4.需要补充一些计算机理论知识
据霍哥介绍,单片机工程师大多来自电子、通信、自动化、机械等专业,计算机专业的很少。 这些专业童鞋会相对缺乏计算机科学方面的基础理论知识,比如数据结构、操作系统、计算机组成原理、计算机网络、算法、编译和链接的基本原理、数据库等。
补充理论知识是一个长期的过程(可能需要2-3年)。 你不必等到学完所有专业计算机理论才可以找到工作。 可以在面试找工作的同时补充基础知识,同时也考验一下自己的技能。 基本。 这些基础知识不仅可以提高你的技术能力,还可以帮助你通过笔试和面试,这决定了你是否能在一线城市赚到2万以上的薪水。
有了计算机基础知识和一定的Linux驱动开发经验后,学习Linux内核是很有必要的。 不过,初学者不需要急于研究Linux内核源代码。 关于内核还有很多东西很难理解。 ,你得花时间看书、慢慢啃代码,不可能很快就能完成,但Linux内核技能还是可以提高你的薪资竞争力的。
4. 对有工作经验的转行者的建议
1、作为跳槽者,你的优势是工作和收入有保障,劣势是学习时间不够。 有了目前的工作,你不必急于寻找新工作。 你可以保持良好的心态,不骄不躁,边骑驴边学,找到合适的工作。
当然,有工作的人没有空闲时间。 如果你想学的新东西和你现在的工作内容没有直接关系,火哥建议你先选择加班少的工作,这样可以腾出下班后的时间。 利用业余时间学习嵌入式Linux的新知识。
有工作、有一些小积蓄但时间紧缺的人,可以购买一些性价比高的付费视频,加快入门和学习进度,节省宝贵的时间。 这也是用金钱换时间。
一般情况下,出去找工作之前不需要学得熟练。 一旦你了解到你可以自我纠正(这个词来自于关于如何快速自学的TED演讲)并且可以做一些工作,你就可以出去面试并找到相关的工作。 Linux嵌入式学习侧重于通用基础知识。 驱动中音视频、通讯协议相关的业务知识可以通过寻找相关工作来补充。
2、只有MCU经验,没有Linux开发经验,如何通过社招应聘嵌入式Linux开发岗位?
这对于有相关工作背景、对社会招聘感兴趣的求职者来说是一件很头疼的事情。 霍兄有以下建议:
首先查看公司是否有Linux相关部门和发展计划,可以主动尝试内部调岗。
第二,看看能否建议公司技术总监将单片机开发环境迁移到Linux系统上,在Linux系统环境上开发单片机。 这样,至少你在工作中有机会使用Linux系统。
第三,可以先尝试采访一些在Linux环境下开发单片机的公司。 面试结束后,问面试官是否在Linux环境下开发单片机。 如果是的话,你可以先加入一家使用Linux开发单片机的公司,继续从事单片机工作一段时间。 在工作中熟悉 Linux。
第四,尽量去面试真正开发Linux系统的公司的一些Bootloader或固件开发相关的职位,因为Bootloader和存储控制器、电源管理等固件代码与MCU裸机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.阈值很高:
从技术角度来看,您需要了解硬件,英语和软件,因此阈值很高。
从工作的角度来看,基础系统中的位置绝对比应用程序中的职位少,并且需要经验;
在学习Linux时,许多人会误会,他们只是想成为驾驶员。
实际上,Linux的范围是如此宽,驾驶员只是一小部分。
在实际工作中,尤其是在中小型企业中,您需要从上到下掌握它;
华为和中兴等大公司的方法是,每个人都专门研究一部分。
这些人离开大型工厂后很难适应外界。
中小型企业负担不起如此高的配置。
2.可以将实际工作中的工作与微控制器开发进行比较。
运行Linux系统后,您可以做更多的事情
以智能房屋开发为例。
假设此用法方案:
您可以通过手机远程操作遥控器来设计空调。
这涉及以下5种产品:
手机—-服务器—-智能网关在家—-遥控器—-空调。
因此,需要开发完整的产品:
A。 移动应用
b. 服务器:它是移动应用程序和家庭智能网关之间的中介。 它也可以用于管理用户。
C。 智能网关:移动应用程序已连接到它,并操作遥控器。
d. 遥控器:从网关接收数据,然后将红外信号发送到空调
e. 空调:我们需要了解空调的红外协议
在这些产品中,遥控器是一个简单的微控制器。 除了其传统功能,
它还可以通过蓝牙,Zigbee和其他协议与智能网关进行通信。
智能网关通常是运行Linux的路由器,它还具有蓝牙模块或Zigbee模块。
它承担访问“互联网”的责任;
服务器:用户注册,设备管理(一个用户可能具有多个智能硬件),费用管理
如您所见,这些涉及大量软件开发。 在微控制器的时代,一个人可以完成所有工作。
但是在Linux领域,每个人都需要合作。
在实际的开发过程中,这意味着通信,编写代码,自己的测试和联合测试。
我曾经一个人做,但是现在我必须与更多的人打交道。