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