您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《微计算机原理》 > 第6章 中断与DMA

第4节 内存直接传送(DMA)

                                                                                               第四节 内存直接传送(DMA) 

1、 问题的提出

  中断方式较之查询方式来说,可以提高CPU的利用率和保证对外设响应的实时性,但对于高速外设(如磁盘、高速A/D等),中断方式不能满足数据传输速度的要求。因为,中断方式下,每次中断均需保存断点(返回地址)和现场(各寄存器的值,包括标志寄存器),中断返回时,要恢复断点和现场。同时,进入中断和从中断返回均使CPU指令队列被清除。所有这些原因,使得中断方式难以满足高速外设对传输速度的要求。 对于高速外设的数据传输,一种有效的方式是使用DMA方式,即:使用DMA控制器(简称DMAC,典型芯片是Intel 8237),在外设和内存之间直接进行数据块传输。这种传输由DMAC硬件完成,不需CPU的干预,因此可以达到较高的 速度,如Intel8237A(3MHz),传输速度可达1.5MB/S。


2、 DMA控制器的构成

(1) 基地址寄存器和当前地址寄存器。
(2) 字节计数器。
(3) 控制寄存器和状态寄存器。
(4)其他电路,如数据缓冲器、请求寄存器、屏蔽寄存器、读写电路等。

3、 DMA控制器的功能

  ① 当外设准备就绪,希望进行DMA传送时,向DMA控制器发出DMA请求信号(DRQ)。DMAC收到此信号后,向CPU发出总线请求信号(HOLD或RQ/GT)。
  ② CPU收到总线请求信号后,如果允许,则发出DMA响应信号(HLDA或RQ/GT)。此时,CPU便放弃对总线的控制,DMAC获得总线的控制权。(除非CPU正在执行总线封锁指令LOCK,CPU在完成当前总线操作后,会响应总线请求。区别:如果IF=1,CPU在执行完当前指令后,会响应INTR中断请求。一条指令可能含有多个总线周期)。
  ③ DMAC获得总线的控制权后,向地址总线发出地址信号,指出传送过程需使用的内存地址。为此,DMAC内部设有"地址寄存器"。在DMA操作过程中,每传送一字节数据,DMAC自动修改地址寄存器的值,以指向下一个内存地址。同时,DMAC获得总线的控制权后,向外设发出DMA应答信号 DACK ,该外设与内存之间进行DMA传送。
  ④ 在DMA传送期间,DMAC发出内存和外设的读/写信号。
  ⑤ 为了决定数据块传输的字节数,在DMAC内部必须有一个“字节计数器”。在开始时,由软件设置数据块的长度,在DMA传送过程中,每传送一字节,字节计数器减1,减为0时,该次DMA传输结束。
  ⑥ DMA过程结束时,DMAC向CPU发出结束信号(撤消HOLD请求),将总线控制权交还CPU。同时,DMAC发出EOP信号。

4、 DMA传送的方法

(1) 周期挪用。将CPU不访问存储器的总线周期挪用来进行DMA操作。
(2) 周期扩展。进行DMA传送时,使送给CPU的时钟周期加大,而送给DMAC和存储器的时钟周期不变。
(3) CPU停机。在进行DMA传送时CPU不工作。

DMA传送的方式:
(1) 块传输方式
DMAC一旦获得总线控制权,连续进行多个字节的传输,只有当“字节计数器”减为0,才释放总线。
(2)单字节传输方式
DMAC获得总线控制权后仅传送一字节就释放总线。

5、 DMAC编程 (1) DMAC和接口电路的初始化程序
  为了使DMA过程能正确进行,必须使用程序对DMA控制器和接口电路进行初始化,初始化包括下列设置:
  ① 设置DMAC的字节计数器初值,以决定数据块的长度。
  ② 设置DMAC的地址寄存器初值,以确定数据传输所用的存储区首地址。
  ③ 设置DMAC的控制寄存器,指出数据传送方向、是否进行块传输,并启动DMA操作。
  ④ 设置接口电路的控制寄存器,指出数据传输方向,并启动I/O操作。

  设:(INT-interface接口,CON-control register控制寄存器,“输入”指I/O->存储器,“输出”指存储器->I/O)接口状态寄存器地址INTSTAT, bit2=1---I/O设备忙
  接口控制寄存器地址INTCON, bit0=1为输入,bit0=0为输出
  bit2=1---启动I/O操作
  DMAC控制寄存器地址DMACON
  bit0=1为输入,bit0=0为输出
  bit3=1,可接收DMA请求
  bit6=0为字节传输模式,bit6=1为块传输模式
  DMAC字节计数器地址BYTE-REG
  DMAC地址寄存器地址ADD-REG

存储器->I/O的数据块传输初始化程序为:

    IDLE: IN AL, INTSTAT  ;读接口状态
    TEST AL, 04H       ;是否忙(bit2)
    JNZ IDLE         ;bit2=1,忙
    MOV AX, COUNT      ;块传输字节数
    OUT BYTE_REG, AX
    LEA AX, BUFFER     ;块传输内存首地址
    OUT ADD_REG, AX
    MOV AL, DMAC      ;DMAC原控制字
    OR AL, 49H       ;块传输、允许接收DMA请求、输入
    OUT DMACON, AL
    MOV AL, INTC      ;接口电路的原控制字
    OR AL, 05H        ;输入,启动操作
    OUT INTCON, AL
      ┆

  程序对接口电路和DMAC初始化后,当接口准备就绪,向DMAC请求传输,DMAC再向CPU请求总线。当DMAC获得总线控制权后,按初始化程序规定的方式执行传输。传输过程本身不需CPU干预。在DMAC传输完成后,发出结束信号EOP ,CPU可以查询EOP信号,以便进行后续数据处理。或者把EOP信号作为中断请求信号,CPU在中断处理程序中进行后续数据处理。

6、 DMA控制器的工作特点

 (1) DMAC是一个接口电路,CPU可以通过其端口地址对DMAC进行读/写操作,以便对DMAC进行初始化或查询其状态。但它与一般的接口电路有显著的不同,DMAC可以获得系统总线控制权,当其获得系统总线控制权后,能提供一系列控制信号,像CPU一样操纵外设和内存之间的数据传输。即,DMAC有两种工作状态:
从模块状态(或称被动态):作为接口电路,受CPU控制
主模块状态(或称主动态):控制系统总线
 (2) DMAC控制内存和外设的数据传输方式,与CPU的方式完全不同。

CPU:
  ① 通过执行指令传输数据。
  ② 被传输的数据必须通过CPU累加器(AL/AX)中转。
DMAC:
  ① 通过硬件逻辑电路,用固定的顺序地址信号和读/写信号进行数据传输。
  ② 被传输的数据不送入DMAC内部中转,从“源”读得的数据保存在数据总线上,然后立即开始写操作,将数据写入“目的”。

 正是由于DMAC的上述数据传输特点,使DMA传输可以达到很高的速度,这也是DMA(Direct Memory Access直接内存访问)的含义.