刷知乎看到下面这个提问。
单片机6年想转嵌入式Linux ,不知如何下手?
现在挺尴尬,做的单片机产品总是感觉重复重复再重复,想学习点新东西,不知道如何转。
说实话,这个问题自己关注了很久。
今天就借题主这个问题,回顾一下自己的 MCU->Linux 的技术道路。
期间有过技术突破时候的快乐,也有面对技术难题时候的苦恼和彷徨乃至想要放弃。
站在今天回头看,自己对于技术的坚持才能支持自己一步一步走下来。
希望我的经历和建议,能够对题主和其他对嵌入式技术有兴趣爱好的朋友,有所帮助。
我是本科阶段就开始接触51单片机,也经历了电子大赛的考验。
硕士阶段也使用 MSP430 做出过一些产学研结合的嵌入式产品,也进行了小批量的实用。
虽然硕士阶段也有接触 Linux 嵌入式开发,但是回顾自己的硕士阶段,PLC+组态和 MSP430 MCU 的确是我的优势技术(毕业课题搞的 FPGA+Verilog 上不了台面,当时不知天高地厚去面试 FPGA 岗位,结果可想而知)。
入职华为后,虽然是 Linux、VxWorks的操作系统,但是其实接触最多的还是 MCU 以及 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系统进行编码验证。有基础的情况下,还是很容易入门和上手的。
如果没有 RTOS 的概念和基础,也真的不用担心,你理解 MCU 的 RTOS 无非就是能让学习 Linux 线程和进程更快一些,不理解那就学的慢点而已。这里推荐我用过的教材,不一定多高赞,但是个人感觉足够用:
至于 UI 开发是否要学习,就看题主的工作情况。
3. Debug 技术
耐心复习完前面两个阶段的知识,并配合以工作和自己虚拟机环境的编码练习。基本上一个项目边学边干下来,题主完全可以摸到嵌入式 Linux 的门道。
不过,但凡程序总会 有bug。以前 MCU 的 IDE 可以帮助我们提供一些Debug信息,断点调试等手段。在 Linux 下,我们只能依靠 GDB 这个强大的工具,帮助我们在 Linux 的世界里,寻找 Bug 的蛛丝马迹。
关于 GDB 的学习,网络上有很多资料。策略依然是边学,边干,边总结。积累多了,GDB 自然就会用了。这里就不再多说。答主经过了死啃阶段,在项目过程中,慢慢实现了Linux应用开发的转变。答主编写的通信芯片底层协议的代码,没准都用在各位朋友的电脑和手机芯片上,哈哈。
这个过程虽然很艰辛,但是对于追求技术进阶的人来说,学习新技术和新技能,永远是快乐的。
其实,Linux Bsp 也是嵌入式 Linux 开发的另一个大头。答主在后期合伙创业中,也是通过死啃的方式,掌握了基本的Linux Bsp 技能栈。过程和路线因为今天篇幅有点长了,写的太多了。后续如果有朋友感兴趣或者需要,答主再来继续往下写怎么从 Linux 的应用开发,扩展到Linux Bsp 开发的技能栈领域。
以上,仅代表个人经历和观点,仅供参考。另外,如果里面有技术说的不准确乃至错误的地方,还请各位批评指正。
作者:snowdream
来源:知乎
点击阅读原文查看更多信息
文章评论