《微型计算机原理及接口》课件第6章_第1页
《微型计算机原理及接口》课件第6章_第2页
《微型计算机原理及接口》课件第6章_第3页
《微型计算机原理及接口》课件第6章_第4页
《微型计算机原理及接口》课件第6章_第5页
已阅读5页,还剩210页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章输入/输出技术6.1I/O接口概述6.2I/O端口地址译码6.3基本的并行输入/输出接口6.4程序控制I/O方式6.5中断方式6.6直接存储器存取(DMA)方式习题6.1I/O接口概述

6.1.1I/O接口功能

I/O接口是位于计算机系统与外设之间的连接电路,是计算机系统与外设连接的桥梁,起着沟通、协调两者关系的作用。针对不同的外设,I/O接口通常具有如下基本功能:

(1)提供信息传递通道。由于接口位于计算机系统与外设中间,因此它必须为两者提供信息传递的通道,通道一般是利用接口中的端口(寄存器)来实现的。我们可以设计多个通道,并有效控制各通道的工作时刻,使计算机系统与外设间的多种信息可以在各通道中分时传输。

(2)进行数据格式转换。我们通常将外设提供或接收的信息广义地称为数据,其形式有多种,如模拟数据、数字数据、并行数据、串行数据等。而计算机系统传输、处理的数据只是数字化的并行数据。因此,在两者进行信息交换时若数据格式不一致,则必须进行数据格式转换。在I/O接口中主要完成的数据格式转换有:●模/数转换。若外设是模拟设备,则其发送与接收的信息为模拟数据。当计算机系统从模拟外设获取信息时,必须将外设的模拟数据转换成并行数字数据,才能被计算机系统接收。同样,当计算机系统给模拟外设加载信息时,必须将计算机的并行数字数据转换成模拟数据,才能被外设接收。

●串/并转换。若外设是数字化的串行设备,其发送与接收的信息为串行数据,则必须将外设的串行数据转换成并行数据,才能被计算机系统接收。同样,需将计算机的并行数据转换成串行数据,才能被外设接收。

数位转换。某些外设虽然是数字化的并行设备,但其传输的并行数据数位若与计算机系统的并行数据数位不符,也需要通过接口将两者的数位作适当的变换。

(3)进行速度匹配。大多数情况下外设的速度低于计算机系统的速度,由于这种速度的不匹配会造成外设与计算机系统传输信息时出现错误,因此必须通过I/O接口来协调两者的速度。一种常用的速度变换方法是在接口中设计数据缓冲器,通过数据缓冲器的“缓冲”功能,使快速的计算机系统与慢速的外设之间达到有效的信息传递。

(4)进行负载匹配。目前的微机系统均采用总线结构,系统中所有部件都是通过总线相互连接在一起的,其中外设与微机系统的连接实际上是通过将外设经过接口连接在微机的系统总线上来实现的。由于每种外设对总线呈现的负载不同,而系统总线的负载能力是有限制的,因此,当大负载外设或多外设连接到微机系统时,接口中必须设计负载匹配电路。驱动器可以作为一种能够提供大电流的电流负载匹配电路来使用。

(5)提供中断能力。当接口中包含中断请求电路时,可以支持外设以中断方式与计算机系统进行信息交换,这样可以提高I/O接口自身在多种输入/输出方式下的适应性。

6.1.2基本I/O接口模型由于我们需要在外设和计算机系统之间建立多个通道,因此一个外设接口可能由多个端口构成。假定外设已数字化,并利用数据、状态、控制(命令)三类信息与计算机系统进行信息交换,则图6.1所示的正是外设与计算机系统连接的典型I/O接口模型。接口中的数据端口提供了外设与计算机系统间数据交换的通道,命令端口传递CPU发给外设的控制命令,状态端口将外设的工作状态反映给CPU。

图6.1典型I/O接口模型

6.1.3I/O接口地址及编址方式当计算机系统中有多个外设时,CPU在某个时刻只能与一个外设打交道。为了确定此刻哪一个外设可以与计算机打交道,采取了与内存同样的处理方法,利用二进制编码为外设编号,该编号被称为外设地址(又称I/O地址),也即通过外设地址来识别不同的外设。从图6.1可以看出,外设需要通过接口才能与计算机系统连接,同时外设与计算机系统交换的信息类型较多,一个外设接口中常常含有多个端口,所以外设地址通常用于对端口的控制。每个端口都需要I/O地址控制,因此一个外设需要分配多个I/O地址,为此也常将I/O地址称作端口地址(也称为接口地址)。有时为了节省I/O地址的使用或简化译码电路的设计,可以使一个输入端口与一个输出端口共用一个I/O地址。

对I/O地址有两种编排方式。一种是将内存地址与I/O地址统一编排在同一地址空间中,简称统一编址方式;另一种是将内存地址与I/O地址分别编排在不同的地址空间(即内存地址空间与I/O地址空间)中,简称独立编址方式。采用统一编址方式可以将内存与外设同样看待,不仅可以对内存实施多种操作与运算,而且可以对外设实施与内存同样的操作与运算,使得对外设的操作十分灵活方便。由于内存与外设占据同一个地址空间,因此分配给外设的地址,内存便不能使用,使内存地址空间与I/O地址空间受到了限制,从而限制了内存与外设的规模。另外,在获得了对内存与外设可以同样操作的方便之时,也给检修、维护增加了难度。当一条传送指令的执行出现错误时,很难从指令上判断出是内存还是外设出了问题。

采用独立编址方式时,内存与外设各自有互不影响的地址空间,使CPU能够拥有较大的内存空间与I/O空间。为了区分是对内存操作还是对外设操作,CPU使用两组指令,即常规的内存、寄存器操作指令与专用的外设输入/输出指令。这样,对外设的操作不会像内存那样灵活,但很容易区分。由于统一编址方式与独立编址方式各有优缺点,因此在不同的微机中采用了不同的编址方式。如Motorola公司的M68系列微机采用统一编址方式,而Intel公司的80x86系列微机及Zilog公司的Z80系列微机则采用独立编址方式。

6.2I/O端口地址译码

6.2.180x86I/O地址空间

80x86系统有独立的I/O地址空间。在80x86系列的PC机中,I/O地址空间为0000H~FFFFH,大小为64KB,用16位地址表示。图6.2表明了PC机中I/O的映射,其中0000H~03FFH之间的I/O空间为计算机系统和ISA总线预留,而位于0400H~FFFFH的I/O端口对于用户应用、主板功能和PCI总线是有效的。

图6.2PC机中I/O的映射

