大家好,我是科岩,我没有失踪啊,只不过是穿越了一趟,刚从20021年穿越回来,去看了看那个时候的行业发展。我可以很负责任的告诉大家,到20021年咱们嵌入式这行业还没被淘汰。

 

咱嵌入式工程师到那个时候还是干着老本行,新知识、新概念虽然层出不穷,但是核心没有变。所以大家放心学,咱这活儿能干到20021年,开心不。

 

那么卷不卷呢,还是很卷的,比现在的互联网都卷,但是不用怕,看过这篇文章的人一定能卷过那些没没看过的人。

 

为什么呢,因为我在20021年采访了一位非常权威的老工程师,他把自己的成功秘诀都教给我了,在文章结尾我也会毫无保留分享给大家。

 

上篇文章咱们讲了单片机的学习路径,这次咱们讲讲linux。

 

文章中会讲解脑图中的全部内容,如果你想要保存一份到电脑或者手机里吃灰,可以关注公众号「科岩成果」后,回复「Linux」下载。

 

闲话少说,咱们开始接客。

 

小菜鸡

 

看过下面这篇单片机学习路径的人,一定知道这次为什么只讲“Linux”。

 

单片机从小菜鸡到老司机

 

嵌入式是一个很笼统的概念,有小伙伴学了那么久嵌入式,仍然说不明白到底嵌入个啥。

 

咱们先来统一一下概念,到底什么是嵌入式?

 

嵌入式其实就是为了区别于我们的PC机,personal computer,也就是电脑而出现的概念。

 

大家现在攒一台电脑,主板内存条硬盘CPU,再买个电源和主机箱显示器,键盘鼠标就齐活了。

 

 

 

每一台电脑都是这些标准器件。同一个主板,换一个不同型号的CPU也一样用,同一个CPU,换不同品牌的内存条,插上也能跑。

 

它们能装标准的苹果、Linux、windows操作系统,做的事情也都一样,处理文本、看视频、打游戏。

 

那嵌入式呢,其实是对这种标准计算机的裁剪或者说定制化。

 

它是用于特定功能的计算设备。

 

比如智能手表爱沃驰,它有cpu、内存、硬盘、触摸屏,但没有键盘也没有鼠标。

 

路由器,有cpu、内存、硬盘,还有Wifi模块,有一两个按键,没有屏幕,没有键盘没有鼠标。

 

小区里的快递柜,有cpu、内存、磁盘、触摸屏,有控制锁的模块,也没有键盘和鼠标。

 

这些设备呢,你换个CPU(MCU),不换主控板,可能同品牌同型号的还勉强能跑,大部分是不能直接用的,因为它不是标准的器件。

 

所以,嵌入式就是裁剪后的计算设备,至少有CPU内存磁盘。其他的,是接显示器还是接触摸屏,是接鼠标还是接游戏手柄?要根据具体的功能或业务场景来选择。

 

那到底嵌入个啥呢?

 

就是把有计算能力的主控板,嵌入到机械装置或者电气装置内部,能够控制这些装置。

 

我们嵌入式工程师的任务,就是完成这个定制化的、嵌入内部主控板的硬件和软件的设计。

 

我们的设计目标通常是达到可用、可靠的前提下,越便宜越好。

 

上篇文章也说过,单片机定制化的产品一般都比较便宜,Linux定制化的会比较贵。

 

那Linux又有什么功能,有哪些技术栈,它能实现什么业务,哪些具体的场景会用到它呢,

 

咱们依然从4个阶段说起。

 

 

首先是小菜鸡。

 

基础概念。

 

首先你要机道知算机是什么,是由数字电路组成的可以运算的机器,可以处理文本,声音,图像等数据。一般使用标准化的CPU,内存,硬盘,还有一些外接的设备。

 

那么嵌入式是什么呢?刚刚也讲了,定制裁剪后专用于某个用途的计算机。

 

然后操作系统,我们现在常用的操作系统windows,Linux,Mac、安卓,还有IOS这些常见的操作系统,你要有概念。操作系统里面都有进程、线程,它们会做一些调度,会处理文件,作为一个程序员,都是你应该知道的。

 

