Linux嵌入式系统开发从小白到大牛
上QQ阅读APP看书,第一时间看更新

4.3 嵌入式硬件系统的基本组成部分

对于一个嵌入式硬件系统来说,微处理器是嵌入式系统的核心基础,基础决定上层建筑,因此需要了解嵌入式硬件系统的组成部分。这个就好比人们买笔记本计算机一样,选择什么配置的计算机,准备买英特尔i5处理器还是i7处理器、内存选8G的还是16G的、显示屏选择14寸的还是15.6寸等。嵌入式硬件系统正是要探讨这些内容,只是关注得更深层次一些。对于一个嵌入式硬件系统来说,主要从它的微处理器的时钟系统、中断系统、总线、I/O设备以及常用外设接口电路几个方面着手研究。嵌入式硬件系统基本组成部分如图4-6所示。

图4-6 嵌入式硬件系统基本组成部分

4.3.1 时钟系统

准确地说,嵌入式系统中不存在时钟的概念,时钟是人为设计的一个概念,因为一个嵌入式硬件系统只有晶振产生的振荡电路,这个振荡电路在不同电压的作用下产生振幅不同、但是规正的波形输入到微处理器中。脉冲信号是一个按一定电压幅度、一定时间间隔连续发出的脉冲信号。脉冲信号之间的时间间隔称为周期;而在单位时间(如1秒)内所产生的脉冲个数称为频率。频率是描述周期性循环信号(包括脉冲信号)在单位时间内所出现的脉冲数量多少的计量名称;频率的标准计量单位是Hz(赫)。

1.时钟周期

时钟周期也称为振荡周期,是由晶振周期振荡产生的物理周期,如果一个微处理器不采用倍频技术化,那么时钟周期也就是该系统的最小时间单位。在计算机术语中也常常将时钟周期称为节拍。

2.机器周期

机器周期是相对于微处理器来说,因此也称为处理器周期。为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下机器周期的时间要大于时钟周期,为了便于理解,以8051单片机为例,一个机器周期等于12个时钟周期。

3.指令周期

指令周期的定义是处理器完成一条指令全部操作所用的时间。一般一条指令周期由若干个机器周期组成,但是由于指令不是完全相同的,所以指令周期也是不同的。对于简单指令,可能只需要一条机器周期,对于复杂指令则需要使用多个机器周期。通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。

小白成长之路:定时器和计数器的区别

对于微处理器来说,定时器和计数器在硬件电路都是相同的,只是使用逻辑和使用场景不同而已。定时器一般用于系统计算时间来处理相应的功能,定时器功能侧重于对时间的计算;计数器功能侧重于对输入信号的计数,它不关心时间问题。

4.3.2 中断系统

什么是中断?举个生活中的例子,如果我们正在考试,突然笔没有墨水了,这个时候通常会举手示意老师,经过老师允许后去加墨水,加完墨水后再次示意老师回到座位继续进行考试。在这个例子中,中断系统一般会有以下几步:首先是中断请求,比如第一次举手示意老师加墨水;其次是中断响应,就是老师允许我们离开座位去加墨水;再次是中断处理,就是加墨水的过程;最后是中断返回,就是加完墨水后再次目光示意老师回到座位继续考试。

但是对于能够移植操作系统的微处理器来说中断系统是复杂的,需要明白三个基本概念,分别是中断向量表、中断管理以及中断服务函数。

1.中断向量表

中断向量表是一系列中断服务程序入口地址组成的表,主要存放中断服务函数的入口地址。比如一般ARM处理器都是从地址0X00000000开始执行指令的,那么中断向量表就是从0X00000000开始存放的。如果将程序下载到其他位置,还要进行中断向量表偏移。比如将程序下载到0X8780 0000,要设置中断向量表偏移位0X8780 0000。

2.中断管理

