写在开头

关于自学这件事呢,每个人有自己的节奏和时间点,所以我的方法不一定适合你。不过别人花了时间精力金钱摸索出来的方法和资料,也许对你有一定的借鉴意义。

那我就把我个人的学习过程写一下吧。

C语言

第一阶段是C语言,这个是嵌入式软件一切的基础。它相对于汇编语言和高级语言来说是承上启下的,涉及到底层硬件编程的时候大部分还是用C语言写的,所以它真的非常重要。C语言里比较难的就是指针了,如果你张口能讲清楚指针和地址的区别,那我觉得你的功力一定不差。

C语言基础一定要打好了,我人生的第一桶金就是在QQ群里帮一个人做了2道C++的题赚了100块钱,老实说,这也是第一次让我认识到原来我学的知识是可以赚到钱的。业界都认同一句话是C语言是最难的,如果C/C++都学会了,那么学java,python这种高级语言就会很快入门。我学的编程语言也不多,就C/C++、python、golang这些,基本对上面那句话是比较认同的,C语言学完了也可以抽个几天入门下python/golang,感受下最近流行的这些编程语言的新的思想新的模式,是真的很简单便捷,C语言要几千行的代码也许golang百来行就搞定了。看个人时间安排,python这个不是必需的。

单片机

学完C语言,就可以玩单片机了。学校里一般教的是51单片机,确实很经典,不管你在学校学的怎么样,我都建议你看一下《郭天祥十天带你精通51单片机》的课程,这门课基本可以带着你初窥单片机的世界。郭老师的这门课讲的超好,逻辑清晰,表达清楚,虽说是07年录制的,但是视频质量很高,从点亮一个led到串口通讯到时钟定时器的设计原理。

这十几条视频看完,基本上就算你入了单片机的门了。郭老师的视频B站上就有,个人建议你看看就行了,51的开发板就不要买了,直接买stm32的就行了。因为现在市场上单片机市场stm32真的是份额巨大,大部分单片机开发都离不开他们的影响。STM32学会了,后面工作接触的基本都是同类型产品,像国产的华大单片机芯片HD32啊之类的基本就跟STM32一样,上手会很快。

你在淘宝上买个stm32的开发板,基本都是带教程的,目前比较出名的就那两家,或者你随便买个开发板,然后上B站搜STM32,去学习排名靠前的STM32的课也行(其实排名前2的课也是他们两家),跟着人家学,先点个灯。人家互联网的人玩个啥新东西都要打印一句“hello world”作为开始的标志,诚然,起码能打印出东西了代表基本的环境框架都没搭错。而我们电子圈的玩个新东西都要点亮一个led灯来宣示自己对手上开发板征服的开始,所以我们开玩笑的时候都号称自己“花式点灯师”。朴素的行业潜规则往往蕴含着深刻的道理,因为任何一款单片机而言,你点亮了它的灯,剩下的功能都是在点灯功能上的延伸,无非是协议更复杂了些,GPIO口更多了些。

点完灯之后把教程里重点的像串口、中断、定时器、IIC、SPI过一遍,再上块触摸屏,玩玩GUI,整点花里胡哨的项目,你的单片机能力就能再上一个等级。这个是我当时做的笔记和知识点总结,都是我自己随手记的,可能只有我自己能看懂,等我哪天不懒了估计会把这些笔记重新整理发在公众号上,努力做成别人也能看懂的样子。

STM32裸机学完后,就去学习实时操作系统,这个系统是可以运行在STM32上的。实时操作系统相比windows、linux而言还是一个比较小、比较简单的操作系统,适合作为你入门操作系统的起点。因为你老是自己写个定时器,写个while(1)的话,技术含量不咋高,相应的可能薪资待遇也会低一些。注意,我说的是普遍,当然每个行业的顶尖精英都是不缺钱的。