80287协处理器将00F8H~00FFH的I/O地址用于通信,因此,Intel预留了00F0H~00FFH的I/O端口。80386至PentiumⅡ使用I/O端口800000F8H~800000FFH与它们的协处理器进行通信。由于数据总线位数的不同,使得80x86系统的I/O地址空间在结构上有所不同,正如内存结构一样。8088系统的I/O空间由1个字节块构成,可实现8位I/O传输;8086、80186、80286、80386SX系统I/O空间由高、低2个字节块构成,可实现8/16位I/O传输,如图6.3所示;类似地,80386DX、80486系统的I/O空间由4个字节块构成,可实现8/16/32位I/O传输;Pentium系列的I/O空间由8个字节块构成,可实现8/16/32位I/O传输(注:目前Pentium机中没有64位的I/O指令)。

图6.3I/O结构

6.2.2I/O地址译码方式

80x86系列微机的I/O地址只有两种形式:8位I/O地址(称固定地址,直接存于指令中)与16位I/O地址(称可变地址,存于DX中),分别对应直接与间接寻址(也称固定于可变端口)的I/O指令。8位I/O端口地址出现在A15~A0的0000H~00FFH空间上,使用固定端口I/O指令访问,使用时只用00H~FFH表示,通常我们仅对A7~A0译码,将A15~A8忽略。而对16位I/O端口地址译码时,A15~A0必须全部或部分使用,使用可变端口I/O指令访问。对于32位地址而言,A31~A16对于I/O地址是未定义的。

与存储器地址译码类似,I/O端口地址译码时也可以采用两种译码方式:全地址译码与部分地址译码。全地址译码时所有I/O地址线参与译码,部分地址译码时只需部分I/O地址线(如某些高位地址线)参与译码。全地址译码使I/O设备占据I/O地址空间的惟一区域,不会造成I/O空间的浪费;部分地址译码会使I/O设备占据I/O地址空间的多个重叠区域,而重叠的地址区域不可以用于其他I/O设备,但其最大的优点是译码电路简单,由此可适当地降低成本,提高可靠性。

6.2.3I/O端口地址译码举例例6.1使用8位I/O地址5CH选择输入端口。译码电路如图6.4所示,采用全地址译码方式,由逻辑门器件实现。

图6.48位I/O地址译码电路

例6.2使用16位I/O地址A0D8H~A0DFH选择I/O端口。译码电路如图6.5所示,采用全地址/部分地址译码方式,由译码器件实现。

图6.516位I/O地址译码电路

例6.3

使用8位I/O地址选择输出端口。译码电路如图6.6所示,采用部分地址译码方式(A0未参与译码),由数字比较器实现。

当开关SW0、SW2、SW5为接通状态时,由P=Q端得到输出端口DAH~DBH的地址译码信号。当开关SW0、SW1、SW6、SW7为接通状态时,由P=Q端得到输出端口3CH~3DH的地址译码信号。

图6.68位I/O地址译码电路

例6.4使用ISA总线上10位I/O地址03C0H~03FFH选择I/O端口。译码电路如图6.7所示,采用部分地址译码方式(A0、A1、A2未参加译码),由ROM器件实现。利用在ROM的特定单元(由待译码的I/O地址选定)中写入特定值(只有1个数据位为0,其余7位为1),其他单元全部写入FFH,使得当从ROM单元读出数据时,数据线上输出的信号即可以作为I/O地址译码信号。

图6.7ISA总线上10位I/O地址译码电路(a)连接电路;(b)ROM中写入的内容;(c)ROM输入/输出真值表

例6.5将例6.4中的译码器件改为可编程逻辑器件(PLD)16L8,译码电路如图6.8所示。

图6.810位I/O地址译码器

利用PLD写入器,根据如下信息对16L8进行编程,即可由16L8的输出端获得所需的I/O地址译码信号:;pins1

2

3

4

5

6

7

8

9 10

A9

A8

A7

A6

A5 A4

A3

NC NCGND;pins111213 1415

16

17 18

1920

NC O8

O7

O6 O5

O4

O3 O2

O1VCC

EQUATIONS/O1=A9*A8*A7*A6*/A5*/A4*/A3/O2=A9*A8*A7*A6*/A5*/A4*A3/O3=A9*A8*A7*A6*/A5*A4*/A3/O4=A9*A8*A7*A6*/A5*A4*A3/O5=A9*A8*A7*A6*A5*/A4*/A3/O6=A9*A8*A7*A6*A5*/A4*A3/O7=A9*A8*A7*A6*A5*A4*/A3/O8=A9*A8*A7*A6*A5*A4*A36.3基本的并行输入/输出接口

6.3.1并行输入接口三态缓冲器有多种型号,74LS244是一种常用的型号,它集成了8个输入与输出同相、控制端低电平有效的三态门,可以作为8位并行输入接口。一种典型的输入接口设计如图6.9所示。这是一个8088系统中的8位输入端口,它通过控制一个8位的三态缓冲器74LS244,在执行以下指令时可以获得8个开关的状态:

INAL,80H;从80H端口获得8个开关接通或断开的信息,将之存入AL寄存器中

图6.9三态缓冲器作8位并行输入接口

6.3.2并行输出接口并行输出接口可以选用数据锁存器或三态数据锁存器。74LS273是常用的数据锁存器,而74LS374是常用的三态数据锁存器。图6.10是利用74LS273设计的用于8086系统中的8/16位输出端口,可以分别给两个8位输出端口加载信息,控制每个端口连接的发光二极管亮或不亮;也可以同时给两个8位输出端口加载信息,控制16个发光二极管的亮或不亮。

图6.10利用74LS273设计的8/16位输出端口

控制程序:MOVDX,3804HMOVAL,00HOUTDX,AL;与端口3804H连接的8个发光二极管全部不亮MOVDX,3805HMOVAL,0FFHOUTDX,AL;与端口3805H连接的8个发光二极管全部发光MOVDX,3804HMOVAX,0FFFFHOUTDX,AX

;与端口3804H和3805H连接的16个发光二极管全亮

图6.11利用74LS374设计的32位输出端口

6.4程序控制I/O方式

6.4.1无条件传送方式

1.输入接口设计对于简单的输入设备,在硬件上只需要设计一个数据输入接口即可以将该外设与CPU连接起来。可实现数据输入接口的器件有三态门,如74LS244。下面以开关为例,说明用无条件传送方式如何实现将外设数据输入到CPU。由于微机系统采用总线结构,系统中的所有设备均通过总线相互连接,故开关只需要与微机系统总线相连,即可以通过总线与CPU连接起来。图6.12给出了开关S与微机系统连接的接口电路。

图6.12开关K与微机系统连接的接口电路

开关的接通与断开状态已通过图中电路转换为计算机能够接收的0或1信息,此信息加载在三态门的输入端。当三态门的控制端出现有效的低电平时,三态门被有效地打开,输入端的数据传递到输出端,加载至微机系统的数据总线上。如果此时CPU读外设(即开关),就可以从总线上获得开关的状态信息。完成如下任务:当开关接通时,CPU执行程序段ON;当开关断开时,CPU执行程序段OFF。下述指令的执行可以完成该任务:

