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

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

第1节 微型机输入与输出

                                                                                                       本章概述:

  输入和输出是指微型机与外界之间的信息交换,即通信。微型机与外界的通信,是通过输入输出设备进行的, 它是计算机的重要组成部分。
  中断是指计算机的CPU暂时中止正在执行的主程序,而转去执行请求中断的那个外设或事件的中断服务程序, 待处理完后又返回到被中止了的程序这样一个过程。
  8086可以处理256种中断,用中断类型码来区分每一种中断。这些中断源可以是硬件,也可以是软件;有的来自CPU内部,有的来自外围芯片。
  直接内存传送(DMA),是硬件控制外设与内存直接进行交换,而不通过CPU进行传送。

                                                                                              第一节 微型机输入与输出 

  输入/输出是指CPU与外部设备之间的信息交换(或称"通讯")。外部设备包括输入设备(如键盘、鼠标、模/数转换器等)、输出设备(如显示器、打印机、磁盘、数/模转换器等)。外部设备简称"外设"。
外设的种类繁多,可以是机械式、电子式或光、磁等形式。外设输入或输出的信息类型也不同,可以有数字量、模拟量(电压或电流)、开关量。而且传送信息的速度差异也很大。因此,外设一般不能直接与系统总线连接,应通过"接口电路"与系统总线连接。接口电路的一般功能有:
  1.进行地址译码,以实现CPU与某一指定设备通讯。
  2.对传送数据提供缓冲,以便使快速CPU与慢速外设速度匹配。
  3.信息交换,使CPU与外设信息的格式、电平一致。
  4.提供数据传送的状态协调,如设备准备好、设备忙等。
  5.提供时序控制,以满足各种外设对时序的要求。

  目前,接口电路已标准化、产品化、系列化,称为"接口芯片"。某些接口电路的工作情况还可由程序设定或改变,称为"可编程"接口芯片。

1.1输入输出的寻址方式 

  在Windows 9.X系统中,可以对接口电路使用的端口地址资源、中断号资源、DMA通道号资源进行自动分配,这种特性称为"即插即用(PnP: Plug And Play)"。获得即插即用特性的条件是:硬件本身支持即插即用,即插即用BIOS、即插即用操作系统。
  在一般的硬件设计中,可以使用"地址开关(SW:Switch)"或"跳线器(JP:Jumper)"来选择硬件使用的端口地址(和/或IRQ、DMA)。
 

1.1.1CPU与外设的接口信息 


1.数据信息
2.状态信息
3.控制信息

(1) 数据信息
  数据信息可以是数字量、模拟量、开关量。键盘等外设输入的是数字量。
  CPU只能处理数字量,温度、压力、速度等模拟量需要经"变送器"转换为电压或电流,再经"模/数转换器"转换为数字量,才能被处理。CPU的输出也必须经过"数/模转换器"转换为模拟电压/电流才能控制某些外部设备。
  开关量表示外设开关的状态(分、合).用一位二进制可以表示一个开关的状态,如1=合、0=分。
(2) 状态信息
  状态信息表示外设的工作状态,如:
  "准备好(Ready)":外设已把传送给CPU的数据准备好,CPU可以读取。
  "忙(Busy)":外设目前正忙,不能接收来自CPU的数据。
(3) 控制命令
  控制命令是CPU传送给外设的,如启动/停止外设等。
 

1.1.2 接口电路 
接口电路:


  CPU与外设间的数据,状态,控制信息,均经过接口电路转达.一般说来,在接口电路中设计一组寄存器(称为I/O"端口"port)用于存放控制命令,状态,数据,分别称为控制寄存器(或控制端口)、状态寄存器(或状态端口)、数据寄存器(或数据端口).如上图中各端口的作用为:
 

端口1 数据端口 (数据寄存器)
端口2 状态端口 (状态寄存器)
端口3 控制端口 (控制寄存器)

(1)数据端口(数据寄存器)
  CPU与外设间可进行双向数据传输,因此,数据端口有两种:数据输入端口(数据输入寄存器),数据输出端口(数据输出寄存器).
  输出:CPU使用OUT指令把数据送至数据输出端口,数据输出端口把数据送给外设。
  输入:外设把其数据送至数据输入端口,CPU使用IN指令从数据输入端口读得数据。
  数据端口在CPU与外设之间起着缓冲和寄存数据的作用。
(2)状态端口(状态寄存器)
  外设把其状态送入状态端口,CPU使用IN指令读入状态端口的值,以查询外设的状态。
  外设的状态一般采用编码表示,编码值称为外设的"状态字"。
  状态字可以编码为8位或16位,用一位或几位表示外设的一种状态,取决于状态端口的具体设计,如,可以这样设计:
  用bit0表示外设是否已把输入数据准备好(数据已放入数据输入端口):
 