中断管理主要是用来管理微处理器中断优先级的,对于微处理器不同中断管理的方式也存在很大差别。有的处理器支持中断嵌套,而有的则不支持,有的处理器支持中断可以被抢占,而有的则不支持。对于ARM处理器来说,Cortex-M3内核中断管理方式采用NVIC,全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器。但是对于Cortex-A7内核中断管理方式采用GIC,全称是General Interrupt Controller,即通用中断控制器。

3.中断服务函数

中断服务函数其实就是指中断以后需要处理的事件,使用中断的目的是为了使用中断服务函数。中断发生后,中断服务函数就会被调用,我们要处理的工作就可以放到中断服务函数中去完成。

小白成长之路:ARM处理器的7种工作模式

1)用户模式(user)是用户程序的工作模式,运行在操作系统的用户态。用户模式没有权限去操作其他硬件资源,只能执行处理自己的数据,也不能切换到其他模式下,想要访问硬件资源或切换到其他模式只能通过软中断或产生异常。

2)系统模式(system)是特权模式,不受用户模式的限制。用户模式和系统模式共用一套寄存器,操作系统在该模式下可以方便地访问用户模式的寄存器,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。

3)一般中断模式(IRQ)也叫普通中断模式,用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式。一般中断模式为特权模式,可以自由访问系统硬件资源。

4)快速中断模式(FIQ)是相对一般中断模式而言的,用来处理对时间要求比较紧急的中断请求,主要用于高速数据传输及通道处理。

5)管理模式(SVC)是CPU上电后默认模式,主要用来做系统的初始化,软中断处理也在该模式下。当用户模式下的用户程序请求使用硬件资源时,通过软件中断进入该模式。

6)中止模式(abort)用于支持虚拟内存或存储器保护,当用户程序访问非法地址,没有权限读取内存地址时,会进入该模式。Linux下编程时经常出现的segment fault通常都是在该模式下抛出返回的。

7)未定义模式(undefined)用于支持硬件协处理器的软件仿真,CPU在指令的译码阶段不能识别该指令操作时,会进入未定义模式。

4.3.3 总线

总线就是不同设备之间交互数据的通道,其特点是共享,超过两种设备以上的连接方式称为总线,一对一的连接方式一般不能称为总线。总线根据在微处理器内部还是外部分为内部总线和外部总线,在微机原理中常用的地址总线、数据总线以及控制总线数据内部总线,像USB、SPI、PCI、IIC、CAN等属于外部总线。

1.地址总线

地址总线决定着微处理的位数、寻址能力,通常情况下地址总线的传输方向是单方向的,微处理器只需要获取具体地址后,使用数据总线读写数据即可。一个微处理的寻址范围通常等于2n(n表示地址总线的数量),比如32位微处理器的寻址范围就是4GB,这也是为什么老式的计算机,比如Windows XP时代,好多的计算机即使安装了8GB的内存条,依旧只能读出来4GB左右。所以地址总线的数量决定着微处理器的位数和内存寻址能力。

2.数据总线

数据总线是微处理器与存储单元以及其他外设数据交换的公共通道,由于地址总线决定了微处理器的内存寻址能力,那么数据总线就决定了微处理器的一个时钟周期和外界数据交换的速度。通常8位数据总线在一个时钟周期可以传输一个字节,但是32位数据总线在一个时钟周期可以一次传输四个字节。因为数据总线既可以完成微处理器写入操作,也可以完成微处理器的读取操作,因此数据总线在传输方向上是双向的。

3.控制总线

控制总线是在地址总线确定了内存地址以后,告诉数据总线当前操作是读操作还是写操作,此外控制总线决定着微处理器对外部设备有多少种。控制总线除了控制读写信号以外还需要控制时序信号,因为对外部设备的读取,不是只是一种电平信号,而是多种电平信号有序排列。控制总线一般是双向的,控制总线的位数要根据系统的实际控制需要而定。实际上,控制总线的具体情况主要取决于微处理器。

4.SPI总线

