7.1 I/O接口概述
7.1.1 I/O接口的作用
1.I/O接口
微处理器与存储器构成了微型计算机系统的主机部分,为了使微型计算机工作,还必须配上各种外部设备,简称外设,将外设中主要用来实现数据的输入/输出、实现人机联系的设备称为输入/输出设备,即I/O设备。
当要把外设与微处理器相连时,往往需要配上相应的电路。通常把介于主机和外设之间的一种缓冲电路称为I/O接口电路,简称I/O接口。
图7.1 主机与外设的连接
2.I/O接口的作用
接口是主机和外设之间交换信息的桥梁。那么,主机与外设交换信息时为什么要通过接口电路呢?这主要有以下三个原因。
① 总线隔离作用
数据总线是外设及存储器传送信息的公共线路,任何外设或存储器都不允许长期占用数据总线,而仅允许被选中的外设或存储器在读/写总线周期中享用数据总线。
因此,大多数外设不能直接和CPU的数据总线相连,要借助与接口电路使外设与总线隔离,起缓冲、暂存数据的作用,使主机和外设协调一致的工作。
② 速度匹配作用
接口电路可以提供握手信息给微处理器和外设,协调主机和外设间数据传送速度不匹配的矛盾。
大多数外设输入输出信息的速度远远低于微处理器,为同步外设与主机的工作,在输入输出控制中,常需要接口电路提供外设的工作状态给微处理器,同时记忆主机下达给外设的命令,从而使主机与外设之间协调一致地工作。
③ 信号变换作用
外设的信息格式与微处理器不一致时,需要接口电路进行信息的变换。
从本质上说,微处理器的信息格式是并行的数字信号,而外设由于其功能的多样性,信息格式也是多种多样的。这就需要进行:
§电平变换
¨并串变换
©数模变换
7.1.2 CPU与外设交换的信息
主机与I/O设备之间交换的信息可分为数据信息、状态信息和控制信息三种。
(1)数据信息:它是CPU与外设之间传送的主要信息,可分为数字量、模拟量和开关量三种形式。
(2)状态信息:是外设通过接口送往CPU的信息,作为外设与CPU之间交换数据的联络信号,反映了当前外设所处的工作状态。
(3)控制信息:是CPU通过接口传送给外设的信息,用来设置外设(包括接口)的工作方式、控制外设的工作等。
图7.2 CPU与外设交换的信息
7.1.3 I/O接口的基本结构(接口与端口)
接口(Interface):介与主机和外设之间的缓冲电路。
端口(Port):接口中可以进行寻址读写的寄存器,简称口。
一个接口往往含有几个端口,CPU通过输入输出指令向这些端口取或存信息。端口主要有三类:一类为状态口,一类为命令口(或控制口),一类是数据口。
CPU通过输入指令从状态口获取外设的状态信息,通过输出指令从命令口发出控制命令,控制外设的工作。通过输入输出指令可以从数据端口与外设交换数据。因此说,计算机主机与外设之间交换信息都是通过接口中的端口来实现的。
图7.3 I/O接口的基本结构
7.1.4 I/O端口的编址
微机系统中,I/O端口的编址方式分为统一编址和独立编址两大类。在Intel80x86系列微机中,采用独立编址方式。
1. I/O端口的统一编址方式
统一编址又称存储器映象编址(Memory-mappingAddress Coding),就是将I/O端口看成是存储器空间的一个组成部分,按照存储器单元的编址方法统一编排地址号,每个I/O端口占用一个地址。这样,CPU对I/O端口的输入/输出操作如同对存储单元的读/写操作一样,对存储器的各种寻址方式也同样适用于I/O端口。
图7.4 I/O端口与内存单元统一编址
2. I/O端口的独立编址方式(Isolated I/O Address Coding)
在独立编址方式下,I/O地址空间完全独立于存储器空间。在I/O地址空间中,每个端口有一个唯一的端口地址,CPU有专用的I/O指令,用于CPU与I/O端口之间的数据传输。Intel80x86系列CPU中设有IN、OUT指令作为专用的I/O指令和寻址方式。在直接寻址方式下,CPU只利用地址总线的低8位输出地址信息,所以只能寻址I/O地址空间的00H~FFH地址,而在间接寻址方式下,CPU利用地址总线的低16位输出地址信息,可以寻址的I/O空间多达64K个端口。
图7.5 I/O端口与内存单元独立编址
7.2 CPU与外设之间数据传送的方法
各种外设的工作速度相差很大,有些相当高,如磁盘机的传送速度达0.2~6Mb/s,而有些外设的工作速度却相当低,如键盘是用于人工输入数据的,输入1个字符通常需几十毫秒。
这里所说的输入/输出方法就是指CPU通过接口与外设之间数据传送的方式,一般有三种:程序控制的输入/输出方式、程序中断的输入/输出方式和直接存储器存取方式。
7.2.1 程序控制的输入/输出方式
该方式完全通过执行程序来控制CPU与外设之间的数据交换,I/O指令序列事先就排在程序中所需要的位置。这种传送方式又分为无条件传送和有条件传送。
1. 无条件传送:程序中I/O指令的执行不需要事先测试外设的状态,而是直接执行。这种传送方式只适用于对简单外设的操作,这些外设始终处于就绪状态,典型的输入是开关,典型的输出是LED。
图7.6 无条件传送方式
(a) 无条件传送数据输入 (b) 无条件传送数据输出
2.有条件传送:也称查询方式传送,程序中I/O指令的执行需要事先测试外设的状态,待外设准备就绪后,执行I/O指令进行数据传送,否则循环测试等待。例如,CPU向打印机送打印字符,就需要测试打印接口电路的BUSY信号。
图7.7 查询传送方式的流程图
图7.8 查询式输入的接口电路
图7.9 查询式输出的接口电路
7.2.2 程序中断的输入/输出方式
该方式借助于CPU响应外部中断请求的能力,实现输入输出的控制。简单地说,就是外设将准备就绪的信号转换成有效的中断请求信号通知给CPU,CPU响应中断后,在中断服务子程序中执行I/O指令,进行数据传送。
查询传送方式是由CPU来查询外设的状态,CPU处于主动地位,而外设处于被动地位。中断传送方式则是由外设主动向CPU发出请求,等候CPU处理,在没有发出请求时,CPU和外设都可以独立进行各自的工作。
7.2.3 直接存储器存取方式(DMA:Direct Memory Access)
在DMA方式下,高速外部设备利用专用的接口电路直接和存储器进行高速数据交换,CPU暂停指令的执行并让出总线控制权。
与前两种方式不同,在DMA方式下,数据的传送不依赖CPU执行I/O指令,而是直接由专用的接口电路DMA控制器来控制外设和内存之间的数据传送。
7.3中断技术
7.3.1. 中断的基本概念
1.中断的定义
计算机在执行正常程序过程中,当出现某种异常事件或某种外部请求时,处理器就暂停执行当前的程序,而转去执行对异常事件或某种外部请求的处理操作。当处理完毕后,CPU再返回到被暂停执行的程序,继续执行,这个过程称为程序中断。
图7.10 中断过程示意图
2. 中断系统
为实现中断功能而设置的硬件电路和与之相应的软件,称为中断系统。
3.中断源
所谓中断源,是指引起中断的原因或发出中断请求的来源。中断源可分为硬件中断源和软件中断源两类。
4.中断处理过程
对于一个中断源的中断处理过程应包括中断请求、中断响应、保护断点、中断处理和中断返回等五个过程。
① 中断请求:是中断源向CPU发出的请求中断的要求。软件中断源是在CPU内部有中断指令或程序出错直接发中断;而硬件中断源必须通过专门的电路将中断请求信号送给CPU,CPU也有专门的引脚接收中断请求信号。
例如,8086/8088CPU用INTR引脚(可屏蔽中断请求)和NMI引脚(非屏蔽中断请求)接收硬件中断请求信号。一般外设发出的都是可屏蔽中断请求。
图7.11 中断请求与屏蔽接口电路
② 中断响应:是指当计算机系统接收到中断请求后应作出的反应。中断响应应具备两个条件:一是中断允许触发器的状态为1(即开中断),二是CPU在执行完现行指令之后。
图7.12 CPU内部设置中断允许触发器
③ 保护断点:所谓断点是指处理完中断后返回主程序时执行的第一条指令的逻辑地址(即当时的CS和IP的值)。因此,CPU一旦响应中断,需要对其正在执行程序的断点信息进行保护(即将CS和IP的值压入堆栈),以便在中断处理结束后仍能回到该断点处继续执行。
④ 中断处理:是指执行完成中断服务功能的处理程序。它主要包括保护现场(将中断服务程序中涉及到的寄存器内容压入堆栈)、中断服务(是中断服务的核心,可完成中断服务的功能)和恢复现场(将原先压入堆栈的寄存器内容再弹回到CPU相应的寄存器中)等。
⑤ 中断返回:是指执行完中断服务程序后返回到原先被中断的程序。它是保护断点的逆过程,即将原先压入堆栈的断点值弹回到CS和IP中,继续执行程序。
7.3.2 中断优先级和中断的嵌套
1.中断优先级
中断请求是随机发生的,当系统具有多个中断源时,有时会同时出现多个中断请求,CPU只能按一定的次序予以响应和处理,这个响应的次序称为中断优先级。对于不同级别的中断请求,一般的处理原则是:
(1)不同按高低。不同优先级的多个中断源同时发出中断请求,按优先级由高到低依次处理。
(2)低级让高级。低优先级中断正在处理,出现高优先级请求,应转去处理高优先级请求,服务结束后再返回原优先级较低的中断服务程序继续执行。
(3)高级封低级。高优先级中断正在处理,出现低优先级请求,可暂不响应。
(4)同级等处理。中断处理时,出现同级别请求,应在当前中断处理结束以后再处理新的请求。
中断优先级
多个中断请求急,
要分中断优先级。
不同中断按高低,
同级中断等处理,
低级中断让高级,
高级中断封低级。
屏蔽中断要允许,
等到最后一个T4。
2.中断优先级的确定
在微机系统中通常用三种方法来确定中断源的优先级别,即
软件查询法
硬件排队电路法
专用中断控制芯片法
1)软件查询法
软件查询法需要简单的硬件电路支持。以8个中断源为例,其硬件电路如图7.13所示,将8个外设的中断请求组合起来作为一个端口(中断寄存器),并将各个外设的中断请求信号相或,产生一个总的INT信号。
图7.13 软件查询法的硬件电路
任一个外设有中断请求,该电路都可向CPU发中断请求信号(INT),CPU响应后进入中断处理程序,在中断处理程序的开始先把中断寄存器的内容读入CPU,再对寄存器内容进行逐位查询,查到某位状态为1,表示与该位相连的外设有中断请求,于是转到与其相应的中断服务程序,同时该外设撤消其中断请求信号。软件查询方式的流程图如图7.14所示。
图7.14 软件查询方式的流程图
对于图7.13所示电路,设中断寄存器端口号为n,则软件查询的程序段如下:
IN AL,n
TEST AL,80H;1号外设有请求?
JNZ II1 ;有,转1号中断服务程序
TEST AL,40H;2号外设有请求?
JNZ II2 ;有,转2号中断服务程序
TEST AL,01H;8号外设有请求?
JNZ II2 ;有,转2号中断服务程序
可以看出,采用软件查询方式,各中断源的优先级是由查询顺序决定的,最先查询的设备,其优先级最高,最后查询的设备,其优先级最低。
采用软件查询方式的优点是节省硬件。但是,由于CPU每次响应中断时都要对各中断源进行逐一查询,所以其响应速度较慢。对于优先级较低的中断源来说,该缺点更为明显。
2) 硬件排队电路
采用硬件排队电路法,各个外设的优先级与其接口在排队电路中的位置有关。常用的硬件优先权排队电路有链式优先权排队电路、硬件优先级编码加比较器的排队电路等。
图7.15给出了一个链式优先级排队电路。
图7.15 链式中断优先级电路
图7.15中,当响应信号沿链式电路进行传递时,最靠近CPU并发出中断请求的接口将首先拦截住响应信号,CPU进入相应外设的中断处理程序,在服务完成后,该外设撤消其中断请求,解除对下一级外设的封锁。
例如,当CPU收到中断请求信号并响应中断时,若1号外设有中断请求(高电平),则立即向1号外设接口发出应答信号,同时封锁2号、3号等外设的中断请求,转去对1号外设服务。
若1号外设没有中断请求,而2号外设有中断请求时,响应信号便传递给2号外设,向2号外设接口发出应答信号,同时封锁3号外设的中断请求。
若CPU在为2号外设进行中断服务时1号外设发出了中断请求,CPU会挂起对2号外设的服务转去对1号外设服务,1号外设处理结束后,再继续为2号外设服务。
可以看出,链式优先级排队电路不仅能够确定各中断源的优先级,而且在相应软件的配合下,可实现高级别的请求中断低级别的服务(即中断的嵌套)
上述两种方法虽然可以解决中断优先级控制问题,但实现起来在硬件和软件上都要做大量的工作,十分麻烦。目前,最方便的办法就是利用厂家提供的可编程中断控制器,这样的器件在各种微机中得到普遍应用。本章后面将介绍广泛应用于80×86微机系统中的专用可编程中断控制芯片8259A。
3.中断嵌套
CPU在执行低级别中断服务程序时,又收到较高级别的中断请求,CPU暂停执行低级别中断服务程序,转去处理这个高级别的中断,处理完后再返回低级别中断服务程序,这个过程称为中断嵌套,如图7.16所示。
图7.16 中断嵌套示意图
7.4 8086/8088中断系统
7.4.1 8086/8088的中断源类型
8086/8088 CPU可以处理256种不同类型的中断,每一种中断都给定一个编号(0~255),称为中断类型号,CPU根据中断类型号来识别不同的中断源。8086/8088的中断源如图7.17所示。从图中可以看出8086/8088的中断源可分为两大类:一类来自CPU的外部,由外设的请求引起,称为硬件中断(又称外部中断);另一类来自CPU的内部,由执行指令时引起,称为软件中断(又称内部中断)。
图7.17 8086/8088中断源
1.软件中断(内部中断)
8086/8088的软件中断主要有三类共五种。
(1) 处理运算过程中某些错误的中断
执行程序时,为及时处理运算中的某些错误,CPU以中断方式中止正在运行的程序,提醒程序员改错。
① 除法错中断(中断类型号为0)。在8086/8088 CPU执行除法指令(DIV/IDIV)时,若发现除数为0,或所得的商超过了CPU中有关寄存器所能表示的最大值,则立即产生一个类型号为0的内部中断,CPU转去执行除法错中断处理程序。
② 溢出中断INTO(中断类型号为4)。CPU进行带符号数的算术运算时,若发生了溢出,则标志位OF=1,若此时执行INTO指令,会产生溢出中断,打印出一个错误信息,结束时不返回,而把控制权交给操作系统。若OF=0,则INTO不产生中断,CPU继续执行下一条指令。INTO指令通常安排在算术指令之后,以便在溢出时能及时处理。例如:
ADD AX,BX
INTO ;测试加法的溢出
(2) 为调试程序设置的中断
① 单步中断(中断类型号为1)。当TF=1时,每执行一条指令,CPU会自动产生一个单步中断。单步中断可一条一条指令地跟踪程序流程,观察各个寄存器及存储单元内容的变化,帮助分析错误原因。单步中断又称为陷阱中断,主要用于程序调试。
② 断点中断(中断类型号为3)。调试程序时可以在一些关键性的地方设置断点,它相当于把一条INT3指令插入到程序中,CPU每执行到断点处,INT3指令便产生一个中断,使CPU转向相应的中断服务程序。
(3) 中断指令INTn引起的中断(中断类型号为n)
程序设计时,可以用INTn指令来产生软件中断,中断指令的操作数n给出了中断类型号,CPU执行INTn 指令后,会立即产生一个类型号为n的中断,转入相应的中断处理程序来完成中断功能。
2.硬件中断(外部中断)
8086/8088 CPU有两条外部中断请求线NMI(非屏蔽中断)和INTR(可屏蔽中断)。
(1) 非屏蔽中断NMI(中断类型号为2)
整个系统只有一个非屏蔽中断,它不受 IF标志位的屏蔽。出现在NMI上的请求信号是上升沿触发的,一旦出现,CPU将予以响应。非屏蔽中断一般用于紧急故障处理。
(2) 可屏蔽中断INTR(中断类型32~255)
可屏蔽中断请求信号从INTR引脚送往CPU,高电平有效,受IF标志位屏蔽,IF=0时,对于所有从INTR引脚进入的中断请求,CPU均不予响应;另外,也可以在CPU外部的中断控制器(8259A)中以及各个I/O接口电路中对某一级中断或某个中断源单独进行屏蔽。
当外设的中断请求未被屏蔽,且 IF=1,则 CPU在当前指令周期的最后一个T状态去采样INTR引脚,若有效,CPU予以响应。CPU将执行两个连续的中断响应周期,送出两个中断响应信号INTA。第一个响应周期,CPU将地址及数据总线置高阻;在第二个响应周期,外设向数据总线输送一个字节的中断类型号,CPU读入后,就可在中断向量表中找到该类型号的中断服务程序的入口地址,转入中断处理。
中断响应周期的时序
值得注意的是,对于非屏蔽中断和软件中断,其中断类型号由CPU内部自动提供,不需去执行中断响应周期读取中断类型号。
3.8086/8088中断源的优先级
8086/8088中断源的优先级顺序由高到低依次为:软件中断(除单步中断外)、非屏蔽中断、可屏蔽中断、单步中断。
在PC机系统中,外设的中断请求通过中断控制器8259A连接到CPU的INTR引脚,外设中断源的优先级别由8259A进行管理。
7.4.2 中断向量表
中断向量表是存放中断向量的一个特定的内存区域。所谓中断向量,就是中断服务子程序的入口地址。对于8086/8088系统,所有中断服务子程序的入口地址都存放在中断向量表中。
8086/8088可以处理256种中断,每种中断对应一个中断类型号,每个中断类型号与一个中断服务程序的入口地址相对应。
每个中断服务程序的入口地址占4个存储单元,其中低地址的两个单元存放中断服务程序入口地址的偏移量(IP);高地址的两个单元存放中断服务程序入口地址的段地址(CS)。
256个中断向量要占256×4=1024个单元,即中断向量表长度为1K个单元。8086/8088系统的中断向量表位于内存的前1K字节,地址范围为00000H~003FFH。
8086/8088的中断向量表如图7.18所示。
图7.18所示的中断向量表中有5个专用中断(类型0~类型4),它们已经有固定用途;27个系统保留的中断(类型5~31)供系统使用,不允许用户自行定义;224个用户自定义中断(类型32 ~255),这些中断类型号可供软中断INTn或可屏蔽中断INTR使用,使用时,要由用户自行填入相应的中断服务程序入口地址。(其中有些中断类型已经有了固定用途,例如,类型21H的中断已用做DOS的系统功能调用)。
由于中断服务程序入口地址在中断向量表中是按中断类型号顺序存放的,因此每个中断服务程序入口地址在中断向量表中的位置可由“中断类型号×4”计算出来。CPU响应中断时,把中断类型号N乘以4,得到对应地址4N(该中断服务程序入口地址所占4个单元的第一个单元的地址),然后把由此地址开始的两个低字节单元(4N,4N+1)的内容装入IP寄存器,再把两个高字节单元(4N+2,4N+3)的内容装入CS寄存器,于是CPU转入中断类型号为N的中断服务程序。
这种采用向量中断的方法,CPU可直接通过向量表转向相应的处理程序,而不需要去逐个检测和确定中断源,因而可以大大加快中断响应的速度。
7.4.3 8086/8088的中断处理过程
在图示流程中,(1)~(5)是CPU的内部处理,由硬件自动完成。
所有内部中断(除法错、INTn、INTO、单步和断点中断)以及NMI中断不需要从数据总线上读取中断类型码,而INTR中断需由CPU读取中断类型码,其中断类型码由发出INTR信号的接口电路提供。
该流程图还反映出了8086/8088系统中各中断源优先级的高低。
7.4.4 中断服务程序的设计
中断服务程序的一般结构如图7.20所示。如前所述,若该中断处理能被更高级别的中断源中断,则需加入开中断指令。在中断服务程序的最后,一定要有中断返回指令,以保证断点的恢复。
用户在设计中断服务程序时要预先确定一个中断类型号,不论是采用软件中断还是硬件中断,都只能在系统预留给用户的类型号中选择。
图7.20 中断服务程序的一般结构
确定了中断类型号,还要把中断服务入口地址置入中断向量表,以保证在中断响应时CPU能自动转入与该类型号相对应的中断服务程序。将中断服务程序入口地址置入中断向量表的方法有两种:DOS系统功能调用法和直接装入法。
1.DOS系统功能调用法(INT21)
功能号:
(AH)=25H。
入口参数:
(AL)=中断类型号
(DS)=中断服务程序入口地址的段地址
(DX)=中断服务程序入口地址的偏移地址
2.直接装入法
用传送指令直接将中断服务子程序首地址INT60置入矢量表中。设中断类型号为60H(此类型号对应的矢量表地址为从00180H即0000H:0180H开始的四个连续存储单元)。程序段如下:
XOR AX,AX
MOV DS,AX
MOV AX,OFFSETINT60
MOV DS:[0180H],AX ;置服务程序偏移地址
MOV AX,SEGINT60
MOV DS:[0180H+2],AX;置服务程序所在
;代码段的段地址