【超详细】嵌⼊式软件学习⼤纲
⽬录
随便聊聊
  前两天上传了我⾃⼰在整个⼤学阶段单⽚机的学习历程(个⼈感觉已经⾮常详细和真实了,包括⾃⼰在某个阶段遇到的问题,单⽚机学习的困难点都有描述),感兴趣的朋友们可以去了解⼀下,从今天开始,打算将⾃⼰学到的关于嵌⼊式⽅⾯(不是单⽚机)的知识和感想来与⼤家分享,因为个⼈正在学习嵌⼊式的缘故,近期分享的内容以嵌⼊式学习为主,单⽚机⽅⾯打算以后有时间再与⼤家分享。
  今天做的这个⽂章,主要是先把⾃⼰学习嵌⼊式软件⽅⾯的学习⼤纲与⼤家分享⼀下,有感兴趣的朋友或者正在学习嵌⼊式的朋友可以⼀起努⼒,相互讨论,往后分享的内容都会是以今天发布学习⼤纲的顺序来分享,当然其他朋友在学习的过程中遇到什么问题,可以在评论区评论⼀下,我懂的地⽅会单独做些⽂章来解释,或者直接在评论区恢复,希望各路朋友多多⽀持,⾮常荣幸与⼤家共成长同进步!
  好了,下⾯开始我们正式的内容:
什么是嵌⼊式?
我对嵌⼊式的看法
  如果要了解嵌⼊式,⼤家必须要先了解什么是PC、什么是单⽚机。在我最早学习单⽚机的时候,天真的以为学单⽚机就是在学嵌⼊式,等到⾃⼰逐渐去了解嵌⼊式以后,才发现原来⾃⼰曾经那么可爱(单⽚机、嵌⼊式在学习路线、学习难度、学习周期上的差别还是很⼤的),为了让更多的嵌⼊式⼩⽩⾛出这样误区,下⾯简单介绍⼀下他们分别的概念,和学习上的差别。
单⽚机系统与嵌⼊式系统的差别
  要了解单⽚机,就要追溯到上世纪早期在没有⼤规模集成电路技术的时代,计算机的设计原理,那时的计算机CPU、随机存储器RAM、只读存储器ROM、各种外设I/O和中断系统ROM等这些都是分离在电路板的各个⾓落⾥。直到20世纪70年代左右,随着科学技术的不断发展,利⽤⼤规模集成电路技术把CPU和数据存储器(RAM)、程序存储器(ROM)及其他I/O通信⼝集成在⼀块芯⽚上,构成⼀个最⼩的计算机系统,这个就是单⽚机。
  那么跟单⽚机先⽐较嵌⼊式有哪些不同的地⽅呢?单⽚机产品和嵌⼊式产品都是电⼦产品,整个SOC都以CPU作为核⼼内嵌各种存储器,都有⼀些外围硬件作为辅助,也都是通过软件控制硬件。在功能上有很多的相似之处。但是在SOC性能上有⾮常巨⼤的差别,例如在内存⽅⾯,嵌⼊式系统的SOC明显⽐单⽚机⼤很多。现在将单⽚机与嵌⼊式系统SOC内存资源进⾏⽐较(顺便与PC机SOC进⾏⽐较):
  1、⼀般单⽚机系统中内存需求⼩,⽽且希望开发尽肯能的简单,因单⽚机SOC内嵌⼩容量的SRAM加⼩容量的NorFlash。
  2、嵌⼊式系统内存需求⼤,因为⼤容量的Norflash相对较贵,因此嵌⼊式SOC⼀般采NANDFlash+Dram+Sram+少量Srom。
  3、⼀般PC机都是:⼩容量的NorFLash+⼤容量的硬盘(类似于Nandflash)+⼤容量的Dram。
  可见在硬件上三者之间就存在较⼤的差别。
  嵌⼊式系统和单⽚机系统在CPU⽅⾯也是有⼀定差异:是否有MMU(分页内存管理单元,它是⼀种负责处理CPU的内存访问请求的计算机硬件),当然操作系统⽅⾯两者也具有⼀定差异,单⽚机系统因为内存资源较少的缘故,因此在操作系统移植⽅⾯⼀般只能跑⼀些简单的RTOS,像51单⽚机这样的简单SOC甚⾄连⼀些轻量级的RTOS都跑不了,哪怕能跑也没⼈会⽤它去跑操作系统(有朋友跟我说能跑,他跑过,纯粹是⾃⼰在玩呢,是不是),⽽嵌⼊式系统就⽐较⽜了,⼀般在嵌⼊式系统中都会跑Linux、Android操作系统。(⼀般分需不需要⽐较友好的⼈机交互界⾯,不需要的⼀般都是跑LINUX,像平板、⼿机⼀般都是跑的Android,当然Android是基于Linux内核的,这个⼤家也要了解⼀下)最后,单⽚机与嵌⼊式在应⽤领域也是有较⼤差异的,单⽚机⼀般应⽤在操作简单的智能家电(如智能台灯),嵌⼊式⼀般运⽤领域较⼴(例如⼯业领域、汽车、航空航天等等都需要嵌⼊式)。这也是