接着,关于程序,要知道程序其实就是运行在某个芯片上的一系列指令集合,一般要通过编译、下载、运行来安装到操作系统上。

 

写程序的软件呢,看你喜欢,随你所爱。

 

接下来,互联网时代,不懂网络是不行的。要了解常见网络协议功能,图中我列出了非常常见的协议,随便挑一个,你得知道它干啥的,当然小菜鸡可以不知道它是怎么干的。

 

最后,嵌入式工程师,我觉得可以用8个字形容嵌入式工程师的性格,实实在在、可可爱爱。

 

不过我也承认,偶会自我感觉良好,总觉得自己写的代码不会有问题,有问题也是别人的bug。

 

然后标准穿搭黑框眼镜,格子衫黑色或者黑色的双肩包,这个我上篇文章也说了。

 

再然后就是女朋友,女朋友哪有画板子香啊!(有女朋友谁还画板子......)

 

接下来,Linux系统命令的学习。

 

 

因为Linux嵌入式工程师嘛,Linux必须得用得特别666。

 

常用命令,目录文件、用户权限、系统、网络、程序还有一些其他的命令,也并不是说你在小菜鸡全部要学习,掌握大部分,其他的需要的时候知道用哪个,现学就行。

 

我列出来的命令,基本上是非常非常精华的命令了,这是我在工作中几乎每天都要用的命令。

 

还记得我上学那会老师教的是红旗Linux,不知道你们学校用的哪个,然后我为了学习还专门报了个班考证书,红帽的RHCT,就是这个证书,

 

 

2011年3月,刚好10年前的,我查了下这个证现在好像改名了,它能比较全面的教你实操一遍linux的系统命令。大家有兴趣可以去研究下,培训培训。

 

下面,只学会使用系统命令还不够,我们还要学习一些对Linux系统进行配置的操作,大多就是改配置文件。

 

 

比如配置环境变量,把动态IP改成静态的,或者是搭建常用的服务。

 

小菜鸡最后就是C语言基础,依然是参考我们C语言的路径图,然后达到小菜鸡就能上手Linux。

 

 

C语言小菜鸡阶段就是会C语言的基本语法,常量变量表达式,函数分支循环,数组结构体指针,以及C的标准库。

 

这些掌握了,你就能在linux上写出程序了。

 

以上,就是小菜鸡阶段了,主要就是学习Linux操作系统的使用,以及在Linux上编写程序运行程序的流程,不知道你是否达到了呢?

 

如果还没达到小菜鸡水平,不会C语言,也不了解操作系统,那么我可以送你一个字,「猛」。

 

什么意思,就是小菜鸡阶段一定不要久留,要迅猛的度过这个阶段。

 

如果让我给时间,就是两周,两周把C语言基本语法和Linux系统搞定。复杂的先不管,多维数组、函数指针,C语言的多态,这些都先不学,后面用的时候再学不迟。

 

小菜鸡这个阶段千万不能久留,因为它容易产生厌学情绪,这个阶段学的东西都比较枯燥,学会了也做不出来什么好玩的东西,成天打印杨辉三角,画画小星星,算个10个数取最大值,很无聊。

 

要给自己压力,尽快度过这个阶段。

 

入门鸡

 

接下来咱们看入门鸡。

 

首先是C语言的进阶。

 

 

写代码要遵守一定的规范,好的公司都有自己的代码规范,缩进注释命名都有规定的,你不能乱写,要写别人能看的懂的代码,这样才好维护。

 

接着,数据结构还是老四样。算法排序查找,这都必须掌握的,要知道什么场景用什么结构和算法,这个就不多说了。

 

 

接着要学习一些代码管理工具的使用,科学管理代码能提高效率,保证质量,比如git和svn,这也是必备的技能。

 

 

接下来就是学习Linux的系统编程,对文件的处理,多进程多线程的使用,包括同步、共享啊这些接口。

 

然后是网络的编程,就是socket的那一套。

 

再往下就是io模型,阻塞式、非阻塞,多路复用和信号驱动这几类要会用。

 

会了linux系统编程接口,理论上你能做任何基于linux的开发了,不过想更加高效,完成更加复杂的应用,就要学会站在巨人的肩膀上,学会用轮子,也就是第三方库的安装和使用。

 

 

