很多人对嵌入式应该学些什么说的很复杂或者很简单,我以主流的linux操作系统为例来展开。
很多人只能做单片机开发,比如C51或者STM32(比较常见)等,当然了他们也可以跑一些小型的操作系统比如μC/OS-II或μC/OS-III等,当然了这些也是基于C语言的学习,也是和硬件在打交道,属于C语言直接调用库函数或者直接操作寄存器,也能够让硬件正常的工作,没错,会这些你也能有一份工作,学的深入的也会有不错的工作,正所谓360行行行出状元嘛,但是当你在这个方向工作三五年之后你会发现你进入到了瓶颈期,为什么呢?因为你会发现你的技术处于某个高度,很难得到提升,而且有很多东西感觉属于这个行业,想尝试着去做,但是就是没有能力去做,这个时候不是你能力不够,而是你的技术储备不够了。你需要去打通一下任督二脉,那么这个时候建议你上手真正的嵌入式开发。
嵌入式门槛的学习比较高的原因,因为中间需要很多的技术储备,如果不能打通中间环节,那么你就只能停留在单片机开发的层面。那么接下来我大致的帮大家理一下这一块的一个思路,小弟入坑不久,错误和漏洞肯定是有的,希望大家能稍稍包涵一下,在此谢过。
学习嵌入式开发首先你需要有一个良好的C语言功底,你需要对C语言可以说是熟练掌握,当然了各种运算符和表达式以及类型的范围是基础中的基础,判断选择循环的语句肯定不能用错,static、extern,const,等的用法和对变量函数的作用域等的影响都是基础,typedef,struct,union,#define的各种用法和坑肯定要掌握,说实话掌握上面这些再加上指针和数组的用法基本上做单片机开发就没有问题了,但是如果是嵌入式开发,对C语言你还需要对各种数组,指针,数组指针,指针数组,函数指针,回调函数的用法熟练掌握,为什么呢?因为驱动的部分基本上都是函数指针和回调函数来实现对各种接口的支持。这个是对C部分的一个要求,相对来说要求较高,不过贵在应用嘛,快速掌握这些和通过几年时间掌握这些其实就是时间的问题,相信多数人事耗不起这个时间的。
第二个你需要掌握的内容是数据结构,数据结构是对数据的组织结构(鄙人陋见),那么这个时候链表的强大就会出现在你的面前,很多人感觉数据结构的学习很难,的确很难,我给大家简单的说下小弟以为的难点在哪里,难点在于他需要你去梳理数据与数据之间的关系,以前咱们是直接遍历,现在要实现对数据的增删改查加排序等功能,同时还要把这些数据当做一个节点栓在一根(单链表等)或两根绳子(双链表等)上,那么怎么先给你的数据申请个位置(malloc一个节点,按照你定义的节点形式)然后在链表上遍历找到合适的位置插入就可以的,同时后面的绳子还不能断对吧,保证数据的完整性。一本不错的书是《大话数据结构》(我没看完,不过很不错)。那么对嵌入式来说,数据结构学到那种程度就可以了呢?我相信这个是大家关注的问题,因为数据结构那么多东西,都学完还不累死了啊。我这里简单的发表一下建议,数据结构将前面的单链表,双链表,循环链表,栈,队列全部拿下(能自己画画节点的图,最好能独立实现代码)就够了,树的话了解树的递归创建和遍历就可以的了,再内核中出现最多的就是链表,希望大家好好掌握,为后面打下坚实的基础。而对于图的话,那是算法工程师的事了,因为图的多数应用都位于算法中,这里就不做过多的介绍了。不过还是要给大家强调一下,如果想深入学习嵌入式开发,那么C语言的掌握还有数据结构部分的思想是重重之中。
拿下C和数据结构之后其实你发现你还是停留在裸机的开发,要想进入嵌入式的开发,那么你需要切入到Ubuntu的学习,当然了个人建议前面的C语言和数据结构也在Ubuntu下开发会更好,因为嵌入式开发目前Ubuntu环境是最好上手的。(这里做个广告,华清远见创客学院的整套嵌入式课程都是在Ubuntu的环境下学习的。)要想进入Ubuntu的学习那么你需要一把钥匙,熟悉shell命令,能实现像windows下那样复制粘贴拷贝重命名查找….,当然了都是通过命令实现的,此外你还需要熟悉vi编辑器,这款最强大的ide,可以百度一下vi的配置,把在vi环境下的代码编辑作为你初入嵌入式必须攻克的一个门槛(很重要),当你基本的shell命令和vi使用拿下了之后,你就拿到了这把钥匙(估计突击这一块也就两三天就能拿下)。
后面你可以看到要想与内核打交道你需要拿下文件IO和库函数,为什么呢 ,你会发现之前的C和数据结构基本上都没有对文件进行过操作,而linux当中号称是”一切皆文件”,因为在驱动开发中不管你是什么设备对我来说都是一样的,都只是一个文件而已,linux下有七种文件类型,bcd-lsp,大家可以自己去扩展一下,那么在linux下将你所有的设备都抽象成各种文件,字符设备文件,块设备文件,网络设备文件,普通文件等等,这也就是说要想学习linux,学习驱动,你必须掌握linux下对各种文件的操作,比如对文件的打开,读,写,ioctl,关闭以及问目录的打开关闭等。linux下提供了两套标准,一个是文件IO,一个是标准IO,区别简单说就是是否有流缓冲区(具体可以自己去扩展),这里区别一下linux下支持的是文件IO,其实这个难度也不大,基础较好的人不用一周就能掌握,当然应用的熟练度肯定是有待斟酌的了。
那么拿下了文件IO和标准IO就万事大吉了吗?不是的,这里我们稍稍谈一下linux内核是怎么工作的,它是通过对进程和线程的调度来完成各种任务的,那么这个时候你想一想,你该做什么啊?是的,没猜错,你需要把linux下7中进程间通信方式给拿下,比如无名管道,有名管道,信号,信号量,共享内存和消息队列以及网络通信,不过由于进程的资源消耗可能稍大,所以引入了线程,那么你需要掌握线程的同步和互斥的机制,同时再深入理解一下调度的概念以及与进程线程间的关系,做个小项目练练手,那么恭喜你,学到这里已经可以找到一份应用层的工作了,比如网络开发等等。
不过俗话说学无止境嘛,一条路走到黑,索性把驱动也拿下吧,只有拿下驱动,你才能够从最底层的硬件一直到最上层的应用然后再从最上层的应用到最底层的驱动打通整个闭环,你会发现很多东西对你来说都是小case的了,驱动开发首选的硬件肯定是ARM的了,如果你有51和STM32等硬件基础,恭喜你这一块很快就能突破,如果你是软件出身不懂硬件,没关系,有好的指导(比如说华清远见创客学院:又打广告了,哈哈~~)你也可以快速上手,其实我们以前也想把路走好,但是就是不知道走那条路,所以走了很多弯路,说白了就是少个人引导你前进。不过嘛,做技术的都喜欢按照自己的想法,自己认为正确的方向前进,我也是,哈哈。说了很多废话,简单的说一下如何上手学习驱动,首先你需要将环境搭建起来,你需要知道如何编译内核,如何将内核在板子上跑起来,这个是第一步。当然了学驱动写的第一个驱动肯定也是点灯(点灯大法好),然后慢慢的接触一下linux下如果去写一个简单的字符设备驱动,学到后面你会发现驱动基本上就是在套框架,比如字符设备框架,Platform框架,IIC框架,SPI框架,INPUT输入子系统框架,misc,USB等等框架,那么驱动到底是做什么的呢?驱动向下操作硬件,向上提供接口,简单点说就是你以前配置硬件寄存器让硬件正常工作,那么你先在驱动中也去相同方式配置硬件,只不过是要将配置硬件的过程何时的套入驱动的框架当中,同时向外面提供你对硬件的操作接口,比如open,read,write,ioctl的接口等,说白了就是在应用层通过io操作去调用驱动的接口然后再驱动提供的接口中去修改硬件的状态,实现对硬件的控制。当然了一些基础知识如自旋锁,互斥体,中断底半部等等大家可以自行去了解。
上面那张图其实就解释完了,但是我们再想一下嵌入式系统是什么,以应用为中心,对吧,那么我们需要在实战中去应用我们的知识和技术去解决实际的问题,这个时候有两套框架,一个是CS,一个是BS,那么在这些基础上你想往哪个方向发展都是可以的。因为任督二脉已通,修炼何种神功就看你的选择了。
当然了上面这些吃几年是没什么问题的,不过热爱技术的大哥们一般都会再学两个东东,一个叫做高级语言,可以选择C++,JAVA,PYTHON三选一,一个叫做界面,可以选择QT、android或者web等,这些都是增值哇,以上为小弟愚见。
4、学习嵌入式以后可以做些什么?(职业发展方向)
4.1、成为某个方向技术方面的核心,领域内的一专多才的专家;
4.2、另一个是从项目中锻炼起来,成为项目主管或是管理型人才;
4.3、再有就是因为嵌入式开发的门槛相对较高,技术的附加值较高,可以利用自己的技术及行业经验去创业。
4.4、可以做很多自己想做的事;