单片机6年想转嵌入式Linux ,不知如何下手?

刷知乎看到下面这个提问。

单片机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

来源:知乎

点击阅读原文查看更多信息


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题(3)—— -2与2的比较(二)

分析下面的代码&#xff0c;求运行结果。 #include <stdio.h>int main(void) {if(-2L > 2UL){printf("11111\r\n");}else{printf("22222\r\n");}return 0; }分析&#xff1a; 常量后面接L表示long型存储&#xff0c;UL表示unsigned long型存储&a…

嵌入式技术面试时的10大潜规则

编排 | strongerHuang微信公众号 | 嵌入式专栏找工作也是一门技能&#xff0c;有的人很快就找到自己喜欢的工作&#xff0c;有的人找了很久也没找到合适的工作。下面给大家分享几点找工作过程中存在的“潜规则”内容。嵌入式专栏1面试的本质不是考试&#xff0c;而是告诉面试官…

每日一题(4)—— (a ^ b 2)

分析下面的代码&#xff0c;求运算结果。 #include <stdio.h>int main(void) {int a 6, b 4;printf("%d\n", a ^ b << 2);return 0; }分析&#xff1a; 主要是考的是“优先级”和按位“异或”&#xff0c; 左移运算符优先级高于按位异或运算符&#…

轻轻的你来了,悄悄的你走了,邓总没有带走一个bug

写这篇文章的时候&#xff0c;比较晚&#xff0c;所以思绪是清晰的&#xff0c;这个时候刚好是邓总来公司跟我交接离职的最后一天。给邓总制作的告别MV&#xff1a;我跟邓总2017年12月在恒大认识&#xff0c;我们入职时间相差一周&#xff0c;我入职的时候就开始注意到旁边的这…

神奇的css3(2)动画

四、Css3 2D动画 1、2D 转换方法 函数 描述 matrix(n,n,n,n,n,n) 定义 2D 转换&#xff0c;使用六个值的矩阵。 translate(x,y) 定义 2D 转换&#xff0c;沿着 X 和 Y 轴移动元素。 translateX(n) 定义 2D 转换&#xff0c;沿着 X 轴移动元素。 translateY(n) 定义 2D…

固定宽度弹性布局(以适应各种各辨率)

最佳网页宽度及其实现——新手可了解一下 1.设计网页的时候&#xff0c;确定宽度是一件很苦恼的事。以minifun.cn为例&#xff0c;根据Google Analytics的统计&#xff0c;半年多以来&#xff0c;访问者的屏幕分辨率一共有81种。最小的分辨率是122x160&#xff0c;这应该是手机…

B站这套教程火了,火速搬运!限时删除~

最近好多粉丝给我留言&#xff0c;寻求人工智能入坑资源&#xff0c;想利用人工智能来实现一些大胆的想法、项目或创意&#xff0c;或是想进入AI行业搞钱。不过细聊之下&#xff0c;大部分伙伴苦于不知从何入手&#xff0c;找不到重点。更甚至被烧脑的算法劝退&#xff0c;折腾…

【MySQL学习笔记008】多表查询

1、多表关系 概述&#xff1a;项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上可分为三种&a…

Linux红外驱动重点解析

红外遥控是我们经常见到的一种无线收发设备&#xff0c;比如电视遥控&#xff0c;空调遥控&#xff0c;现在电视遥控有些慢慢变成了蓝牙装置。昨天是在知识星球里面看到有人提问&#xff0c;今天来解析一份网友写的驱动程序。调试红外需要注意几个细节1、我们发射的遥控器用肉眼…

每日一题(5) —— 逗号表达式

分析下面的代码&#xff0c;求运算结果。 #include <stdio.h>int main(void) {int a[3][2] {(0, 1), (2, 3), (4, 5)};int *p a[0];printf("%d\n", p[0]);return 0; }分析&#xff1a; 仔细观察可以看出&#xff0c;大括号里面的是(),而不是花括号&#xff…

整理一篇Linux drm显示系统的文章

这篇文章主要是回答一位同学的提问&#xff0c;当然也是做一次总结&#xff0c;我相信关注我号的很多人也有做LCD相关的驱动或者系统开发&#xff0c;即使不是专门做LCD&#xff0c;但是在开发过程中也难免会遇到这样或者那样的问题。所以找了几篇和drm不错的文章分享给大家&am…

Java实现十进制数转十六进制数

Now~Lets begin our second question~ 如何利用Java语言将十进制数字转换成十六进制数字呢&#xff1f; 我第一次编码出来的效果是酱紫的~ /*** */ package com.succez.task2;import java.util.Scanner;/*** <p>Copyright: Copyright (c) 2018</p>* <p>succe…

[转]JavaScript:只能输入数字(IE、FF)

本文转自&#xff1a;http://www.cnblogs.com/ly5201314/archive/2009/03/04/1402993.htmlJavaScript&#xff1a;只能输入数字(IE、FF) 为了解决只能输入数字的问题&#xff0c;网上有许多资料&#xff0c;现归拢一下。 一、不带负号的输入 这里&#xff0c;没有解决“正负号”…

每日一题(6)—— sizeof用法

已知int a&#xff0c;一下那种写法是错误的&#xff1f; A. sizeof(int); B. sizeof(a); C. sizeof int; D. sizeof a;以下答案是来自《C语言深度剖析》&#xff1a;

现在做硬件工程师还有前途吗?

这个问题是我在知乎看到的。问这个问题的&#xff0c;要么是正在从事硬件工作&#xff0c;要么是准备入行的新人。我工作年限不久&#xff0c;工作4年多。我先发表自己的一些观点&#xff0c;可能不对&#xff0c;勿喷&#xff0c;然后我再截取部分知乎上网友的回答。我大学的专…

58同城沈剑:好的架构是进化来的,不是设计来的

虽然这篇文章写的比较早&#xff0c;但是&#xff0c;还是很有参考意义&#xff0c;值得好好品读思考。看看别人是怎么思考就架构这种事情。 好的架构不是设计出来的而是演进出来的 对很多创业公司而言&#xff0c;在初期的时候&#xff0c;我们很难在初期就预估到流量十倍以后…

[译]5 Mac OS X RSS Readers Worth Giving a Shot

5 Mac OS X RSS Readers Worth Giving a Shot Mac OS X 下5款值得关注的RSS 阅读工具 There was once a time when my favorite RSS reader cost a fair but not insignificant price and the open source alternative wasn’t up-to-snuff. I won’t name any names, though y…

每日一题(7) —— 求余运算符

设有以下语句:int x10;x3x%(-3),则x的值是: A.11 B.12 C.14 D.15分析&#xff1a; 求余运算&#xff0c;除数和被除数都可以是负的&#xff0c;求余后的值 与 被除数 的符号相同&#xff0c;比如 -10 % -3 -1, 10 % -3 1。

一文读懂 Linux 内存分配全过程

在《你真的理解内存分配》一文中&#xff0c;我们介绍了 malloc 申请内存的原理&#xff0c;但其在内核怎么实现的呢&#xff1f;所以&#xff0c;本文主要分析在 Linux 内核中对堆内存分配的实现过程。本文使用 Linux 2.6.32 版本代码内存分区对象在《你真的理解内存分配》一文…

CodeForces - 540D Bad Luck Island —— 求概率

题目链接&#xff1a;https://vjudge.net/contest/226823#problem/D The Bad Luck Island is inhabited by three kinds of species: r rocks, s scissors and p papers. At some moments of time two random individuals meet (all pairs of individuals can meet equiprobabl…