我们学习嵌⼊式的原因所在。
PC系统与嵌⼊式系统的差别
  好了分析完单⽚机与嵌⼊式的差别,我们再来了解⼀下什么是PC机,PC机与嵌⼊式的差别体现在哪?
  PC是什么呢?PC指的就是个⼈计算机,它是指⼀种⼤⼩、价格和性能适⽤于个⼈使⽤的多⽤途计算机(这是PC机的⼀⼤特点即通⽤性)。台式机、笔记本电脑到⼩型笔记本电脑和平板电脑以及超级本等都属于个⼈PC机。
  PC与嵌⼊式在硬件的差异在上⾯我们分析过了,现在我复制粘贴⼀下:
  1、嵌⼊式系统内存需求⼤,因为⼤容量的Norflash相对较贵,因此嵌⼊式SOC⼀般采NANDFlash+Dram+Sram+少量Srom。
  2、⼀般PC机都是:⼩容量的NorFLash+⼤容量的硬盘(类似于Nandflash)+⼤容量的Dram。
  说实话个⼈PC机在内部资源上是优于嵌⼊式系统的,但是这不是PC与嵌⼊式最⼤的区别,下⾯我附嵌⼊式的定义给⼤家看看:
  嵌⼊式即嵌⼊式系统,IEEE(美国电⽓和电⼦⼯程师协会)对其定义是⽤于控制、监视或者辅助操作机器和设备的装置,是⼀种专⽤的计算机系统;国内普遍认同的嵌⼊式系统定义是以应⽤为中⼼,以计算机技术为基础,软硬件可裁剪,适应应⽤系统对功能、可靠性、成本、体积、功耗等严格要求的专⽤计算机系统;从应⽤对象上加以定义来说,嵌⼊式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。
  其实很多学弟学妹表⽰⾃学⽐较困难,这是正常的,看到这么⼀⼤串晦涩难懂的⽂字定义,换谁都很难看下去,下⾯给⼤家解释⼀下:嵌⼊式系统与PC在分层上是很相似的:都分为硬件层、中间层、系统软件层和应⽤软件层组成,那么他们差别在哪呢,看上⾯定义有⼀句话⾮常关键:“软硬件可裁剪,适应应⽤系统对功能、可靠性、成本、体积、功耗等严格要求的专⽤计算机系统”,软硬件可裁剪,这是嵌⼊式最显著的特点,嵌⼊式系统可以根据对系统功能要求的不同在软件及硬件上做出扩展或裁剪。更⼤的⼀个特点在于嵌⼊式系统是“专⽤计算机系统”,⽽PC机是通⽤的计算机系统,这体现在哪呢?举个例⼦:“你是⼀个嵌⼊式软件开发⼯程师你⽤的电脑是Thinkpad x1,你朋友可能是个⽛医,他能不能也⽤Thinkpad x1呢,他当然也可以。”⽽嵌⼊性系统就没有这样的通⽤性:“你做的⼀款在挖掘机⾥⾯的嵌⼊式系统和他⽤来给病⼈拔⽛的嵌⼊式系统是不可能通⽤的”。
单⽚机与嵌⼊式在学习模式上的差别
主流的芯⽚平台
  主流的单⽚机平台有:51单⽚机、PIC、STM32、AVR、MSP430等等。
  主流的嵌⼊式平台有:ARM、PPC、MIPS等
开发模式的差别
  在开发模式上,两者有哪些区别呢?
  1、单⽚机开发多为裸机开发,程序规模⼩,多为单个程序员独⽴开发,在做⼀下⽐较复杂的产品时,也是会⽤到⼀些⾼端的电⽚机例如:基于ARM cortex-M3 架构的STM32系列单⽚机,并可以在单⽚机中跑⼀些简单的RTOS(例如UCos、FreeRTOS等)。
  2、嵌⼊式开发⼏乎全部基于嵌⼊式操作系统,⽬前使⽤Linux与Android系统。
