怎样学习嵌入式软件

什么是嵌入式?html

        嵌入式分为广义和狭义两种。广义的嵌入式就是片上系统(system on a chip),包含单片机、PSOC、NIOS、Microblaze等。而狭义的嵌入式就是ARM九、cortex A8等特定的跑操做系统的芯片。这里主要介绍狭义嵌入式的学习路线。python

        仍是主流的方法。先学会使用它。再深刻研究底层。linux

        常用的操做系统有linux、WIN CE、安卓、Vxworks、QNX、OSE等。眼下资料最多的是linux,因此如下以linux为例。android

1、安装虚拟机和linux系统。git

        通常人用的电脑都会装Windows系统,要想在Windows上跑其余系统。得安装虚拟机。web

而眼下主流的虚拟机有vmware、VirtualBox、hyperV等,你可以随便选一个安装。而后去官网下载我的版的linux镜像(.iso文件)并把它安装在虚拟机里面就能够。这里给出主流linux系统的官网连接:ubuntufedoracentosdebiansuse。假设你没实用过linux的话,推荐使用ubuntu。因为RedHat要收费。并更名为RHEL,因此这里不做介绍。
算法

         先下载一本《鸟哥私房菜》。shell

而后进入第2、3、四阶段(前期的学习不需要开发板)。
数据库

2、学会使用linux常用命令。编程

         这里,必须改改在Windows下点鼠标的习惯。在linux下作事得用命令行。此外,在linux下载软件。不需要在百度下载,而是用linux自带的软件包管理工具(如:apt-get、dnf、rpm等)。假设你用ubuntu的话,得改动软件源(下载软件的网址),因为国外的源比較慢,百度上有具体说明。接下来,得学会最主要的命令,如:ls、cd、find、grep、ps、diff、fdisk、ifconfig等。

跟着教材多操做几遍就会了。没有很是深的理论知识,不需要掌握所有的命令,也不需要记住所有命令的选项。用到的时候会查就可以了。

有空的话可以上ubuntu社区或者linux公社


3、学会使用linux常用工具。


一、编辑器(写代码必备的)。

有gedit,vim,emacs,sublime等。推荐学vim

二、gcc和gdb。gcc是编译器。gdb就是代码调试器。

三、makefile、autoconf、automake。这里可不像VC++6.0这样的工具。点个鼠标就给你编译好。

在linux下,你得用makefile和make工具,来编译代码。

当中autoconf和automake可以本身主动生成makefile。

四、ssh、tftp。

假设你在ARM开发板上弄了个Webserver,那么。你就可以用这些工具去訪问它。当中,ssh工具建议用SecureCRT或者MobaXterm

五、samba。要想用linux跟windows交换数据,还可以搭建sambaserver。

六、版本号控制器。有svn,cvs,git等。推荐学git。

有了git。你就没必要手动备份代码了。

4、学会编写shell脚本。

         在实际工做中,复杂的系统管理操做,不会一行一行地敲命令,而是用脚本(命令是基础)。

脚本也是一种编程语言,仅仅只是是解释型语言。相比C/C++、C#、JAVA这类高级语言。脚本要易学很是多(因为添加了语法糖)。在linux下,shell也有很是多种。如:bsh、bash、csh、tcsh、ksh、zsh等,一般是学bash,其余的遇到再学也不迟。因为都是大同小异的。

此外,bash语法比較奇特,很是多符号(如:$#,$0,$?等)比較难记,只是也不是必需特地去死记它,有个印象就可以了。用到的话再查手冊,这里重点掌握正則表達式。

假设有时间的话,建议再学python脚本。python的语法要easy很是多。用途也比bash广很是多。

推荐《Shell脚本编程诀窍》。


5、学会linux下C编程。

         虽然学会bash已经能作很是多事情了。但是驱动和内核开发仍是用C语言,因为那时候系统还没起来。bash是用不了的。此外。C语言的运行效率比bash要高,网络编程的Socket也常常常使用C语言开发。在这里,得掌握主要的文件操做、进程/线程控制、Socket等。推荐《Linux环境C程序设计》、《UNIX环境高级编程》、《UNIX网络编程 卷1》、《UNIX网络编程 卷2》,也许这些教材有点难。但是,请不要钻牛角尖。不懂的临时跳过,在学完下一阶段的理论以后,再来看。以前不懂的东西就变得easy。

6、加强理论知识。

        因为有的人打着嵌入式硬件project师的名号装逼,事实上嵌入式硬件就是普通硬件project师作的工做。咱们这里都是讨论软件方面的内容,而且嵌入式是以软件为主导的(工资上有较大差距)。假设对硬件感兴趣的。可以參考本博客《怎样学习硬件设计——理论篇》和《怎样学习硬件设计——实践篇》,这里不要求掌握硬件,有必定程度的了解就能够。


一、单片机。

详细的学习路线请參考本博客的《怎样学习单片机》。

不想学单片机的话,可以学计算机组成原理。

二、数据结构。主要掌握表和树,当中链表会在操做系统的调度算法中用到。


三、操做系统。全部都是重点,必须深刻研究,才会对linux有个较全面的认识。


四、编译原理。有时间的话,最好多看看。没空的话,也得了解一下。

对于提升编程能力,有必定的帮助。

五、数据库。除了主要的数据库理论以外,还得掌握SQLite或者Oracle。


六、ARM体系结构。介绍ARM的架构和指令集。在移植uboot和驱动中会用到。不作这两项工做的话,可以不学。


七、计算机网络基础。开发中用到的socket、ssh、tftp、http就会涉及到网络相关的知识。

八、接口应用。

如:串口、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。

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对你来讲已经很easy的了,通常仅仅需要学会使用uboot或者用已经移植好的uboot,不需要深刻研究它。

推荐看uboot自带的帮助文档。

阅读uboot源代码,推荐windows下的source insight。

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板上搭个webserver,这里。得学习HTML、CSS、Javascript、XML、Ajax、PHP等。看起来内容很是多。但事实上并很少。因为这些语言都很是easy上手。初学可以使用Adobe的Dreamweaver作开发,上手以后一个sublime text配合firefox浏览器就可以了(还要学习MVC模式)。此外,还得会用bash或者python编写CGI程序,这样才干够在网页上调用究竟层的C语言接口。推荐《疯狂HTML 5/CSS3/JavaScript讲义》。

十3、杂谈。

          本文没有涉及流程图绘制软件文档生成工具等(这两个东西在工做中会经常用到)。

          由上文可知,嵌入式软件涉及很是多计算机相关的知识,这对于电子专业的学生来讲。无疑至关于跨专业那么大难度。此外,就算你掌握了上面所说起的知识,那也仅仅是打开一扇小小的窗户而已,还有很是多事情作不了的。比方:二维码识别、视频採集卡等。

BTW,嵌入式的工做也分红几个岗位,各自是系统project师、驱动project师、软件project师(负责网页或GUI开发)、UIproject师(又称美工)。

系统project师:熟悉操做系统的内核原理、熟读内核源代码。

主要职责为系统打补丁或者加入新功能,如:热升级、提升系统的容错性等。

通常的公司是不作这样的开发的。

驱动project师:熟悉各类外设的驱动开发,为内核和GUI提供接口。

由于很是多IC厂商提供了相关芯片的驱动程序,而致使很是多驱动project师下岗(需求量下降)。

软件project师:熟悉各类编程语言和GUI图形库、框架(不是会查文档就可以的。而是要求很熟悉框架)。由于项目需求经常变动,开发效率跟不上变化,因此软件project师的需求量大大添加。

UIproject师:主要负责美化界面。

美术特长生更适合这类工做。

相关文章
相关标签/搜索