MOVDX,0FF7HINAL,DXANDAL,01HJZON ;假定程序段ON与本程序段在同一内存段中JMPOFF指令INAL,DX执行时,产生了为低和I/O地址为FFF7H的信息,这使得图中的译码器输出低电平而打开三态门,同时CPU将三态门提供的开关信息通过数据线加载至寄存器AL中,完成了将开关状态无条件传送至CPU的数据输入任务。

图6.13三态门作为数据输入接口的一般连接模式

2.输出接口设计作为以无条件传送方式实现数据输出的例子,下面给出CPU对发光二极管的控制。图6.14为发光二极管与微机系统连接的接口电路。锁存器作为发光二极管与微机系统数据总线连接的中间接口,接收来自CPU的输出数据。当锁存器的CP端出现上升沿信号时,数据总线上的数据被锁存于锁存器内部并输出。

图6.14发光二极管与微机系统连接的接口电路

发光二极管为电流控制器件,当其上有几毫安至十几毫安的电流流过时,发光二极管发光;如其上流过的电流小于几毫安,则发光二极管的亮度较暗。为了将锁存器输出的电平信号转换成发光二极管所需要的电流信号,采用了在发光二极管的正极端通过电阻R接+5V电源、负极端加载锁存器输出控制信号的转换电路。适当地选择电阻R(约几百欧姆),就可以保证锁存器输出不同电平时,发光二极管发光或不发光。反相器对锁存器起保护作用,当发光二极管发亮时,反相器提供足够大的吸入电流,以保护锁存器不受损坏。对于图6.14中的电路,CPU执行下述指令可以使两个发光二极管发光:

MOVDX,0000HMOVAL,81HOUTDX,AL而CPU执行下述指令可以使两个发光二极管不发光:MOVDX,0000HMOVAL,00HOUTDX,AL在该输出控制中,指令OUTDX,AL的执行使锁存器CP端的译码器产生一个负脉冲,在负脉冲期间,CPU的输出数据通过AL,经数据总线加载至锁存器输入端,而负脉冲的后沿(上升沿)将数据锁存于锁存器中并输出,以控制发光二极管的工作。从该例子同样可看出,对于像发光二极管这样的简单输出设备,在硬件上只要提供类似锁存器这样的输出接口,软件上执行一条OUT指令,CPU就可以在任何时刻向外设输出数据。图6.15示意了利用锁存器作为数据输出接口的一般连接模式。图中,译码器输入的I/O地址应与OUT指令中使用的I/O地址一致。

图6.15锁存器作为数据输出接口的一般连接模式

6.4.2查询方式实际中,有许多外设与微机系统的信息交换需要在满足一定条件的情况下才能进行。假如外设的速度比较慢,对CPU的工作效率要求不高,那么CPU就可以用查询的方式与外设进行信息交换。

所谓查询方式,就是CPU通过执行指令不断地询问外设的工作状态,然后根据外设的状态确定对其进行I/O操作的时刻。典型的查询方式工作流程如图6.16所示。从图中清晰可见,每次的I/O操作均是在对外设状态查询并被外设允许的情况下进行的,这是查询方式的主要特点。

图6.16典型的查询方式工作流程

1.查询方式的实现为了使CPU能够查询到外设状态,需要外设提供一个状态信息(此状态信息将作为一个特殊的数据),然后利用图6.13中的电路设计一个状态接口,将外设的状态信息传递给CPU,供CPU查询。若CPU从外设接收数据,则CPU先读状态端口以获取外设状态。当外设已处于准备好数据的状态时,CPU从数据端口读取外设数据,必要时从控制端口向外设发出数据已接收的响应信号,使外设开始下一数据的准备工作;当外设处于未准备好数据状态时,CPU只能通过不断的查询来等待外设状态的建立。

若CPU向外设输出数据,则CPU同样先读状态端口以获取外设状态。当外设已处于可以接收数据的状态时,CPU通过数据端口向外设输出数据,必要时从控制端口向外设发出数据已输出的响应信号,启动外设接收数据;当外设处于不可以接收数据的状态时,CPU仍只能通过不断的查询来等待外设状态的建立。显然,CPU在与外设以查询方式进行信息交换时,数据端口与状态端口是该方式实现的硬件基础,而在I/O控制程序中设置状态查询环是该方式的软件实现中不可缺少的部分。这种方法的优点是所用硬件的数据较少,代价是软件开销较大。

图6.17用查询方式实现I/O传送的示例(a)外设与微机接口电路;(b)外设工作时序

现在欲将8086/88系统中从内存地址为D2000H开始的顺序1000个数据输出给图6.17中的外设,用查询方式编写的控制程序段如下:

DAOUT:MOV AV,0D200HMOV DS,AXMOV BX,0 ;初始化内存首地址MOV CX,1000 ;初始化计数器MOV DX,02F9HMOV AL,01HOUT DX,AL ;初始化选通信息NEXT:MOV DX,02FAHWAT:INAL,DXAND AL,80HJNZ WAT ;状态查询环MOV DX,02F8HMOV AL,[BX]OUT DX,AL ;数据输出MOV DX,02F9HMOV AL,00HOUT DX,ALCALL DLY100μs ;DLY100μs为100μs的延迟子程序MOV AL,01HOUT DX,AL ;产生选通信号INC BX ;修改内存指针LOOPNEXT ;输出次数的循环控制RET

2.多外设的查询控制在微机系统中,希望以查询方式与微机进行信息交换的外设可能有多个。查询方式是一种同步机制,它以轮询的方式依次对各个外设进行服务。轮询的顺序确定了外设的优先级,而轮询的顺序又是根据外设的重要性确定的。通常是相对重要的和速度快的外设先被查询、服务,而相对不重要的和速度慢的外设后被查询、服务。可以采取多种控制方法对外设进行轮询,图6.18示意了几种轮询控制流程。这几种方法的不同之处在于对外设优先级间差异大小的规定不同。

查询方式与无条件传送方式类似,它们的实现都不需要专门的硬件,所有的输入/输出传送都是在程序的控制下完成的,只是无条件传送方式更加简单,它可以看做是查询方式的一种特例,因此两者同属于程序控制的I/O方式。由于查询与无条件传送方式实现简单,因此在许多外设与系统连接的场合中得到应用。

图6.18几种轮询控制流程

6.5中

查询方式尽管很简单,但它有以下两方面的限制:

(1)CPU在对外设查询时不能做其他的工作,特别是在对多个外设轮询时,无论是否必要都要查询外设状态,造成处理器时间的浪费,使CPU工作效率降低。

(2)CPU在对多个外设以查询方式实现I/O操作时,如果某外设要求CPU对其服务的时间间隔小于CPU对多个外设轮询服务一个循环所需要的时间,

则CPU就不能对该外设进行实时数据交换,这可能会造成数据丢失。

6.5.1中断的概念所谓中断,是指某事件的发生引起CPU暂停当前程序的运行,转入对所发生事件的处理,处理结束后又回到原程序被打断处接着执行的这样一个过程。显然,中断的产生需要特定事件的引发,中断过程的完成需要专门的控制机构。图6.19

