嵌入式基础概念(一)

一、ARM的几个版本号误区

< 1 > 几个误区

  1. ARM7个ARMv7不是一回事
  2. Cortex-A9比Cortex-A7更先出来

事实上是A8先出来的,A8出来后才出来的A9,A9后面同时出来的A15和A7。A8是单核的,A9是单核或双核的,A9的性能和功耗是取了折中的。之后出来的A15相对于A9性能更强,但是功耗变高,发热量变大;A7相对于A9是性能降低了,但是功耗变低了。

< 2 > ARM的几种版本号

  1. ARM内核版本号
    比如我现在用到的I.MX6ull的内核版本号是ARMv7
  2. ARM SoC版本号
    比如我现在用到的I.MX6ull的 Soc版本号是Cortex-A7单核
  3. 芯片型号
    比如我现在用到的是I.MX6ull这款芯片

在这里插入图片描述
在这里插入图片描述

< 3 > 注意

  1. ARM内核版本号和SoC版本号是由ARM公司确定的,而SoC型号是由半导体公司确定的。
  2. Cortex系列后ARM产品线分割成3个系列,这个是市场细分的需要和选择。
  3. ARM已经发布了一些64位架构如A53等,主要面向高性能服务器类应用。
  4. ARM下一步重点发展方向是Cortex-M7,特点是低功耗,主要面向物联网终端。

二、SoC 和 CPU 的区别

< 1 > 基本概念

  • SoC = System on Chip(在一个芯片上集一个系统)
  • 芯片的发展方向:从CPU到SoC
  • 现在已经没有纯粹的CPU了,都是SoC
  • ARM出卖的内核其实就是CPU(当然还需要总线),各种外设是半导体厂商自己添加的

< 2 > 早期的CPU的工作原理

在这里插入图片描述
早期的CPU,芯片集成度非常低,CPU就是一颗单独的芯片,内部只集成了运算器和控制器,它只能运算和控制,这时候的CPU内部本事是没用内存的,CPU离开了内存是没法计算的,当年CPU里面没有内存是因为内存集成不进去,其他的如串口也集成不进去,就只有单单一个CPU,如果需要使用串口,需要在CPU外面使用一个串口控制器芯片通过PCB走线与CPU相连,然后CPU加上这些外设芯片构成的整个PCB板就叫做一块系统板,这个系统板和另一个系统板就可以通信了,CPU通过它的串口控制器和另一个系统板上的串口控制器进行通信,没法把串口控制器等功能集成到CPU芯片里面去。比如这里还要用到LCD,就需要在外围加入LCD控制器的芯片通过走线与CPU相连,这些芯片组成的一个整板叫做一个系统板。这些UART控制器、LCD控制器就叫外设,和CPU组合到一块板子上就是现在的一块K60芯片实现的功能,只是被集成为一块小小的芯片。这里的外设指的是系统板子以内,CPU以外的就叫外设,CPU就叫内部,内部只有运算器和控制器,叫内设

< 3 > 现在的SoC

在这里插入图片描述
现在的CPU集成密度很高,以上那些功能现在都被集成在CPU里面,成为了一款芯片,比如我现在用过的K60芯片,他就是带这些外设功能的。早期CPU外设的4个芯片现在都被集成到一块芯片里了,所以现在的System就是在一个芯片里面了。也就是System on Chip(SoC),所以理论上CPU和SoC是有区别的,标准的CPU是指早期的只含有运算器和控制器的芯片,SoC就是已经将系统集成为一整个芯片的。所以现在买到的芯片都是SoC,标准的CPU是买不大的,现在的CPU都是内部已经集成了很多外设的。

三、嵌入式和单片机开发模式的区别

< 1 > 基本概念

  • 单片机开发多为裸机,程序规模小,多为单个程序员独立开发。有些复杂的产品也会使用高端单片机,如STM32,并使用RTOS(uCOS、freeRTOS等等)
  • 嵌入式开发几乎全部基于嵌入式操作系统,目前使用最多的是Linux和Android

< 2 > 技术特征:编程语言方面

  • 单片机主要使用C语言(少量用汇编),和标准C略有不同,很少使用结构体、函数指针等C语言高级特性。
  • 嵌入式开发较复杂,一般分底层和应用层。底层使用C语言,应用层使用C、C++、Java等语言均有。嵌入式C语言对结构体、数据结构、算法、函数指针(用来实现面向对象)等高级特性使用比较多

< 3 > 技术特征:软硬件组件方面