bit0 =1,准备好,CPU可以读取
=0,未准备好

用bit1表示外设是否可以接收新的数据(数据输出端口是否为空):

 

bit1 =1,可以,数据输出端口为空,CPU可以再输出数据
=0,外设不能接受新的数据,输出端口还有数据

(3)控制端口(控制寄存器)
  CPU使用OUT指令把控制命令送至外设的控制端口,外设从控制端口获得命令。
  控制命令采用编码表示,编码值称为外设的"控制字"或"命令字"。控制字可以编码为8位或16位,用一位或几位表示控制命令及其参数,取决于控制端口的具体设计。
  结论:CPU对外设的各种操作(向外设发出控制命令、查询外设的状态、向外设输出数据、从外设获得数据),均归结为对接口电路中各端口的读/写操作(IN/OUT指令)。当然,不同操作对应的IN/OUT指令的端口不同。
  注意,某些设备不是通过接口电路直接连接到CPU上,而是通过接口电路直接连接到系统总线上,如下图:

1.1.3 I/O端口地址寻址方式 

3.I/O端口寻址方式

  系统中的端口用"端口地址"来区分,端口地址的编码方式有两种:"独立I/O编址"和"存储器I/O统一编址"。
  Intel X86系列CPU及其兼容CPU使用独立I/O编址方式,其端口地址范围是0000~FFFFH。存储器的地址也包含0000~FFFFH地址范围,使用 M/IO(8088CPU是IO/W)来区分端口和存储器。
  M/IO=1,地址信号表示存储器地址;
  M/IO=0,地址信号表示端口地址;
  当CPU执行端口访问指令IN/OUT时,产生M/IO=0信号。当执行存储器访问指令时,产生M/IO=1信号。
  在某些CPU中,使用存储器统一I/O编址。在这种编址方式中,CPU使用相同的指令访问存储器和I/O,仅由地址信号来区分访问存储器或I/O。

1.1.4 输入/输出指令IN/OUT 
 4.输入/输出指令IN/OUT

  把端口地址放在DX寄存器中,可对该端口进行读/写。
  IN AL,DX ;从DX端口读入8位,放在AL寄存器中
  IN AX,DX ;从DX端口读入8位,放在AL寄存器中
        ;从DX+1端口读入8位,放在AH寄存器中
  OUT DX,AL ;把AL的8位值送DX端口
  OUT DX,AX ;AL的值送DX端口,AH的值送DX+1端口

  如果端口地址小于或等于FFH,在IN/OUT指令中可用立即数表示端口地址,如:
    IN AL,42H
    IN AX,42H
    OUT 43H,AL
    OUT 43H,AX
  接口电路用端口地址(I/O地址)来区分CPU需访问的端口。一个接口芯片可以有几个端口,地址信号的高位译码后作为芯片的片选信号CS,地址信号的低位用于选择该芯片的端口,如下图:


  在接口电路的设计中,也可把几个端口设计为相同的端口地址,这有以下几种情况:
  (1).CPU对数据输入端口只进行读操作(IN),对数据输出端口仅进行写操作(OUT),因此,数据输入端口和数据输出端口可使用相同的地址,接口电路用IOR和IOW来区分。(最小模式时为RD,WR )。
与此类似,由于CPU对状态端口只进行读操作(IN),对控制端口仅进行写操作(OUT),因此,状态端口和控制端口可使用相同的地址。
  (2).多个数据端口也可使用相同的端口地址,接口电路根据CPU对该端口地址访问的先后顺序确定具体的端口。
  (3).多个控制端口也可使用相同的端口地址,接口电路根据CPU对该端口地址写入的先后顺序确定具体的端口。
  

1.1.5 微机中I/O端口地址的使用 

5.微机中I/O端口地址的使用

 端口地址是微机的一种重要资源,一般作如下分配:

 

DMA控制器1 000~01FH 8237
DMA控制器2 0C0~0DFH 8237
中断控制器 1 020~03FH 8259
中断控制器 2 0A0~0BFH 8259
定时/计数器 040~05FH 8253
键盘控制器 060~06FH 8042
RT/CMOS 070~07FH 1287
数学协处理器 0F0~0FFH 8087
并行接口1 370~37FH LPT1,PRN
并行接口2 270~27FH LPT2
串行接口 1 3F8~3FFH COM1
串行接口 2 2F8~2FFH COM2
显示接口 3C0~3CFH CRT
硬盘接口 1F0~1FFH HDD
软盘接口 3F0~3F7H FDD