示意了微机中实现中断的基本模型,其中的中断控制逻辑和中断优先级控制逻辑构成了中断控制器,用来控制CPU是否响应中断事件提出的中断请求、多个中断事件发生时CPU优先响应哪一个、如何对中断事件进行处理以及如何退出中断,即它控制了中断方式的整个实现过程。

图6.19微机系统中实现中断的基本模型

图6.20显示了在有中断产生的情况下CPU运行程序的轨迹。从程序执行的角度看,中断使CPU暂停了正在执行的程序,转到中断处理程序上执行,在中断处理程序被执行完毕后,又回到被暂停程序的中断断点处接着原状态继续运行原程序。

图6.20在有中断产生的情况下CPU运行程序的轨迹

1.中断源能够引发中断的事件被称为中断源。通常,中断源有两类:内部中断源与外部中断源。由处理机内部产生的中断事件称为内部中断源。常见的内部中断源有计算溢出、指令的单步运行、程序运行至断点处、执行特定的中断指令等。由处理机外部设备产生的中断事件称为外部中断源。常见的外部中断源有外设的输入/输出请求、定时时间到、电源掉电、设备故障等。由内部中断源引发的中断称为内中断,由外部中断源引发的中断称为外中断。

2.中断过程中断方式的实现一般需要经历下述过程:中断请求—→中断响应—→断点保护—→中断源识别—→中断服务—→断点恢复—→中断返回

1)中断请求当外部中断源希望CPU对它服务时,就以产生一个中断请求信号并加载至CPU中断请求输入引脚的方式通知CPU,形成对CPU的中断请求。为了使CPU能够有效地判定接收到的信号是否为中断请求信号,外部中断源产生的中断请求信号应符合下列有效性规定:

(1)信号形式应满足CPU的要求。如8086/88CPU要求非屏蔽中断请求信号(NMI)为上升沿有效,可屏蔽中断请求信号(INTR)为高电平有效。

(2)中断请求信号应被有效地记录,以便CPU能够检测到它。

(3)一旦CPU对某中断源的请求提供了服务,则该中断源的请求信号应及时撤消。后两点规定是为了保证中断请求信号的一次有效性,有许多通用接口芯片或可编程中断控制器都提供了这一保证。内部中断源以CPU内部特定事件的发生或特定指令(如INTn指令)的执行作为对CPU的中断请求。

2)中断响应

CPU对内部中断源提出的中断请求必须响应,而对外部中断源提出的中断请求是否响应取决于外中断源的类型及响应条件。如CPU对非屏蔽中断请求会立即作出反应,而对可屏蔽中断请求则要根据当时的响应条件作出反应。CPU接受中断请求称为响应中断,不接受中断请求称为不响应中断。

CPU对中断请求的检测时刻为每条指令执行的最后一个时钟周期。只有当可屏蔽中断请求满足一定的响应条件时,CPU才可响应其中断请求。不同的微机对可屏蔽中断请求有不同的响应条件。8086/88系统的响应条件为:

(1)指令执行结束。

(2)CPU处于开中断状态(即IF=1)。

(3)没有发生复位(RESET)、保持(HOLD)和非屏蔽中断请求(NMI)。

(4)开中断指令(STI)、中断返回指令(IRET)执行完,需要再执行一条指令,才能响应INTR请求。

3)断点保护一旦CPU响应了某中断请求,它将对此中断进行服务,也即将从当前程序跳转到该中断的服务程序上。为了在中断处理结束时能使CPU回到被中断程序断点处接着执行原程序,需要对被中断程序的断点信息进行保护。不同的CPU所作的断点保护操作不同。8086/88CPU的硬件自动保护的断点信息为断点地址(包括断点处的段地址与段内偏移地址)和标志寄存器内容,它通过压栈的方法将断点信息保存在堆栈中,其他信息的保护需要通过软件在中断处理程序中完成。

4)中断源识别当系统中有多个中断源时,一旦中断发生,CPU必须确定是哪一个中断源提出了中断请求,以便对其作相应的服务,这就需要识别中断源。常用的中断源识别方法有:

(1)软件查询法。对于外中断,该方法在硬件上需要输入接口的支持,如图6.21(a)所示。一旦中断请求被CPU响应,则CPU在中断处理程序中读中断请求状态端口,并通过图6.21(b)所示的流程依次查询外部中断源的中断请求状态,以此确定提出请求的中断源并为其服务。

图6.21中断源识别的软件查询法(a)硬件接口;(b)软件查询流程

(2)中断矢量法。该方法是将多个中断源进行编码(该编码称为中断矢量),以此编码作为中断源识别的标志。中断源在提出请求的同时,向CPU提供此编码供识别之用。在8086/88中断系统中,识别中断源采用的就是中断矢量法。

5)中断服务中断服务完成对所识别中断源的功能性处理,是整个中断处理的核心,也是对各种中断源进行处理的之差别所在。由于中断源不同,要求CPU对其进行的处理不同,因此中断服务的内容、复杂度也不同。如有的中断服务只做简单的I/O操作,有的中断服务可能要监测控制一条生产线,还有的中断服务将完成与其他系统的协调工作。总之,中断服务可以完成的任务是多种多样的。

6)断点恢复中断服务结束后,应恢复在中断处理程序中由软件保护的信息。若在中断处理程序开始处,按一定顺序将需要保护的信息压入堆栈,则在断点恢复时,应按相反的顺序将堆栈中的内容弹回到信息的原存储处。

7)中断返回中断返回实际上是CPU硬件断点保护的相反操作,它从堆栈中取出断点信息,使CPU能够从中断处理程序返回到原程序继续执行。一般中断返回操作都是通过执行一条中断返回指令实现的。

3.中断优先级及嵌套若中断系统中有多个中断源同时提出中断请求,那么CPU先响应谁呢?中断优先级就是为解决这个问题而提出的。由于中断源种类繁多、功能各异,因此它们在系统中的地位、重要性不同,它们要求CPU为其服务的响应速度也不同。按重要性、速度等指标对中断源进行排队,并给出顺序编号,这样就确定了每个中断源在接受CPU服务时的优先等级(即中断优先级)。

在多中断源的中断系统中,解决好中断优先级的控制问题是保证CPU能够有序地为各个中断源服务的关键。中断优先级控制逻辑要实现以下功能:

(1)不同优先级的多个中断源同时提出中断请求时,CPU应首先响应最高优先级的中断源提出的请求。

(2)CPU正在对某中断源服务时,若有优先级更高的中断源提出请求,则CPU应对高优先级的中断作出响应,即高优先级的中断请求可以中断低优先级的中断服务。

目前采用的解决中断优先级控制的方案有:

(1)软件查询。采用软件识别中断源的方法(如图6.21所示),以软件查询的顺序确定中断源优先级的高低,即先查询的优先级高,后查询的优先级低。

(2)硬件链式优先级排队电路。

(3)硬件优先级编码比较电路。