安装第三方库呢,可以直接通过网络安装比如yum或者apt-get命令。

 

还有一种方式就是下载源码,然后去做源码的配置,编译,安装,最后通过命令-v来看它的版本,判断是否安装成功,这两种安装方式都是需要掌握的。

 

我列了一些常用的第三方库,单元测试的,检查内存泄漏的,数据库的,安全的,还有网络的,这些库,也都非常常用了。

 

学会安装、使用第三方库,你就拥有了站在别人肩膀上的能力。

 

接下来还要学习交叉编译,毕竟是嵌入式Linux,要移植到不同的硬件平台。

 

 

你要知道什么是交叉编译。就是在你的电脑上编译出其他处理器上的程序,没多难,就是下载个工具链,配置个环境变量就ok啦。

 

最后是一个实践,我建议编写一个网络聊天程序,可以去阿里云购买一个云服务器来做服务端,本地的linux做客户端。

 

 

你做一个专属客户端发给你的女神,以后你们就不用微信,让这个聊天程序成为你们爱的证据,有动力了吧?

 

这个网络聊天程序我也没有找到特别合适用于这咱们学习使用的,所以这篇文章呢,如果点赞超过100,我就去自己写一套,奉献给大家。

 

入门鸡阶段呢就是这些内容,主要就是C语言的进阶,Linux的系统编程,以及第三方库的安装和使用。

 

如果你还没有达到入门级阶段呢,那么我同样也送你一个字:就是「稳」。

 

什么意思呢?Linux系统编程的这些接口,都是非常经典的接口,这些经典接口它的参数返回值、调用方式,使用时有哪些注意点,这些问题在学习的过程中,我们一定要一步一步的来,循序渐进,稳稳的进步,不能不用力,也不能太猛了,毕竟需要掌握的还挺多。这对你以后成为进阶机和老司机,会有非常大的帮助。

 

基础打的牢,上层建筑才能建得高,入门鸡阶段呢,大概是1~3年的这么一个时间周期。

 

进阶机

 

接下来是进阶机。

 

 

我把进阶机分成了两个部分,一部分叫“通用内功”,就是几乎哪个行业都通用的东西,学会内功,才能以不变应万变;另一部分叫“独门绝技”,指的是某一个细分领域的专业技术知识,学会了至少不用担心失业。

 

咱们先看看通用内功。

 

 

首先是源代码的学习,我列了些网络相关的源码,包括TCP、UDP、HTTP,还有高性能服务器、存储系统的源码,这些久经考验、使用广泛的源代码可以给我们的工作带来很多启发,有些代码片段直接可以借鉴。

 

图中后面是这些代码的地址,大家可以去下载、学习。

 

接下来是代码性能的优化,性能优化在低性能单片机领域还是比较重要的,但是现在高性能的芯片越来越快,所以一般来说性能优化不是那么重要。

 

可能一个应届生写的代码速度是老工程师的几十分之一,不影响功能的话,能正常用也行。

 

但我们也要知道该怎么优化,这样才能有所成长,写出高质量的代码。

 

接下来是代码的可移植性,也是4点,统一的数据类型、内存和结构体对齐,注意大小端,多用库函数。

 

如果你看过很多源代码,并且学习使用,那么写移植性好的代码会成为你的习惯。

 

接下来是一些其他语言或处理脚本的学习,python,shell、lua、R语言、php甚至makefile等等。

 

不用说嵌入式,就单说程序员,一个优秀的程序员一定是会不断学习新的编程语言的。最重要的东西其实不是编程语言本身,而是语言的设计思路以及它所适用的场景。学的语言多了,需要设计技术方案时,你就会知道,用哪个语言能够既快又好的达到目的。

 

学完了上层语言呢,可以向下再学一层,Arm的汇编指令。

 

运行Linux的Arm芯片多是Cortex-A核心的,37个寄存器,一些关键的指令要知道有什么用,会写些简单的汇编程序就可以啦。

 

再向下,学一些计算机体系结构的知识,总线,存储器,I/O,还有CPU。这个体系结构是纯理论知识的学习,我找到了我上学时候的计算机组成原理这本书,当时学的真的是枯燥乏味,看得我都晕了。

 

 

