什么是嵌入式?

嵌入式分为广义和狭义两种。广义的嵌入式就是片上系统(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系统的官网链接:ubuntufedoracentosdebiansuse。如果你没有用过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,你就不必手动备份代码了。

四、学会编写shell脚本。

在实际工作中,复杂的系统管理操作,不会一行一行地敲命令,而是用脚本(命令是基础)。脚本也是一种编程语言,只不过是解释型语言。相比C/C++、C#、JAVA这类高级语言,脚本要易学很多(因为增加了语法糖)。在linux下,shell也有很多种,如:bsh、bash、csh、tcsh、ksh、zsh等,一般是学bash,其它的遇到再学也不迟,因为都是大同小异的。此外,bash语法比较奇特,很多符号(如:$#,$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、计算机网络基础。开发中用到的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等。

八、内核裁剪。

        一般初学,可以先掌握内核剪裁(具体工作就是填写若干个选项)。剪裁只是去掉内核部分不需要的功能,以减少代码体积。这里只要求你对内核的各个功能选项都很熟悉就可以了。如果剪裁还不能满足要求的话,得阅读内核源码,修改内核了。推荐《Understanding the Linux Kernel》和《Linux Kernel Development》。阅读内核源码,推荐windows下的source insight。

九、驱动开发。

        由于系统还没起来,所以驱动能用到的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。

十一、图形界面开发。

常用的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工程师:主要负责美化界面。美术特长生更适合这类工作。

如何学习嵌入式? 嵌入式之路从入门到放弃....相关推荐

  1. 码农之路从入门到放弃之:计算机基础知识

    从入门到放弃 计算机基础知识 计算机概述 计算机组成部分 1.硬件部分: 2.软件部分 操作系统(OperatingSystem) 1.windows 简介 1.1.windows--优点 1.2.w ...

  2. Spring学习之路-从入门到放弃

    后台框架是真难入门啊!!!IDE的使用,环境的搭建,框架下载,上手,每一步都恶心人. 花了整整两天,才学会用idea,并且初步了解了maven(TM就是一个npm),然后跟着下载了对应的jar包,搭建 ...

  3. 【原创】强化学习精选资料汇总:从入门到精通,看完这些干货就够啦!

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要8分钟 Follow小博主,每天更新前沿干货 [导读]本文为大家整理了公众号之前发过的一系列强化学习资料和学习手册,包括:强化学习视频课程.经 ...

  4. 嵌入式编程入门教程,学习设计嵌入式工程师

    俗话说万事开头难(然后中间难,最后难?),刚开始的时候,你是否根本就不知如何开始,上网查资料被一堆堆新名词搞的找不到北,去看书也是找不到方向?又是arm,又是linux,又是uboot头都大了.不知道 ...

  5. 嵌入式开发板硬件操作入门学习0——电路图概念 硬件接口的四大类

    电路图概念 术语: sch:schematic,原理图 PCB:Printed Circuit Board,印刷电路板 footprint:脚印.足迹,表示元件在电路板上的外形 component:元 ...

  6. 专科生的嵌入式开发之路

    俗话说的好,高中不努力,大学指定没戏,哈哈,谁说的,当然是我说的.高考结束了,我成功以320分的优异成绩成为了一个地道的专科生,高中玩嗨了,这回选志愿就傻眼了,这点分可选的学校并不多,要不再复习一年? ...

  7. 【百家稷学】深度学习与嵌入式平台AI实践(北京交通大学实训)

    继续咱们百家稷学专题,本次是有三AI在北京交通大学进行的暑期课程教学.百家稷学专题的目标,是走进100所高校和企业进行学习与分享. 分享主题 本次分享是在北京交通大学计算机与信息技术学院进行,主题是& ...

  8. 【嵌入式学习】嵌入式开发的第一课

    前言 在这里仅就嵌入式的学习,简单记录分享. 一.什么是嵌入式 嵌入式系统是以应用为中心,以现代计算机技术为基础,能够根据用户需求(功能.可靠性.成本.体积.功耗.环境等)灵活裁剪软硬件模块的专用计算 ...

  9. 怎样入门嵌入式嵌入式未来的发展方向

    概述 ​    很多工程师要往嵌入式方向发展,特别是ARM得到应用后,这个趋势更是有增无减,但你真的知道怎样入门嵌入式么?你知道嵌入式未来的发展方向么? 怎样入门嵌入式嵌入式未来的发展方向 在很多学生 ...

最新文章

  1. 基于XML的自动装配||SpEL测试
  2. vue的 v-for 循环中图片加载路径问题
  3. Linux环境下安装RocketMQ(MetaQ)
  4. Linux——网络地址临时配置(详细步骤+问题解决)
  5. react hooks使用_何时使用React Suspense和React Hooks
  6. Socket网络编程--聊天程序(2)
  7. 【Mysql】利用Mybatis3连接mysql获取datetime类型数据错误
  8. 今天老师本来想讲另外一个题目, 但是由于大家不是很了解数组,因此写了一些数组让我们练习...
  9. 学python要多久-目前Python学习需要多长时间?老男孩Python入门培训
  10. 服务器网口聚合操作文档,服务器网口聚合怎么操作
  11. java 微博发布时间_java 对新浪微博微博的发表时间解析
  12. QQ游戏自动登录器V4.0
  13. 【2020年高被引学者】 孙剑 旷视科技
  14. 如何关闭OPPO手机服务器维护,OPPO天气预警怎么关闭
  15. 在互联网时代,读书人如何更好的养活自己
  16. Docker学习之六:基于Dockerfile构建镜像
  17. 链路聚合|静态,动态配置|华为,思科配置|聚盒~
  18. Android studio下载及安装方法
  19. linux 格式化 sda,linux – 如何将/ dev / sda挂载并格式化为不同的/ dev / name?
  20. centos 挂载iso光盘镜像文件

热门文章

  1. 2g内存装linux64位卡不卡,2g内存可以装64位win7吗?
  2. 前后端交互详解(建议收藏)
  3. 关闭微软Edge浏览器的“使用推荐的浏览器设置”弹窗
  4. Java实现身份证信息比较大小
  5. 微信小程序分享朋友圈遇到的巨坑
  6. Delphi Free和FreeAndNil之间的区别
  7. 乔春洋:品牌定位中的若干关系问题
  8. 用c语言怎么查找字符串,c语言如何查找字符串?
  9. 正则表达式 匹配中文
  10. python实现的超简单圣诞树