明天就借题主这个问题,回顾一下自己的MCU->Linux的技术公路。
期间有过技术突破时侯的快乐,也有面对技术困局时侯的困惑和迷惘乃至想要舍弃。
站在明天回头看,自己对于技术的坚持能够支持自己一步一步走出来。
希望我的经历和建议,才能对题主和其他对嵌入式技术有兴趣爱好的同学,有所帮助。
我是大专阶段就开始接触51单片机从实践中学嵌入式linux应用程序开发,也经历了电子竞赛的考验。
硕士阶段也使用MSP430作出过一些校企结合的嵌入式产品,也进行了小批量的实用。
尽管硕士阶段也有接触Linux嵌入式开发,而且回顾自己的硕士阶段,PLC+组态和MSP430MCU的确是我的优势技术(结业课题搞的FPGA+Verilog上不了台面,当时不知天高地厚去笔试FPGA岗位,结果可想而知)。
入职华为后,尽管是Linux、VxWorks的操作系统,并且似乎接触最多的还是MCU以及Linux用户态下的应用编程。在大一点公司有过经历的人都晓得,螺母钉就是螺栓钉linux命令行,你永远只能看见行道树看不到森林。不过华为几年,我的编码能力的确有了大幅度质的提升。
当初离开华为,和题主的看法有些类似,每天都是面对基本相同的芯片,做的永远是自己最熟悉的模块,产品重复造轮子的现象也很严重。想去学习新的技能栈也没有任何时间和精力。
总算等到了甲方通讯芯片供应商给出的Linux嵌入式开发的offer,想着自己也以前搞过Linux嵌入式,有些基础就欣然掉入了这个芯片大鳄500强做通讯合同栈的开发。
理想很丰腴,现实很肉感。可以说嵌入式Linux和MCU的开发,有相同和相通,而且差异也是十分巨大的。而且,对于答主来说退无可退,但是答主也看好了Linux在技术壁垒上的优势。如何办?只能掏出当初刚入职华为死啃C语言的劲头,干就完了。
当初没有知乎这样的知识问答平台,就找了新公司的老职工还有答主同届结业搞Linux嵌入式开发的朋友咨询经验和学习路线。在收到她们热心的回复和指导后,答主开始了又一轮的死啃Linux嵌入式技术旅程。
Linux的嵌入式开发从大类来看,分为BSP和应用开发。
答主为了应付新工作的挑战,先选择了嵌入式Linux应用开发的备考及进阶。旁边等答主离开这家公司自主创业的时侯,也由于成本问题也自己死啃了嵌入式Linux的BSP,这儿咱先说应用。
1.Shell、VIM及Makefile
好多同学可能说,这两个工具有必要学习么?我的建议是,十分有必要。假如你连基本的shell都不懂,如何去摆弄Linux的文件系统。
假如VIM用的不好,即使windows的文件夹可以和Linux系统映射,并且windows下的字符编码常常在Linux下导致莫名其妙的问题。你说VIM的文本编辑你要不要学习一下?
至于Makefile,搞MCU,DSP的同学可能都比较陌生。由于MCU,DSP的配套编码下载软件帮你搞定了Makefile,你只须要在UI界面下配置一下就可以手动生成编译文件链。例如Keil中,你告诉Keil编译文件在那里,宏定义是啥就行了。而且当时答主编译Linux,只能自己自动在Maikfile中告诉嵌入式编译器,编译哪些文件,生成哪些文件等等:
另外:学会搭建交叉编译环境,也是一个嵌入式Linux开发人员必须的技能。这个东西没啥技术可言,理解大约原理半个小时搞定。
以上这种,不建议掏出大块时间进行学习和操练。工作之余,安装个虚拟机环境和Linux系统,买本基本的Shell教程,忙活几天基本Shell和VIM就差不多了。
至于Makefile,推荐网上自行找寻一下《跟我一起学Makefile》这篇古老的文档。
2.Linux常用API
学习既然题主和当初答主一样,都是从MCU过来的。C语言肯定没有问题。假如题主接触过RTOS那理解Linux,也会快好多。
虽然没有RTOS的经验,也没有关系。从头开始学,反倒少遭到曾经知识和理解的影响。
虽然常用的Linux应用态编码,主要用到的就这么几个库和API:多线程,多进程,阻塞非阻塞等理论互斥机制:读写锁,载流子锁等线程通讯机制和讯号网路通讯Socket其他你工作可能涉及到的。
跟随一本书linux查看端口占用,从头看出来,边看边用工作实践,边用你里面装好的虚拟机+Linux系统进行编码验证。有基础的情况下,还是很容易入门和上手的。
假如没有RTOS的概念和基础,也真的不用害怕,你理解MCU的RTOS无非就是能让学习Linux线程和进程更快一些,不理解那就学的慢点而已。这儿推荐我用过的教材,不一定多高赞,并且个人觉得足够用:
至于UI开发是否要学习,就看题主的工作情况。
嵌入式物联网须要学的东西真的特别多,千万不要学错了路线和内容,引起薪水要不起来!
无偿分享你们一个资料包,差不多150多G。上面学习内容、面经、项目都比较新也比较全!某鱼上买恐怕起码要好几十。
点击这儿找小助理0元发放:加陌陌发放资料
3.Debug技术
耐心备考完上面两个阶段的知识,并配合以工作和自己虚拟机环境的编码练习。基本上一个项目边学边干出来,题主完全可以摸到嵌入式Linux的猫腻。
不过,即便程序总会有bug。曾经MCU的IDE可以帮助我们提供一些Debug信息,断点调试等手段。在Linux下,我们只能借助GDB这个强悍的工具,帮助我们在Linux的世界里,找寻Bug的蛛丝马迹。
关于GDB的学习,网路上有好多资料。策略仍然是边学,边干,边总结。积累多了从实践中学嵌入式linux应用程序开发,GDB自然都会用了。这儿就不再多说。答主经过了死啃阶段,在项目过程中,渐渐实现了Linux应用开发的转变。答主编写的通讯芯片底层合同的代码,没准都用在诸位同学的笔记本和手机芯片上,哈哈。
这个过程其实很艰难,而且对于追求技术进阶的人来说,学习新技术和新技能,永远是快乐的。
虽然,LinuxBsp也是嵌入式Linux开发的另一个大头。答主在后期合伙创业中,也是通过死啃的形式,把握了基本的LinuxBsp技能栈。过程和路线由于昨天篇幅有点长了,写的太多了。后续假如有同学感兴趣或则须要,答主再来继续往下写如何从Linux的应用开发,扩充到LinuxBsp开发的技能栈领域。