3.1 单片机方面
  • 单片机多涉及一些简单外设,譬如串口、I2C、ADC、LCD(小屏幕和分辨率)
  • 其实单片机也能搞USB、用网卡上网,但是单片机裸机写出来的网卡通信首先你写出来他是很麻烦的,需要花很长时间,而且它不能运用到产品上,此时更好的就上ARM+Linux操作系统,直接驱动仿真移植一下,基于Linux的应用层编程写网络通信程序更容易;USB同理,操作系统自带驱动程序,你单片机上还要自己去写,麻烦死了,还不一定顶事;对于音视频编解码,现在芯片里都有硬件音视频编解码了,当然你也可以依赖操作系统自己写。
  • 用以前的一些简单的单片机玩玩串口、I2C、ADC、LCD这些自己写还是能接受的,还是写的出来的,也不会花费太长的时间
  • 现在高端的单片机,如STM32都是提供了库的,库里包含的如USB的源代码、串口源代码等都不用我们自己写了,因为自己通过寄存器来实现上述功能很多人写不出来,单片机位数高了,变复杂了。实际上使用库编程就是单片机嵌入式领域了
3.2 嵌入式方面
  • 嵌入式系统涉及更多复杂外设,譬如网络(有线网卡、WiFi、蓝牙等)、USB、音视频编解码等。基于操作系统开发的好处就在于操作系统已经给我们提供了很多的基础架构,不需要我们重头从零开始写,如网络组件、蓝牙、硬件音视频编解码、USB驱动等等。用单片机啥都要靠自己重头写。
3.3 总结
  • 我们现在使用的是单片机的库来开发,就是属于单片机嵌入式。而嵌入式系统的本质就是单片机里面提供的库。

< 4 > 操作系统与裸机的区别

  • 裸机运行的程序代码,一般由一个main函数中的while死循环和各种中断服务程序组成,平时CPU执行while循环中的代码,出现其他事件时,跳转到中断服务程序进行处理,没有多任务、线程的概念。
  • 而引入操作系统后,程序执行时可以把一个应用程序分割为多个任务,每个任务完成一部分工作,并且每个任务都可以写成死循环。操作系统根据任务的优先级,通过调度器是CPU分时执行各个任务,保证每个任务都能够得到运行。若调度方法优良,则可使个任务看起来是并行执行的,减少了CPU的空闲时间,提高了CPU的利用率。由操作系统的任务管理衍生出相应的CPU管理、内存管理,它们分别负责分配任务对CPU的占有权和管理任务所占有的内存空间。在linux操作系统中,还具有文件管理、I/O设备管理的功能。

四、嵌入式系统的特点

< 1 > 专用、软硬件可裁剪可配置

  • 传统计算机,比如笔记本电脑就是通用的,各行各业的人士都可以使用笔记本电脑,用笔记本电脑做不同的事情。但是嵌入式系统是专用的,比如给空调开发的嵌入式系统,空调控制器就只能供给空调使用。
  • 软硬件可裁剪可配置,指的是嵌入式系统的配置是可以动态变化的,如软件部分里,Linux系统最大的特点就是可裁剪性,像那种很庞大的服务器集群就是用的Linux系统,但是这个Linux系统能够经裁剪部分而放在其它芯片里,Linux系统要大可以很大,要小可以很小。

< 2 > 低功耗、高可靠性、高稳定性

  • 很多嵌入式系统是通过电池供电的,低功耗在电池供电里是很有意义的。用电池供电的嵌入式产品对低功耗的要求是很高的,比如给小孩配的防走丢式GPS定位器,低功耗要求就很高,一周充一次电我能接受,但是你让我隔两个小时充一次电,那我用它干屁,小孩走丢了的时候,你没电了可还行。
  • 手机的高可靠性、高稳定性要求没有很高,因为如果死机了是能接受的,但是如果像控制电梯的嵌入式设备,你可靠性和稳定性不高,电梯突然从19楼掉到2楼,不得吓死人。

< 3 > 相对于PC机而言软件代码短小精悍

< 4 > 代码可固化

  • 可固化指代码可以烧录到硬件里,烧录指通过某种方式将程序下载到嵌入式硬件里。固化就是这一次烧录进去的程序,下一次重新开机程序还在;没有固化就是这次下载的程序,等到下次关机重启程序就没了,需要重新下载。