在使用和设计接口电路时,应遵循如下原则:
 ①凡是已被系统使用的端口地址,如上表的地址,不能作为它用。
 ②凡是被系统声明为保留(reserved)的地址,尽量不要作为它用,否则,可能与其它或未来的产品不兼容。

1.2 输入输出传送方式 
 输入/输出方式是指CPU与外设传送数据的方式,重点讨论:

  ①各种输入/输出方式的执行过程。

  ②接口电路硬件动作与CPU软件的关系(已知硬件动作要求,设计出对应的软件,或已知软件,分析在该软件控制下的硬件动作情况).

  ③接口电路的设计。


1.2.1 传送方式 

1、 程序方式

  在程序控制下进行外设的信息传送。通常的方法是在程序中安排一段有IN/OUT指令和其他指令组成的程序段,用来控制外设的工作。根据外设的特点,可以采用无条件传送方式或条件传送方式(查询方式).

(1)无条件传送方式
  无条件传送时指:不查询外设的状态,认为外设已经准备就绪,直接与外设传送数据。
  外设准备就绪是指:对于输入设备,它已经把数据放入接口电路的数据输入端口(数据输入寄存器),CPU可以读取;对于输出设备,它已经准备好接收数据(接口电路的数据输出寄存器已空),CPU可以向它输出数据。
  由于不查询外设状态,接口电路不需要状态寄存器,只需要数据输入寄存器和数据输出寄存器。 要求数据输入寄存器仅在CPU读(IN指令)该寄存器时才送出数据,因此,应使用三态缓冲器设计数据输入寄存器。 CPU把数据输出至数据输出寄存器后,数据输出寄存器应保持该数据,直到CPU向其送入新的数据,因此,应使用锁存器设计数据输出寄存器。
  三态缓冲器的工作情况:
  当STB=0,选通,缓冲器输出Do=输入Di。
  当STB=1,无论Di如何变化,缓冲器输出Do悬空。

锁存器的工作情况:
  当LATCH=1,锁存器输出Do=输入Di。
  当LATCH由1到0跳变,输入Di被锁存。
  当LATCH=0,无论Di如何变化,锁存器输出Do维持不变。

无条件传送方式的输入接口电路:
  外设把数据送到三态缓冲器,CPU执行IN指令从三态缓冲器中读得外设的数据。
     IN AL,Addr
  CPU执行IN指令时RD=0,IO/M=1(8088CPU为IO/M,8086CPU为M/IO),地址总线A7~A0上出现地址Adrr。地址信号经地址译码器后输出高电平,与非门输出EN=0,选通三态缓冲器,三态缓冲器把其存放的数据送出至数据总线D7~D0,从而CPU的AL获得该数据。

无条件传送方式的输出接口电路:
CPU执行OUT指令把数据送到锁存器,锁存器把数据送给外设。
   OUT Addr,AL
  CPU执行OUT指令时,WR =0,IO/M =1,地址总线A7~A0上出现地址Addr,数据总线D7~D0上出现AL的值。地址信号经地址译码器后输出高电平,它与IO/M 、WR 一起使与非门输出STB=0,把数据总线D7~D0上出现的数据(AL的值)锁存到锁存器中,外设从锁存器获得该数据。

  例、打印机字体设置和步进电机控制。在打印机上,有一组DIP开关,用于设置字体、国别等,程序使用IN指令读入DIP开关的状态,从而获得这些设置。在打印时,程序控制步进电机的正转/反转,从而控制字车的左、右行进。
     START:MOV DX, DATA_PORT ; 端口地址
     MOV AL, 03H ; AB相加电
     OUT DX, AL
     CALL DELAY ; 延时子程序
     MOV AL, 06H ; BC相加电
     OUT DX, AL
     CALL DELAY
     MOV AL, 0CH ; CD相加电
     OUT DX, AL
     CALL DELAY
     MOV AL, 09H ; DA相加电
     OUT DX, AL
     CAL DELAY
     JMP START

读入DIP开关的状态:
  MOV DX, DATA_PORT
  IN AL, DX

(2) 查询方式(条件传送方式)
  CPU从接口电路的状态寄存器读取外设的状态,当外设准备好,则与外设传送数据,否则,应继续查询状态。

由此可见,查询式传送的接口电路除了需要数据端口外,还需要状态端口。