但是现在看呢,我跟你们说,真的,这本书绝了。计算机是干啥的,计算、存储、通信,而这本书写的就是计算、存储、通信的精华,是关键,是最核心的东西。

 

但这部分知识呢,大部分人的工作中是用不到的,除非做那种最底层的工作,比如设计CPU,设计硬盘。但我也建议你学学,至少知道它讲啥的,万一哪天有需要,能很快找到就可以。

 

OK,以上就是通用内功的学习,通用内功各行各业都有用,这部分知识学会了已经超越很大一部分人了。

 

那么接下来就是独门绝技了,咱们依然是从上到下的一个讲解。

 

 

首先是图形界面编程,也就是大家熟知的QT,要学QT,首先得学面向对象和C++,然后是QT的信号与槽的机制,画图、文件、线程、数据库、网络接口的使用,最后是QT在不同硬件平台上的移植,这些都是一个QT工程师该掌握的。

 

QT我不懂啊,但是我知道QT的C++源代码写得非常漂亮,如果你花时间努力学习QT的源码,看懂了它的架构、机制,那你基本上可以在简历上写「掌握QT的设计机制」和「精通C++」。

 

是的你没看错,学习QT顺便还能精通一下C++,是不是很爽。

 

 

接下来是流媒体,就是做个摄像头、做直播等等,需要了解各种各样流媒体的协议,RTP、RTSP等等,它们怎么握手,怎么交互,播放、暂停,【传输协议】你肯定得深入的学习。

 

然后就是编解码封装协议、应用的框架还有一些国家的标准,都要掌握。

 

下面是人工智能,人工智能现在是非常火,我找了几项建议大家学习的框架或者代码,能够移植到咱们嵌入式设备上,大概如图中这几项。

 

 

首先,深度学习,TensorFlow这个框架就可以了,收集数据、处理特征、训练学习模型等等都是现成的接口,好用,用的人多,资料也好找。

 

然后语音语义识别,就是我说完话,计算机能转换成文字,但还不知道我说的是啥意思,这也是有现成的框架。

 

接着,自然语言处理,就是机器能够理解我说的话,这部分我没有找到在嵌入式设备上能够移植的框架或代码,应该都还是在云端做的,列出来只是告诉大家有这个分支。

 

图像识别OpenCV这个图像处理库是必须要学习的。

 

还有机器人,就是ROS系统的学习了。

 

可能你会问,咱们搞嵌入式的学人工智能好像有点不沾边。其实现在很多公司都有类似的项目,把后面云端的人工智能算法前移,放到前端设备上进行计算。

 

你想想如果全世界的摄像头、路由器、交换机甚至快递柜它们剩余的算力都用来发挥价值,那我们整个人类社会的算力也会迈一大步,算力是什么,就是生产力呀!

 

云计算、懂人工智能算法的人可能不懂嵌入式,他们来做移植一没兴趣,二是跨专业了,肯定不如我们嵌入式工程师移植的快,所以,将这些框架、算法移植到硬件上进行落地,是可以考虑的一个职业方向。

 

接下来是物联网,车联网,大概要懂这些技术:包括传感器、无线通信、总线通信、网络协议和物联网常见的应用。

 

 

应用比如规则引擎,就是当温度高于xx度,打开空调这样的规则,或者做设备的远程OTA升级,OTA升级里面涉及的技术细节也特别多,大家感兴趣都可以去做详细的查询。

 

接下来是边缘计算,大公司像亚马逊、微软,还有其他公司也都有框架提供,它是把云端的一些计算任务挪到了的嵌入式设备上,目前用在工业物联网上用的多,因为工业物联网接的设备种类多、协议复杂。

 

 

它可以支持大量的设备侧协议,比如前面说到的蓝牙、ZigBee,mqtt,modbus,不同的协议,不同的设备可以进行统一的管控,统一的编解码、收发数据。另外像规则引擎、日志等等这些应用,也都可以从云端挪到设备端来做。

 

下面是虚拟化和容器技术,这个现在也是各大公司的一个方向。

 

 

虚拟化就是在真实的芯片上虚拟出来一个或几个内核,然后虚拟出各自的内存、磁盘,可以装不同的操作系统。

 

 