编程语⾔的差别
  编程语⾔⽅⾯的差异:单⽚机主要使⽤C语⾔(少有汇编),与标准C略有不同,在结构体、指针、共⽤体及它们与数组的结合等C语⾔⾼级特性⽅⾯使⽤较少,⽽嵌⼊式则不同,嵌⼊式软件开发主要有分为底层、应⽤层。底层多使⽤C及汇编(并且⾼级特性运⽤较多)。应⽤层则多使⽤C++、JAVA等⾼级语⾔,嵌⼊式针对基于C语⾔的数据结构、算法运⽤能⼒要求较⾼。
软硬件组成的差别
  在软硬件组成⽅⾯:单⽚机学习多涉猎到简单的外设(如Uart串⼝、I2C、ADC、LCD、GPIO等)⽽嵌⼊式系统则会涉猎到更多复杂的外设(如有线⽹卡、WIFI、蓝⽛、TCP、USB、⾳视频图⽚的编解码等),这些复杂外设在单⽚机裸机程序下是很难去写出来的(不是写不出,是没必要写出),在操作系统下,本⾝是提供相关基础架构及库函数的。
嵌⼊式到底适不适合你学?
嵌⼊式学习与编程语⾔和英语⽔平的差别
  在编程语⾔⽅⾯嵌⼊式开发主要使⽤C语⾔,有的朋友会问我:我C语⾔⼀窍不通能不能学习嵌⼊式?我认为是可以的,不过前提是先去学习⼀下简单的C语⾔基础,不需要你学的特别精深,但是基础的知识内容还是要懂的。当然嵌⼊式开发还会⽤到汇编语⾔,这个可以在学习嵌⼊式裸机的时候边学裸机边学ARM汇编(没必要吧汇编学的太精通,当然如果你有的是时间,那当然多多益善),在嵌⼊式中间层的开发上会⽤到C++多⼀些,个⼈建议⽤到哪⼀步学到哪⼀步,不建议把C\C++\汇编\java都学好再来看嵌⼊式(那都猴年马⽉了),应⽤层会⽤到其他各种⾼级语⾔(难道你都要挨个学⼀遍?),其实你能把C学精学好,就OK了,其他语⾔⽤到的时候⼏天就能学到不错的程度。
  嵌⼊式学习与英语的关系(这个还是蛮重要的,因为很多朋友都反映英语⽔平不好,是不是不适合学嵌⼊式):我想说的是英语⾮常重要,需要你去积累学习,因为⾸先⼀点,我们编程时⽤英语写,但是C中关键是在于关键字,这个在编程的过程中⼤都就记住了,那么嵌⼊式学习英语的重要性体现在哪?在阅读Datasheet上,那么有朋友就会觉得⾃⼰英语不好就不适合嵌⼊式学习了,这是不对的,我英语也不怎么好,前期我们看datasheet可以依赖于桌⾯词典嘛,虽然阅读起来速度会很慢,但不失为⼀种办法,在后期慢慢积累的过程中,我们的英语⽔平和看⽂档的能⼒就好不断提⾼了。so,英语不好不是学不好嵌⼊式的理由,这个世界上不存在笨⼈,只存在懒⼈。
  下⾯补充⼀点:嵌⼊式学习数电模电等等这些专业课的关系,⾸先嵌⼊式分为嵌⼊式软件和嵌⼊式硬件两部分,嵌⼊式硬件的学习是离不开⼗点数电模电、电路这些专业课的,甚⾄相关的微积分计算、复变函数计算、基本的傅⾥叶变换、拉式变换和Z变换都是要了解的,当然掌握了基本计算⽅法以后可以利⽤MATLAB软件进⾏运算。嵌⼊式软件学习的话对硬件专业⽅⾯的需求不那么紧张,但是软件设计也是需要硬件辅助的,总⽽⾔之模电数电这些专业课程的学习对嵌⼊式学习是有影响的,但不是必须去专门学习。可以通过后期的积累慢慢总结学习。
哪些专业的朋友更适合嵌⼊式学习
  有的朋友本来是学外语专业的学⽂学专业的,感觉嵌⼊式是个未来的⼤趋势,就打算跨⾏学习,我觉