(4)利用可编程中断控制器(PIC)。这是目前使用得最广泛,也是最方便的方法,是80x86系统中采用的方法。

图6.22中断嵌套示意图

中断嵌套可以在多级上进行。要保证多级嵌套的顺利进行,需要做以下几个方面的工作:

(1)在中断处理程序中要有开中断指令。大多数微机在响应中断时硬件会自动关中断,因此,中断处理程序是在关中断的情况下运行的。若要实现中断嵌套,对于可屏蔽中断而言,一定要使中断处理程序处于允许中断的状态。

(2)要设置足够大的堆栈。当断点信息保存在堆栈中时,随着中断嵌套级数的增加,对堆栈空间的需求也在增加,只有堆栈足够大时,才不会发生堆栈溢出。

(3)要正确地操作堆栈。在中断处理程序中,涉及堆栈的操作要成对进行,即有几次压栈操作,就应有几次相应的弹出操作,否则会造成返回地址与状态错误。

6.5.28086/88中断系统

1.中断源类型

256个中断源分为两大类:内部中断和外部中断。

1)内部中断内部中断由CPU内部事件及执行软中断指令产生。已定义的内部中断有:

(1)除法错中断。执行除法指令时,如果商超过8位或16位所能表达的最大值(如除以0时),则无条件产生该中断。该中断的向量码为0。

(2)单步中断。这是在调试程序过程中为单步运行程序而提供的中断形式。当设定单步操作(即状态寄存器中陷阱标志TF=1)后,CPU执行完一条指令就产生该中断。该中断的向量码为1。

(3)断点中断。这是在调试程序过程中为设置程序断点而提供的中断形式。设置断点或执行INT3指令可产生该中断。INT3指令功能与软件中断相同,但是为了便于与其他指令置换,它被设置为1字节指令。该中断的向量码为3。

(4)溢出中断。在算术运算程序中,若在算术运算指令后加入一条INTO指令,则将测试溢出标志OF。当OF=1(表示算术运算有溢出)时,该中断发生。该中断的向量码为4。

(5)软件中断。执行软件中断指令INTn即产生该中断。指令中的n为该中断的中断向量码。用户可以通过设置不同的中断向量码n来形成自己定义的软件中断事件。需要注意的是,8086/88中断系统对各类中断源以统一的向量码标识,所以用户使用的中断向量码不得与微机系统中已使用的中断向量码冲突。

2)外部中断外部中断是由外部中断源产生对CPU的请求引发的。8086/88中断系统将外部中断源又分为以下两种。

(1)非屏蔽中断。当某外部中断源产生一个有效的上升沿信号作为中断请求信号,并被加载至CPU的NMI引脚上时,产生非屏蔽中断。非屏蔽中断不受中断允许标志位IF限制,这种中断一旦产生,CPU必须响应它,因此,它的优先级必然高于可屏蔽中断。为了及时响应该中断,CPU内部自动提供了该中断的向量码(n=2)。在对重要事件(如电源掉电、关键设备出现故障等)进行处理时,经常使用该中断。

(2)可屏蔽中断。当某外部中断源产生一个有效的高电平信号作为中断请求信号,并被加载至CPU的INTR引脚上时,可能产生的中断即为可屏蔽中断。这是普通的外部中断,只有这种中断才能用IF屏蔽。在IF=1时,CPU可对可屏蔽中断请求作出响应。由于大多数外部中断源都被归结在可屏蔽中断类中,而8086/88CPU只有一个可屏蔽中断请求输入引脚,因此,在8086/88中断系统中,在CPU之外又设计了一个中断控制器(如8259)。这个中断控制器不仅能够对多个可屏蔽中断源进行优先级控制,而且可以为这些中断源提供中断向量码。

2.中断响应过程在8086/88系统中,中断控制是由CPU与中断控制器共同完成的,这使得中断过程简化为:①中断请求;②中断响应;③中断处理:i.断点保护;ii.中断服务;iii.断点恢复;iv.中断返回。

其中,步骤①为外部中断源动作,步骤②是CPU硬件自动完成的动作,步骤③是中断处理程序应该完成的工作。CPU从检测出中断请求到转移至中断处理程序之前所做的工作即为中断响应过程,其流程如图6.23所示。

图6.23中断响应过程

如果是可屏蔽中断,则CPU连续执行两个INTA(中断响应)周期。在第1个INTA周期,CPU将地址总线与数据总线置高阻,并从INTA引脚输出第1个负脉冲信号加载至中断控制器8259。在第2个INTA周期,CPU先送出第2个负脉INTA冲信号,该信号通知中断控制器将相应中断源的中断向量码放至数据总线上,随后CPU从数据总线上读取中断向量码(8位)。

INTA周期结束之后,或者在产生内部中断、NMI中断时,CPU将标志寄存器、CS、IP的内容压入堆栈,关中断,然后根据中断向量码n(它可以是由CPU硬件规定的,或由软中断指令确定的,或由中断控制器8259提供的)查找中断向量表(即内存地址4×n处),从中获取中断源n的中断处理程序首地址(也称入口地址),并使CPU转而执行中断处理程序。如果同时有几类中断发生,则CPU按图6.24的顺序进行查询,再作出响应。这个查询顺序决定了8086/88中断系统中几类中断源的优先顺序,即内部中断(INT)优先级高于非屏蔽中断,非屏蔽中断(NMI)优先级高于可屏蔽中断(INTR)。单步中断是一个特例,它是所有中断源中优先级最低者,而且还受IF屏蔽。

图6.24中断响应时CPU查询中断源的顺序

3.中断向量表

8086/88微机系统在内存的最低端开辟了1KB的存储区作为中断向量表。该表以四字节为一组构造而成,共分为256组,按中断向量码的序号排列,如图6.25所示。在微机系统初始化时,利用程序将各中断源的中断处理程序首地址填写在该表中起始地址为4×n(n为中断向量码)的连续4字节的字节组中(前两字节放中断处理程序首地址之段内偏移地址,后两字节放中断处理程序首地址之段地址)。这样,在中断响应时,CPU就可以根据中断向量码n查找中断向量表,从表中起始地址为4×n的连续4字节单元里获取中断源n的中断处理程序首地址。

中断向量表建立了不同的中断源与其相应的中断处理程序首地址之间的联系,它使CPU在中断响应时可以依据中断向量码自动地转向中断处理程序,它是8086/88中断系统中特有的、不可缺少的组成部分。在8086/88微机系统中,只有这个中断向量表和复位后开始执行的地址FFFF0H~FFFFFH是接受特殊处理的存储区域。

图6.25中断向量表

6.5.3可编程中断控制器8259

1.8259内部结构

8259内部结构如图6.26所示,它的工作过程如下:

(1)中断请求输入端IR0~IR7接收外部中断源的请求信号。

(2)外部中断源的请求状态锁存在中断请求寄存器IRR(8位)的相应位(即置1),将它与中断屏蔽寄存器IMR(8位)相“与”后送给优先级判决电路。