容器,是在真实机器上共用同一套内存、磁盘,虚拟出不同的文件系统,虚拟化的隔离性好,容器的性能好,各有各的特点。

 

 

他们的好处很多,容易复制、部署,方便测试,软件肯定比硬件灵活对吧。

 

做虚拟化需要懂硬件像Arm体系结构,还要懂软件懂内核,有很多芯片原厂、通信公司还有互联网大厂有和硬件相关的虚拟化岗位,咱们嵌入式工程师都可以试试。

 

接下来一个技术领域通信。

 

 

包括了各种各样的网络通信协议,比如说WiFi、2G、4G、5G,还有路由、交换协议,我举了一些非常常见的二三层的协议,这都是做交换机、路由器等等网络设备需要懂的。

 

做通信还要看IEEE和3gpp这些标准。

 

唉,想当年我也是写过这个4G协议的人啊,天天看3GPP的文档,看的我都晕了。

 

下面是安全这个细分领域。

 

 

包括密码学,各种加解密算法;操作系统安全,比如安全启动,TEE,可信计算;然后是网络安全、二进制安全,以及国产化适配,很多行业是不允许采购国外芯片的,那就需要支持国产芯片

 

大家有没有想过咱们手机的指纹、人脸这么重要的隐私信息保存在哪里,是操作系统上么?被黑客黑了怎么办?当然不是操作系统里,有知道的朋友么,可以留言分享给大家。

 

接下来是异构计算,就是各种各样的用于特殊用途的处理器。

 

 

CPU啥都能干,能做控制,能做计算还能做调度;异构的处理器呢,主要就是做计算,它的使命就是发挥算力,比如做高并发的浮点数运算,非常快。

 

随着AI和自动驾驶逐渐成熟,各式各样的高性能芯片也逐渐出现了,想高速计算,是需要软硬件结合的,算法要移植,驱动要开发,这里有很多机会。想做这个行业呢,刚刚说的通用内功,计算机体系结构知识你得熟知,异构不管有多异,就容易触类旁通了。

 

再往下一层就是内核了,内核的理论知识要了解,对进程、内存是怎么做的管理,中断异常的机制等等。

 

 

然后要对内核进行裁剪,把不需要的部分去掉。怎么制作引导程序,怎么制作内核镜像、根文件系统、设备树,这些都是内核工程师该做的。

 

对于内核,还要掌握一些调试技巧,因为是写内核程序,经常整个系统崩掉,那得知道怎么查问题,我列出了一些常用的技巧,要熟练掌握。

 

学习了内核方面的知识呢,就可以向再往下一层学习BSP了,也就是板级支持包,得学习电子学相关的知识,电压电流电阻电容、半导体门电路等等。

 

 

然后一些常用工具得会用,万用表、示波器逻辑分析仪,有时候看代码怎么都没错,可就是不符合预期,那就要看看波形图排查错误。

 

然后还要会看硬件方案的原理图,重点关注存储器、外设、接口、引脚相关的部分。

 

不同的芯片要会看芯片手册,这都是必须的,时序图、内存的映射关系、具体寄存器的功能。

 

有上面的基础,就可以做驱动的开发了。

 

首先要理解驱动程序的框架,不能乱写。

 

驱动呢大体就字符设备、块设备、网络设备,大家都可以看看图中都有什么,这些分类的设备,循序渐进学习,写过简单的再写复杂的也没那么难。

 

以上就是进阶机阶段要掌握的技术啦。

 

通用内功,做任何一个领域,任何一项技术都需要掌握的,这是看家本领。

 

独门绝技,可以作为个人的核心竞争力,我建议,至少有一项你要去深入的研究,成为这一项技术的专家。

 

无论是通用内功,还是独门绝技,可以衡量一下自己是否达到了这个阶段。

 

如果还没到进阶机,那我再送你一个字,「久」。

 

就是要持久、长期,不要急,不要躁,这个阶段里面的这些技术,短期内上手是可以的,但想精通,至少5年,8年,10年才能掌握。

 

进阶机是完完全全的持久战,最后要达到一个什么水平呢?

 

可以基于现有的技术、接口结合你公司的业务,客户的需求,创造新的接口,创造新的形式,进而创造出新的产品,就可以了。

 