所以你可以学习一下操作系统的知识,思考用这个操作系统实现某功能和不用操作系统实现的区别是什么,是不是更方便更有效率了。主流的实时操作系统像ucos,freeRTOS等,我个人是从ucos-Ⅱ系统学起的,它里面的任务调度,信号邮箱的通信,中断、优先级的设计等等,基本是所有操作系统共有的特点。了解它们实现的原理,对你后续linux的学习大有裨益。

STM32裸机+ucos操作系统教程学完后,你就可以上手做一些实战项目,比较流行的小项目比如智能手环、门禁、环境监测等等。我这里有一些做项目的资料,

如果你需要的话,可以在公众号回复“学习资料”领取。

Linux应用

stm32熟悉了之后,可以玩玩linux,先学linux应用,应用就是用户程序,俗称app。从单片机转到linux学习的人也许会有很多不适应,因为很多东西接触不到底层了,被linux系统隔了一层。比如说我们在单片机上用复杂协议都是要自己用GPIO口输出高低电平,包括时序啊,起始条件、停止条件等来实现协议和通信,而到linux系统上则不用接触这么底层的东西。

像我做linux应用的时候,最常用的就是网络编程了,比如使用TCP、UDP协议有线控制仪器设备,或者使用ssh协议连接远程服务器,或者使用http、mqtt协议跟云端通信,或者通过zigbee和室内单片机节点进行信息交互等等等等,这些协议统统不用管人家是怎么实现的,你只需要装个软件库调用就行了。

所以刚从单片机转linux的同学一定要注意心态上的变化,不能还依赖于自己以往的用单片机的思维定式,要接受linux的这套设定。学习linux应用的时候也不用买开发板,用自己的电脑装个虚拟机,主流的linux操作系统像ubuntu、redhat都行。从系统命令到shell脚本、makefile,从文件操作到多进程多线程等等,知识很多。但是这些东西都是终端程序,大概呢就长这样:

但是你经常接触的APP肯定不长这样对吧,个个都是花里胡哨的,这个时候就引出了一个叫做图形界面的东西,linux下最流行的就是Qt了,这个时候需要学点C++类和对象的知识。我们可以用Qt来美化我们的APP,用一些按键啊、窗口啊来将我们的命令行程序包装成大众都能用的APP。

应用学的差不多了你可以写个小型的linux系统APP,比如简单的银行ATM系统,用多进程模拟一下取钱存钱(最后银行的账要对上啊),来检验一下学习的成果。

Linux内核与驱动

linux系统有句slogan,叫做“everything is a file”,意思是说linux系统的一切东西都可以当做文件来进行读写。比如说你外接了一个USB设备,这个设备被linux系统识别后,就会被当做一个文件,你可以对它进行打开、读取、写入等像操作文件一般的操作。但是你我都知道这东西它其实不是一个文件,而是一个USB设备,那么我们对文件写入的话到底写入到哪儿了呢?这就是驱动的作用了,它负责把你写入的东西放到该放的地方,使这个USB设备按你的想法运转。你写应用的时候根本不用管驱动是怎么实现的,只需要会调用它就完事了。

这个时候你可能会想,大家都来调驱动,那驱动谁写呢?于是,你接触到了linux内核驱动开发。

在学习这部分的时候,我推荐你买一块linux系统开发板,这样比较直观一点,课程的话,韦东山老师的课比较经典。通常大家都会给自己的linux开发板移植系统,在这个过程中你就会接触到uboot的移植,linux内核的移植,根文件系统的制作这三件套,嗯,这是移植系统必须的三大步骤。建议你买本书或视频好好看看,我这里也有自己收藏的一些资料,包括一些电子书和移植流程等,如果你需要的话,在公众号回复“学习资料”即可领取。

