“
哪些是嵌入式?
嵌入式分为广义和狭义两种。广义的嵌入式就是片上系统(systemonachip),包括单片机、PSOC、NIOS、Microblaze等。而狭义的嵌入式就是ARM9、cortexA8等特定的跑操作系统的芯片。这儿主要介绍狭义嵌入式的学习路线。
还是主流的方式,先学会使用它,再深入研究底层。
常用的操作系统有Linux、WINCE、安卓、Vxworks、QNX、OSE等,目前资料最多的是linux,所以下边以linux为例。
”
一、安装虚拟机和linux系统
通常人用的笔记本就会装Windows系统,要想在Windows上跑其它系统linux多线程,得安装虚拟机。而目前主流的虚拟机有vmware、VirtualBox、hyperV等,你可以随意选一个安装。之后去官网下载个人版的linux镜像(.iso文件)并把它安装在虚拟机上面即可,这儿给出主流linux系统的官网链接:ubuntu、fedora、centos、debian、suse。假如你没有用过linux的话,推荐使用ubuntu。由于RedHat要收费,并更名为RHEL,所以这儿不作介绍。
先下载一本《鸟哥的Linux私房菜》。之后步入第二、三、四阶段(前期的学习不须要开发板)。
二、学会使用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,你就毋须自动备份代码了。
四、学会编撰shell脚本
在实际工作中,复杂的系统管理操作,不会一行一行地敲命令,而是用脚本(命令是基础)。脚本也是一种编程语言,只不过是解释型语言。相比C/C++、C#、Java这类中级语言,脚本要易学好多(由于降低了句型糖)。在linux下,shell也有好多种,如:bsh、bash、csh、tcsh、ksh、zsh等,通常是学bash,其它的遇见再学也不迟,由于都是邯郸小异的。据悉,bash句型比较独特,好多符号(如:$#,$0,$?等)比较难记node.js安装linux,不过也没必要特意去死记它,有个印象就可以了,用到的话再查指南,这儿重点把握正则表达式。假如有时间的话,建议再学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、计算机网路基础。开发中用到的socket、ssh、tftp、http都会涉及到网路相关的知识。
8、接口应用。如:并口、zmodem、IIC、SPI、1-wire、USB、HDMI、CAN、IIS、PCIE、蓝牙、陀螺仪等。
学完里面那些理论以后,得再备考一下linux下的C编程,你会有更大的收获。
先下载一本韦东山的《嵌入式Linux应用开发完全指南》,还要买一块2440的开发板(尽管s3c2440早已停产,并且这芯片按照是资料最多的一块),之后步入七、八、九、十阶段。其中第七、八、九阶段,使用开发板自带的bootloader即可,暂时毋须研究它。
七、文件系统
在学习操作系统原理的时侯,早已有介绍文件系统了,但是不须要深入研究文件系统的具体算法,只须要了解其特点再学会使用它就可以了。如:NFS、FAT32、NTFS、yaffs2、ext4、ZFS等。
八、内核剪裁
通常初学,可以先把握内核裁剪(具体工作就是填写若干个选项)。裁剪只是去除内核部份不须要的功能,以降低代码容积。这儿只要求你对内核的各个功能选项都很熟悉就可以了。假如裁剪还不能满足要求的话,得阅读内核源码,更改内核了。推荐《UnderstandingtheLinuxKernel》和《LinuxKernelDevelopment》。阅读内核源码,推荐Windows下的sourceinsight。
九、驱动开发
因为系统还没上去,所以驱动能用到的API(内核的部份API,如:kprintk、kmalloc等)并不多,好多函数还是得自己写的,其中,会时常访问临界资源,所以得把握载流子锁、睡眠锁。据悉,驱动程序出问题的话,整个系统就死掉了,所以还要把握各类调试驱动的方式,如:goto句子、日志系统、KDB等。接出来就要熟悉把握字符设备和块设备的驱动程序了。推荐《小白的博客》和《LinuxDeviceDrivers》(不建议看英文版)。
十、移植bootloader
单片机也有bootloader,在keilC下的startup.a51,主要是做一些初始化工作。这么,在ARM里面的bootloader也是一样的功能,同样,也没有这么重要所以把它排在前面。常用的bootloader有vivi和uboot,通常学习uboot,主要把握uboot的启动流程和移植。在经过上面的学习,这么uboot对你来说早已十分容易的了,通常只须要学会使用uboot或则用早已移植好的uboot,不须要深入研究它。推荐看uboot自带的帮助文档。阅读uboot源码,推荐windows下的sourceinsight。
十一、图形界面开发
常用的GUI图形库有:GTK++、QT、JAVA、安卓等。有C++基础的,建议学习QT,不会C++的,建议学JAVA。在前期的GUI开发,可以不须要使用开发板,而2440下适宜跑QT,假如要跑JAVA、安卓的话,建议换一块开发板,可以考虑Exynos4412开发板。据悉,你还可以用python自带的TKinter来开发图形界面。推荐《QT5编程入门》、《疯狂JAVA课件》、《疯狂Android课件》、《python编程入门》。
由于安卓系统是在linux的基础上封装了一层APIcentos csh 安装,所以,假若做安卓驱动,就得把握linux(上面前十个阶段)。假如只做安卓app,你只须要使用Androidstudio或则eclipse配合安卓模拟器(最好用安卓手机),就可以了,不须要学习linuxcentos csh 安装,也不须要开发板。
在你做过几个GUI项目以后,再学习UML和设计模式,这会大大提高你的代码构架能力。
十二、Web开发
有的时侯得在ARM板上搭个web服务器,这儿,得学习HTML、CSS、JavaScript、XML、Ajax、PHP等。看上去内容好多,但显然并不多,由于这种语言都很容易上手。初学可以使用Adobe的Dreamweaver做开发,上手以后一个sublimetext配合firefox浏览器就可以了(还要学习MVC模式)。据悉,还得会用bash或则python编撰GI程序C,这样才可以在网页上调用到底层的C语言插口。推荐《疯狂HTML5/CSS3/JavaScript课件》。
十三、杂谈
本文没有涉及流程图勾画软件、文档生成工具等(这两个东西在工作中会常常用到)。
由上文可知,嵌入式软件涉及好多计算机相关的知识,这对于电子专业的中学生来说,无疑相当于跨专业这么大难度。据悉,即使你把握了前面所提到的知识,那也只是打开一扇小小的阳台而已,还有好多事情做不了的。诸如:二维码辨识、视频采集卡等。
BTW,嵌入式的工作也分成几个岗位,分别是系统工程师、驱动工程师、软件工程师(负责网页或GUI开发)、UI工程师(又称美工)。
系统工程师:熟悉操作系统的内核原理、熟读内核源码。主要职责为系统打补丁或则添加新功能,如:热升级、提高系统的容错性等。通常的公司是不做这些开发的。
驱动工程师:熟悉各类外设的驱动开发,为内核和GUI提供插口。因为好多IC厂商提供了相关芯片的驱动程序,而造成好多驱动工程师下岗(需求量降低)。
软件工程师:熟悉各类编程语言和GUI图形库、框架(不是会查文档就可以的,而是要求十分熟悉框架)。因为项目需求时常变更,开发效率跟不上变化,所以软件工程师的需求量大大降低。
UI工程师:主要负责美化界面。美术特长生更适宜这类工作。
1.
2.