什么是嵌入式?python
嵌入式分为广义和狭义两种。广义的嵌入式就是片上系统(system on a chip),包括单片机、PSOC、NIOS、Microblaze等。而狭义的嵌入式就是ARM九、cortex A8等特定的跑操做系统的芯片。这里主要介绍狭义嵌入式的学习路线。linux
仍是主流的方法,先学会使用它,再深刻研究底层。android
经常使用的嵌入式操做系统有Linux、WIN CE、安卓、Vxworks、QNX、OSE等,目前资料最多的是linux,因此下面以linux为例。git
1、安装虚拟机和Linux系统。正则表达式
通常人用的电脑都会装Windows系统,要想在Windows上跑其它系统,得安装虚拟机。而目前主流的虚拟机有vmware、VirtualBox、hyperV等,你能够随便选一个安装。而后去官网下载我的版的Linux镜像(.iso文件)并把它安装在虚拟机里面便可,这里给出主流Linux系统的官网连接:ubuntu、fedora、centos、debian、suse。若是你没有用过linux的话,推荐使用ubuntu。由于RedHat要收费,并更名为RHEL,因此这里不做介绍。算法
先下载一本《鸟哥私房菜》。而后进入第2、3、四阶段(前期的学习不须要开发板)。shell
2、学会使用Linux经常使用命令。数据库
这里,必须改改在Windows下点鼠标的习惯,在linux下作事得用命令行。此外,在Linux下载软件,不须要在百度下载,而是用linux自带的软件包管理工具(如:apt-get、dnf、rpm等)。若是你用ubuntu的话,得修改软件源(下载软件的网址),由于国外的源比较慢,百度上有详细说明。接下来,得学会最基本的命令,如:ls、cd、find、grep、ps、diff、fdisk、ifconfig等。跟着教材多操做几遍就会了,没有很深的理论知识,不须要掌握全部的命令,也不须要记住全部命令的选项,用到的时候会查就能够了。有空的话能够上ubuntu社区或者linux公社。编程
3、学会使用Linux经常使用工具。ubuntu
一、编辑器(写代码必备的)。有gedit,vim,emacs,sublime等,推荐学vim。
二、gcc和gdb。gcc是编译器,gdb就是代码调试器。
三、makefile、autoconf、automake。这里可不像VC++6.0这种工具,点个鼠标就给你编译好。在Linux下,你得用makefile和make工具,来编译代码。其中autoconf和automake能够自动生成makefile。
四、ssh、tftp。若是你在ARM开发板上弄了个Web服务器,那么,你就能够用这些工具去访问它。其中,ssh工具建议用SecureCRT或者MobaXterm。
五、samba。要想用Linux跟windows交换数据,还能够搭建samba服务器。
六、版本控制器。有svn,cvs,git等,推荐学git。有了git,你就没必要手动备份代码了。
七、串口调试助手。推荐serials。其它的,好比:minicom,cutecom,picocom都很差用。
4、学会编写shell脚本。
在实际工做中,复杂的系统管理操做,不会一行一行地敲命令,而是用脚本(命令是基础)。脚本也是一种编程语言,只不过是解释型语言。相比C/C++、C#、JAVA这类高级语言,脚本要易学不少(由于增长了语法糖)。在Linux下,shell也有不少种,如:bsh、bash、csh、tcsh、ksh、zsh等,通常是学bash,其它的遇到再学也不迟,由于都是大同小异的。此外,bash语法比较奇特,不少符号(如:$#,$0,$?等)比较难记,不过也不必特地去死记它,有个印象就能够了,用到的话再查手册,这里重点掌握正则表达式。若是有时间的话,建议再学python脚本,python的语法要容易不少,用途也比bash广不少。推荐《Shell脚本编程诀窍》。
5、学会Linux下C编程。
尽管学会bash已经能作不少事情了,可是驱动和内核开发仍是用C语言,由于那时候系统还没起来,bash是用不了的。此外,C语言的执行效率比bash要高,网络编程的Socket也经常用C语言开发。在这里,得掌握基本的文件操做、进程/线程控制、Socket等。推荐《Linux环境C程序设计》、《UNIX环境高级编程》、《UNIX网络编程 卷1》、《UNIX网络编程 卷2》,或许这些教材有点难,可是,请不要钻牛角尖,不懂的暂时跳过,在学完下一阶段的理论以后,再来看,以前不懂的东西就变得容易。
6、加强理论知识。
由于有的人打着嵌入式硬件工程师的名号装逼,其实嵌入式硬件就是普通硬件工程师作的工做。咱们这里都是讨论软件方面的内容,并且嵌入式是以软件为主导的(工资上有较大差距)。若是对硬件感兴趣的,能够参考本博客《如何学习硬件设计——理论篇》和《如何学习硬件设计——实践篇》,这里不要求掌握硬件,有必定程度的了解便可。
一、单片机。具体的学习路线请参考本博客的《如何学习单片机》。不想学单片机的话,能够学计算机组成原理。
二、数据结构。主要掌握表和树,其中链表会在操做系统的调度算法中用到。
三、操做系统。所有都是重点,必须深刻研究,才会对Linux有个较全面的认识。
四、编译原理。有时间的话,最好多看看,没空的话,也得了解一下。对于提升编程能力,有必定的帮助。
五、数据库。除了基本的数据库理论以外,还得掌握SQLite或者Oracle。
六、ARM体系结构。介绍ARM的架构和指令集,在移植uboot和驱动中会用到,不作这两项工做的话,能够不学。
七、计算机网络基础。开发中用到的tcp、udp、ssh、tftp、http、rtp就会涉及到网络相关的知识,也就是socket套接字编程。
八、接口应用。如:串口、zmodem、IIC、SPI、1-wire、USB、HDMI、CAN、IIS、PCIE、蓝牙、陀螺仪等。
学完上面这些理论以后,得再复习一下linux下C编程,你会有更大的收获。
先下载一本韦东山的《嵌入式Linux应用开发彻底手册》,还要买一块2440的开发板(虽然s3c2440已经停产,可是这芯片依照是资料最多的一块),而后进入7、8、9、十阶段。其中第7、8、九阶段,使用开发板自带的bootloader便可,暂时没必要研究它。
7、文件系统。
在学习操做系统原理的时候,已经有介绍文件系统了,并且不须要深刻研究文件系统的具体算法,只须要了解其特性再学会使用它就能够了。如:NFS、FAT3二、NTFS、yaffs二、ext四、ZFS等。
8、内核裁剪。
通常初学,能够先掌握内核剪裁(具体工做就是填写若干个选项)。剪裁只是去掉内核部分不须要的功能,以减小代码体积。这里只要求你对内核的各个功能选项都很熟悉就能够了。若是剪裁还不能知足要求的话,得阅读内核源码,修改内核了。推荐《Understanding the Linux Kernel》和《Linux Kernel Development》。阅读内核源码,推荐windows下的source insight或者eclipse。
9、驱动开发。
因为系统还没起来,因此驱动能用到的API(内核的部分API,如:kprintk、kmalloc等)并很少,不少函数仍是得本身写的,其中,会常常访问临界资源,因此得掌握自旋锁、睡眠锁。此外,驱动程序出问题的话,整个系统就挂掉了,因此还要掌握各类调试驱动的方法,如:goto语句、日志系统、KDB等。接下来就要熟悉掌握字符设备和块设备的驱动程序了。推荐《小白的博客》和《Linux Device Drivers》(不建议看中文版)。
10、移植bootloader。
单片机也有bootloader,在keil C下的startup.a51,主要是作一些初始化工做。那么,在ARM上面的bootloader也是同样的功能,一样,也没有那么重要因此把它排在后面。经常使用的bootloader有vivi和uboot,通常学习uboot,主要掌握uboot的启动流程和移植。在通过前面的学习,那么uboot对你来讲已经很是容易的了,通常只须要学会使用uboot或者用已经移植好的uboot,不须要深刻研究它。推荐看uboot自带的帮助文档以及《深刻理解BootLoader》。阅读uboot源码,推荐windows下的source insight或者eclipse。
11、图形界面开发。
经常使用的GUI图形库有:GTK++、QT、JAVA、安卓等。有C++基础的,建议学习QT,不会C++的,建议学JAVA。在前期的GUI开发,能够不须要使用开发板,而2440下适合跑QT,若是要跑JAVA、安卓的话,建议换一块开发板,能够考虑Exynos4412开发板。此外,你还能够用python自带的TKinter来开发图形界面。推荐《QT5编程入门》、《疯狂JAVA讲义》、《疯狂Android讲义》、《python编程入门》。
由于安卓系统是在Linux的基础上封装了一层API,因此,若是作安卓驱动,就得掌握Linux(上面前十个阶段)。若是只作安卓app,你只须要使用android studio或者eclipse配合安卓模拟器(最好用安卓手机),就能够了,不须要学习Linux,也不须要开发板。
在你作过几个GUI项目以后,再学习UML和设计模式,这会大大加强你的代码架构能力。
12、Web开发。
有的时候得在ARM板上搭个Web服务器,这里,得学习HTML、CSS、Javascript、XML、Ajax、PHP等。看起来内容不少,但其实并很少,由于这些语言都很容易上手。初学可使用Adobe的Dreamweaver作开发,上手以后一个sublime text配合firefox浏览器就能够了(还要学习MVC模式)。此外,还得会用bash或者python编写CGI程序,这样才能够在网页上调用到底层的C语言接口。推荐《疯狂HTML 5/CSS3/JavaScript讲义》。
十3、杂谈。
本文没有涉及流程图绘制软件、文档生成工具等(这两个东西在工做中会常常用到)。
由上文可知,嵌入式软件涉及不少计算机相关的知识,这对于电子专业的学生来讲,无疑至关于跨专业那么大难度。此外,就算你掌握了上面所说起的知识,那也只是打开一扇小小的窗户而已,还有不少事情作不了的。好比:二维码识别、视频采集卡等。
BTW,嵌入式的工做也分红几个岗位,分别是系统工程师、驱动工程师、软件工程师(负责网页或GUI开发)、UI工程师(又称美工)。
系统工程师:熟悉操做系统的内核原理、熟读内核源码。主要职责为系统打补丁或者添加新功能,如:热升级、提升系统的容错性等。通常的公司是不作这种开发的。
驱动工程师:熟悉各类外设的驱动开发,为内核和GUI提供接口。因为不少IC厂商提供了相关芯片的驱动程序,而致使不少驱动工程师下岗(需求量减小)。
软件工程师:熟悉各类编程语言和GUI图形库、框架(不是会查文档就能够的,而是要求很是熟悉框架)。因为项目需求常常变动,开发效率跟不上变化,因此软件工程师的需求量大大增长。
UI工程师:主要负责美化界面。美术特长生更适合这类工做。 ———————————————— 版权声明:本文为CSDN博主「队长-Leader」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。 原文连接:https://blog.csdn.net/k331922164/article/details/50629131