zoukankan      html  css  js  c++  java
  • 学习嵌入式开发

     这是我从网上找的大神对嵌入式开发的学习总结,转载地址:https://blog.csdn.net/xueheih/article/details/80309900 

    学习嵌入式开发:

      首先需要一个良好的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中进程间通信方式给拿下,比如无名管道,有名管道,信号,信号量,共享内存和消息队列以及网络通信,不过由于进程的资源消耗可能稍大,所以引入了线程,那么你需要掌握线程的同步和互斥的机制,同时再深入理解一下调度的概念以及与进程线程间的关系,做个小项目练练手,那么恭喜你,学到这里已经可以找到一份应用层的工作了,比如网络开发等等。

      不过俗话说学无止境嘛,一条路走到黑,索性把驱动也拿下吧,只有拿下驱动,你才能够从最底层的硬件一直到最上层的应用然后再从最上层的应用到最底层的驱动打通整个闭环,你会发现很多东西对你来说都是小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、可以做很多自己想做的事;

    总结:

      C语言-->数据结构-->Linux-->ARM

  • 相关阅读:
    为什么越来越少的人用jQuery
    远程工作是一种怎样的体验?
    JavaScript黑客是这样窃取比特币的,Vue开发者不用担心!
    原有vue项目接入typescript
    ES6核心特性
    强烈推荐10个值得订阅的国外技术周报
    jquery ajax超时设置(转载)
    Multiple “order by” in LINQ(转载)
    Cookies, Claims and Authentication in ASP.NET Core(转载)
    Json.NET序列化后包含类型,保证序列化和反序列化的对象类型相同(转载)
  • 原文地址:https://www.cnblogs.com/bellin124/p/13937848.html
Copyright © 2011-2022 走看看