(3)优先级判决电路从提出请求的中断源(记录在IRR中)中检测出优先级最高的中断请求位,将其与在内部服务寄存器ISR(8位)中记录的正在被CPU服务的中断源进行优先级比较,只有当提出请求服务的中断源优先级高于正在服务的中断源优先级时,判优电路才向控制电路发出中断请求有效信号。

(4)控制电路接收到中断请求有效信号后,向CPU输出INT信号。

(5)CPU接收INT信号,在中断允许(IF=1)的情况下,发出INTA响应信号。

(6)8259接收INTA信号,在第1个INTA周期先设置ISR的相应位,并恢复IRR的相应位,然后主控8259送出级联地址CAS0~CAS2,加载至从属8259上。

(7)单独使用的8259或是由CAS0~CAS2选择的从属8259,在第2个INTA周期将中断向量码输出至数据总线。

(8)CPU读取中断向量码并转移到相应的中断处理程序。

(9)中断结束时,通过在中断处理程序中向8259送一条EOI(中断结束)命令,使ISR相应位复位。或者当8259选择自动结束中断方式时,由8259在第2个INTA信号的后沿自动将ISR相应位复位。

图6.268259内部结构图

2.8259引脚功能

8259是具有28个引脚的集成芯片,如图6.27所示,各引脚功能如下:

图6.278259内部引脚图

3.8259工作方式

1)中断结束方式

8259中的内部服务寄存器ISR用来记录哪一个中断源正在被CPU服务,当中断结束时,应恢复ISR的相应位,以清除其正在被服务的记录。8259有两种中断结束方式:非自动结束方式和自动结束方式。

(1)非自动结束方式。非自动结束方式利用在中断处理程序中提供一条EOI(中断结束)命令,使8259中的ISR相应位被清除。EOI命令是通过CPU将相关信息写入8259的操作命令字OCW2而生成的。

EOI命令有两种形式:①

一般中断结束命令(EOI)。该命令可对正在服务的中断源的ISR进行复位。例如,当CPU响应8259的IR3引脚上的中断源请求时,在第1个INTA周期,ISR3被置位,表示IR3;正在被CPU服务。在IR3的中断处理程序中编写一条一般EOI命令(通常放置在中断返回指令之前)并执行之,则当前正在被服务的中断源在8259中的记录被清除,即ISR3被清零,表示现在8259中已没有IR3正在被CPU服务的标记。

特殊中断结束命令(SEOI)。该命令可对指定中断源的ISR进行复位。例如,CPU正在执行IR3的中断处理程序,此时ISR中有ISR3=1、ISR5=1,则在IR3的中断处理程序中可以利用一般EOI命令清除ISR3,也可以利用特殊EOI命令指定清除ISR5。

(2)自动结束方式。这种方式不需要EOI命令,8259在第2个信号的后沿自动执行(一般)EOI操作。注意:

这种方式尽管不需要EOI命令,但是在中断服务过程中,因ISR相应位已复位,所以有可能响应优先级更低的中断。因此,当允许中断嵌套时,不要采用自动结束方式。

2)缓冲方式缓冲方式用来指定系统总线与8259数据总线之间是否需要进行缓冲。

(1)非缓冲方式。在指定非缓冲方式时,/作为输入,用来识别8259是主控制器还是从属控制器。

(2)缓冲方式。在指定为缓冲方式(有数据缓冲器)时,/为输出。当为低时表示8259输出中断向量码,它被用于CPU等待信号产生及数据总线缓冲器的控制中。

3)嵌套方式嵌套方式用于8259的优先级控制,它有两种形式:

(1)一般嵌套方式。一般嵌套规定:

IRj输入端接受一次中断之后,在EOI命令使ISRj复位之前,IRj拒绝接受自身新的中断请求,同时8259还自动屏蔽比IRj优先级低的中断源请求。这是通常采用的优先级控制原则,即高优先级中断能够中断低优先级中断服务,低优先级中断不能够中断高优先级中断服务,同等优先级中断不能够相互中断。这种方式一般用在单片使用的8259或级联方式下的从属8259上。

(2)特殊全嵌套方式。在8259以级联方式工作时,要求主控8259在对一个由从属8259来的中断进行服务的过程中,还能够对由同一个从属8259上另外一个高优先级IR输入端来的中断请求进行服务。特殊全嵌套方式就是为实现这种多重中断而专门设置的。它与一般嵌套方式的惟一不同就在于,它允许某中断可以中断与它有相同优先级的另一个中断服务。这种方式一般用在级联方式下的主控8259上。

4)屏蔽方式屏蔽方式也用于8259优先级控制,它也有两种形式:

(1)一般屏蔽方式。正常情况下,当IR端中断请求被响应时,8259自动禁止同级及更低优先级的中断请求,这就是一般屏蔽方式。这种方式有可能使某些优先级较低的中断长时间得不到服务。

(2)特殊屏蔽方式。特殊屏蔽方式解除了对低级中断的屏蔽,在这种方式中,除了由ISR

设置的位和由IMR屏蔽的位表示的中断外,其他级别的中断都有机会得到响应。

4.优先级规定

8259在进行优先级控制时,是以每个中断源优先级的高低为依据的。它通过对操作命令字OCW2的设置,对所管理的8个中断源的优先顺序按两种方式作出规定:

(1)固定优先级。8259的8个中断源中,IR0优先级最高,IR1优先级次之,依次排列,直到IR7优先级最低。该顺序固定不变。

(2)循环优先级。8259将中断源IR0~IR7按下标序号顺序地构成一个环(即中断源顺序环),优先级顺序将依此环规定。有两种规定方法:

①自动循环优先级。该方法规定刚被服务过的中断源具有最低优先级,其他中断源优先级顺序依中断源顺序环确定。例如,CPU对IR2中断的服务刚结束时,8259的8个中断源的优先级顺序由高到低为IR3、IR4、IR5、IR6、IR7、IR0、IR1、IR2。②

指定循环优先级。该方法规定在OCW2中指定的中断源具有最低优先级,其他中断源优先顺序依中断源顺序环确定。例如,CPU在对IR2中断服务的过程中,通过指令在OCW2中指定IR3具有最低优先级,则IR2中断服务结束时,8259的8个中断源优先级顺序由高到低为IR4、IR5、IR6、IR7、IR0、IR1、IR2、IR3。

5.8259命令字

8259的工作是依据其命令进行的,在8259工作之前以及工作过程中,都需要由CPU给8259加载适当的命令,使其完成规定的控制功能。8259有7个命令字(包括4个初始化命令字ICW,3个操作命令字OCW),利用两个I/O地址,CPU可以将它们分别写入7个命令字寄存器中。

1)初始化命令字初始化命令字用于初始设定8259的工作状态,它包括:①

ICW1:规定8259的连接方式(单片或级联)与中断源请求信号的有效形式(边沿或电平触发),命令字格式如图6.28所示,利用A0=0,D4=1寻址。

