DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。
要把外设的数据读入内存或把内存的数据传送到外设,一般都要通过CPU控制完成,如CPU程序查询或中断方式。利用中断进行数据传送,可以大大提高CPU的利用率。
但是采用中断传送有它的缺点,对于一个高速I/O设备,以及批量交换数据的情况,只能采用DMA方式,才能解决效率和速度问题。DMA在外设与内存间直接进行数据交换,而不通过CPU,这样数据传送的速度就取决于存储器和外设的工作速度。
通常系统的总线是由CPU管理的。在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态--高阻状态,而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。DMA控制器必须有以下功能:
1. 能向CPU发出系统保持(HOLD)信号,提出总线接管请求;
2. 当CPU发出允许接管信号后,负责对总线的控制,进入DMA方式;
3. 能对存储器寻址及能修改地址指针,实现对内存的读写操作;
4. 能决定本次DMA传送的字节数,判断DMA传送是否结束
5. 发出DMA结束信号,使CPU恢复正常工作状态。
如图是DMA控制器硬件结构示意图。
DMA的可能引脚说明:
数据总线:用于传送数据。
地址总线:用于选择存储器地址。
数据传送信号:MEMR为存储器读操作信号,MEMW为存储器写操作信号,IOR为外设读操作信号,IOW为外设写操作信号。
DRQ:DMA请求信号。是外设向DMA控制器提出要求DMA操作的申请信号。
DACK:DMA响应信号。是DMA控制器向提出DMA请求的外设表示已收到请求和正进行处理的信号。
HOLD:总线请求信号。是DMA控制器向CPU要求让出总线的请求信号。
HLDA:总线响应信号,是CPU向DMA控制器表示允许总线请求的应答信号。
5.2 DMA工作方式
随着大规模集成电路技术的发展,DMA传送已不局限于存储器与外设间的信息交换,而可以扩展为在存储器的两个区域之间,或两种高速的外设之间进行DMA传送,如图所示。
DMAC是控制存储器和外部设备之间直接高速地传送数据的硬件电路,它应能取代CPU,用硬件完成数据传送的各项功能。
各种DMAC一般都有两种基本的DMA传送方式:
1. 单字节方式:每次DMA请求只传送一个字节数据,每传送完一个字节,都撤除DMA请求信号,释放总线。
2. 多字节方式:每次DMA请求连续传送一个数据块,待规定长度的数据块传送完以后,才撤除DMA请求,释放总线。
在DMA传送中,为了使源和目的间的数据传送取得同步,不同的DMAC在操作时都受到外设的请求信号或准备就绪信号--Ready信号的限制。
5.3 DMA控制器8237
Intel 8237/8237-2是一种高功能的可编程的DMA控制器,采用5MHz的8237-2传送,速度可达到1.6M字节/秒。
8237的DMA传送有以下四种方式:
1. 单字节传送方式
2. 数据块传送方式
3. 请求传送方式
4. 级连方式
有一个结束处理的输入信号EOP,允许外界用此输入端结束DMA传送或重新初始化。
8237可以级连,任意扩展通道数。
8237的系统结构图如图所示。 图中的通道部分只画出了一个通道的情况(其实每个通道都有一个一个基地址寄存器(16位)、基字节数计数器(16位)、现行地址寄存器(16位)和现行字节计数器(16位),每一个通道都有一个6位的模式寄存器以控制不同的工作模式)。 8237的结构中包含了三个基本的控制逻辑块: 1. 时序控制逻辑块;(根据编程规定的DMAC的工作模式,产生包括DMA请求、DMA传送以及DMA结束所需要的内部时序和外部信号) 另外,缓冲器、8237的数据引线、地址引线都有三态缓冲器,因而可以接管也可以释放总线。
|
1. 软件命令
8237在编程状态还有两种软件命令,软件命令不需要通过数据总线写入控制字,而由8237直接对地址和控制信号进行译码。命令的格式如下表所示。
1) 清除高/低触发器
2) 主清除命令
信号 A3 A2 A1 A0 #IOR #IOW |
操作 |
1 0 0 0 0 1 |
读状态寄存器 |
1 0 0 0 1 0 |
写命令寄存器 |
1 0 0 1 0 1 |
非法 |
1 0 0 1 1 0 |
写请求寄存器 |
1 0 1 0 0 1 |
非法 |
1 0 1 0 1 0 |
写单屏蔽寄存器位 |
1 0 1 1 0 1 |
非法 |
1 0 1 1 1 0 |
写模式寄存器 |
1 1 0 0 0 1 |
非法 |
1 1 0 0 1 0 |
清高/低触发器命令 |
1 1 0 1 0 1 |
读临时寄存器 |
1 1 0 1 1 0 |
主清除命令 |
1 1 1 0 0 1 |
非法 |
1 1 1 0 1 0 |
非法 |
1 1 1 1 0 1 |
非法 |
1 1 1 1 1 0 |
写所有屏蔽位 |
2. 8237的编程步骤
1) 输出主清除命令
2) 写入基与现行地址寄存器
3) 写入基与现行字节数寄存器
4) 写入模式寄存器
5) 写入屏蔽寄存器
6) 写入命令寄存器
7) 写入请求寄存器。若有软件请求,就写入指定通道,可以开始DMA传送的过程。若无软件请求,则在完成了(1)--(6)的请求后,由通道的DREQ启动DMA传送过程。
3. 编程举例
若要利用通道0,由外设(磁盘)输入32K字节的一个数据块,传送至内存8000H开始的区域(增量传送),采用块连续传送的方式,传送完不自动初始化,外设的DREQ和DACK都为高电平有效。
要编程首先要确定端口地址。地址的低4位用以区分8237的内部寄存器,高4位地址A7--A4经译码后,连至选片端#CS,假定选中时高4位为5。
初始化程序如下:
OUT 5DH, AL ;输出主清除命令
MOV AL, 00H
OUT 50H, AL ;输出基和现行地址的低8位
MOV AL, 80H
OUT 50H, AL ;输出基和现行地址的高8位
MOV AL, 00H
OUT 51H, AL
MOV AL, 80H
OUT 51H, AL ;给基和现行字节数赋值
MOV AL, 84H
OUT 5BH, AL ;输出模式字
MOV AL, 00H
OUT 5AH, AL ;输出屏蔽字
MOV AL, 0A0H
OUT 58H, AL ;输出命令字
分享