外设子系统设计的总原则是能够平衡各个部件的延迟和速度差异,达到最高带宽。外设子系统包括系统外设和I/O接口。
系统外设主要指维持SoC正确运转的必需模块,包括定时器、计数器等。
早期的ARM处理器系统使用私有定时器和全局定时器,现在则使用通用定时器。
SoC中每一个处理器至少拥有一个私有定时器(Private Timer),该定时器能够在指定的计数值上产生中断,或者工作在自减模式下,即当计数值递减到0时产生中断。
私有定时器支持单次触发模式和自动重载模式。在单次触发模式下,计数值递减到0后,私有定时器停止;在自动重载模式下,计数值递减到0后,私有定时器将重加载寄存器的计数值复制到计数寄存器中,产生中断后继续执行递减操作。
对于多处理器SoC来说,每一个处理器除各自拥有的私有定时器外,还拥有一个多处理器共享的全局定时器(Global Timer)。私有定时器和全局定时器如图1.30所示。
图1.30 私有定时器和全局定时器
通用定时器(Generic Timer)为ARM处理器内核提供了标准化的定时器框架,包括一个系统定时器和一组(单核)定时器,如图1.31所示。SoC通常还含有用于报告时间和日期的实时计数器(Real Time Counter,RTC)。
图1.31 通用定时器
图1.32给出了SoC的定时器框架。
图1.32 SoC的定时器框架
系统计数器(System Counter)是一个全局唯一、共享和始终在线的设备,以一个固定频率递增。即使系统处于待机状态,所有处理器内核都被关闭,系统计数器仍然可以工作,当计数到最大值后会回滚。系统计数值将被广播到系统中的所有处理器内核,从而为处理器内核提供时间流逝的通用视图,即各个处理器内核的定时器应该看到相同的系统计数值。系统计数器和处理器工作在不同的时钟频率下,软件对处理器频率的修改不会影响系统计数器。系统计数器位于始终开启的电源域中,不受动态电压频率调节(DVFS)等电源管理技术的影响。在省电模式下,可以关闭各个处理器的供电,但仍可以保持系统计数器的供电,以保持系统时间。系统计数器需要反映时间的推进,但可以通过广播更少的计数器更新信息来降低功耗。例如,系统计数器可以每10个时钟周期更新一次。
每个处理器内核都有一组定时器。这些定时器的计数值会与系统计数器广播的系统计数值进行比较。软件可以配置定时器,以便将来在设定点产生中断或事件。系统计数器为所有处理器内核提供了一个通用参考点,可为软件提供时间戳。
除处理器内部的定时器外,还可以为处理器提供多个外部定时器,以便处理器执行更多的定时任务,如图1.33所示。外部定时器通过内存映射寄存器进行访问,其中断通常作为通用中断控制器的共享外设中断。
图1.33 外部定时器
处理器内核通过专用接口或通用总线读取外部计数器的计数值。由于处理器内核与外部计数器之间可能存在频率差异,因此彼此之间需要同步机制。这种同步可以由异步桥或格雷码与二进制码的转换来实现,如图1.34所示。
图1.34 外部计数器的同步化
数据传输(Data Transmission)是指依照适当规程,经过一条或多条链路,在数据源与数据宿之间传输数据的过程,也表示将数据从一处送往另一处的操作。
通常处理器并不直接与I/O设备进行信息交换,而要借助于I/O接口。各类信息通过I/O接口进入不同的寄存器,一般称这些寄存器为端口,通常有数据端口、状态端口和控制端口。处理器可以对内存和I/O接口进行统一编址或分别编址,如图1.35所示。
图1.35 I/O接口
外设子系统的设计,首先需要考虑硬件的资源配比,达到总体速度均衡;然后增加队列(FIFO队列),填补双方的时序空隙,促使所有硬件可以满负荷运行,队列越深,则效率越高,不过支持队列的乱序执行会导致控制及错误处理变得更加复杂。
外设中含有缓冲器,在数据链路上,数据以比特流的形式串行传输;在内部,数据则以字节(或多字节)为单位并行传输。在发送数据时,先以并行方式将数据写入发送缓存,再以串行方式从发送缓存中按顺序读出数据,发送到数据链路上。在接收数据时,先从数据链路上将串行传输的数据按顺序存入接收缓存,再以并行方式按字节(或多字节)将数据从接收缓存中读出,以便解决数据速率不一致的问题,如图1.36所示。标准数据缓存存在于发送和接收两方,两方分别有一个发送缓存和一个接收缓存,若进行全双工通信,则在每一方都要同时设有发送缓存和接收缓存。
图1.36 通过数据链路进行通信
FIFO队列常用于接收数据和发送数据,其大小可单独进行编程设置。
很多外设都单独配备一个波特率发生器,可根据内部模块时钟或外部频率输入产生波特率。为了达到期望波特率,必须考虑两个标准:模块性能和应用环境。模块性能由模块的输入频率决定,尽管模块本身可达到的波特率较高(其取决于模块时钟和表示一个数据位所需要的模块时钟周期数),但实际可达到的波特率往往受限于应用环境。在大多数情况下,受驱动延迟、信号传输时间或电磁干扰(EMI)等因素的影响,应用环境会限制可达到的最大波特率。
GPIO总线接口是通用I/O接口,可以连接键盘等低速设备。
协议类接口包括串行接口、并行接口、音频与视频接口。常见的低速外设接口有I2C接口、SPI和UART接口等。其中,I2C接口已经成为许多嵌入式控制器的必备模块,如实时时钟控制器;SPI的作用为对外部芯片(如LCD内部控制器芯片、基带芯片等)进行初始化;UART接口多用于开发过程中的调试,有时也用于数据输入。
连接性接口(Connectivity Interface)包括USB接口、PCI接口、蓝牙接口、WLAN接口、以太网接口等高速接口,需要控制器和专用PHY(物理层接口)协同工作。
其他接口包括键盘接口、电源接口、A/D接口、D/A接口和触摸屏接口等。
CPU与外设之间的数据传输方式有三种:程序控制方式、中断方式和DMA方式。
程序控制方式可分为无条件传输和条件传输两种方式。
无条件传输也称为同步传输,主要用于简单外设。这类外设在任何时刻均处于已准备好发送数据或准备好接收数据的状态,因此在需要进行数据输入或输出时,程序可以不必检查外设的状态,直接执行输入或输出指令。一般当处理器与外设之间传输数据不太频繁时,采用无条件传输方式。
条件传输也称为查询式传输,在开始传输数据前,必须要确认外设是否已经准备好接收数据。当处理器用于数据传输的时间较长且外设数量不多时,采用条件传输方式。
在实时系统及多外设系统中,为了提高处理器的效率和系统的实时性能,通常采用中断方式进行数据传输。中断方式虽可大大提高处理器效率,但会占用处理器时间,对高速I/O设备及成组数据传输而言,速度仍然太慢。
中断源包括内部中断源和外部中断源,其中,内部中断源来自系统外设和数据外设,如RTC、UART、定时器、I2C设备和SPI设备等,外部中断源来自GPIO设备等。
中断触发类型有上升沿触发、下降沿触发、高电平触发、低电平触发。外部中断信号需要进行去除毛刺、寄存、同步到总线时钟等特殊处理。
中断控制器(INTerrupt Controller,INTC)可以对SoC系统中各个外设的中断进行管理和优先级排序。其内部至少有三种寄存器:中断使能寄存器、中断状态寄存器和中断屏蔽寄存器。ARM公司先后推出了多代中断控制器,以适应不同类型处理器内核的需求,具体介绍如下。
芯片内部有许多中断源,向量中断控制器(Vectored Interrupt Controller,VIC)的作用就是控制哪些中断源可以产生中断,可以产生哪类中断,以及产生中断后执行哪段服务程序。
在图1.37中,VIC接收到32个中断请求,ARM处理器内核(ARMTTDMI-S)则接收到两个中断请求,分别为普通中断请求(IRQ)和快速中断请求(FIQ)。其中,FIQ是一些特殊的中断源发出的中断请求,具有最高优先级。
图1.37 VIC
以ARM7处理器为例,中断请求在VIC中被设置为以下三类。
·FIQ:具有最高优先级。
·向量IRQ:具有中等优先级。
·非向量IRQ:具有最低优先级。
VIC最多支持16个向量IRQ,这些中断请求被分为16个优先级,VIC为每个优先级制定一个服务程序入口地址。在发生向量IRQ中断后,相应优先级的服务程序入口地址被装入向量地址寄存器中,通过一条ARM指令即可跳转到相应的服务程序入口处,所以向量IRQ具有较快的中断响应速度。
任何中断源的中断请求都可以被设置为非向量IRQ。非向量IRQ与向量IRQ的区别在于前者不能为每个非向量IRQ设置服务程序入口地址,而是所有的非向量IRQ都共用一个相同的服务程序入口地址。当有多个中断源的中断请求被设置为非向量IRQ时,需要在用户程序中识别中断源,并分别进行处理。所以,非向量IRQ的中断响应延迟相对较长。
嵌套向量中断控制器(Nested Vectored Interrupt Controller,NVIC)应用于ARM公司研发的Cortex-M处理器,负责所有的外设中断。其功能是优先级分组和配置、读中断请求标志、清除中断请求标志、使能中断、清除中断等。优先级分组与先占优先级和次占优先级有关。假设有两个中断先后触发,若正在执行的中断先占优先级比后触发的中断先占优先级低,则会先处理先占优先级高的中断;依次类推,如果又出现更高先占优先级的中断,则可以再次打断中断处理,这便是中断嵌套。次占优先级只在同一先占优先级的中断同时触发时起作用,若先占优先级相同,则优先执行次占优先级较高的中断,次占优先级不会造成中断嵌套。如果中断的两种优先级都一致,则优先处理在中断向量表中位置较高的中断。
此外,NVIC还支持不可屏蔽中断(Non-Masked Interrupt,NMI)输入。在某些情况下,NMI无法由外部中断源控制。NVIC的工作原理如图1.38所示。
图1.38 NVIC的工作原理
进入多核时代以后,中断控制器由单一的模块分化成了两个部分,一部分直接连接中断源,由所有处理器共享;另一部分对接处理器,其数量通常等于处理器的数量。
GIC是ARM公司研发的Cortex-A处理器内核中的一个中断控制器,可以接收硬件中断信号,通过一定的设置策略,分送给对应的处理器进行处理,其工作原理如图1.39所示。这样既能保证主任务的执行效率,又能及时获知外部的请求,从而处理重要的设备请求操作。此外,GIC可以实现软中断,用于各处理器内核之间的通信。
GIC由分发器(Distributer)和重分发器(Redistributer)构成。分发器负责收集来自外设或芯片内部的各种中断事件,并基于它们的中断特性(优先级、是否使能等)对中断进行分发处理。重分发器会将分发器派发来的中断送到其连接的CPU中。在CPU接口中,中断被统一归类为IRQ或FIQ,触发IRQ中断或FIQ中断。
图1.39 GIC的工作原理
如果I/O设备的数据速率较高,但CPU与外设按字节或字来进行数据传输,那么即使尽量压缩程序控制方式和中断方式中的非数据传输时间,也不能满足要求。为此需要改变传输方式,实现按数据块传输。DMA的出现就是为了解决批量数据的I/O问题。
DMA是指外设不通过处理器而直接与系统内存交换数据的接口技术,数据速率取决于存储器和外设的工作速度。通过DMA,可将批量数据从一个地址空间复制到另一个地址空间。处理器初始化此传输动作,而DMA控制器(DMAC)实行和完成传输动作。
一个完整的DMA传输过程必须经历DMA请求、DMA响应、DMA传输和DMA结束4个步骤。其工作过程如下:首先,当要求通过DMA方式传输数据时,DMA控制器向CPU发出请求,CPU释放总线控制权,交由DMA控制器管理;然后,DMA控制器向外设返回一个应答信号,外设与内存开始进行数据交换;最后,当数据传输完毕时,DMA控制器将总线控制权交还给CPU。在这种方式下,DMA控制器与CPU分时使用总线。DMA传输过程如图1.40所示。
图1.40 DMA传输过程
DMA控制器是一种在系统内部转移数据的控制器,能够通过一组专用总线将内存和外存与每个具有DMA能力的外设连接起来。通常只有数据流量较大(数据传输速率为kbit/s或更高)的外设才需要具有DMA能力,典型例子包括视频接口、音频接口和网络接口等。
一般而言,DMA控制器拥有一个主(Master)端口,包括地址总线、数据总线和控制寄存器。每个源/目标外设对都需要一个通道,通道是指一个源外设和一个目标外设之间的读/写数据路径。DMA控制器拥有一组FIFO缓冲器,在DMA控制器与外设或存储器之间起缓冲作用。DMA硬件握手接口使用一组硬件信号来控制源外设与目标外设之间的事务。一个通道可以通过硬件、软件或外设中断接收请求。DMA控制器如图1.41所示。
系统总线通常由CPU管理,在DMA方式下,希望CPU将这些总线让出来,由DMA控制器接管,控制传输的字节数,判断DMA传输是否结束,以及发出DMA传输结束信号。因此DMA控制器必须有以下功能:能向CPU发出系统保持信号,提出总线接管请求;当CPU发出允许接管信号后,负责对总线的控制,进入DMA方式;能对存储器寻址且能修改地址指针,实现对内存的读/写;能决定本次DMA传输的字节数,判断DMA传输是否结束;能发出DMA传输结束信号,使CPU恢复正常工作状态。
图1.41 DMA控制器
多通道DMA控制器可以用于外设发送方向或接收方向的数据传输,并且可以同时发起多个DMA传输。例如,如果多通道DMA控制器用于给外设的发送方向传输数据,则需要给该外设分配一个发送方向的DMA硬件握手接口(req、ack等);如果多通道DMA控制器用于给外设的接收方向传输数据,则需要给该外设分配一个接收方向的DMA硬件握手接口;如果外设的发送方向和接收方向都需要多通道DMA控制器传输数据,则需要给该外设的发送方向和接收方向单独分配DMA硬件握手接口。涉及外设的DMA数据传输,通常发生在存储器与外设之间。实际上,大多数的DMA控制器都能同时支持存储器到存储器、存储器到外设、外设到存储器的数据传输。多通道DMA控制器如图1.42所示。
图1.42 多通道DMA控制器
多端口DMA控制器利用多个标准端口传输数据,每个通道从一个端口(数据源)读数据、写数据到相同端口或另一个端口(目标端口)。端口读访问:传输来自源端口的数据到FIFO缓冲器;端口写访问:传输FIFO缓冲器中的数据到目标端口。在图1.43中,有4个标准端口,每个数据源(双端口RAM、单端口RAM、外存、外设)对应一个端口。每个多端口DMA控制器有多个DMA通道,以及多条直接与存储器组(Memory Bank)和外设连接的总线。
图1.43 多端口DMA控制器
一个芯片上可以包含多个DMA控制器,如图1.44所示。
图1.44 多DMA控制器
很多高性能处理器中集成了两种类型的DMA控制器:系统DMA控制器和内存DMA(IMDMA)控制器。其中,系统DMA控制器可以实现对任何资源(外设和存储器)的访问;而内存DMA控制器专门用于内存之间的相互存取操作。
在图1.45中,DMA控制器1的AHB外设端口虽连接到总线交叉矩阵,但缺少访问内存的通道,所以只有DMA控制器2能够执行内存到内存的数据传输。
图1.45 系统DMA控制器和内存DMA控制器