(1)、查询式输入的接口电路

  设状态寄存器的端口地址为STATUS_PORT,数据输出寄存器的端口地址为DATA_PORT。状态寄存器的D6=0表示输出设备可以接收数据(准备好,不"忙",数据锁存器为"空"),D6=1表示输出设备"忙"。则查询式输出的程序为:
     POLL:IN AL,STATUS_PORT ;读状态
     TEST AL, 40H ; 忙?
     JNZ POLL ; D6(BUSY)=1,输出设备忙
     MOV AL,STORE(数据)
     OUT DATA_PORT,AL ; 输出数据
  结合查询式输出的程序,分析查询式输出接口电路的动作情况:
  "IN AL,STATUS_PORT"指令产生的信号为:RD=0、IO/M=1、地址总线上出现的信号为STATUS_PORT,地址译码输出Y1=1,与非门1=0,选通状态寄存器,状态寄存器把D触发器输出(反应输出设备状态)送至数据总线,从而在AL中获得输入设备的状态(D6位).D6(BUSY)=0,表示输出设备不忙,CPU可向其输出数据。D6(BUSY)=1,表示输出设备忙,CPU不能向其输出数据。
  当输出设备不忙(BUSY=0),CPU用指令"OUT DATA_PORT,AL"向其输出数据,该令产生的信号为:WR=0、IO/M=1、地址总线上出现的信号为DATA_PORT,数据总线上出现数据(AL的值)。端口译码输出Y2=1,选通数据输出寄存器,把AL的值保存在锁存器中。同时,D触发器被置1,产生OBF信号(输出缓冲器满,Output Buffer Full),它一方面通知输出设备,锁存器中已有数据,另方面给出输出设备忙的信号。

1.2.2 中断传送方式 

2.中断传送方式

  使用查询方式时,CPU读取状态寄存器并检测状态字,如设备未准备好,CPU不断地查询(读取状态寄存器并检测状态字),浪费了大量CPU时间,CPU的利用率低。
  使用中断方式,CPU不查询设备状态,当设备准备好时,主动向CPU提出中断请求,CPU响应中断后,在中断处理程序中与设备交换信息。如果设备未准备好,CPU可以执行其他程序,大大提高了CPU的利用率。
  在每条指令执行完后,CPU均可响应中断,因此,当设备准备好时,CPU可以及时与设备交换信息,大大提高了CPU对设备响应的实时性。
  因此,中断方式被广泛使用。
  中断方式输入的接口电路:
  中断方式输入的接口电路除了必须的输入锁存器和三态缓冲器外,还必须包含产生中断请求信号(INTR)的电路,当CPU响应中断请求后,接口电路应撤消中断请求。另外,在应用中,通常需要禁止某设备申请中断,因此,一般还要设计一个中断屏蔽触发器(MASK),当中断屏蔽触发器置1时,允许该设备申请中断,否则禁止该设备申请中断。第三,CPU响应中断后,发出INTA 信号,接口电路收到该信号后,应送出中断类型码。中断类型码标识该接口电路对应的输入设备。



该接口电路的工作原理是:
  当输入设备准备好一个数据供输入时,它发出一个选通信号STB,该信号一方面把数据打入锁存器,另方面使中断请求触发器INTR置1。如果允许该接口电路发出中断申请,中断屏蔽触发器MASK为1(Q=1),则接口电路发出中断请求信号INTR。
  CPU收到中断请求信号后,如果CPU内部允许中断(标志寄存器中IF位=1),CPU在执行完当前指令后,响应中断。中断响应信号INTA选通缓冲器,送出中断类型码。CPU根据中断类型码进入相应的中断处理程序。
  在中断处理程序中,CPU执行输入指令(IN),读取输入寄存器中的数据。IN指令产生的信号为:RD=0、地址总线上出现的信号为输入寄存器的地址,地址经译码后的输出Y2与RD,IO/M一起,选通输入寄存器,把输入数据送到数据总线,AL寄存器获得该数据。输入指令同时对中断请求寄存器INTR复位。
  在该接口电路中,以下指令使接口电路允许请求中断(置MASK=1):
     MOV AL,01H ;D0至MASK的D输入端
     OUT DX,AL ;DX的值使译码器输出Y1=1

1.2.3 直接存储器存取方式(DMA) 

3.直接存储器存取方式(DMA)

  中断传送方式提高了CPU利用率和系统工作的实时性,但它通过中断处理程序完成数据的输入/输出,在中断处理程序中,要保存段点、保护现场,需要较多指令,因而传送一次数据需要较长时间,这对于高速外设及成组数据交换(如磁盘与内存间的数据交换)速度显得太慢了。
  DMA方式(Direct Memory Access)由DMA控制器(DMAC,典型芯片是Intel 8237A)控制外设与内存直接进行数据交换,不经过CPU,从而大大加快了传送速度。