系统移植好后,就可以进入到驱动的学习。从早期驱动模型到平台设备驱动到设备树的使用,都要过一遍,一般大家都会从字符设备驱动学起,比如先自己写一个led灯的驱动,试试驱动的安装和卸载这些流程,然后写一写复杂点的串口的驱动,移植一些复杂点的,比如网卡驱动、LCD屏的驱动等等。在这个过程中,你会越来越多的接触到内核,跟它有着频繁且亲密的互动。这时候免不了学点内核调试技术了,比如中断子系统、内核休眠与内核定时器,异步通知,内核同步机制等。这里的知识相当复杂,不建议初学者入戏太深。驱动和内核的知识太过庞大,不能急于求成,适合在漫长的岁月里慢慢体会它的巧妙之处。

都过了一遍了,就可以考虑做个大一点的项目,比如智能家居。

这里我想插一句。挺多同学想要这个项目的详细教程,我也试着去录过一段时间的视频想把这玩意讲清楚,但是这项目确实太大了,牵扯到的知识太多,短时间讲不完。而我目前也是在职业生涯的初期,空闲时间太少,所以这个视频教程估计是要鸽很久了。不过我可以把当时的源码免费给大家,如果你真的想做的话,也是一个参考。你在过程中有什么实在想不明白的问题或者卡了很久的点可以问我,我帮你看看,但是整套教程的话,我近期实在是没有时间做了。需要的话,你在公众号回复“智能家居”就可以获得源码。

至此,arm+Linux就告一段落了,这些做完,基本你就可以找到10K以上的嵌入式工程师的工作了。

拓展学习

不过也许你是个不满足的人,希望再拓展一些知识面。这里有以下几个选择:

arm玩过了,可以看看FPGA,像zynq这种热门的芯片,有机会一定要玩一玩。zynq的实战项目我看的是这几本书,挺不错的,网上很多博客教程其实都是复制的他们的。

现在物联网比较热门,你可以让你的设备上个网。了解下行业流行的MQTT通信协议,比如用微信小程序远程控制你的设备,感受物联网的世界。

物联网这个项目做完,你基本就已经初步入门了web前端了,这个时候可以学点后端的知识,最近python,golang很火,python的话廖雪峰的教程挺好的。据某头条资深HR和某宝CTO跟我讲,目前大家都在转golang。所以我最近也在学golang,他们官网的教程就不错。先把官网的教程过一遍,在阿里云上买个服务器,你就可以自己写个服务器先玩着。学习后端记得要了解下docker,mysql,redis这些工具。尤其是mysql,它是一个高效的数据库管理工具,你总会用到的。

最后,作为一个写代码的,git一定要会用啊。虽然你很怕麻烦,但是git这工具,谁用谁真香。

这些都过了一遍了,你就可以在你的简历上写:

熟练C/C++,熟练使用cortex-M3、A9芯片,具有stm32裸机开发经验,以及SPI、232、485、IIC、CAN总线等协议的使用经验;

熟练掌握arm+Linux嵌入式应用开发,驱动开发,TCP/IP网络编程等,精通QT图形界面开发。

熟悉FPGA软件,有zynq开发经验。

熟悉Python/golang后端,物联网云端开发;

熟练使用git开发工具。

大概这几行简介,加上你实际的项目经历,然后标上期望薪资15k~30K,会有HR来找你的。

写在最后

以上呢就是我自己的个人学习经历了。我对自己的评价是动手能力较弱,不太能拆东西焊板子,长处是逻辑思维能力较强,喜欢安静和思考。所以我个人的发展比较偏软件。当然也有动手能力强的同学是直接往硬件方向去了,画板子焊电路板做结构等等。以我个人对硬件同学的了解,做这一行肯定是需要精通电子电路的知识,模电数电要好,各种元器件的特性要了解,AD之类的软件要会用,还会接触到一些工厂的人,毕竟板子需要制作嘛。哦还有,焊功要强。由于我目前没有往硬件方面发展,就不多说了,不过我今年认识了一个宝藏UP主达尔闻,专门在B站上投稿一些硬件方面的课,质量都挺高的,有往硬件方面发展的同学倒是可以关注一下。

以上文章首发于公众号“李纳克斯Linux”,有更多我的分享和职场感悟,感兴趣的话关注一下哦。