得这不是不可但是很难,为什么难呢?你想想你跟学外语专业的,对计算机领域可能⼀窍不通,对⼀下基本的名次都没有太多的概念,你说你学起来难不难,固然很难,但不是不能学,也有很多跨⾏来做软件开发的⼀样可以做到很好。这个还是个⼈的,那么接下来分析⼀下那些专业更适合嵌⼊式的学习:⾃动化专业(我就是学这个专业的,想了解我的学习历程可以去看我的另⼀篇经验分享⽂章,写的很详细)、电⼦信息类专业、计算机类专业、测控类专业、机械电⼦类专业都可以。
  总的来说,我认为任何事物的学习最关键的都不是专业,你是不是这个专业的与你以后将要学习什么事物是没有必然联系的,有必然联系的是你⾃⼰的态度和你是不是对它有特别⼤的兴趣(尤其是技术性很强的学科,你不喜欢他,他就是再好你也不⼀定能学的进去),当前你能学到什么程度这取决于你的毅⼒,你会学的多快这取决于你的学习能⼒和专注程度,所以朋友们⼀旦决定要学习它,就请拼劲全⼒吧!
嵌⼊式学习路线
  好了现在到了终点了,如果你打算要好好学习嵌⼊式了,那么下⾯的内容也许对你有⼀定帮助,嵌⼊式的学习是分阶段的,每个阶段有不同的学习内容,具体分⼏个阶段,每个阶段需要学习什么内容,我们可以接着往下看。嵌⼊式软件是⼀个系统⾮常庞⼤的学科,嵌⼊式的学习路线很长,内容很杂很多,学习曲线很陡打算学习的朋友要做好⼼理准备,俗话说跟什么样的⽼师学习⼗分重要,在这⾥再
做⼀下关于嵌⼊式软件学习⽼师的推荐:朱有鹏⽼师,⼀个好的⽼师对你学习的深浅、学习周期的长短、学习效果的好坏有着⾮常密切的关系,如果你想学习嵌⼊式软件,那么我推荐你跟朱有鹏⽼师来学习(本⼈亲⾝体验),朱⽼师讲的细致⼊微,⾯⾯俱到,⼜通俗易懂,朱⽼师有免费的体验课:零基础教你学习Linux、和基于Linux的C语⾔学习,两个体系的课程都是免费的,他讲的好不好,我不多说⼤家⾃⼰去体会,我是在淘宝上买的他的课(我不是托哈,是真的学习有不错的感觉来给⼤家推荐,以后不再做相关的推荐)1500RMB左右,全套课程800⼩时左右,外加⼀套三星S5PV210(基于ARM Cortex-A8架构)的开发板,⼀站式讲解,包含嵌⼊式学习的各个⾓落。当然如果预算不够也可以跟着学习⼤纲来⾃学,但是难度⼀定是不⼩的。好了不多说,下⾯介绍⼀下我的嵌⼊式软件学习的⼤纲:
⼀、预备知识(基础学习)
  这部分包括Linux基础学习和C语⾔基础学习,如果你的基础不错可以直接跳过(后期我在做相关分享时也会直接跳过这⾥,只挑⼀下晦涩难理解的地⽅重点分享):
预备知识第⼀部分-linux基础学习⼤纲
1.了解当前主流操作系统及其特点
2.了解什么是双系统与虚拟机
3.基于VMware搭建⾃⼰的linux开发环境
4.了解什么是隐藏⽂件与⾮隐藏⽂件(与windows系统做对⽐学习)
5.了解什么是相对路径与绝对路径(与windows系统做对⽐学习)
6.了解linux内核&各个发⾏版的差别
7.了解GUI(图形⽤户界⾯)和cmdline(命令⾏)
8.linux常⽤命令:例如ls、cd 、pwd&mkdir&mv&touch&cp 、rm&cat&rmdir 、ln(软连接与硬连接)、man、apt-get、
9.学习linux中的⽂件类型标记⽅法
10.学习什么是编辑器&vi和vim的关系
11.了解vi的两种⼯作模式
12.学习vi⾼级应⽤:查&快速切换⾏&设置显⽰⾏号
13.学习linux命令⾏中⼀些符号的含义
14.学习vi⾼级应⽤:⾏删除&⾏复制粘贴
15.了解普通⽤户与特权⽤户 su命令切换⽤户
16.rwx与linux中权限表⽰
17.懂得ubuntu中使⽤sudo暂时获取root权限
18.学习linux⾼阶命令:find、grep&which&whereis、uname&关机重启命令、tree&mount&df、⽤户管理&权限管理及其他可能⽤到的⾼阶命令
预备知识第⼀部分-C基础学习⼤纲
1.C语⾔基本概念
2.C语⾔程序开发的⼀般步骤
3.使⽤printf进⾏格式化输出
嵌入式系统开发是什么4.VMware中共享⽂件夹功能的使⽤
5.C语⾔数据类型之整形
6.数据类型之整形回顾
7.数据类型之浮点型
8.数据类型之字符型
9.有符号数和⽆符号数
10.C语⾔运算符之算术运算符
11.复合算术运算符
12.++与--运算符和代码风格问题
13.运算符总结和顺序结构
14.第⼀种选择结构if else
15.for循环
16.第⼆种选择结构switch case结构
17.循环结构while和do while
18.C语⾔之函数
19.函数三要素:定义声明和调⽤
20.函数的形参和实参
21.函数的返回值、函数名
22.C语⾔之数组
23.数组的初始化
24.不同数据类型的数组
25.sizeof运算符
26.字符数组和字符串
27.C语⾔之指针
28.C语⾔之结构体
29.C语⾔之共⽤体(Union)
30.C语⾔之宏定义
31.宏定义和枚举
32.C语⾔进阶篇
⼆、ARM裸机学习
  这⾥的ARM裸机学习与STM32的裸机学习是完全不同的,这⾥的裸机学习基于嵌⼊式系统硬件的,不再是基于windows下的IDE进⾏开发,⽽是在Linux中拥有ARM-linux交叉编译链进⾏开发,通过usb、SD卡多种⽅式进⾏烧写。当然ARM裸机的学习不单单是学习ARM 裸机,他同样是的针对Linux的基本操作的训练,及学习makefile的制作重定位连接⽂件的制作等等,对下⼀步学习Uboot及Linux内核有着⾄关重要的作⽤,好了废话不多说,直接上⼤纲:
ARM琐碎知识的学习(⾄关重要)
  这部分主要是针对ARM的背景知识和零散杂碎知识的学习,⽬的是为之后的正式学习做铺垫。这些内容对于初学者来说⾮常重要。
1.了解ARM的成长史
2.了解ARM的商业模式和⽣态系统
4.了解开发板的各个版本号学习
5.学习SoC和CPU的区别&外设概念的引⼊
6.了解主流学习型主芯⽚
7.详细了解开发板
8.了解嵌⼊式和单⽚机的区别
9.学习嵌⼊式系统的构成特点和演进⽅向
10.学习什么是交叉编译
11.了解CPU的设计原理、数据总线和地址总线
12.学习Jlink、SD卡等辅助设备的使⽤及使⽤原因
ARM裸机第⼆部分-ARM体系结构与汇编指令
  这部分是ARM裸机学习的第⼆部分,主要内容是ARM体系结构(指令集和CPU的关系、RISC与CISC、冯诺依曼结构与哈佛结构等)、S5PV210的地址映射、内存外存的连接⽅式,S5PV210的启动过程详解,S5PV210的编程模式与内部通⽤寄存器、异常向量表,ARM常⽤汇编指令等。
1.学习可编程器件的编程原理
2.学习指令集对CPU的意义
3.了解RISC和CISC的区别
4.了解统⼀编址&独⽴编址&哈佛结构&冯诺依曼结构
5.深⼊了解软件编程控制硬件的关键-寄存器
6.学习ARM体系结构要点
7.了解S5PV210的内存映射详解
8.学习CPU和外部存储器的接⼝
9.学习S5PV210的启动过程详解
11.学习如何在开发板上选择不同启动⽅式
12.了解ARM的编程模式和7种模式
13.了解ARM的37个寄存器详解
14.学习ARM的异常处理⽅式
15.学习ARM汇编指令集(简单学习即可))
ARM裸机第三部分-开发板、原理图和数据⼿册
1.开发板硬件⼿册带读
2.开发板刷系统(USB\SD两种⽅式)
3.X210核⼼板、底板原理图导读
4.S5PV210数据⼿册导读
5.x210的dnw刷机
6.linux下使⽤dd命令刷写uboot
ARM裸机第四部分-GPIO和LED
1.裸机实验体验之usb启动配合dnw⼯具下载
2.裸机实验体验之SD卡下载
3.⾃⼰动⼿安装交叉编译⼯具链
4.Makefile⼤侠隆重登场
5.mkv210_image.c⽂件详解
6.⼀步步点亮LED1_硬件⼯作原理及原理图查阅
7.⼀步步点亮LED2_数据⼿册查阅及相关寄存器浏览
8.⼀步步点亮LED3_从零开始⼿写汇编点亮LED
9.⼀步步点亮LED4_使⽤位运算实现复杂点亮要求
10.⼀步步点亮LED5_汇编编写延时函数并实现LED闪烁效果
11.⼀步步点亮LED6_再难⼀点的流⽔灯效果
12.反汇编⼯具objdump的使⽤简介
ARM裸机第五部分-SDRAM和重定位relocate

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。