SPI总线的全称为串行外围设备接口(Serial Peripheral Interface),这是由摩托罗拉科技公司开发的一款串行总线通信方式,它的设计目的是给微处理器提供连接外围设备的低成本的方案。SPI总线只需要4个I/O接口就可以实现对于存储器、传感器、LCD驱动器以及音频等芯片的数据通信。与标准的串行接口不同,SPI是一个同步协议接口,所有的传输都参照一个共同的时钟,这个同步时钟信号由主机(处理器)产生,接收数据的外设(从设备)使用时钟来对串行比特流的接收进行同步化。可能会有许多芯片连到主机的同一个SPI接口上,这时主机通过触发从设备的片选输入引脚来选择接收数据的从设备,没有被选中的外设将不会参与SPI传输。SPI接口的缺点是没有指定的流控制,没有应答机制确认是否接收到数据。

5.CAN总线

CAN总线是一种抗干扰极强的串行通信总线,主要用于汽车、航天、船舶等对数据稳定传输要求极高的领域。CAN总线的成本相对其他低速串行总线来说比较高,主要是CAN的收发控制器价格比较贵。CAN总线最早是由德国博世公司开发的,后来被ISO国际标准委员会组织收录并作为汽车行业标准的串行通信协议。CAN总线能够抗干扰是因为CAN总线将内部逻辑电平转换为差分信号输出到CAN总线上,差分信号由于采用电位差来定义高低电平的逻辑,所以能有效地对抗电磁干扰。

小白成长之路:串行总线和并行总线的区别

微处理器的内部总线都是并行总线,并行总线的特点是单位时间内吞吐量大,对时序要求高,并且对物理I/O的数量要求比较多,一般至少需要8条并行数据线(一个字节位宽)。因此并行总线的抗电磁干扰比较差,通常都是用于微处理器内部以及板卡布线使用。

串行总线也有很多,像前面提到的SPI和CAN总线。其实还有很多,比如USB、IIC、SATA、RS-485、RS-232以及LIN总线等。LIN总线的特点是通过时序控制减少对物理I/O数量的依赖,因此封装了串行总线的微处理器通常比较小。串行总线数据线少,便于对信号做抗干扰处理,通常串行总线的抗干扰能力强,适合远距离通信。但是串行总线的单位时间内数据的吞吐量要小于并行总线。

4.3.4 存储系统

存储系统是一个嵌入式系统的重要组成部分,甚至可以说一个嵌入式系统不能没有存储系统。嵌入式系统经常使用的存储器可以分为三类,分别是随机存取存储器、只读存器器和闪存,理论上闪存是从只读存储器派生出来的,因为闪存也是一种非易失存储器类型,如图4-7所示。

图4-7 存储器分类

1.随机存取存储器(RAM)

首先需要明白随机的概念,随机就是微处理器想什么时间读写数据都不需要提前和存储器“打招呼”,反过来理解就是存储器中的数据被读写是随机的。RAM(Random Access Memory)随机性和ROM(Read-only Memory)、FLASH不同。RAM是一种掉电数据就会丢失的存储器类型,这是和ROM相同的地方。随机存储器又分为动态随机存储器和静态随机存储器。

DRAM(Dynamic Random Access Memory,动态随机存取存储器)是最为常见的系统内存。这里对动态的理解是这样的:DRAM的物理构造是采用电容充放电来保存数据的,这也就需要动态地给DRAM内存电激励信号,就是间隔一段时间用电信号刷新数据,防止电容充放电不及时导致数据丢失,常见的DRAM就是计算机的内存条。

SRAM(Static Random-Access Memory,静态随机存取存储器)是一种具有静止存取功能的内存,其内部机构比DRAM复杂,可以做到不刷新电路即能保存它内部存储的数据。静态的意思就是不需要刷新。对比DRAM,SRAM的优点是读写速度特别快,但是缺点也很明显,就是集成度低,相同容量的存储单元中SRAM体积比DRAM大,而且价格高,一般用于对读写速度要求较高的场景,比如CPU的高速缓存一般是SRAM。

2.只读存储器(ROM)