< 5 > 实时性

  • Linux系统是一个非实时操作系统
  • 实时操作系统(RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,并控制所有实时任务协调一致运行的操作系统。提供及时响应和高可靠性是其主要特点。

< 6 > 若交互性

  • 强交互性:人和手机之间的交互,以及人和电脑游戏之间的交互
  • 弱交互性:比如路由器,人们只会关心网络还在没,网连上没。才不会去管它怎么运行的,也不会去看它。

< 7 > 专用开发工具及开发环境

  • 如 gcc 交叉编译器等

五、嵌入式系统的组成

< 1 > 硬件

  • 微处理器
  • 存储器(内存、Flash等)
  • I/O接口、输入输出设备等

< 2 > 软件

  • 嵌入式操作系统(底层)
  • BSP(board support package 板级支持包)
  • 应用软件(上层)

六、嵌入式程序的编译运行过程

从源代码到CPU执行过程:

在这里插入图片描述

  • 在Linux里是elf二进制格式,它仅仅是二进制的一种格式,比如在Windows,二进制可执行程序是exe格式。
  • 因为裸机程序是要烧录的,elf格式的二进制程序里有很多冗余的东西,所以用objcopy工具将其转化为Bin格式可烧录的文件

七、CPU设计方式发展

  • 早期简单CPU,指令和功能都很有限,一般只能完成加减乘除运算。
  • CISC年代,CPU功能扩展依赖于指令集的扩展,就是CPU的设计者设计了完成更多任务的指令供用户使用。指令集的扩展实质是CPU内部组合逻辑电路的扩展。比如现在的Intel就是用的CISC,那时候比的就是谁的指令集多。
  • RISC年代,CPU仅提供基础功能指令(譬如内存与寄存器通信指令,基本运算与判断指令等),功能扩展由使用CPU的人利用基础架构来灵活实现,就是那些更高级的指令我们自己来写,比如基础架构只提供30条指令,自己人为利用这30条指令,用软件编程编出来300条功能(当然这些都是在CPU外部人为编程完成的),而CISC就是类似直接给你提供300条指令。RISC迁移到也就是开发我们现在用的芯片,比如ARM就是用的RISC。
  • 因为提供指令集的减少,RISC的CPU就比CISC的简单,组合逻辑电路就减少了,功耗就降下来了,CPU结构相对简单了价格也就便宜了。所以现在的手机、平板一般选择用RISC降低功耗。

八、什么是IO?什么是内存?

< 1 > 内存

  • 内存时程序的运行场所,内存和CPU之间通过总线连接,CPU通过一定的地址来访问具体内存单元

< 2 > IO

  • IO 是输入输出接口,是CPU和其他外部设备(如串口、LCD、触摸屏、LED等)之间通信的道路。一般的IO就是指CPU的各种内部或外部外设

< 3 > IO 的访问方式

  • IO 指的是与COU连接的各种外设
  • CPU访问各种外设有2种方式:一种是类似于访问内存的方式,即把外设的寄存器当做一个内存地址来读写,从而以访问内存相同的方式来操作外设,叫IO与内存统一编址方式(统一编制一般在RISC的CPU里,如ARM);另一种是使用专用的CPU指令来访问某种特定外设,叫IO与内存独立编址(独立编址有CISC的思想)。

< 4 > 内存的访问方式

  • 内存通过CPU的数据总线来寻址定位,然后通过CPU数据总线来读写
  • CPU的地址总线的位数是CPU设计时确定的,因此一款CPU所能寻址的范围是一定的,而内存是需要占用CPU的寻址空间的。
  • 内存与CPU的这种总线式连接方式是一种直接连接,优点是效率高访问快,缺点是资源有限,扩展性差。

九、冯诺依曼结构与哈佛结构

  • 程序和数据都放在内存中,且不彼此分离的结构称为冯诺依曼结构。譬如Intel的CPU均采用冯诺依曼结构。
  • 程序和数据分开独立放在不同的内存块中,彼此完全分离的结构称为哈佛结构。譬如大部分的单片机(MCS51、ARM9等)均采用哈佛结构。
  • 常见的ARM(除ARM7外)都是哈佛结构
  • 哈佛结构保证了ARM CPU运行的稳定性和安全性,因此ARM适用于嵌入式领域
  • 哈佛结构也决定了ARM裸机程序(使用实地址即物理地址)的链接比较麻烦,必须使用复杂的链接脚本告知链接器如何组织程序;对于OS之上的应用(工作在虚拟地址之中)则不需要考虑这么多。
  • 所以裸机程序要写链接脚本,因为使用了实地址。而应用程序不用写链接脚本。

十、寄存器相关

< 1 > 什么是寄存器

  • 寄存器属于CPU外设的硬件组成部分
  • CPU可以像访问内存一样访问寄存器
  • 寄存器是CPU的硬件设计者制定的,目的是留作外设被编程控制的“活动开关”
  • 正如汇编指令集是CPU的编程接口API一样,寄存器是外设硬件的软件编程接口API。使用软件编程控制某一硬件,其实就是编程读写该硬件的寄存器。

< 2 > 通用寄存器和特殊功能寄存器

  • SoC中有2类寄存器:通用寄存器和SFR
  • 通用寄存器(ARM中有37个)是CPU的组成部分,CPU的很多活动都需要通用寄存器的支持和参与。
  • SFR(special function register,特殊功能寄存器)不在CPU中,而存在于CPU的外设中,我们通过访问外设的SFR来编程操控这个外设,这就是硬件编程控制的方法。
  • 通用寄存器的功能在CPU设计的时候是没有定的,可以自己人为的去规定、使用;SFR寄存器的某一位具体能实现什么功能都是被定死的,无法改变的。

十一、内存和外存

< 1 > 内存(RAM)

  • 即内部存储器,是用来运行程序的,作为程序运行的环境,因为内存时RAM随机存储的,CPU可以通过地址总线和它们相连接的。
  • 举例:DRAM、SRAM、DDR

< 2 > SRAM 和 DRAM

2.1 SRAM(静态内存)
  • 缺点:容量小、价格高
  • 优点:不需要软件初始化,直接上电就能使用
2.2 DRAM(动态内存)
  • 优点:容量大、价格低
  • 缺点:上电后不能直接使用,需要软件初始化后才能使用
2.3 总结
  • 单片机中:内存需求量小,而且希望开发尽量简单,适合全部用SRAM
  • 嵌入式系统:内存需求量大,而且没有NorFlash等可启动介质
  • PC机:内存需求量大,而且软件复杂,不在乎DRAM的初始化开销,适合全部用DRAM

< 3 > 外存(ROM)

  1. 即外部存储器,用来存储东西的(程序、文档、数据等)
  2. 举例:硬盘、Flash(包含Nand、iNand… U盘、SSD)、光盘

< 4 > CPU与内存、外存的连接方式

  • CPU连接内存和外存的连接方式不同。
  • 内存需要直接访问,所以是通过地址总线&数据总线的总线式访问方式连接的(好处是直接访问,随机访问;坏处是占用CPU的地址空间,大小受限)
    举例:如下图所示CPU与内存连接是一根一根地址线相连接上的。有地址总线的条数决定它能访问内存的大小,所以一般总线的条数确定了,CPU能够访问的最大内存也就确定了,内存的大小一般是相对于其它的外存允许的地址范围大。比如这款芯片DRAM的起始地址从0X20000000到0X7FFFFFFF就是1G的大小,表示CPU在内存寻址最大为1G。再就是我现在使用的I.MX6ULL的内存大小是512MB,那么 512 M B = 512 × 2 20 B y t e = 2 29 B y t e 512 MB = 512×2^{20} Byte = 2^{29} Byte 512MB=512×220Byte=229Byte,表示CPU具有的地址总线条数是29条。
    在这里插入图片描述
  • 外存是通过CPU的外存接口来连接的(好处是不占用CPU的地址空间,坏处是访问速度没有总线式快,访问时序较复杂)
    举例:如下图所示,这里NAND的范围是256MB,但是这可不意味着CPU只能接256MB大小的NAND Flash,一般开发板上接的都是几个GB大小的NAND Flash,如果仅仅是一个NAND Flash就需要占用几个G的空间,和内存一样通过地址总线来接的,那基本是吃不消的。所以外存是通过一些接口来连接的,所以对于如下芯片的设定,在连接NAND Flash的时候就只有256MB的空间大小,但是还是能与几个G的NAND Flash连接上然后放到如下这么一段看起来比较小的空间里去。因为在非总线式连接里面,有一个接口程序的时序操作去访它问的。
    在这里插入图片描述

< 5 > SoC常用外部存储器

5.1 Flash:电子式访问
  • NorFlash
    特点:容量小、价格高。优点是可以和CPU直接总线式相连,CPU上电后可以直接读取,所以一般用作启动介质,启动代码烧写到NorFlash里,然后NorFlash接到地址总线上,一般接到CPU的SROM bank。比如台式机的bios就是一块Nor Flash,bios里面事先烧好了一段启动代码,用来启动。而且以前的板子就是含有一块NorFlash和一块NandFlash,NorFlash专门用来主板启动,启动之后用NandFlash当硬盘。
  • NandFlash(跟硬盘一样)
    特点:容量大、价格低。缺点是不能总线式访问,也就是说不能上电CPU直接读取,需要CPU先运行一些初始化软件,然后通过时序接口读写
  • EMMC、iNand、moviNand
    eMMC(嵌入式MMC卡,e表示embeded),也就是eMMC本身是一个芯片,但是它类似是一张SD卡,你把EMMC卡当做芯片放在主板上,就相当于给开发板插了一张SD卡。EMMC卡、SD卡本身内部就有一个CPU,它自己内部就可以做一些处理,相当于给主板上的CPU减轻负担。
  • oneNAND
  • SD卡、TF卡、MMC卡
  • eSSD
5.2 硬盘:机械式访问、磁存储原理

硬盘:通过机械式访问、磁存储原理、SATA是接口

  • SATA硬盘(SATA是一种接口)
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值