图6.28ICW1格式

ICW2:提供8个中断源的中断向量码,其低3位由8259用中断源序号填写,命令字格式如图6.29所示,利用A0=1及初始化顺序寻址。

图6.29ICW2格式

③ICW3:用于多片8259级联。主控8259的ICW3内容表示8259的级联结构,从属8259的ICW3低3位提供与级联地址比较的识别地址,命令字格式如图6.30所示,利用A0=1,SNGL=1(在ICW1中)以及初始化顺序寻址。

图6.30ICW3格式

ICW4:选择8259的工作方式(EOI方式、缓冲方式及嵌套方式)。在8086/88系统中,

必须有ICW4,必须设置PM=1。命令字格式如图6.31所示,利用A0=1,IC4=1(在ICW1

中)以及初始化顺序寻址。

图6.31ICW4格式

2)操作命令字操作命令字(OCW)可以在8259工作过程中随时写入操作命令字寄存器,以便灵活改变8259的某些功能,它包括:

(1)OCW1:对8259的中断源设置屏蔽操作,实际上是对中断屏蔽寄存器IMR进行设置与清除的命令,命令字格式如图6.32所示,利用A0=1寻址。对IMR可以进行写入操作,也可以进行读出操作。

图6.32OCW1格式

(2)OCW2:用来提供EOI命令及确定中断源优先级顺序,命令字格式如图6.33所示,利用A0=0,D4=D3=0寻址。

图6.33OCW2格式

(3)OCW3:设置8259屏蔽方式及确定可读出寄存器(IRR、ISR或8259的当前中断状态),命令字格式如图6.34所示,利用A0=0,D4=0,D3=1寻址。

图6.34OCW3格式

6.8259级联使用一个8259,最多可以管理8个中断源。当中断系统规模较大时,中断源数目可能多于8个,采用级联的方式就可以扩大8259管理中断源的能力。

1)级联结构

8259采用两级级联,级联结构如图6.35所示。1个8259作为主控制器芯片,其他8259作为从属控制器芯片,主控制器的1个IR端与1个从属控制器的INT端相连,最多可以连接8个从属控制器,因此,最多可以获得64个中断请求输入端。

图6.358259级联结构

2)级联方式下8259的中断响应在第1个INTA周期,主控8259根据IR0~IR7中CPU已响应的最高优先级中断源输入引脚序号清除IRR相应位,设置ISR相应位,并将此中断源输入引脚序号作为级联地址,从CAS0~CAS2输出至从属8259。从属8259读取级联地址,并与初始化时在ICW3中设置的识别地址进行比较。只有识别地址与级联地址一致的从属8259,才能接收INTA信号,将自身的IRR相应位清除,将ISR相应位置位,并在第2个INTA周期将ICW2中的中断向量码输出给数据总线。若主控8259的IR端直接连接着中断源(可以由ICW3确定),则在第2个INTA周期,由主控8259提供中断向量码。

3)级联方式下8259的特殊操作级联方式下,所有的从属8259是相互独立的,而主控8259与从属8259既具有独立关系,又具有主从关系,所以,无论是主控制器还是从属器,每个8259都需要独立地进行初始化,以确定各自的工作方式、中断向量码等信息。另外,每个8259需要有各不相同的I/O地址,以便CPU分别对它们进行读或写操作。

有几项操作应该特别注意:

(1)初始化时,主控制器与从属器的ICW3应以不同格式填写;主控制器的嵌套方式必须选择为特殊全嵌套方式,从属器的嵌套方式必须选择为一般嵌套方式。

(2)当结束来自从属8259的中断时,中断处理程序要发送两个EOI命令,一个发送给相关的从属8259(由I/O地址确定),一个发送给主控8259。注意,在发送主控EOI命令前,要先检查该从属8259的ISR是否只记录了一个中断源正在被服务。若是,则发送主控EOI命令;否则,不发送主控EOI命令。

6.5.4中断方式的实现

1.连接8259在8086/88中断系统中,如果有可屏蔽中断源存在,则中断系统的硬件电路中一定要有中断控制器8259。8259应位于8086/88系统总线与中断源之间,它在系统中的连接如图6.36

所示。8259占用两个I/O地址,图中的译码器可根据分配给8259的I/O地址进行设计,中断控制器也可以采用级联方式连接。

图6.368259在系统中的连接

8259内部有7个命令寄存器和3个状态寄存器,可供CPU通过两个I/O地址进行操作。为了用两个I/O地址寻址8259的多个内部寄存器,8259利用了命令字(D3、D4位)中的写入内容及写命令字的顺序,来作进一步的寻址。表6.1描述了8259内部寄存器的寻址控制方式。

表6.1

8259内部寄存器的寻址控制方式

2.编写中断初始化程序为了使中断能够顺利进行,需要设定中断的一些初始信息,这可通过中断初始化程序来完成。中断初始化程序包括两部分:一是对8259的初始化,二是设置中断向量表。

1)初始化8259因为8259的内部寄存器寻址与命令字的写入顺序有关,所以,对8259的初始化一定要按规定的顺序进行,如图6.37所示。

图6.378259的初始化顺序

下面是一段对8259初始化的程序(假定8259的连接电路如图6.36所示,占用的I/O地址为FF00H和FF02H):

SET59A:MOVDX,0FF00H ;8259的地址A0=0MOVAL,13H ;写ICW1,边沿触发,单片,需 要ICW4OUTDX,ALMOVDX,0FF02H ;8259地址A0=1MOVAL,48H ;写ICW2,设置中断向量码OUTDX,AL MOVAL,03H ;写ICW4,8086/88模式,自动 EOI,非缓冲,一般嵌套OUTDX,ALMOVAL,0E0H ;写OCW1,屏蔽IR5、IR6、 IR7(假定这3个中断输入未用)OUTDX,AL利用程序可以读出8259内部寄存器的内容。下面的一段程序可将00H与FFH分别写入IMR,并将其读出比较,以判断8259的中断屏蔽寄存器IMR工作是否正常,当不正常时转到IMRERR。

MOV DX,0FF02HMOV AL,0OUTDX, AL ;写OCW1,将00H写入IMRINAL,DX ;读IMRORAL,AL ;判断IMR内容是否为00HJNZIMRERRMOV AL, 0FFHOUT DX,ALINAL, DXADD AL,1JNZ IMRERR

CPU读出8259的IMR时,可利用I/O地址直接寻址,而要读出ISR、IRR或中断状态寄存器时,则需要先设置命令字OCW3。下面是CPU读出ISR内容的一段程序:MOV DX,0FF00H ;8259的地址A0=0MOV AL,0BHOUT DX,AL ;写OCW3INAL,DX ;读出ISR内容放入AL中

2)设置中断向量表假定某中断源的中断向量码已由上述初始化程序确定为48H,CPU对该中断源进行处理的中断处理程序放置在以内存地址标号CLOCK开始的存储区域中,则在该中断发生前,应采取下述方法对中断向量表进行设置:

(1)直接写中断向量表。利用写指令,直接将中断处理程序的首地址写入内存地址为4×n的区域中。程序如下:INTITB:MOV AX,0 MOV DS,AX ;将内存段设置在最低端

MOV SI,0120H ;n=48H,4×n=120H MOV AX,OFFSETCLOCK;获取中断处理程序首地址之段内偏移地址

MOV[SI],AX;将段内偏移地址写入中断向量表4×n地址处

MOV AX,SEGCLOCK ;获取中断处理程序首地址之段地址

MOV[SI+2],AX

;将段地址写入中断向量表4×n+2地址处

(2)利用DOS功能调用。若系统运行在DOS环境下,可利用DOS功能调用设置中断向量表,调用格式为:功能号25H→AH中断向量码→AL中断处理程序首地址之段地址:偏移地址→DS:DXINT21H程序如下:MOVAH,25HMOVAL,48HMOVDX,SEGCLOCKMOVDS,DXMOVDX,OFFSETCLOCKINT21H

3.编写中断处理程序中断处理程序用来实现CPU对中断源的实质性服务,它一般由断点保护、中断源识别、中断服务、断点恢复、中断返回等几部分构成。在8086/88系统中,中断源识别已在中断响应过程中完成,所以,中断处理程序中不需要进行中断源识别。但由于8086/88中断系统有自己特殊的地方,如各类中断源受中断允许标志位IF的影响不同,可屏蔽中断INTR需要中断控制器管理等,因此在中断处理程序中需要加入相应的处理。

1)中断嵌套

8086/88中断系统将所有中断源分为三类,即INT、NMI及INTR,并规定CPU对INT与NMI的响应不受IF限制,而对INTR的响应必须在IF=1(即允许中断)的情况下进行。由于中断响应过程中已将IF清零(即禁止中断),CPU进入到中断处理程序时已处于屏蔽INTR状态,因此,要想实现可屏蔽中断的嵌套,必须在中断处理程序中开中断。开中断操作是利用执行开中断指令STI来实现的,该指令可设置在断点保护与断点恢复之间的任意位置。为了在中断返回时能获得正确的断点信息,在断点恢复前必须关中断(执行指令CLI)。可嵌套的中断处理程序流程如图6.38所示。

图6.38可嵌套的中断处理程序流程

2)改变中断优先级可屏蔽中断源是通过中断控制器8259来管理的。8259初始化后,对八个中断请求输入按固定优先级控制其响应顺序,这虽然可以保证重要的中断源能够得到及时服务,但在某些特殊情况下,可能会出现一些优先级较低的中断源长时间得不到服务的状况。为了改变这种状况,8259提供了改变中断优先级的方法,即在中断处理程序中写操作命令字OCW2或OCW3。MOV DX,0FF00H ;8259的地址A0=0MOV AL,0C6H ;设置指定(特殊)循环优先级及OCW2寻址信息OUT DX,AL ;写OCW2写OCW2可以将8259的优先级控制方法由固定优先级变为循环优先级,使那些原来为低优先级的中断源能够被动态地规定为具有较高优先级,以均衡CPU对各中断源服务的机会。例如,在中断处理程序中写进如下一段程序,可实现在该中断处理程序结束后将IR7定义为优先级最高:

写OCW3可以设置8259的特殊屏蔽方式,通过改变中断屏蔽对象,使低优先级中断有可能打断高优先级中断,提供低优先级中断能够得到服务的机会。图6.39给出了一种特殊屏蔽的示意图,其中优先级较低的中断IR6先于优先级较高的中断IR3得到了CPU服务。屏蔽方式的设置用下述指令完成:

MOV DX,0FF00H ;8259的地址A0=0MOV AL,68H ;设置特殊屏蔽方式(SMM=1)及OCW3寻址信息OUT DX,AL ;写OCW3

MOV DX,0FF00H ;8259的地址A0=0MOV AL,48H ;设置SMM=0及OCW3寻址信息OUT DX,AL ;写OCW3

3)产生EOI命令

8259需要在中断结束时清除内部服务寄存器ISR中相应位关于某中断源正在被服务的记录。在自动EOI方式下,ISR相应位的清除在中断响应过程中由8259硬件自动完成;在非自动EOI方式下,ISR相应位的清除要由中断处理程序中的EOI命令来完成。

EOI命令有两种形式:一般EOI与特殊EOI(指定EOI)。一般EOI实现对正在服务的ISR位复位,特殊EOI实现对指定的ISR位复位。

例如,当来自8259中断输入端IR6的中断请求被CPU响应时,8259自动设置ISR的数据位D6为1(即ISR6=1)。在IR6中断处理程序中,CPU执行以下指令,产生对8259的一般EOI命令:MOV DX,0FF00H ;8259的地址A0=0MOV AL,20H ;设置一般EOI命令OUT DX,AL ;写OCW2

上述指令执行的结果是:清除了IR6正在被CPU服务的记录,即ISR6=0。

如果想在IR6的中断处理程序中清除IR3正在被CPU服务的记录(如图6.39所示的中断情形),则在IR6中断处理程序中让CPU发特殊EOI命令即可:MOVDX,0FF00H ;8259的地址A0=0MOV

AL,63H ;设置特殊EOI命令OUT

DX,AL ;写OCW2上述指令执行的结果是:清除了IR3正在被CPU服务的记录,即ISR3=0。

注意,8259执行EOI(即中断结束)并不意味着CPU中断结束,CPU的中断结束是通过执行中断返回指令IRET来完成的,所以EOI命令可以在中断处理程序中的任何位置发布。但由于ISR信息参与8259的优先级判决,若在中断处理程序结束前过早地发EOI命令或对其他指定中断发EOI命令(包括自动EOI情形),则相应的ISR信息会消失,造成8259在进行优先级判决时完全忽略了当前正在被CPU服务的中断源。因此,在正常情况下,当8259以非自动EOI方式工作时,在中断处理程序中最好选择一般EOI命令,且使IRET指令紧随该命令之后(如图6.39所示)。

图6.39特殊屏蔽方式示意图

4)举例下面举一实例说明中断的实现。将定时器产生的周期为20ms的方波加载到图6.36电路中的IR0上,利用前述的SET59A程序段初始化8259,用INTITB程序段初始化中断向量表,然后在中断发生时执行下述中断处理程序,即可实现利用20ms一次的定时中断建立时、

分、秒电子钟的功能。

CLOCK PROC FARPUSH AXPUSH SIMOV AX,SEGTIMERMOV DS,AXMOV SI,OFFSETTIMERMOV AL,[SI] ;取50次计数INC ALMOV [SI],ALCMP AL,50 ;判断1s到否?JNE TRNEDMOV AL,0MOV [SI],ALMOV AL,[SI+1] ;取60s计数ADD AL,1DAAMOV [SI+1],ALCMP AL,60H ;判断1min

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论