只读存储器ROM,顾名思义就是只能读取不能随便写入信息,它的特点是掉电以后数据不会丢失。只读存储器是不断发展的,只读存储器分类是在发展中划分的,因此根据时间线划分只读存储器可以分为掩膜只读存储器(MASK ROM)、一次性编程只读存储器(OTP ROM)、紫外线可擦除只读存储器(EPROM)、电可擦除只读存储器。注意这里的擦除和写入是两个概念。早期的微处理器基本采用EEPROM,比如80C52单片机。

3.闪存(Flash Memory)

闪存是一种非易失数据存储器,它实际也是由只读存储器派生出来的。闪存主要分为两类,一类是NOR Flash,另一类是NAND Flash。两者的区别主要有:第一,在速度上由于NAND Flash是安装页或者块来擦写,因此比按照字节擦写的NOR Flash要快,但是在读取数据上由于NAND需要定位内存地址,需要时钟周期要远远高于NOR Flash,因此在读取速度上NOR Flash更有优势。第二,在可靠性方面,就是大家经常说的NAND Flash会出现坏块,这是因为NAND Flash之间容易发生位翻转,产生的坏块是随机分布的,所以一般都会选择使用EMMC接口的Flash,因为EMMC标准接口能够管理NAND Flash出现的坏块。最后从成本上来说,NAND Flash更占优势,总体来说NAND Flash的市场要远远大于NOR Flash。

4.3.5 嵌入式微处理器片上外部设备

嵌入式微处理片上的外部设备决定着嵌入式系统输入和输出设备的类型和数量,这也会影响微处理器的成本。嵌入式系统根据应用场景和领域的不同,对外部设备的需求也不同,片上外部设备通常也被称为接口,常见有以下几种。

1.通用输入/输出接口(GPIO)

通用输入/输出接口是微处理器最基本的接口,简称GPIO,GPIO是连接微处理器和板卡设备的重要接口,一般GPIO是可以配置的,配置参数根据微处理器的不同而不同,如输入模式、输出模式、复用模式等,GPIO输入/输出的通常是TTL信号,输入板卡级别的信号,信号电压一般在0V~5V之间。比如通常的微处理器控制LED亮灭主要就是操作的GPIO。

2.串行接口(IIC、SPI、USART/UART、USB、CAN)

串行接口种类有很多种,像IIC、SPI、USART/UART、USB、CAN串行总线接口。除此以外还有RS-232、RS485、SATA接口等,但是对于微处理器来说,能够直接与其通信的一般都是TTL信号的串行接口,比如IIC、SPI、USART/UART等,这些串行接口简化的嵌入式系统的布线方式,原本至少8根数据线的并口,可以使用一根数据线和一根时钟线来完成。随着嵌入式系统的分工越来越明确,对于一些特殊应用和场合会有专门的硬件解决方案,这些硬件解决方案为了更好地适用市场,会兼容各种串行接口,比如使用最多的U盘,就是采用USB串行接口。

3.数模/模数转换接口(ADC/DAC)

在讲ADC/DAC接口以前,要先明白什么是模拟量、什么是数字量。模拟量就是连续不变的量,这里的关键词是连续;而数字量是离散的,它和模拟量相对。知道这两个概念以后,就能明白什么是数模转换和模数转换了。微处理器集成ADC/DAC以后就能够通过传感器采集的自然模拟量,经过运算处理以后显示出来,这个过程就是模数转换和数模转换的过程。因此,所有的微处理基本都会集成ADC/DAC接口。

4.液晶显示接口(LCD-RGB)

LCD的接口方式有很多种,比如LVDS接口、EDP接口、MIPI接口以及最常用的TTL接口。这里的接口是根据驱动LCD信号的性质来划分的,微处理器基本都可以使用TTL信号接口,但前提是微处理器的引脚够多。其中LCD中的RGB接口就属于TTL电平信号。通过对红(Red)、绿(Green)、蓝(Blue)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色,RGB即代表红、绿、蓝3个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色。RGB接口一般是8bit的R数据线、8bit的G数据线以及8bit的B数据线,即数据线24位。这也是日常看到的RGB24位真彩色。