老司机

 

依然是4个部分。

 

 

技术、管理、行业、公司。

 

 

横向的技术扩展就是可以学一些其它学科的工程工具,上位机、测试、Matlab、PCB、工业设计、结构设计,但说实话,工作之后很难有精力再去搞这些了,除非你有极强的兴趣。

 

 

管理能力,包括团队管理、项目管理、需求竞对分析、供应链、成本控制等等,老司机要借助团队和公司的力量完成产品的开发和落地。

 

 

然后是对行业的认知,要成为某个行业的专家。

 

假设进阶机阶段的通用内功和独门绝技你都掌握了,你的技术水平可以封神了,那我告诉你,你的技术可以做出来任何的产品,可以你却不知道该做什么产品。

 

比如QT,你什么界面交互都会做,各种芯片都会移植,那请帮我做一个医院的病人、药品管理系统,你怎么做?即使你做出来了,我再问你,你怎么卖,卖给谁?卖多少钱合适,出了问题谁管。

 

再比如人脸识别,框架熟悉得像右手一样,你能精确识别出每一张脸,那这机场的、火车站的识别,可能跟银行的、小区门禁的要求就不一样,识别完要干啥,跟公安局的信息比对?跟身份证联动?还是说就开个门?

 

这些就是具体行业的知识了,想想你们公司领导、上级的上级,是不是非常懂业务、懂行业,如果一个公司没有懂行业的老司机,这公司一天都开不下去。

 

可以看图中各行各业都有什么产品,看看你对啥感兴趣,往那方面发展。

 

消费电子,这都不用说了,没有不知道的吧;

 

汽车电子,车里面全是芯片,岗位很多;

 

电力行业,咱们国家现在在大力推进智能电网,可以了解了解;

 

再下面的安全行业,防火墙网闸WAF堡垒机,这些不知道大家听过么。

 

最后是懂公司,我列了整个电子行业上下游的产业链出来:

 

 

从最上层的芯片原厂再到中间的传感器、操作系统、云平台、运营商,最后是B端或C端的硬件厂商,或者是集成商、渠道商。

 

要知道你的公司是属于哪种,和谁合作,和谁竞争,你们行业其他公司过的怎么样,都有哪些业务,他们为什么开展这些业务。

 

好,这就是老司机要具备的能力了。

 

如果你已经到了这个阶段,那就恭喜你啦!

 

还不是老司机呢,也不要紧,我再送你一个字,那就是「深」。

 

想成为老司机,你要深入的了解你所在的行业和公司,多花时间在这里面,有问题往深了多想一步,把公司的事儿当做自己的事儿。

 

其实职场就是这样,你对业务和行业理解的越深刻,你就越有话语权。多跟老司机交流交流拍拍马屁,让他吹吹牛,有机会也带着你。

 

以上就是整个脑图的全部内容了,大家,加油吧!

 

总结

 

在穿越到20021年时,我看到到处都是物联网设备,它们让人类变得更懒了。

 

我看到电动汽车充一次电已经能续航1万公里,全自动驾驶已是每一辆车的标配。

 

我看到人工智能早已应用到各行各业,几乎每一台拥有计算能力的设备都可以自学习、自决策,调用人工智能算法就像现在我们调用串口收发数据一样简单。

 

还记得开头我说过采访了一位老工程师么,我问他成功的秘诀是什么,没想到他告诉我的,和10年前我在一本书上看到的,竟然一模一样。

 

我也把这段秘诀分享给大家:

 

学习与不学习的人,在每天看来是没有任何区别的;在每个月看来,差异也是微乎其微的;在每年看来的差距虽然明显但好像也没什么了不起的;但在每5年来看的时候,可能已经是认知与财富的巨大分野。等到了10年再看的时候,也许就是一种人生对另一种人生不可企及的鸿沟。

 

成为老司机的秘诀,就在你所度过的平平凡凡的每一天中,每天进步一点点,相信我,量变一定会带来质变。

 

时代如何发展,本质依然没有变。

 

最后送给大家一副对联:

时刻牢记四字箴言,坚持十年

分享收藏点赞在看,月入十万

 

我是科岩,下期再见。