单片机老司机是如何炼成的?
大家好,我是科岩。
首先跟大家说一声抱歉,大家久等的嵌入式学习路径,今天终于来了。
经常有人问我,嵌入式该怎么入门,怎么学习,怎么精通,怎么成为专家。我前思后想掏心掏肺,花了大概2周的时间,写了这样的一个成长路径。
注意!本文又干又长,如果此时你无法抽出大约10分钟时间,建议看个开头,然后点个关注、收藏之后再(也不)看。
依然是用一个脑图呈现给大家,文中会仔细讲解脑图中全部内容。
如果想要一份高清版本,保存到电脑或手机里认真学习(吃灰),可以关注公众号「科岩成果」后,回复「单片机」下载。
图片和脑图的源文件都有提供。
闲话少说,正式接客。
首先如图,嵌入式学习路径之单片机。
为什么单说单片机呢,因为我觉得嵌入式是一个比较笼统的概念,可以按处理器性能大致分成两类。
性能低的比如51、stm32、arduino,这类设备一般用作开发比较便宜的产品,比如手环、插座、牙刷、小型玩具什么的,这样的芯片资源有限,没办法运行linux操作系统;
还有一类是高性能的,像我们手机那种处理器,能运行linux、安卓操作系统的,这类芯片一般用作开发比较贵的产品,像智能音箱、自动售货机、摄像头、路由器等等。
这两种性能不同的处理器都是嵌入式,但需要掌握的技术是有一定区别的,这期就先讲低性能的,单片机的成长路径,如果看完觉得不错记得关注,后面会再写一篇嵌入式Linux的成长路径。
依然是熟悉的4个阶段,这是科岩独创学习4阶段,小菜鸡、入门鸡、进阶机、老司机,也就是从入门到精通(入土)的几个阶段。
看完欢迎留言告诉我你在什么阶段。
小菜鸡
先从小菜鸡开始,小菜鸡就是一个纯小白,就是你茫然无知什么都不懂。需要学习的有三个部分,基础概念、C语言基础、单片机基础。
如图,基础概念内容如下:
你要知道单片机是什么;要知道MCU、RAM、ROM、IO引脚、中断、定时器这些概念指什么;另外,常见单片机有8位、16位和32位的。
还要对电路板有概念,什么是原理图,什么是PCB,这些硬件概念在小菜鸡阶段知道就行。
再然后是软件,其实也就是运行在单片机中的程序,我们也把它叫做固件。
有了硬件和软件,就要把软件安装到硬件中执行,这个过程叫做编译、下载、运行,一般会用到Keil、IAR、gcc等等工具。
我们人生中烧录到单片机的第一个程序一般是什么呢?
就是点灯,点灯其实就是嵌入式工程师的hello world,一般电路板上都有led灯,LED灯点亮了,就说明这块板子的硬件,包括电源、处理器、引脚等等是没有问题的,还说明软件的烧录、运行等一系列的步骤是没有问题的。
板子是好的,才有后面的工作。
所以作为嵌入式工程师,一般也自称为点灯工程师,>> 大家好我是点灯工程师,科岩 >_<
最后一点,就是知道什么是嵌入式工程师,一般行业内称呼一名嵌入式工程师都是某某工。
比如你姓张,大家就会称你为张公,姓李呢,就会叫你李公,像我呢,我姓老,不知道此刻看文章的你姓什么嘞?
工程师上班一般都在做什么呢?就是在画板子,写程序,调板子,烧板子。
你烧过板子么,反正我是烧过,特别好玩,直接冒烟,把我们上班的大楼都给整停电了,是不是很有趣。
嵌入式工程师的标准穿搭:黑框眼镜,格子衫,黑色或者灰色的双肩包。非常典型,工作经验一般可以通过发际线的高低做判断。
对单片机程序有概念之后,就要学习C语言了。
这里写了三点,参考c语言路径图;达到小菜鸡水平就可以上手单片机;最好是能达到进阶机。
这是什么意思呢,之前我做过一个C语言的学习路径图,也是分成了4个阶段。
小菜鸡是基础就是学C语言的语法;入门鸡算是培养兴趣可学可不学;进阶机比较高级,数据结构、算法、网络、linux都该学了,最好能到这个水平;老司机就不强求了,可以后面再学。
我就不详细展开了,这个如果想详细的去看的话,可以看下面这篇文章,如果想要脑图也可以到「科岩成果」下载。
有了C语言基础,接下来就是一些单片机的基础了。
首先要选一款学习资料丰富的mcu,建议直接选STM32,资料非常丰富,如果有任何问题查资料基本都能找到答案,对初学者来说非常友好
接着就要写代码了,我们的程序一般是通过轮询,或者定时器,或者中断这三种方式来进行触发,要学会编写这三种方式的代码。
接下来是外设,单片机存在的意义是什么呢?
其实就是通过外设,可能是键盘也可能是传感器,这种输入类型的外设,输入一定的数据,进行处理再通过输出类型的外设,可能是显示屏,输出一定的结果。
在小菜鸡阶段要学习使用各种常见的外设,LED灯、蜂鸣器、键盘还有IO引脚,这都是最基础的。
还要学习这3种很常见的串行口,uart、spi、i2c,要掌握通信协议的设计和编解码的处理,很多传感器就是通过固定的协议与单片机通信,另外单片机再和其他单片机、PC机等设备通信时都会用到协议编解码。
接着要学习一些调试手段,比如说Keil和IAR软件的调试功能。都挺简单的,如果程序有问题,可以用调试手段来查查内存、某个变量的值,排查问题。
小菜鸡最后,要做几个简单的实践。
我列出来两个,一个是测距,可以用红外或者是超声传感器来做。
另外一个实践是,可以读一些传感器的数据,比如温湿度、人体检测,把数据显示在屏幕上。
小菜鸡阶段结束后,你就可以做些简单的小项目。菜鸡学习时间呢,大概两周左右就可以了。
入门鸡
接下来就来到了入门鸡阶段,有这么几个部分:单片机高级部分,学习电路板知识,再做几个复杂点的实践小项目。
先看单片机的高级,包括这些内容:
写代码要有一定的规范,包括缩进、注释、变量和函数的命名等等,要按规矩写。
入门鸡阶段,项目中要用一些基础的数据结构了,不要全局变量和flag满天飞;还要学些基础的算法,主要的就是排序和查找。
接着要会用状态机编写稍复杂的程序,小菜鸡学会的轮询、定时器、中断只能做些简单的程序,复杂点程序就要有结构进行控制了,状态机是比较好的一种代码框架,要理解状态机的原理、编写的手法。
再复杂点的程序,就得上操作系统了,学会使用嵌入式实时操作系统,也就是RTOS,要了解它们的任务、锁、信号量和消息队列是怎么使用的。
如果做和物联网相关的项目,就要编写网络相关的程序,得会写socket程序,调用socket接口收发tcp/udp/mqtt的数据。
单片机联网一般会用到无线模块,可以通过串口透传或者AT指令控制模块,比如Wifi、蓝牙、ZigBee等等传输数据。
很多项目中的单片机是需要用电池的,电池容量有限,所以要学会编写低功耗的程序,比如控制单片机睡眠、停机、待机,还有低功耗如何测试、有哪些指标衡量功耗的高低,都要掌握。
第二部分,要学习看电路板了。
得能看懂简单的原理图和PCB就行。
最后,入门鸡的实践:
我建议做一个物联网设备,连接某个云平台。
阿里云、腾讯云、百度云,都可以连,他们都有物联网的接入平台,接入后,设备要与平台 APP打通。
比如做一个联网的温湿度采集器,可以在APP上看到设备从传感器读取数据,也可以做一个联网的智能插座或者智能灯,通过APP来控制它的开关。
入门鸡要花一定的时间,可能是你工作个一年后到三年之间的这样的一个状态,会灵活的使用以上的这些软件接口与硬件器件,时间久了就可以编写复杂的程序,做复杂的项目了。
进阶机
接下来是进阶机阶段,这个阶段要学习的东西不但变多了,还更深入了。
我把进阶机的学习范围分成2大部分,一部分叫“通用内功”,就是几乎哪个行业都通用的东西,学会内功,才能以不变应万变;另一部分叫“独门绝技”,指的是某一个细分领域的专业技术知识,学会了至少不用担心失业。
咱们先看通用内功,首先是最上层,嵌入式实时操作系统源码的学习,我建议学习FreeRTOS、RT-Thread、μC/OS这三个比较常用的嵌入式系统。
入门鸡阶段是会用RTOS,进阶机就要学习任务、锁、信号量怎么实现了。
接下来是网络源代码的学习,同样的,在入门鸡阶段是会用网络接口,进阶机就要学习如何实现了。
我们可以通过lwip这样的轻型协议栈源码来学习TCP或者UDP,mqtt是物联网传输的协议,HTTP是WEB的常用协议,图中这几个源码都是可以直接学习的。
然后是模块的二次开发,模块二次开发指的是基于无线模块直接做编码,而不是通过MCU进行控制。
这样可以减少一颗MCU主控芯片的使用,节约硬件成本,毕竟咱们硬件行业成本第一啊!
接着可以学习对代码性能进行优化,我列出了4种方式,这些都可以了解,有的项目有特殊的需求,咱们就要知道怎么优化。
下面是代码的可移植性,其实也是按照一定的规范编写代码,我也是列出了4点。
如果写代码时习惯考虑代码的可移植性,那你写的代码也能很容易的移植到不同平台。有时我们做一款产品,产品升级了或者更换了硬件芯片,之前代码移植性好的话,可以很快替换成新平台。
然后是编译和链接的脚本,要学习C语言代码是如何编译成机器指令,机器指令又是如何在芯片中进行组织的。
代码编译完会进行链接,要指定加载地址、指定代码段、数据段地址,这个也是有些特殊的产品需要人工设置。
除了C语言,还要掌握几种其他编程语言,Python、lua、shell都建议学学。
学会了C语言,这些语言其实都不怎么用学,看看语法就能上手写,我们经常用这类语言处理有规律的文本、处理二进制固件,方便快捷。
后面三个是学习底层知识,首先要学会看芯片手册,通过芯片手册能学到太多东西了。
在工作的过程中会遇到各种各样的芯片,可能会有一些比较少见的特殊芯片,没有封装成C语言的库,或者某些不常用的功能芯片提供的库没有封装,这时你就要通过操作寄存器直接控制它们。
芯片手册第一次看肯定看不懂,这个也需要花时间,时间久了,看得多了自然就懂了。
而且每个芯片的芯片手册套路、结构都差不多,看懂一个,基本其他也都懂了,所以大家不用担心。
再往下一层就是汇编指令集,单片机arm的体系结构居多,应当学一下arm的指令集,比如说Cortex M系列的核,它有37个寄存器,要了解它的一些常见汇编指令。能看懂,能够编写简单的程序就可以了。
最后再下一层就是电子学了,要学模电和数电的知识,电压电流,电阻电容,半导体二极管等等,都要知道它们是干嘛的,接着门电路、CPU、存储器的电路是怎么设计的,知道理论就可以了。
上面这些知识都是内功心法,无论做哪个行业,只要和硬件打交道,都能用得上,是咱吃饭的家把什。
下面再看看独门绝技都有啥,独门绝技就是能让咱们吃的爽,吃的久。
首先是通信协议栈的开发,比如PHY层、MAC层、空口各层协议的开发,像Wifi、4G、5G都有类似的开发需求、岗位,现在5G这么火,如果你能参与开发一个5G模组,那就非常厉害了!
下面是算法,算法这个分支也是一个比较专业性的分支,我列出了一些咱们单片机上可以跑的算法,滤波、姿态,惯导,PID,还有slam算法,有些是做可穿戴设备需要的,有些是无人机、无人车需要。
做算法是有很高门槛的,基本都研究生起步,如果你没有读研究生,或者读了但对数学没兴趣,建议还是不要去搞算法了。
我学历就是个普通小本科,算法这方面简直是个白痴,不懂。算法是真的牛,算法永远的神!
接下来是安全,这个我不知道有没有人了解,也是个细分领域。包括芯片安全,网络安全。
比如为数据加个密再存储、比如给固件签个数字签名再烧录到芯片,这都是安全工程师需要设计和考虑的。
未来万物互连,越来越多的家电产品,甚至汽车也都能用手机控制。所以,嵌入式、物联网的安全不能忽略。
再后面是FPGA设计,学习编写Verilog HDL语言,学会用硬件描述语言设计组合逻辑电路和时序逻辑电路,这也是一个比较细的一个分支,专业性非常强。
学习了FPGA之后呢,还可以再学习下设计CPU,包括流水线,取指、译码、执行,总线,中断异常等等这些硬件的设计,这已经非常非常底层了。
为什么嵌入式工程师要学习FPGA或者设计CPU呢?
我觉得这是底层原理,会底层的原理,解决上层的问题会思路更开阔,好比你明白TCP的原理,那如果HTTP出了问题,你会更容易解决。
好,以上就是进阶机阶段需要学习的东西了,此刻的你觉得兴奋还是觉得可怕?
如果掌握了这些呢,工作中遇到的任何技术问题,基本上没有你解决不了的了。
进阶机阶段,一般是工作至少5年吧,5年8年10年都有可能。想要理解和掌握,既需要不断的学习理论知识,也需要积累实践经验。
进阶机到此结束,马上就要迎来最后一个阶段,老司机阶段。
让我们来一起揭开老司机的神秘面纱吧。
老司机
老司机阶段,分了4个部分,技术、管理、行业、公司。
到了老司机阶段,你不单单是一个懂技术的人了,还要懂管理、懂行业。
仍然可以继续学习技术,可以学一些横向的技术扩展,比如上位机、APP的编写;测试工具、测试流程的学习;有兴趣可以学学Matlab仿真。
如果喜欢画板子,可以多画画PCB;愿意做设计,也可以学学工业设计、结构设计这些知识。
那么管理呢,包括了这些内容:
可以边带团队边学习管理知识,要依靠团队的力量实现你想实现的产品或者功能。
你还要有一定的行业认知,就是你要懂行业,我大概总结了几个单片机涉及到的行业:
不要把目光集中在手上开发板的一亩三分地儿,要关注行业的市场空间,是否处在上升期。
要努力成为某个行业的专家,行业的专家,行业的专家!
什么是行业的专家?举个例子,如果你在医疗行业,那你就要懂些医疗方面的知识。
比如做个血糖仪,要学习血糖对人体有什么作用、正常血糖值是什么范围,还要懂一个血糖仪是怎么设计、生产的,都有哪些人参与,客户是哪些人,他们在哪,通过什么样的方式或者渠道能把产品卖给他们,有没有什么行业潜规则。
大家现在听我这么说可能觉得很难,但其实没多难,你如果喜欢一个行业,那就去那个行业干几年,稍微用点心,都不用太久,慢慢就不知不觉都学会了。
老司机的最后一点就是公司了,我列了整个电子行业上下游的产业链出来:
从最上层的芯片原厂再到中间的模组厂传感器厂、操作系统、云平台、运营商,最后是B端或C端的硬件厂商,或者是集成商或者渠道商。
无论哪种类型的公司,都会有嵌入式工程师的需求。
作为一个老司机的你,应该了解你们行业中头部、腰部、尾部的公司,了解他们的商业模式,他们的生存状态,了解同行在做什么产品,都有哪些业务,为什么开展这些业务,这是一个老司机应该懂的。
这些行业认知和公司认知,都是需要在多年的从业中,摸爬滚打获得的,这些经验在哪本书或哪篇文章中都是学不到的。
end
以上就是整个脑图的全部内容了,看到这一定又有人会说我在劝退了。
这乱七八糟的学科知识都需要学,一看就头大,一看就不想学,好,那么请问啊,你是想学哪种知识呢?有什么知识学会了就不用怎么动脑,躺着就能数钱的,也教教我。
坦白说,我真的没有在劝退。
刚刚毕业的我们参加工作,一定要树立一个正确的职业观。
没有谁的人生是简简单单的,也没有谁的职业生涯是轻松加愉快的。
既然一定是要去做一个职业,那就不论是嵌入式还是大家知道的其他的,后端呀,Java呀,PHP啊,Python啊, 这些所有的语言,所有的知识,你都是需要一个这样的一个成长阶段的。
如果最开始就树立着一个长远目标,就朝着老司机这样的方向去迈进,有一个指引,我相信你会非常明确的,你会获得一段成功的职业生涯和难忘的人生经历。
人的一生何其短暂,职业生涯多说不过40年,我希望,当你退休、回首往事的时候,不会因为虚度年华而悔恨,也不会因为碌碌无为而羞愧。
全文完。如果对你有启发有帮助,求赞、求在看、求转发,让更多的兄弟看到。
后面我还会再出一期嵌入式linux的学习路径,主要讲Linux系统工程师的,欢迎大家关注起来。
到这了,大家再见!