6.1 输入 /输出及其接口
6.2 输入 /输出传送方式
6.3 中断技术
6.4 80X86/ Pentium中断系统
6.5 可编程中断控制器
6.6 中断程序设计
6.7 DMA控制器第 6章 输入 /输出和中断技术返回主目录第 6章 输入 /输出和中断技术输入 /输出设备是计算机系统的重要组成部分,计算机通过它们与外设进行数据交换 。 微机系统中,各种输入 /输出设备通过接口与系统相连,并在接口的支持下实现各种方式的数据传送 。 微型计算机系统中常用的外围设备有:键盘,显示器,
磁带机,硬盘驱动器,软盘驱动器,模数转换器,数模转换器,
调制解调器以及一些专用设备等 。 把外围设备同微型计算机连接起来的电路称为外设接口电路,简称外设接口 。
6.1 输入 /
6.1.1 I/O信息的组成
CPU通过接口与外设交换信息,这些信息包括数据信息,
状态信息和控制信息 。
1.
数据信息可分为数字量,模拟量和开关量 。
数字量是键盘,CRT,打印机及磁盘等 I/O外设与 CPU交换的信息,它是以二进制形式表示的数或以 ASCII码表示的数或字符 。
当微型计算机用于控制系统时,大量的现场信息经过传感器把非电量 (如温度,压力,流量,位移等 )转换成电量,
并经放大处理得到模拟量的电压或电流 。
这些模拟量必须先经过 A/D转换器转换成数字量才能输入计算机;计算机控制信号的输出也必须先经过 D/A转换器把数字量转换成模拟量才能去控制执行机构 。
开关量即两个状态的量 。 如开关的断开与闭合,阀门的打开与关闭等 。 通常开关量要经过相应的电平转换才能与计算机连接 。 每个开关量只要一位二进制数表示,故对于字长为 8位
(或 16位 )的计算机,一次可输入或输出 8位 (或 16位 )开关量 。
2.
状态信息是 CPU与外设之间交换数据时的联络信息 。 CPU
通过读取外设状态信号,可知外设的工作状态 。 如输入设备的数据是否准备好,输出设备是否空闲 。 输出设备正在输出信息,则用 BUSY信号通知 CPU暂停送数 。 因此,状态信号是
CPU与 I/O外设正确进行数据交换的重要条件 。
3,控制信息控制信息是设置 I/O外设 (包括 I/O接口 )的工作模式,命令字的有关信息 。 如,启动,,,停止,信息 。
每个 I/O接口通常包含若干 I/O端口 (输入 /输出端口 )寄存器,
CPU和存储器通过这些端口与该接口所连接的外设进行信息交换 。 通常,状态信息和控制信息也是通过数据总线传送的 。
由于它们的作用不同,故在传送时赋予不同的端口 。 因此,
一个外设往往占用几个端口,如数据端口,状态端口,控制端口等 。 当一个外设的状态信息和控制信息位数较少时,可以将不同的外设的状态或控制信息归并到一起,共同使用一个端口 。 这样,CPU对外设的控制或 CPU与外设间的信息交换,
实际上就是 CPU通过 I/O指令读 /写端口的数据 。 在控制端口,
写出的数据表示 CPU对外设的控制信号;在状态端口,读入的数据是外设的状态信息;只有在数据端口,才真正地进行数据信息的交换 。
6.1.2 I/O接口的作用外围设备的种类繁多,有机械式,电子式,机电式,磁电式以及光电式等 。 其所处理的信息有数字信号,模拟信号,有电压信号,电流信号 。 不同的外围设备处理信息的速度相差悬殊,有的速度慢,有的速度快 。 另外,微型计算机与不同的外围设备之间所传送的信息格式和电平高低是多种多样的,这样就形成外设接口电路的多样化 。
由于外围设备的多样性,外设接口电路应具有如下功能:
(1) 转换信息格式 。 如串 —并转换,并 —串转换,配备校验位等
(2) 提供联络信号,协调数据传送的状态信息 。 如设备,就绪,,,忙,,数据缓冲器,满,,,空,等信号 。
(3) 协调定时差异 。 为协调微机与外设在定时或数据处理速度上的差异,使两者之间的数据交换取得同步,有必要对传输的数据或地址加以缓冲或锁存 。
(4) 进行译码选址 。 在具有多台外设的系统中,外设接口必须提供地址译码以及确定设备码的功能 。
(5) 实现电平转换 。 为使微型计算机同外设匹配,接口电路必须具有电平转换和驱动功能 。
(6) 具备时序控制 。 有的接口电路具有自己的时钟发生器,
以满足微型计算机和各种外设在时序方面的要求 。
(7) 可编程 。 对一些通用的,功能较齐全的接口电路,
应该具有可编程能力 。
6.1.3I/O
CPU对外设的访问实质上是对外设接口电路中相应端口的访问 。 I/O端口的寻址方式有两种,即 I/O指令寻址和存储器映像 I/O寻址 。
1,I/O
I/O指令寻址方式又称,专用的 I/O端口寻址,方式 。 其硬件结构及地址空间分配如图 6 - 1所示 。 这种寻址方式的特点是:存储器和 I/O端口在两个独立的地址空间中,I/O端口的读,写命令由 来控制,访问 I/O端口用专用的
IN指令和 OUT指令 。
IOR IOW
图 6 – 1 I/O指令寻址方式
C P U 存储器
20 16
控制逻辑
M E M R
CB
M E M W
I / O 接口
1616
I O WI O R
AB
DB
2
20
= 1M
存储单元
I / O 单元
I/O指令寻址方式的优点是,I/O端口的地址码一般比同系统中存储单元的地址码短,译码电路较简单;存储器同 I/O端口的操作指令不同,程序比较清晰;存储器和 I/O端口的控制电路结构相互独立,可以分别设计 。 它的缺点是:需要专门的 I/O指令,这些 I/O指令一般没有存储器访问指令丰富,所以程序设计的灵活性较差 。
2,存储器映像的 I/O
存储器映像的 I/O端口寻址的硬件结构及地址空间分配如图 6 - 2 所示 。 这种寻址方式的特点是:存储器和 I/O端口共用一个地址空间; I/O端口读,写命令通过 和来实现,所有访问存储器的指令都可用于 I/O端口,包括存储
。
MEMR MEMW
图 6 – 2 存储器映像的 I/O端口寻址存储器与 I / O 接口控制逻辑
M E M R
CB
M E M W
DB
C P U
AB
I / O 端口存储单元
1M
存储器映像的 I/O端口寻址方式的优点是:任何对存储器数据进行操作的指令都可用于 I/O端口的数据操作,不需要专门的 I/O指令,系统编程比较灵活; I/O端口的地址空间是一部分内存空间,使可大可小,外设的数目几乎不受限制 。 它的缺点是,I/O端口占用了一部分内存空间,使内存空间减少;
访问 I/O端口同访问内存一样,由于访问内存的地址长,指令的机器码也长,执行时间显然增加 。 简单外设接口框图如图 6
- 3 所示 。
图 6 –3 简单外设接口数据口
DB 数据状态口控制口
AB
CB
C P U
状态信息控制信息外设
6.2 输入 /
在微机系统中 。 大量数据在 CPU,存储器和 I/O接口之间传送 。 数据传送过程中的关键问题是数据传送的控制方式 。
微机系统中数据传送的控制方式有:程序控制方式,DMA(直接存储器存取 )方式和 I/O处理机方式 。 I/O处理机方式在微机系统中用得不多,这里不作介绍 。
6.2.1程序控制的输入 /输出方式程序控制的数据传送分为无条件传送,查询传送和中断传送,这类传送方式的特点是以 CPU为中心,由 CPU控制,通过预先编制好的输入或输出程序实现数据的传送 。 这种传送方式的数据传送速度较低,传送时要经过 CPU内部的寄存器,
同时数据的输入 /输出的响应也较慢 。
1.
无条件传送方式是假设输入接口数据已经准备好,或者输出设备是空闲的,此时 CPU无需查询状态,可直接用 IN和
OUT指令完成与接口之间的数据传送 。
采用无条件传送方式的接口电路如图 6 - 4 所示。
图 6 - 4
(a) 无条件传送的输入方式; (b)无条件传送的输出方式数据三态缓冲器来自外设地址译码器
I O / M
RD
8
8
数据总线地址总线
( a )
锁存器到外设 地址译码器
I O / M
WR
8
8
数据总线地址总线
( b )
CE
& &
当进行输入时,由于数据保持时间比 CPU的处理时间长,
输入端必须用输入缓冲器与 CPU的数据总线相连 。 当 CPU执行输入指令时,I/O读信号 有效,来自输入设备的数据到达数据总线,传送给 CPU。 显然,CPU在执行输入指令时,要求外设的数据已经准备好,否则就会出错 。
当进行输出时,由于外设速度较慢,要求接口有锁存功能,
即 CPU送给外设的数据应该在接口中保持一段时间 。 当 CPU执行输出指令时,I/O 有效,CPU输出的信息经过数据总线进入输出锁存器,输出锁存器保持这个数据,直到外设取走该数据 。 显然,CPU在执行输出指令时,必须保证锁存器是空闲的 。
从以上分析可以看出,无条件传送是最简便的传送方式,
它所需的硬件和软件都较少 。
IOR
IOW
2,查询传送方式当 CPU与外设工作不同步时,很难确保 CPU在执行输入操作时,外设一定是,准备好,的;而在执行输出操作时,外设一定是,空闲,的 。 为保证数据传送的正确进行,可采用查询传送方式 。
利用查询方式输入数据之前,CPU要查询输入数据是否准备好;利用查询方式输出数据之前,CPU要查询输出设备是否空闲 。 只有确认外设已经具备了传送条件后,才能用 IN
和 OUT指令完成数据传送 。
与无条件传送方式相比,采用查询方式的接口电路要复杂些,因为它要提供 CPU查询的电路 。
(1) 查询式输入 。
图 6 - 5 所示为查询式输入的接口电路,该电路有两个端口寄存器,即状态口寄存器和数据口寄存器 。
当输入设备准备好数据之后,发出选通信号 。 它一方面把输入数据锁存到数据锁存器中,另一方面使状态标志触发器置 1。 状态标志是一位信号,通过缓冲器后,接到 CPU数据总线的某一位上,假设接至 D7位 。 CPU先读状态口,查询
D7是否为 1。 若 D7=1,表示输入数据已经准备好,再读数据口,取走输入数据,同时使状态标志触发器复位 。 图 6 - 6 所示为查询式输入数据的程序流程图 。
图 6- 5 查询式输入的接口电路输入装置锁存器数据选通信号
+ 5V
D
R
Q
缓冲器
( 1 )
数据三态缓冲器
( 8 )
R e a d y
状态信息去数据总线 DB
地址译码
I O / M
状态端口译码
I O / M
RD
RD
地址译码数据端口译码地址总线
&
&
图 6 – 6 查询式输入数据的流程图输入状态信息
N
R E A D Y?
输入数据
Y
SCAN,IN AL,
TEST AL,80H
JZ SCAN
IN AL,
(2) 查询式输出 。 图 6 - 7 所示为查询式输出接口电路,它的状态口和数据口合用一个地址 。
当前输出设备空闲时,状态标志触发器清 0。 CPU在输出数据之前,先读取状态信息 。 假设忙闲标志接至数据线 D0位,当
D0=0时,表示输出设备空闲,CPU再对数据口执行输出指令 。
图 6 – 7 查询式输出接口电路输出装置锁存器数据
+ 5V
D Q
数据总线
DB
地址译码器状态端口
WR
地址译码器输出数据端口地址总线
R
A C K
三态缓冲器
( 1 )
I O / M
" B U S Y "
RD
I O / M
去数据总线 DB
状态信息
" B U S Y "
&
&
数据口选中信号一方面把输出数据写入锁存器,一方面使状态标志触发器置 1,通知输出设备 。 当输出设备取走当前数据后,向接口发出确认信号 ACK,使状态标志触发器清 0,
表示输出设备空闲 。
图 6 - 8 为查询式输出数据的程序流程图 。
查询输出的程序段如下:
SCAN,IN AL,状态口地址;
TEST AL,01H ;
JNZ SCAN ; 忙,
MOV AL,
OUT 数据口地址,AL ;空闲,
图 6- 8 为查询式输出数据的程序流程图 。
读状态端口
Y
B U S Y?
读出数据
N
准备输出数据
6.2.2中断控制的输入 /
,也称中断传送方式,即当外设的输入数据准备好或接收数据的锁存器为空时,主动向
CPU发出中断请求,使 CPU中断原来执行的程序 (主程序 ),转去执行为外设服务的输入或输出操作,服务完毕,CPU再继续执行原来的程序 。
中断传送方式中,CPU和外设 (甚至多个外设 )可同时工作,
从而大大提高了 CPU的效率和控制程序执行的实时性 。
中断传送时的接口电路如图 6 - 9 所示 。 它有两个端口,即数据口和中断控制口,它们合用一个口地址 。
图 6 –9 中断传送方式接口电路输出装置锁存器数据中断类型码
+ 5V
D Q
三态缓冲器
I N T R
去数据总线
DB
地址总线选通装置中断允许
WR
地址译码器
I O / M
去数据总线 DB三态缓冲器
I N T A
( 中断响应信号)
&
&
当输入设备数据准备好后,发出选通信号,该信号把数据存入锁存器,同时使 D触发器置 1,发出中断请求 。 若中断是开放的,则 CPU接收中断请求信号,在现行指令执行完后,
暂停正在执行的程序,发出中断响应信号 。 由外设将一个中断矢量放到数据总线上,CPU就转入中断服务程序,完成读取或输出数据,同时清除中断请求标志 。 中断处理完毕后,
CPU返回被中断的程序继续执行 。
为了增强中断的灵活性,在中断传送方式的接口电路中,
常常设置中断允许触发器,该触发器受 CPU控制 。 当向端口写 01H时,中断允许触发器置 1,这样,如果输入设备数据准备好,接口就可以发出中断请求了 。 当向端口写入 00H时,
中断允许触发器清 0,禁止向 CPU提出中断请求 。
6.2.3直接存储器存取传送方式在中断传送方式中,是通过 CPU执行程序来实现数据传送的,故实际传送一个字节仍需要几十到几百微秒 。 这对于高速
I/O设备以及成组交换数据的情况 (例如磁盘与内存之间的信息交换 ),速度就显得太慢了 。 为此,设想采用硬件实现在外设与内存之间直接的数据传送,而不通过 CPU,这样,数据传送速度的上限就取决于存储器的工作速度 。 这种方式称为直接存储器存取 ( Direct Memory Access,简称 DMA) 。
DMA方式的数据交换不是由 CPU执行一段程序来完成的,
而是由硬件来实现的 。 数据交换过程由单独的 DMA控制器来控制,CPU不介入 。
实际上,CPU和 DMA控制器是共享一个存储器的两个独立的处理单元,只不过 DMA控制器是一个特别简单的处理单元,
且不受程序控制 。 当 DMA和 CPU同时要求访问内存而发生冲突时,为不丢失数据,通常赋于 DMA控制器以较高的优先权,以便及时响应高速设备所提出的数据传送请求,而推迟 CPU指令的执行 。 为实现这种传送方式而设计的专用控制芯片称为 DMA
控制器 ( DMAC),较常用的为 Intel 公司的 8237A。
6.3
6.3.1
当某件事件发生时,为了对该事件进行处理,CPU中止现行程序的执行,转去执行处理该事件的程序 (俗称中断处理程序或中断服务程序 ),待中断服务程序执行完毕,再返回断点继续执行原来的程序,这个过程称为中断 。 其过程如图 6 -
10 所示 。 以外设提出交换数据为例,当 CPU 执行主程序到第 K条指令时,外设如果提出交换数据的请求,CPU响应外设交换数据的请求,转入中断状态,执行中断服务程序 。 在完成中断服务后恢复原来程序,即从第 K+ 1条指令 (断点处 )
继续执行 。 这样,便产生了保护现场和恢复现场的要求 。
图 6 – 10 中断过程示意图中断处理主程序
K
K + 1
返回
N + m
所以当 CPU转入中断处理程序时,首先应保留中断时的断点地址 K+1和 CPU寄存器状态 (即保护现场 )。 一旦数据交换完毕,必须恢复现场,再返回到断点地址 K+1,继续执行原程序 。 中断处理程序的大致流程如图 6 - 11 所示 。
采用中断技术,能实现以下功能:
① 分时操作 。
计算机配上中断系统后,CPU就可以分时执行多个用户的程序和多道作业,使每个用户认为它正在独占系统 。 此外,
CPU可控制多个外设同时工作,并可及时得到服务处理,使各个外设一直处于有效工作状态,从而大大提高主机的使用效率 。
图 6 –11 中断处理流程保护现场为外设服务恢复现场
② 实时处理 。
当计算机用于实时控制时,计算机在现场测试和控制,
网络通信,人机对话时都会具有强烈的实时性,中断技术能确保对实时信号的处理 。 实时控制系统要求计算机为它们的服务是随机发生的,且时间性很强,要求做到近乎即时处理,
若没有中断系统是很难实现的 。
③ 故障处理 。
计算机运行过程中,往往会出现一些故障,如电源掉电,
存储器读出出错,运算溢出,还有非法指令,存储器超量装载,信息校验出错等等 。 尽管故障出现的概率较小,但是一旦出现故障将使整个系统瘫痪 。 有了中断系统后,当出现上述情况时,CPU就转去执行故障处理程序而不必停机 。 中断系统能在故障出现时发出中断信号,调用相应的处理程序,
将故障的危害降低到最低程度,并请求系统管理员排除故障 。
6.3.2
引起中断的原因或发出中断请求的来源,称为中断源 。
通常中断源有以下几种:
(1) 外部设备请求中断 。
一般的外部设备 (如键盘,打印机,A/D转换器等 )在完成自身的操作后,向 CPU发出中断请求,要求 CPU为它服务 。
(2) 故障强迫中断 。
计算机在一些关键部位都设有故障自动检测装置 。 如运算溢出,存储器读出出错,外部设备故障,电源掉电以及其它报警信号等,这些装置的报警信号都能使 CPU中断,进行相应的中断处理 。
(3) 实时时钟请求中断 。
在控制中常遇到定时检测和控制,为此常采用一个外部时钟电路 (可编程 )控制其时间间隔 。 需要定时时,CPU发命令使时钟电路开始工作,一旦到达规定的时间,时钟电路发出中断请求,由 CPU转去完成检测和控制等工作 。
(4) 数据通道中断 。
数据通道中断也称直接存储器存取 (DMA)操作,如磁盘,
磁带机或 CRT等直接与存贮器交换数据所要求的中断 。
(5) 程序自愿中断 。
CPU执行了特殊指令 (自陷指令 )或由硬件电路引起的中断是程序自愿中断,是指当用户调试程序时,程序自愿中断检查中间结果或寻找错误所在而采用的检查手段,如断点中断,
单步中断等 。
6.3.3中断分类按中断处理方式,中断可分为简单中断和程序中断 。 简单中断采用周期窃用的方法来执行中断服务,有时也称数据通道或
DMA。 程序中断不是窃用中央处理机的周期来进行中断处理,
而是中止现行程序的执行转去执行中断服务程序 。
按中断产生的方式,中断可分为自愿中断和强迫中断 。 自愿中断,即通过自陷指令引起的中断,或称软件中断,例如程序自愿中断 。 强迫中断,是一种随机发生的实时中断,例如外部设备请求中断,故障强迫中断,实时时钟请求中断,数据通道中断等 。
按引起中断事件所处的地点,中断可分为内部中断和外部中断 。 外部中断也称为外部硬件实时中断,它由来自 CPU某一引脚上的信号引起 。 内部中断也称软件指令中断,它是为了处理程序运行过程中发生的一些意外情况或调试程序而提供的中断 。
6.3.4
(1) 识别中断源 。
当 CPU响应外部设备的中断请求后,必须识别出是哪一台外设请求中断,然后再转入对应于该设备的中断服务程序 。
CPU识别请求中断设备的过程称为中断源的识别 。 利用程序来查询设备的请求中断状态,从而确认出应该服务的设备号,
并转入相应设备号的中断服务程序,这种方法称为软件查询技术识别中断源 。 CPU利用识别中断指令,可识别出硬件设备中排队优先的设备,并取回占有优先权的设备的编码 (或称设备地址 ),CPU根据设备地址转入相应的中断服务程序 。
(2) 中断优先权 。
一般而言,一个系统中有多个中断源 。 当某一时刻出现两个或多个中断源提出中断请求时,中断系统应能判别优先权最高的中断请求 。 在处理完优先权最高的中断请求后,再去响应其它较低优先级的中断请求 。 中断源的优先权是根据它们的重要性事先规定好的 。
(3) 中断嵌套 。
当 CPU响应某一中断源的请求,正在执行中断处理时,若有优先权级别更高的中断源发出中断申请,则 CPU要能中断正在执行的中断服务程序,响应高优先级中断 。 在高优先级中断处理完后再返回继续执行被中断的中断服务程序,即能实现中断处理程序的嵌套 。
如果一个系统中有三个中断源,优先权的安排为:中断 1
为最高,中断 3为最低,则中断处理如图 6 - 12 所示 。
(4) 中断与返回 。
当某一中断源发出中断请求时,CPU能决定是否响应该中断请求 。 若允许响应该中断请求,CPU必须在现行的指令执行完后,把断点处的 PC(即下一条应执行的指令地址 ),各个寄存器的内容和标志位的状态,压入堆栈保留下来 (称为保护断点和现场 )。 然后转到需要处理的中断源的服务程序入口,
同时清除中断请求触发器 。 中断处理完毕,再恢复被保留下来的各个寄存器和标志位的状态 (称为恢复现场 ),最后恢复
PC值 (称为恢复断点 ),使 CPU返回断点,继续执行主程序 。
图 6 – 12 中断嵌套示意图中断 3 请求
n
中断 3
服务程序
m
中断 2
服务程序
1
中断1
服务程序
I R E T
1 + 1
I R E T
中断 1 请求
m + 1
I R E T
n + 1
断点中断 2 请求主程序
6.3.5中断优先权如果系统中有多个中断源,就要考虑其优先权问题 。 通常,多个中断源的中断请求信号都是送到 CPU同一引脚上申请中断服务的,这就要求 CPU能识别出是哪些中断源在申请中断,同时比较它们的优先权,从而决定先响应哪一个中断源的中断请求 。 另外,当 CPU正在处理中断时,也可能要响应更高级的中断请求,并屏蔽同级或较低级的中断请求,这些都需要分清各中断源的优先权 。 有些微机系统中,中断源的优先级可以由用户根据轻重缓急安排,一般可采用软件优先级排队和硬件优先级排队两种方法 。
1.
软件优先级排队是指各个中断源的优先权由软件安排,
与硬件电路关系不大 。 图 6 - 13 所示电路是一种配合软件优先级排队使用的电路,图中各中断源的优先权不是由硬件电路安排,而是由软件安排的 。
图中若干个外设的中断请求信号相,或,后,送至 CPU
的中断接收引脚 ( 如 INTR) 。 这样,只要任一外设有中断请求,CPU便可响应中断 。 在中断服务子程序前可安排一段优先级的查询程序,即 CPU读取外设中断请求状态端口,然后根据预先确定的优先级级别逐位检测各外设的状态,若有中断请求就转到相应的处理程序入口 。 其流程如图 6 - 14 所示 。
图 6 –13 软件优先级排队电路三态缓冲器
D
0
D
7
…
1
2
OC 门
I N T R 4 3
+ 5V R
2
1
OC 门
0 # 外设
7 # 外设
…
端口地址
1
1
1
图 6 –14 软件优先权查询流程图保留现场
A 申请服务?
B 申请服务?
C 申请服务?
恢复现场
外设 A 中断服务程序外设 B 中断服务程序外设 C 中断服务程序
Y
Y
Y
N
查询的顺序反映了各个中断源的优先权的高低 。 显然,
最先查询的外设,其优先权级别最高 。 这种方法的优点是节省硬件,优先权安排灵活;缺点是查询需要耗费时间,在中断源较多的情况下,查询程序较长,可能影响中断响应的实时性 。
2.
硬件优先级排队是指利用专门的硬件电路或中断控制器对系统中各中断源的优先权进行安排 。
(1) 硬件优先级排队电路 。
链式优先权排队电路是一种简单的中断优先权硬件排队电路,如图 6 - 15 所示 。 采用该方法时,每个外设对应的接口上连接一个逻辑电路,这些逻辑电路构成一个链,称为菊花链,由该菊花链来控制中断响应信号的通路 。
图 6 - 15
(a) 菊花链; (b) 菊花链逻辑电路设备 1
接口
C P U 以及总线控制逻辑
I N T A
I N T R
中断回答菊花链逻辑电路中断请求设备 2
接口菊花链逻辑电路设备 3
接口菊花链逻辑电路
( a )
三态缓冲器去数据总线 DB
中断类型码
1 无
0 有中断回答菊花链逻辑电路
I N T A
I N T R
中断请求
1 有
0 无
1 封锁后一级
0 开放后一级
( b )
1 1 1
1
1
≥1
≥1
1
从图 6 - 15 中可以看到,当一个外设有中断请求时,
CPU如果允许中断,则会发出 信号 。 如果链条前端的外设没有发出中断请求信号,那么这级中断逻辑电路就会允许中断响应信号 原封不动地往后传递,一直传到发出中断请求的外设; 如果某一外设发出了中断请求,那么本级的中断逻辑电路就对后面的中断逻辑电路实现阻塞,使 信号不再传到后面的外设 。 因而菊花链电路各个外设的中断优先权就由其在链中的位置决定,处于菊花链前端的比处于后端的优先级高 。 当某一外设收到中断响应信号后,就控制有关电路送出中断类型码,从而执行相应的中断服务程序 。
INTA
INTA
INTA
当多个外设同时发出中断请求信号时,根据电路分析可知,处于链头的外设先得到中断响应,而排在菊花链中较后位置的外设就收不到中断响应信号,因而暂时不会被处理 。
若 CPU正执行某个中断处理子程序,又有级别较高的外设提出中断请求,由于菊花链电路中级别低的外设不能封锁级别高的外设得到中断响应信号,故可响应该中断请求,从而发生中断嵌套现象 。
(2) 可编程中断控制器 。
采用可编程中断控制器是当前微型计算机系统中解决中断优先权管理的常用方法 。 通常,中断控制器包括下列部件:
中断优先权管理电路,中断请求锁存器,中断类型寄存器,
当前中断服务寄存器以及中断屏蔽寄存器等 。
其中,中断优先权管理电路用来对所处理的各个中断源进行优先权判断,并根据具体情况预先设置优先权 。 实际上,
中断控制器也可以认为是一种接口,外设提出的中断请求经该环节处理后,再决定是否向 CPU传送,CPU接受中断请求后的中断响应信号也送给该环节处理,以便得到相应的中断类型码 。
6.4.1
Intel 80X86系列微机有一个灵活的中断系统,可以处理
256个不同的中断源,每个中断源都有相应的中断类型码
( 0~255) 供 CPU识别 。 中断源可以来自 CPU外部,也可以来自 CPU内部,可分成两大类:硬件中断和软件中断,如图 6 -
16 所示 。 80386以上高档微处理器工作于保护方式时的中断情况与 8086/8088稍有不同 。
1.
硬件中断是由外部硬件产生的,又称为外部中断 。
8086/8088为外部设备提供了两条硬件中断信号线,即 NMI和
INTR,分别接收非屏蔽中断和可屏蔽中断请求信号 。
6.4 80X86/Pentium中断图 6- 16 8086/8088中断分类
I N T n 指令( 软件中断)
中断逻辑
I N T 3
指令
I N T O
指令单步中断除数为
0 中断非屏蔽中断请求中断控制系统
( 8 2 5 9 A )
硬件中断可屏蔽中断请求
N M I
I N T R
…
(1) 非屏蔽中断 。
由 NMI引脚出现中断请求信号 CPU产生的中断称为非屏蔽中断请求,它不受中断允许标志 IF的限制,其中断类型码为 2。 当 NMI引脚上出现上升沿触发时,表示非屏蔽中断请求信号有效,CPU内部会把该信号锁存起来,但要求该信号的有效电平持续 2个时钟周期以上 。 CPU接收到非屏蔽中断请求信号后,不管当前正在做什么事,都会在执行完当前指令后立即响应中断请求而进入相应的中断处理 。 在实际系统中,
非屏蔽中断通常用来处理系统中出现的重大事故和紧急情况,
如系统掉电处理,紧急停机处理等 。 在 IBM PC系列微机中,
若系统板上存储器产生奇偶校验错或 I/O通道上产生奇偶校验错或 Intel 8087/80287产生异常都会引起一个 NMI中断 。
(2) 可屏蔽中断 。
一般外部设备提出的中断请求是从 CPU的 INTR引脚上引入的,所产生的中断为可屏蔽中断 。 INTR信号是高电平触发的,与内部中断和非屏蔽中断相比,可屏蔽中断受中断标志 IF
的影响 。 只有在 IF=1的情况下,CPU才会在执行当前指令后响应可屏蔽中断请求信号,所以,即使 INTR信号有效,也必须保持到当前指令执行结束 。 如果 IF=0,即使中断源有中断请求,
CPU也不会响应,也称为中断被屏蔽 。 IBM PC系列微机中,
通常外部设备提出的中断请求信号首先通过中断控制器 8259A
预处理后,再决定是否向 CPU的 INTR引脚提出中断请求 。 系统中可屏蔽中断可以有一个或多个,CPU响应可屏蔽中断请求后,引脚送出两个负脉冲,并配合有关电路获得与中断源对应的中断类型码 。
INTA
2,软件中断软件中断是 CPU根据软件的某条指令或者软件对标志寄存器的某个标志位的设置而产生的,由于它与外部硬件电路完全无关,故也称为内部中断 。 在 80X86系统中,内部中断主要有以下几种:
(1) 除法出错中断 ——0型中断 。
当执行除法指令时,若发现除数为 0或商超过了机器所能表达数的范围,则立即产生一个中断类型码为 0的内部中断,
该中断称为除法出错中断 。 一般该中断的服务处理都由操作系统安排 。
(2) 单步中断 ——1型中断 。
若 TF=1,则 CPU处于单步工作方式,即每执行完一条指令之后就自动产生一个中断类型码为 1的内部中断,使得指令的执行成为单步执行方式 。
单步执行方式为系统提供了一种方便的调试手段,成为能够逐条指令地观察系统操作的一个窗口 。 如 DEBUG中的跟踪命令,就是将标志 TF置 1,进而去执行一个单步中断服务程序,
以跟踪程序的具体执行过程,找出程序中的问题或错误所在 。
需要说明的是,在所有类型的中断处理过程中,CPU会自动地把状态标志压入堆栈,然后清除 TF和 IF。 因此当 CPU进入单步处理程序时,就不再处于单步工作方式,而以正常方式工作 。
只有在单步处理结束后,从堆栈中弹出原来的标志,才使 CPU
返回到单步工作方式 。
80X86指令系统中没有设置或清除 TF标志的指令。
但指令系统中的 PUSHF和 POPF为程序员提供了置位或复位 TF的手段 。 例如,若 TF=0,下列指令序列可使 TF
(3) 溢出中断 ——4型中断 。
若算法操作结果产生溢出 ( OF=1),则执行 INTO指令后立即产生一个中断类型码为 4的中断 。 4型中断为程序员提供了一种处理算术运算出现溢出的手段,它通常和算术指令功能配合使用 。
PUSHF
POP AX
OR AX,0100H
PUSH AX
POPF
(4) 指令中断 ——n型中断 。
在指令系统中,介绍了中断指令 INTn,这种指令的执行也会引起内部中断,其中断类型码由指令中的 n指定 。 该指令就称为软中断指令,通常指令的代码为两个字节代码,第一字节为操作码,第二字节为中断类型码 。 但是中断类型码为 3的软中断指令却是单字节指令,因而它能很方便地插入到程序的任何地方,专供在程序中设置断点调试程序时使用,也称为断点中断 。 插入 INT3指令之处便是断点,在断点中断服务程序中,
可显示有关的寄存器,存储单元的内容,以便程序员分析到断点为止程序运行是否正确 。
还需指出,内部中断的类型码是预定好的或包含在软中断指令中,除单步中断外,其他的内部中断不受状态标志影响,中断后的服务处理须由用户自行安排 。
6.4.2中断向量表在 80X86中断系统中,无论是外部中断还是内部中断,系统都分配给每一个中断源一个确定的中断类型码,其长度为一个字节,故系统中最多允许有 256个中断源 ( 其对应类型码为
0~255) 。 那么,80X86CPU在响应中断后,是如何转入各个中断服务程序的呢?
所谓中断向量,实际上就是中断处理子程序的入口地址 。
通常在内存的最低 1 KB( 00000H~003FFH) 建立一个中断向量表,分成 256个组,每组占 4个字节,用以存放 256个中断向量 。 每个中断向量占 4个字节,其中前 2个字节存放中断处理子程序的入口地址的偏移量 ( IP,16位 ),后 2个字节存放中断处理子程序入口地址的段地址 ( CS,16位 ) 。 按照中断类型码的序号,对应的中断向量在中断向量表中按规则顺序排列,
如图 6 - 17所示 。
图 6 –17 中断向量表类型 0 中断入口( 除法出错)
类型 1 中断入口( 单步中断)
类型 2 中断入口( N M I)
类型 3 中断入口( 断点中断)
类型 4 中断入口( 溢出中断)
类型 5 中断入口类型 3 1 中断入口类型 3 2 中断入口类型 2 5 5中断入口
……
……
15 8 7 0
0 0 0
0 0 4
0 0 8
0 0 C
0 1 0
0 1 4
0 7 F
0 8 0
3 F C
供用户使用系统备用专用中断
IP
CS
IP
CS
IP
CS
图中前 5个中断类型是 80X86规定的专用中断,有着固定的意义和处理功能;类型码 5~31为系统使用或保留;类型码
32~255可以由用户自行使用 。 但是,在一种具体的微机系统中,可能对用户可使用的中断类型码另有规定,如 PC/AT中断类型码 70H~77H就已有安排,所以用户在进行系统开发和应用时应注意 。
中断类型码与中断向量在向量表中的位置之间的对应关系为:
中断向量地址指针 =4×
例如,中断类型码为 20H的中断源对应的中断向量存放在 0000,0080H( 4× 20H=80H) 开始的 4个单元中 。
如果在 00080H~00083H这 4个单元中存放的值分别为 10H、
20H,30H,40H,那么,在该系统中,20H号中断所对应的中断向量即中断处理程序的入口地址为 4030H,2010H。
又如,一个系统中对应于中断类型码为 17H的中断处理子程序存放在 1234,5670H开始的内存区域中,则对应于
17H类型码的中断向量存放在 0000,005CH( 4× 17H=5C) 开始的 4个字节中 。 所以 0段的 005CH~005FH这 4个单元中的值分别为 70H,56H,34H,12H。
6.4.3
80X86中的各种中断响应和处理过程是不相同的,其主要区别在于如何获取相应的中断类型码 。
1.
对于专用中断,中断类型码是自动形成的,而对于 INT n
指令,其类型码即为指令中给定的 n。 在取得了类型码后的处理过程如下:
① 把类型码乘 4,作为中断向量表的指针 。
② 把 CPU的标志寄存器入栈,保护各个标志位 。
③ 清除 IF和 TF标志,屏蔽新的 INTR中断和单步中断 。
④ 保存断点,即把断点处的 IP和 CS值压入堆栈,先压入
CS值,再压入 IP值 。
⑤ 从中断向量表中取中断服务程序的入口地址,分别送至 CS和 IP中 。
⑥ 按新的地址指针执行中断服务程序 。
在中断服务程序中,通常要保护现场,进行相应的中断处理,恢复现场,最后执行中断返回指令 IRET。 IRET的执行将使 CPU按次序恢复断点处的 IP和 CS值以及标志寄存器,
于是程序就恢复到断点处继续执行 。
内部中断有以下特点:
① 中断由 CPU内部引起,中断类型码的获得与外部无关,
CPU不需要执行中断响应周期去获得中断类型码 。
② 除单步中断外,内部中断无法用软件禁止,不受中断允许标志位的影响 。
③ 内部中断没有随机性,这一点与调用子程序非常相似 。
2,外部中断响应过程
(1) 非屏蔽中断响应 。 当 CPU采样到非屏蔽中断请求时,
自动提供中断类型码 2,然后根据中断类型码查到中断向量表指针,其后的中断处理过程与内部中断一样 。
(2) 可屏蔽中断响应 。
当 INTR信号有效时,如果中断允许标志 IF=1,则 CPU就会在当前指令执行完毕,响应外部的中断请求,转入中断响应周期 。
中断响应周期有 2个,每个响应周期都由 4个 T状态组成 。
CPU在每个响应周期都从 引脚上发一个负脉冲的中断响应信号 。 中断响应的第一个总线周期用来通知请求中断的外设,CPU准备响应中断,现在应该准备好中断类型码;在第二个总线响应周期中,要求请求中断的外设在接到第二个负脉冲以后 ( 第二个中断响应周期的 T3状态前 ),立即把中断类型码通过数据总线传送给 CPU。 CPU在 T4状态的前沿采样数据总线,获取中断类型码 。 如图 6 - 18 所示 。 其后的中断响应过程和内部中断一样 。
INTA
图 6 –18 中断响应总线周期
T
1
T
2
T
3
T
4
T
I
T
I
T
I
T
1
T
2
T
3
T
4
中断类型AD
7
~ A D
0
I N T A
A L E
空闲状态
C L K
当一个可屏蔽中断被响应时 CPU实际执行的总线周期有 7
个 。 即:
① 执行 2个中断响应总线周期,CPU获得相应的中断类型码,将它左移 2位形成中断向量表指针,存入暂存器 。
② 执行 1个写总线周期,把标志寄存器 FR的内容压入堆栈 。
同时,置中断允许标志 IF和单步标志 TF为 0,以禁止中断响应过程中其他可屏蔽中断的进入,同时也禁止了中断处理过程中出现单步中断 。
③ 执行 2个写总线周期,把断点地址的内容压入堆栈 。
④ 执行 1个读总线周期,从中断向量表中取出中断处理子程序入口地址的偏移量送到 IP寄存器中 。
⑤ 执行 1个读总线周期,从中断向量表中取出中断处理子程序入口地址的段基地址送到 CS寄存器中 。
(3) 中断优先权 。 图 6 - 19 所示的是 80X86中断响应和处理流程 。
所有中断都是在当前指令结束后处理的,在 80X86系统中各种中断源的优先权实际上是指被识别出来的先后 。 在当前指令执行完后 CPU首先自动查询在指令执行过程中是否有除法出错中断,溢出中断和 INT n中断发生,然后查询 NMI和
INTR,最后查询单步中断,先查询到的先被响应 。
图 6 – 19 80X86中断响应和处理流程当前指令执行结束软件中断?
Y
N M I?
I N T R?
形成中断类型码
I F = 1?
T F = 1?
执行下一条指令
N
进入中断响应取中断类型码形成中断类型码标志寄存器入栈令 T E M P = TF
清 IF 和 TF
CS,IP 入栈调用中断处理程序又有
N M I?
T E M P = 1?
执行中断处理程序
IP,CS 出栈标志寄存器出栈返回被中断的主程序
IR ET
N
N
Y
Y
Y Y
N
Y
N
Y
Y
N
N
6.4.4 IBM PC/AT中断分配在 IBM PC系列微机中,中断向量表是由 DOS操作系统在启动时建立的,用户可以修改以便增加功能 。 尽管不同档次的微机硬件配置不同,使用 DOS的版本不同,但中断向量表定义的功能基本相同 。 表 6 - 1 给出了中断分配表 。
6.4.5
1.
80386/80486及 Pentium等高档微处理器不仅具有前面讲到的所有中断类型,而且大大丰富了内部中断的功能,把许多执行指令过程中产生的错误情况也纳入了中断处理的范围,这类中断称为异常中断,简称异常 ( Exception) 。 有时也将软中断指令 INT n纳入异常中断的范围 。 异常分为三类:失效 (Faults)、
陷阱 (Traps)和中止 ( Abort) 。 三类异常的差别表现在两个方面,一是发生异常的报告方式,二是异常中断服务程序的返回方式 。
失效:若某条指令在启动之后,真正执行之前被检测到异常,产生异常中断,而且在中断服务完成后返回该指令,重新启动并执行完成,这类异常就是失效 。
例如,在读虚拟存储器时,首先产生存储器页失效或段失效,此时中断服务程序立即按被访问的页或段将虚拟存储器的内容从磁盘上转移到物理内存中,然后再返回主程序中重新执行这条指令,程序正常执行下去 。
陷阱:产生陷阱的指令在执行后才被报告,且其中断服务程序完成后返回到主程序中的下一条指令 。 例如用户自定义的中断指令 INT n就属于此类型 。
中止:该类异常发生后无法确定造成异常指令的实际位置,
例如硬件错误或系统表格中的错误值造成的异常 。 在此情况下原来的程序已无法执行,因此中断服务程序往往重新启动操作系统并重建系统表格 。
2.
为了管理各种中断,80386/80486和 Pentium等高档微处理器都设立了一个中断描述符表 IDT( Interrupt Descriptor Table) 。
表中最多可包含 256个描述符项,对应 256个中断或异常 。 描述符中包含了各个中断服务程序入口地址的信息 。 当
80386/80486等高档微处理器工作于实地址方式时,系统的 IDT
变为 80386/80486系统中的中断向量表,存于系统物理存储器的最低地址区中,共 1 KB。 每个中断向量占 4 个字节,即 2
个字节的 CS值和 2个字节的 IP值 。
当高档微处理器工作于保护方式时,系统的 IDT可以置于内存的任意区域,其起始地址存放在 CPU内部的 IDT基址寄存器中 。
有了这个起始地址,再根据中断或异常的类型码,即可取到相应的描述符项 。 每个描述符项占 8个字节,其中包括 2
个字节的选择器和 4 个字节的偏移量,这 6个字节共同决定了中断服务程序的入口地址;其余 2个字节存放类型值等说明信息 。 得到中断服务程序的入口地址便可进行相应的中断处理 。
6.5 可编程中断控制器为了使多个外部中断源共享中断资源,必须解决几个问题 。
例如,若微处理器只有一根中断请求输入线,就无法同时处理多个中断源发出的中断请求信号;另外,如何区分中断矢量,
各中断源的的优先级别如何判定等问题,也需要解决 。 这就需要有一个专门的控制电路在微处理器的控制下去管理那些中断源并处理它们发出的中断请求信号 。 这种专门管理中断源的控制电路就是中断控制器 。 可编程中断控制器 8259A就是为这个目的设计的中断优先级管理电路 。 它具有如下功能,
① 它可以接收多个外部中断源的中断请求,并进行优先级别判断,选中当前优先级别最高的中断请求,再将此请求送到微处理器的中断输入端 。
② 具有提供中断向量,屏蔽中断输入等功能 。
③ 可用于管理 8级优先权中断,也可将多片 8259A通过级连方式构成最多可达 64级优先权中断管理系统 。 8259A管理的
8级中断对应的服务程序入口地址构成的中断向量表存放在内存固定区域 。
④ 具有多种工作方式,自动提供中断服务程序入口地址,
使用灵活方便 。
6.5.1 8259A
1,8259A的引脚说明
8259A为 28脚双列直插式封装器件,管脚分配如图 6 -
20 所示。
D0~ D7:双向数据线,用来与 CPU交换数据。
INT:中断请求,输出信号,由 8259A传给 CPU,或由从
8259A传给主 8259A。
:中断响应,输入信号,来自 CPU。
IR0~ IR7:中断请求输入,由外设传给 8259A。 8259A规定的中断优先级顺序为 IR0> IR1> … > IR7。
INTA
图 6 – 20 8259A的外部引脚
CS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
28
27
26
25
24
23
22
21
20
19
18
17
16
15
WR
RD
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
C A S
0
C A S
1
V
CC
A
0
I N T A
IR
7
IR
6
IR
5
IR
4
IR
3
IR
2
IR
1
IR
0
I N T
S P / E N
C A S
2
G N D
IR0~ IR7:中断请求输入,由外设传给 8259A。 8259A规定的中断优先级顺序为 IR0> IR1> … > IR7。
CAS0~ CAS2:级连信号 。 对于主片,这三个信号是输出信号,根据它们的不同组合 000~ 111,分别确定连在哪个
IRi上的从片工作 。 对于从片,这三个信号是输入信号,以此判别本从片是否被选中 。
/,从设备编程 /允许缓冲器,双向 。 作输入信号使用时,即为,作为主设备与从设备的选择控制信号,=1时,该 8259A作为主片; 当 =0时,该
8259A作为从片 。 作输出信号使用时,即为,作为允许缓冲器接收发送的控制信号 。
SP EN
SP
EN EN
EN
A0,内部寄存器选择控制信号,输入信号 。 8259A规定,
当 A0=0时,对应的寄存器为 ICW1,OCW2和 OCW3;当 A0=1时,
对应的寄存器为 ICW2~ ICW4和 OCW1。
,片选信号,输入信号 。 一般来自地址译码器的输出 。
,读允许信号,输入 。 来自 CPU 。
,写允许信号,输入 。 来自 CPU 。
2.
图 6 - 21为 8259A的内部结构和逻辑框图 。 8259A由八个部分构成,它们是中断服务寄存器,中断优先权判断器,中断屏蔽寄存器,中断请求寄存器,中断控制逻辑,数据总线缓冲器,级连缓冲器 /比较器和读 /写控制逻辑 。
CS
RD
WR
IOR
IOW
图 6 – 21 8259A的内部结构控制电路内部控制逻辑初始化命令寄存器组操作命令寄存器组
I N T I N T A
中断服务寄存器
I S R
中断优先级判断器中断请求寄存器
I R R
IR
0
IR
1
IR
2
IR
3
IR
4
IR
5
IR
6
IR
7
中断屏蔽寄存器 I M R
内部数据总线级连缓冲器比较器
C A S
2
C A S
1
C A S
0
S P / E N
读写控制逻辑
RD
WR
A
0
CS
数据总线缓冲
D
7
~ D
0
8 8
(1) 中断请求寄存器 IRR( Interrupt Request Register) 。
IRR是一个 8位寄存器,用来接收来自 IR0~ IR7上的中断请求信号,并将 IRR相应位置位 。 外设产生中断请求信号的方式有边沿触发方式和电平触发方式,用户可根据需要通过编程进行设置 。
(2) 中断服务寄存器 ISR( Interrupt Service Register) 。
ISR是一个 8位寄存器,用来存放当前正在处理的中断请求 。
在中断嵌套方式下,可以将其内容与新进入的中断请求进行优先级比较,从而决定是否进行嵌套 。
(3) 中断屏蔽寄存器 IMR( Interrupt Mask Register) 。
IMR是 8位寄存器,用来存放中断屏蔽字,可由用户通过编程进行设置 。
当 IMR的第 i位置位时,来自 IRi的中断请求被屏蔽了,从而禁止来自 IRi的中断 。 因此用户设置 IMR的各位后,可以改变系统原来的中断优先级 。
(4) 中断优先权判断器 。
在中断响应期间,可以根据控制逻辑规定的优先权级别和
IMR的内容,把 IRR中提出中断的优先权最高的中断请求位送 ISR。
(5) 数据总线缓冲器 。
数据总线缓冲器是一个 8位三态双向缓冲器,是 8259A与局部总线的接口 。 微处理器通过它向 8259A传送命令字,控制 8259A的工作模式,同时也接收 8259A传送的工作信息及中断向量 。
(6) 控制逻辑 。
在 8259A的控制逻辑电路中,有一组初始化命令寄存器
(ICW1~ ICW4)和一组操作命令字寄存器 (OCW1~ OCW3),这 7
个寄存器可由用户根据需要通过编程进行设置,控制逻辑电路可以根据程序来管理 8259A的全部工作 。
(7) 读 /写控制逻辑 。
读 /,,
的控制下,控制着 8259A的数据总线缓冲器之间的信息传送,控制逻辑如表 6 - 2 所示 。 它把微处理器送来的命令字传送到 8259A中相应的命令寄存器中 (包括初始化命令字 ICW1、
ICW2,ICW3,ICW4 和操作控制字 OCW1,OCW2,OCW3、
OCW4),再把 8259A中相应的控制器 /寄存器中的内容 (IRR、
ISR,IMR)输出到数据总线上 。
CS
IOR )(RD )()( WRIOW
(8) 级连缓冲器 /比较器 。
级连缓冲器 /比较器用来存放和比较系统中全部 8259A的标记 IDS。 这个标记是微处理器通过数据总线送入 8259A的 。
所有的 8259A通过级连线 CAS0 ~ CAS2 三条 I/O外线实现互连 。
其中必须有一个 8259A为主片,其余的 8259A为从片 。 主片通过 CAS0~ CAS2 输出标记信息,而从片通过这三条线输入标记信息,并与自己原有的标记进行比较,如果相同则该从片被主片选中,它就在中断响应周期把自己的中断向量送到数据总线上 。
6.5.2 8259A
8259A同微处理器之间,除了提出中断申请外,还要通过 8位数据线传送数据和命令,把 8位的数据总线用作输入,
输出端口,由微处理器对 8259A写入命令,设置其工作状态,
或者由微处理器对 8259A的状态寄存器进行读出 。 这时,与一般的输入 /输出设备一样,,A0,等信号进行控制,表 6 - 2 列出了对寄存器访问的控制方法 。 在利用数据总线传送中断向量时,由来自微处理器的 信号控制,
与作为 I/O,A0,等无关 。
请求中断处理的设备通过 8259A的中断请求输入线送出高电平或者正脉冲,提出中断请求 。 8259A的 IR输入一旦变成高电平,在 IRR内与这个输入相对应的位被置 1。 下面主要介绍单个 8259A工作 (即 8259A作为主片 )时进入中断处理的过程:
CS RD WR
CS RD WR
INTA
① 当一条或多条中断请求线 (IR0~ IR7)变成高电平时,设置相应的 IRR位 。
② 在 8259A判断了中断优先权和中断屏蔽寄存器的状态后,
如果条件合适,就向微处理器发出高电平信号 INT,请求中断服务 。
③ 微处理器接到中断请求信号后,如果满足条件,则响应中断,输出回答信号为 引脚上的两个负脉冲 。
④ 8259A接到来自微处理器的第一个 脉冲时,把允许中断的最高优先级请求位置入 ISR,并把 IRR中相应的位复位 。 同时,8259A准备向数据总线发送中断向量 。
INTA
INTA
6.5.3 8259A的工作方式
8259A具有非常灵活的中断管理方式,可满足用户各种不同要求,并且这些工作方式都可以通过编程来设置 。 但是,
由于工作方式多,使用户感到 8259A的编程和使用不太容易掌握 。 为此,在讲述 8259A的编程之前,我们先对 8259A的工作方式分类进行简明的介绍 。
1.
按照优先权设置方法来分,8259A有以下两种工作方式,
(1) 普通全嵌套方式 。
普通全嵌套方式是 8259A最常用的工作方式,简称为全嵌套方式 。 该方式下中断优先权是固定的,即 IR0优先权最高,
IR1优先权最低 。 当 CPU响应中断时,8259A就把申请中断的优先权最高的中断源在 ISR中的相应位置,1”,而且把它的中断类型码送到数据总线上 。
在此中断源的中断服务程序完成之前,与它同级或优先权更低的中断源的申请就被屏蔽,只有优先权比它高的中断源的申请才是允许的 ( 当然,CPU是否响应取决于 CPU是否处在开中断状态 ) 。
(2) 特殊全嵌套方式 。
特殊全嵌套方式和普通全嵌套方式只有一点不同,在特殊全嵌套方式下,当处理某一级中断时,如果有同级的中断请求,
那么也会给予响应,从而实现一种对同级中断请求的特殊嵌套 。
特殊全嵌套方式一般用在 8259A级连系统中 。 在这种情况下,主片 8259A编程为特殊全嵌套方式 。 这样,当来自某一从片的中断请求正在处理时,一方面,和普通全嵌套方式一样,
对来自优先级较高的主片其他引脚上的中断请求进行开放;另一方面,对来自同一从片的较高优先级请求也会开放 。
另外,在特殊全嵌套方式中,中断结束的操作应注意须用软件检查刚结束的中断是否是从片的唯一中断 。 其方法是:
先向从片发一正常结束中断命令 EOI( End of Interrupt),然后读 ISR内容 。 若为 0表示只有一个中断服务,这时再向主片发一个 EOI命令;否则,说明该从片有两个以上中断,则不应发给主片 EOI命令,待该从片中断服务全部结束后,再发送
EOI命令给主片 。
2.
在实际应用中,中断源的优先权情况是比较复杂的,不一定有明显的等级,而且优先权还可能改变 。 所以,不能总是规定 IR0优先权最高,IR7优先权最低,而要根据实际情况来处理 。 故 8259A设计了两种改变优先权的方法,
(1) 自动循环方式 。
在优先权自动循环方式中,优先级队列是在变化的 。 一个设备受到中断服务以后,它的优先级自动降为最低,原来比它低一级的中断则为最高级,依次排列 。 如初始优先级队列规定为 IR0,IR1,IR2,…,IR7。 此时,若 IR4请求中断,则处理 IR4,
在 IR4被服务以后,IR4自动左循环到最低优先级,IR5 成为最高优先级,这时中断源的优先级依次为 IR5,IR6,IR7,IR0、
IR1,IR2,IR3,IR4。 这种方式一般用在系统中多个中断源优先级相同的场合 。
(2) 特殊循环方式 。
特殊循环方式与优先权自动循环方式只有一点不同,在优先权特殊循环方式中,可以编程写 OCW2来设置当前的中断优先级顺序 。 例如,确定 IR5为最低优先级,那么当前的优先级顺序为 IR6,IR7,IR0,…,IR5。
3.
我们知道,不管用哪种优先权方式工作,当一个中断请求得到响应时,8259A都会将中断服务寄存器 ISR中相应位置
,1”,为以后中断优先权电路的工作提供依据 。 当中断服务程序结束时,必须使该 ISR位清零;否则,8259A的中断控制功能就会不正常 。 这个使 ISR位复位的动作就是中断结束处理 。
注意,这里的中断结束是指 8259A结束中断的处理,而不是
CPU结束执行中断服务程序 。
8259A分自动中断结束方式和非自动中断结束方式,而非自动中断结束方式又分为普通 ( 或称一般,正常 ) 中断结束方式和特殊中断结束方式 。
(1) 自动中断结束方式 ( AEOI) 。
若采用该方式,信号的后沿,8259A将自动把中断服务寄存器 ISR中的对应位清除 。 这样,尽管系统正在为某个设备进行中断服务,但对 8259A来说,
中断服务寄存器中却没有对应位作指示,所以,就好像已经结束了中断服务一样 。 这种最简单的中断结束方式,只能用于不要求中断嵌套的情况 。
INTA
(2) 普通中断结束方式 。
这种方式配合全嵌套优先权工作方式使用 。 当 CPU用输出指令向 8259A发出普通中断结束 EOI时,8259A就会把 ISR中已置位的最高位复位,因为在全嵌套方式中,置 1的最高 ISR
位对应了最后一次被响应和被处理的中断,也就是当前正在处理的中断,所以,最高 ISR位复位相当于结束了当前正在处理的中断 。
(3) 特殊中断结束方式 ( SEOI) 。
在非全嵌套方式下,由于中断优先级不断改变,无法确知当前正在处理的是哪级中断,这时就要采用特殊中断结束方式 。 采用这种方式反映在程序中就是要发一条特殊中断结束命令,在这个命令中指出了要清除哪个 ISR位 。
这里,我们还要指出一点,不管是普通中断结束方式,
还是特殊中断结束方式,对于级连系统的从片在一个中断服务程序结束时,都必须发两次中断结束命令,一次是对主片发送的,一次则是对从片发送的 。
4.
8259A的 8个中断请求都可根据需要单独屏蔽,屏蔽是通过编程使得屏蔽寄存器 IMR相应位清,0”或置,1”,从而允许或禁止相应中断 。 8259A有两种屏蔽方式 。
(1) 普通屏蔽方式 。
普通屏蔽方式中,将 IMR某位置,1”,则它对应的中断就被屏蔽,从而使这个中断请求不能从 8259A送到 CPU。 如果该位清,0”,则允许该级中断 。
(2) 特殊屏蔽方式 。
有些情况下,希望一个中断服务程序能动态地改变系统的优先权结构 。 例如,在执行中断服务程序某一部分时,希望禁止较低级的中断请求;但在执行中断服务程序的另一部分时,又希望能够开放比本身的优先级低的中断 。
为达到这样的目的,我们自然会想到使屏蔽寄存器的对应位置 1,使本级中断受到屏蔽 。 这样,便可以为开放较低级中断请求提供可能 。 但是这样做有一个问题:每当一个中断请求被响应时,就会使 ISR对应位置 1,所以只要没有发出
EOI命令,8259A就会据此而禁止所有优先级比它低的中断 。
因此,尽管使当前处理的较高级的中断请求被屏蔽,但由于
ISR位未被复位,较低级的中断请求在发出 EOI命令之前仍不会得到响应 。
为此,在设置了特殊屏蔽方式后,再编程使 IMR某位置位,
就会同时使 ISR的对应位复位 。 这样,就不只是屏蔽当前正在处理的这级中断,而且还真正开放了其他级别较低的中断 。
当然未被屏蔽的更高级中断也可以得到响应 。
5.
外设的中断请求信号从 8259A的引脚 IRn引入,但根据实际工作需要,8259A
(1) 边沿触发方式 。
在边沿触发方式下,8259A的引脚 IRn上出现上升沿,表示有中断请求,高电平不表示有中断请求 。
(2) 电平触发方式。
在电平触发方式下,8259A的引脚 IRn上出现高电平,表示有中断请求。这种方式下,应注意及时撤除高电平,否则可能引起不应该有的第二次中断。
无论是边沿触发还是电平触发,中断请求信号 IR都应维持足够的宽度。即在第一个中断响应信号 结束之前,IR都必须保持高电平,如果 IR信号提前变为低电平,8259A会自动假设这个中断请求来自引脚 IR7。这种办法能够有效地防止由 IR输入端上严重的噪声尖峰而产生的中断。
INTA
为实现这一点,对应 IR7的中断服务程序可只执行一条返回指令,从而滤除这种中断 。 如果 IR7另有它用,仍可通过读 ISR
状态而识别非正常的 IR7中断 。 因为,正常的 IR7中断会使相应的
ISR位置,1”,而非正常 IR7中断则不会使 ISR的 D7位置,1”。
6.5.48259A的状态设定
8259A根据接收到的微处理器的命令进行工作 。 微处理器的命令分为两类:一类是初始化命令,称为初始化命令字
(ICW)。 8259A在进入操作之前,必须由初始化命令字来使它处于初始状态 。 另一类是操作命令,称为操作控制字 (OCW)。
在对 8259A进行初始化之后,用这些控制字来控制 8259A执行不同的操作方式 。 操作控制字可在初始化后的任何时刻写入
8259A。
1.
8259A有 4个初始化命令字 ICW1~ ICW4,它们按照一定的顺序送入,设置 8259A的初始状态 。 无论何时,当微处理器向
8259A发送一条 A0=0和 D4=1的命令时,这条命令就译码为 ICW1。
它启动 8259A的初始化过程产生下列动作:清除 IMR,
把最低优先级分配给 IR7,把最高优先级分配给 IR0,将从设备标志 ID置成 7,清除特殊屏蔽方式,设置读 IRR方式 。 各初始化命令字的功能如下:
(1) ICW1( 初始化字 ) 。 ICW1称为芯片控制初始化命令字 。 ICW1的各位定义如下:
1 LTIM SNGL
A0 D7 D6 D5 D4 D3 D2 D1 D0
D7,D6,D5,D2在 8086/8088系统中不用,可为 1,也可为 0。 它们在 8080/8085系统中使用 。
D4=1和 A0=0是 ICW1的标志 。 在初始化命令字设置过程结束后,当 A0=0时,D4=0表示操作控制字 OCW2或 OCW3。
LTIM用来设定中断请求信号的形式 。 如果 LTIM=0,则表示中断请求为边沿触发方式; 如果 LTIM=1,则表示中断请求为电平触发方式 。
SNGL用来指出本片 8259A是否与其他 8259A处于级连状态 。
当系统中只有一片 8259A时,SNGL为 1;当系统中有多个
8259A时,SNGL为 0。
IC4用来指出初始化过程中是否设置 ICW4。 若 IC4为 0,表示不用 ICW4;若 IC4为 1,表示用 ICW4。 在 8086/8088系统中,
ICW4是必须使用的,此时 IC4必定为 1。
(2) ICW2( 中断类型码字 ) 。
ICW2是设置中断类型码的初始化命令字 。 ICW2的各位定义如下:
A0 D7 D6 D5 D4 D3 D2 D1 D0
0 A15/T7 A14/T6 A13/T5 A12/T4 A11/T3 A10 A9 A8
编程时用 ICW2设置中断类型码高 5位 T7~ T3,低 3位插入
IR的编码 。
(3) ICW3( 级连控制字 ) 。
ICW3是标志主片 /从片的初始化命令字 。 只有在一个系统中包含多片 8259A时,ICW3才有意义 。
A0 D7 D6 D5 D4 D3 D2 D1 D0
0 IR7 IR6 IR5 IR4 IR3 IR2 IR1 IR0
从上面格式可见,如果本片为主片,则 D7~ D0对应于 IR7~
IR0引脚上的连接情况 。 如果某一引脚上连有从片,则对应位为
1 ; 如 果 未 连 从 片,则 对 应 位 为 0 。 例如,当
ICW3=F0H(11110000)时,表示 IR7,IR6,IR5,IR4引脚上接有从片,而 IR3,IR2,IR1,IR0引脚上没有从片 。
如果本片是从片,则 ICW3的格式如下:
A0 D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 0 0 0 ID2 ID1 ID0
就是说,如果本片为从片,则 ICW3的 D7~ D3不用,可以为 0,也可以为 1,但为了和以后的产品兼容,所以使它们为 0。
ID2~ ID0是从设备标志 ID的二进制代码,它等于从片 8259A的
INT端所连的主片 8259A的 IR编码 。 表 6 - 3 列出了从设备标志的编码 。
表 6-3 从设备标志编码
(4) ICW4( 中断结束方式字 ) 。
ICW4为方式控制初始化命令字 。 只有在 ICW1的 D0位为 1时,
才有必要设置 ICW4,否则不必设置 。
ICW4的格式如下:
A0 D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 0 SFNM BUF M/S AEOI uPM
D7 ~ D5位总是为 0,用来作为 ICW4的标识码 。
若 D4(SFNM)为 1,则为特殊的全嵌套方式 。 在采用特殊全嵌套方式的系统中,一般都使用了多片 8259A。
若 D3(BUF)为 1,则为缓冲方式 。 在缓冲方式下,8259A
通过总线驱动器和数据总线相连 。 此时,引脚 作为输出端来使用 。 在 8259A和 CPU之间传输数据时,启动数据总线驱动器 。
如果 8259A不通过总线驱动器和数据总线相连,则 BUF
应该设置为 0。 在单片的 8259A系统中,接高电平 。
D2(M/S)在缓冲方式下用来表示本片为从片还是主片 。 即
BUF=1时,如果 M/S=1,则表示本片为主片;如果 M/S=0,
则表示本片为从片 。 当 BUF=0时,则 M/S不起作用,可为 0 可为 1。
/SP EN
/SP EN
/SP EN
D1(AEOI)指定是否为中断自动结束方式 。 AEOI=1,则设置中断自动结束方式; AEOI=0时,不用中断自动结束方式,
这时必须在中断服务程序中使用 EOI,使 ISR中最高的优先权的位复位 。
D0( μPM) 指定微处理器的类型 。 μPM=0时,表示
8259A工作于 8080/8085系统中; μPM= 1时,表示 8259A工作于 8086/8088系统中 。
2,初始化命令字的编程顺序在 8259A进入正常工作之前,必须将系统中的每片 8259A
进行初始化 。 初始化命令字用来设定 8259A的初始状态 。 在初始化的过程中,ICW1和 ICW2总是要出现的 。
ICW3 和 ICW4 是否使用,由 ICW1 的相应位决定 。 当
SNGL=0时,需要 ICW3分别用作主片或从片的 8259A,它们的格式是不同的 。 ICW1的 IC4=1时,需要 ICW4,对于 8086/8088
系统,ICW4总是需要的 。 CPU向 8259A写入命令时,A0=0和
D4=1标志着写入 ICW1,初始化过程开始 。 随后写入的初始化命令字由 A0=1作为标志 。 初始化过程结束后,才能写入操作控制字 。 图 6 -22为对 8259A进行初始化的流程图 。
3,8259A的操作命令字在对 8259A用初始化命令字进行初始化后,就进入工作状态,准备好接收 IR输入的中断请求信号 。 在 8259A工作期间,
可通过操作命令字来使它按不同的方式进行操作 。
图 6 – 22 8259A初始化流程图存储器与 I / O 接口控制逻辑
M E M R
CB
M E M W
DB
C P U
AB
I / O 端口存储单元
1M
操作命令字是在应用程序内部设置的 。 操作命令字共有三个,可以独立使用 。
(1) OCW1( 屏蔽控制字 ) 。 OCW1称为中断屏蔽操作命令字 。 其格式如下:
A0 D7 D6 D5 D4 D3 D2 D1 D0
1 M7 M6 M5 M4 M3 M2 M1 M0
在写入 OCW1时,直接对中断屏蔽寄存器 IMR的相应屏蔽位进行置位或复位操作 。 M7~ M0代表 8个屏蔽位,用来控制
IR输入的中断请求信号 。 如果某一位 M=1,它就屏蔽对应的
IR输入 (即 M0=1屏蔽 IR0,M1=1屏蔽 IR1等等 ),禁止它产生中断输出信号 INT。
如果 M=0,则清除屏蔽状态,允许对应的 IR输入信号产生 INT输出,请求微处理器进行服务 。
屏蔽某个 IR输入,不影响其它的 IR输入的操作 。 因此利用 OCW1屏蔽某些 IR请求,可以禁止这些设备的中断请求,而其它的设备可以通过未屏蔽的 IR去申请中断 。
(2) OCW2( 中断结束和优先权循环控制字 ) 。
OCW2用来设置优先级循环方式和中断结束方式。其格式如下:
A0 D7 D6 D5 D4 D3 D2 D1 D0
0 R SL EOI 0 0 L2 L1 L0
与这些操作有关的命令和方式控制大多以组合格式使用
OCW2。 命令或方式的选择应当以组合格式来设置,而不是按位设置 。
R是优先级循环控制位 。 R=1为循环优先权,R=0为固定优先权 。
SL用来选择指定的 IR级别位 。 决定 OCW2中的 L2,L1,
L0 是否有效 。 若 SL=1,则 L2,L1,L0有效;若 SL=0,则 L 2、
L1,L0无效 。
EOI是中断结束命令位 。 在非自动中断结束命令的情况下,
EOI= 1表示中断结束命令,它使 ISR中最高优先权的位复位;
EOI=0则不起作用 。
这三个控制位的组合格式所形成的命令和方式如表 6 - 4
所示。
中断结束 -清除循环 AEOL方式 -特殊循环 L2,L1,L0用来指定操作起作用的 IR级别码 。 在表 6 - 5 的组合位控制格式中,
凡 SL=1的指令,在 L2,L1,L0所指定的 IR级别编码上都起作用 。 SL=0时,不使用 L2,L1,L0位 。 L2,L1,L0的编码与作用的 IR级别如表 6 - 5 所示 。
(3) OCW3(屏蔽和读状态控制字 )。
OCW3的功能有三个方面:一是设置和撤消特殊屏蔽方式;
二是设置中断查询方式;三是用来设置对 8259A内部寄存器的读出命令 。 其格式如下:
A0 D7 D6 D5 D4 D3 D2 D1 D0
0 0 ESMM SMM 0 1 P RR RIS
ESMM是特殊屏蔽模式允许位,是允许或禁止 SMM位起作用的控制位 。 当 ESMM= 1时,允许 SMM位起作用;当
ESMM=0时,禁止 SMM位起作用 。
SMM是设置特殊屏蔽方式控制位 。 当 ESMM=1和
SMM=0时,选择特殊屏蔽方式;当 ESMM=1和 SMM=1时,
清除特殊屏蔽方式,恢复一般屏蔽方式;当 ESMM=0时,
SMM位不起作用 。
P是查询命令位 。 当 P=1时,8259A发送查询命令;当
P=0时,不处于查询方式 。 当 ESMM=0时,这一位不起作用 。
RR是读寄存器命令位 。 当 RR=1时,允许读 IRR或 ISR;当
RR=0时,禁止读这两个寄存器 。
RIS:读 IRR或 ISR选择位 。 如果 RR=1和 RIS=1,则允许读中断服务寄存器; 如果 RR=1和 RIS=0,则允许读中断请求寄存器 IRR; 当 RR=0,则 RIS位无效 。
6.5.5 8259A应用举例
1,8259A在 PC/XT
IBM PC/XT微机只使用了一片 8259A,可处理 8个外部中断,如图 6 - 23 所示 。 其中,IRQ0接至系统板上定时器 /计数器 Intel 8253通道 0的输出信号 OUT0,用作微机系统的日时钟中断请求; IRQ1是键盘输入接口电路送来的中断请求信号,用来请求 CPU读取键盘扫描码; IRQ2是系统保留的;另外 5个请求信号接至 I/O通道,由 I/O通道扩展板电路产生 。 在 I/O通道上,
通常 IRQ3用于第 2个串行异步通信接口,IRQ4用于第一个串行异步通信接口,IRQ5用于硬盘适配器,IRQ6用于软盘适配器,
IRQ7用于并行打印机 。
图 6 – 23 IBM PC/XT与 8259A接口
IR
0
IR
1
IR
2
IR
3
IR
4
IR
5
IR
6
IR
7
I R Q
0
I R Q
1
I R Q
2
I R Q
3
I R Q
4
I R Q
5
I R Q
6
I R Q
7
中断控制器
I N T日时钟键盘保留串行口 2
串行口 1
硬盘软盘打印机
A
0
地址 A
0
I N T A C S
( 片选)
CS
WR
RD
数据 D
7
~ D
0
编程/ 中断类型码
I N T R
C P U
总线控制器
I O R
I O W
I N T AI N T A
S
2
S
1
S
0
S P / E N
C A S
2
C A S
1
C A S
0
+ 5V
NC
S
2
S
1
S
0
在 I/O地址空间中,分配给 8259A的 I/O端口地址为 20H和
21H。 对 8259A的初始化规定,边沿触发方式,缓冲器方式,
中断结束为 EOI命令方式,中断优先权管理采用全嵌套方式 。 8
级中断源的类型码为 08H~0FH。 各级中断源规定如表 6 - 6 所示 。
( 1) 8259A初始化编程 。 根据系统要求,8259A初始化编程如下:
MOV AL,00010011B ;设置 ICW1为边沿触发,单片
8259A需要 ICW4
OUT 20H,AL
MOV AL,00001000B ; 设置 ICW2中断类型码基数为
08H,
( 2) 8259A操作方式编程 。
在用户程序中,允许用 OCW1来设置中断屏蔽寄存器 IMR,
以控制各个外设申请中断允许或屏蔽 。 但注意不要破坏原设定工作方式 。 如允许日时钟中断 IRQ0和键盘中断 IRQ1,其他状态不变,则可送入以下指令:
IN AL,21H ; 读出 IMR
AND AL,0FCH ; 只允许 IRQ0和 IRQ1,其他不变
OUT 21H,AL ; 写入 OCW1,即 IMR
由于中断采用的是非自动结束方式,因此若中断服务程序结束,则在返回断点前,必须对 OCW2写入 00100000B,即 20H,
发出中断结束命令 。
MOV AL,20H ; 设置 OCW2的值为 20H
OUT 20H,AL ; 写入 OCW2的端口地址 20H
IRET ;
在程序中,通过设置 OCW3,亦可读出 IRR,ISR的状态以及查询当前的中断源 。 如要读出 IRR内容以查看申请中断的信号线,这时可先写入 OCW3,再读出 IRR。
MOV AL,20H ; 写入 OCW3,读 IRR
OUT 21H,AL
NOP ; 延时,等待 8259A的操作结束
IN AL,20H ; 读出 IRR
当 A0=1时,IMR的内容可以随时方便地读出,如在 BIOS
中,中断屏蔽寄存器 IMR的检查程序如下:
MOV AL,0 ; 设置 OCW1为 0,送 OCW1口地址,
表示 IMR为全 0
OUT 21H,AL
IN AL,21H ; 读 IMR
OR AL,AL ; 若不为 0,则转出错程序 ERR
JNZ ERR
MOV AL,OFFH ; 设置 OCW2为 FFH,送 OCW1口地址,表示 IMR为全
OUT 21H,AL
IN AL,21H ; 读 IMR
ADD AL,1 ; IMR=0FFH?
JNZ ERR ; 若不是 0FFH,则转出错程序 ERR
.,....
ERR
2,8259A在 PC/AT
在 PC/AT微机中,共有两片 8259A,如图 6 - 24 所示 。
由图 6 - 24 可见,主片 8259A原来保留的 IRQ2中断请求端用于级连从片 8259A,所以相当于主片 IRQ2又扩展了 8个中断请求端 IRQ8~IRQ15。
图 6 – 24 PC/AT与 8259A接口
8实时钟
9中断改向 0 A H
10保留
11保留
12保留
13协处理器
14硬盘
15保留中断控制器
I N T R
8 2 5 9
( 从片)
SP
0日时钟
1键盘
2
3串口 2
4串口 1
5并口 2
6软盘
7并口 1
C A S 2
C A S 1
C A S 0
SP
I N T A
+ 5V
8 2 5 9
中断控制器
( 主片)
8 0 2 8 6 /
8 0 3 8 6
C P U
I N T R
D
7
~ D
0
主片的端口地址为 20H,21H,中断类型码为 08H~0FH,
从片的端口地址为 A0H,A1H,中断类型码为 70H~77H。 主片的 8级中断已被系统用尽,从片尚保留 4级未用 。 其中 IRQ0
仍用于日时钟中断,IRQ1仍用于键盘中断 。 扩展的 IRQ8用于实时时钟中断,IRQ13来自协处理器 80187。 除上述中断请求信号外,所有的其他中断请求信号都来自 I/O通道的扩展板 。
(1) 8259A初始化编程 。
对主片 8259A的初始化编程如下:
MOV AL,11H ; 写入 ICW1,设定边沿触发,级
OUT 20H,AL
JMP INTR1 ; 延时,等待 8259A
INTR1,MOV AL,08H ; 写入 ICW2,设定 IRQ0的中断类型码为 08H
OUT 21H,AL
JMP INTR2
INTR2,MOV AL,04H ;写入 ICW3,设定主片 IRQ2级连
INTR3,MOV AL,11H ; 写入 ICW4,设定特殊全嵌套方式,普通 EOI方式
OUT 21H,AL
对从片 8259A
MOV AL,11H ; 写入 ICW1,设定边沿触发,级连方式
OUT 0A0H,AL
JMP INTR5
INTR5,MOV AL,70H ;写入 ICW2,设定从片 IR0,即
IRQ8的中断类型码为 70H
OUT 0A1H,AL
JMP INTR6
INTR6,MOV AL,02H ; 写入 ICW3,设定从片级连于主片的 IRQ2
OUT 0A1H,AL
JMP INTR7
INTR7,MOV AL,01H ; 写入 ICW4,设定普通全嵌套方式,普通 EOI方式
OUT 0A1H,AL
(2) 级连工作编程 。
当来自某个从片的中断请求进入服务时,主片的优先权控制逻辑不封锁这个从片,从而使来自从片的更高优先级的中断请求能被主片所识别,并向 CPU发出中断请求信号 。
因此,当中断服务程序结束时必须用软件来检查被服务的中断是否是该从片中唯一的中断请求 。 先向从片发出一个
EOI命令,清除已完成服务的 ISR位,然后再读出 ISR的内容检查它是否为 0。 ISR的内容为 0,则向主片发一个 EOI命令,
清除与从片相对应的 ISR位;否则,就不向主片发 EOI命令,
继续执行从片的中断处理,直到 ISR的内容为 0,再向主片发出 EOI命令 。
读 ISR
MOV AL,0BH ; 写入 OCW3,读 ISR
OUT 0A0H,AL
NOP ; 延时,等待 8259A
IN AL,0A0H ; 读出 ISR
从片发 EOI
MOV AL,20H
OUT 0A0H,AL ; 写从片 EOI
主片发 EOI命令的程序如下:
MOV AL,20H
OUT 20H,AL ; 写主片 EOI
6.6 中断程序设计
80X86系列微处理机可以处理 256个中断,分为内部中断和外部中断 。 对于不同类型的中断,处理过程略有差异,但基本上都是根据中断类型码在中断向量表中查找中断服务程序的入口地址,以便调用相应的中断服务程序 。 所以,在进行中断服务程序设计时,需要首先设置中断向量表,把需要执行的中断服务程序的入口地址事先放入中断向量表的相应存储单元,
然后才能允许中断 。 几种中断服务程序的编程原则大致相同 。
但是,由于可屏蔽中断要涉及到中断控制器的操作,所以其编程较内部中断和非屏蔽中断复杂 。
下面以可屏蔽中断为例,介绍中断程序设计的一般过程 。
1.
由于中断响应后须在中断向量表中查找中断服务程序的入口地址,所以在进入中断处理前,主程序应设置好中断向量,
使其指向相应的中断服务程序 。 在 PC系列微型计算机中,若利用其内部的 8259A处理中断,则还须在设置中断向量表之前,
首先保存原中断向量的内容,以便在执行用户程序后,恢复原状态 。 即在用户程序退出前,取出原中断向量恢复到中断向量表中 。
当设置中断向量表时,可以利用数据传送指令直接访问中断向量表的相应存储单元,写入中断向量,也可以利用 DOS系统功能调用 INT21H的 25H和 35H号功能调用修改中断向量 。
如果借用 PC/XT微机系统中的 IRQ3( 0BH) 响应外部中断,中断后须执行的子程序的过程名为 INT-PROC,其中中断向量表的设置可以用下面的程序段实现:;
:
INTSEG DW?
INTOFF DW?
:
MOV AH,35H
MOV AL,0BH
INT 21H
MOV INTSEG,ES ;
MOV INTOFF,BX ;;
CLI; 关中断,
PUSH DS
MOV AX,SEG INTPROC
MOV DS,AX
MOV DX,OFFSET INTPROC
MOV AH,25H
MOV AL,0BH
INT 21H
POP DS
2,设置中断控制器在响应可屏蔽中断前,需要对中断控制器进行设置 。 若利用 PC微机内部的 8259A处理中断,由于操作系统已经对
8259A进行过初始化及操作方式安排,所以只要对中断屏蔽寄存器 IMR进行相应处理 。 对于通过 8259A控制的硬件中断,
必须使中断屏蔽寄存器 IMR的相应位置 0,才能允许中断请求 。
同样,为了在应用程序返回 DOS后恢复原状态,应在修改
IMR之前保存原内容,并于程序退出前予以恢复 。
在程序中还可以通过控制屏蔽位,随时允许或禁止有关中断的产生 。 假设允许 IRQ3响应外部中断,编程修改 IMR的程序如下:
INTIMR DB?
:
IN AL,21H ; 读出 IMR
MOV INTIMR,AL ; 保存原 IMR
AND AL,0F7H ; 允许 IRQ3,
OUT 21H,AL ; 设置新 IMR
:; 恢复原先的 IMR
MOV AL,INTIMR ; 取出保留的 IMR
OUT 21H,AL ; 重写 OCW 1
:
3,设置 CPU的中断允许标志 IF
硬件中断来自外设,它随时都可能提出申请,除利用 IMR
控制某一个或几个中断响应外,还可以通过关中断指令 CLI和开中断指令 STI控制所有可屏蔽中断的产生 。 当不需要中断或不能中断时,就必须关中断,防止不可预测的后果 。 而在其他时间则要开中断,以便及时响应中断,为外设提供服务 。
例如,修改中断向量表和 IMR不能产生中断,所以这段时间里必须关闭中断。
为中断服务程序提供初值等时间,也不能响应中断,所以也应该关闭中断,在此之后应该开中断 。
另外,进入中断服务程序后,可以马上开中断,从而允许较高级的中断能够嵌套执行 。
4.
中断服务程序中通常须完成以下任务:保护现场,中断服务,恢复现场,向 8259A发送中断结束命令,中断返回等 。
INTPROCPROC;
PUSH AX ;
PUSH BX
:
STI ;
,;
:
CLI ;
:
POP BX ;
POP AX
MOV AL,20H ; 向 8259A发送 EOI
OUT 20H,AL
IRET ;
INTPROC ENDP
一般说来,外部中断服务程序是用来处理较急迫的事件的,因此服务时间应尽量短 。 能放在主程序中完成的任务,
就不要由中断服务程序完成,这样可以避免干扰其他中断设备的工作 。
外部中断服务程序不要使用 DOS系统功能调用 INT 21H,
因为 DOS版本的内核是不可重入的 。 例如,当主程序在执行一个 DOS系统功能调用时,产生外部中断,中断服务程序又调用这个 DOS系统功能,就出现了 DOS重入,这是不允许的 。 中断服务程序若要控制 I/O设备,最好调用 ROM BIOS功能或者对
I/O接口直接编程 。
上述中断程序的设计过程,除了对中断控制器 8259A的操作外,其他均适合内部中断和非屏蔽外部中断 。 但非屏蔽中断在 PC机中有特殊作用,一般不要改写其中断服务程序 。
6.7 DMA 控 制
6.7.1DMA概述直接存储器存取 DMA( Direct Memory Access)方式是用硬件实现存储器与存储器之间或存储器与 I/O设备之间直接进行高速数据传送,不需要 CPU的干预。 这种方式通常用来传送数据块。
DMA传送包括,RAM→I/O 端口的 DMA读传送; I/O端口
→ RAM 的 DMA写传送; RAM→RAM 的存储单元传送 。 DMA
传送过程如图 6 - 25 所示 。 从图中可以看出,系统总线分别受到 CPU和 DMAC这两个器件的控制,即 CPU可以向地址总线,
数据总线和控制总线发送信息,DMAC也可以向地址总线,
数据总线和控制总线发送信息 。 但是,在同一时间,系统总线只能受一个器件控制 。
图 6 – 25 DMA传送过程
C P U D M A C
总线请求总线响应
I / O
D M A
响应
D M A
请求
AB
DB
CB
当 CPU控制总线时,DMAC必须与总线脱离;而当
DMAC控制总线时,CPU必须与总线脱离 。 因此,CPU与
DMAC之间必须有联络信号 。
DMA传送的工作过程如下:
① I/O端口向 DMA控制器发出 DMA请求,请求数据传送 。
② DMA控制器在接到 I/O端口的 DMA请求后,向 CPU发出总线请求信号,请求 CPU脱离系统总线 。
③ CPU在执行完当前指令的当前总线周期后,向 DMA控制器发出总线请求信号 。
④ CPU随即和系统的控制总线,地址总线及数据总线脱离关系,处于等待状态,由 DMA控制器接管这 3个总线的控制权 。
⑤ DMA控制器向 I/O端口发出 DMA应答信号。
⑥ DMA控制器把进行 DMA传送涉及到的 RAM地址送到地址总线上 。 如果进行 I/O端口 → RAM传送,DMAC向 I/O端口发出 I/O读命令,向 RAM发出存储器写命令;如果进行
RAM→I/O 端口传送,DMAC向 RAM发出存储器读命令,向
I/O端口发出 I/O写命令,从而完成一个字节的传送 。
⑦ 当设定的字节数传送完毕,DMA传输过程结束,也可以由来自外部的终止信号迫使传输过程结束 。 当 DMA传送结束后,DMA控制器就将总线请求信号变成无效,并放弃对总线的控制,CPU检测到总线请求信号无效后,也将总线响应信号变成无效,于是,CPU重新控制三总线,继续执行被中断的当前指令的其他总线周期 。
DMA用硬件在外设与内存之间直接进行数据交换 。 通常 系 统 的 数 据 和 地 址 总 线 以 及 一 些 控 制 信 号 线 ( 如
IO/,,等 )是由 CPU管理的,在 DMA方式,
就要求 CPU让出总线 (也就是将这些总线置为高阻状态 ),而由 DMA控制器 (DMAC)接管总线 。 通常,大部分 DMA都有三种 DMA传送方式:
M RD WR
(1) 单字节传送方式 。
每次 DMA传送只传送一个字节的数据,传送后释放总线,
CPU至少控制一个完整的总线周期,然后测试 DMA请求线
DREQ,若有效,再进入 DMA周期 。 在这种方式中要注意:
① DMA响应信号 DACK有效前,DREQ必须保持有效;
② 若 DREQ在传送过程中一直保持有效,在两次传送之间也必须释放总线 。
(2) 成组传送方式 。
一个 DMA请求可以传送一组信息 。 在 DMAC初始化时,
由编程决定这一组信息的字节数,只要在 DACK有效之前
DREQ保持有效即可 。 一旦 DACK有效,不管 DREQ是否有效,
DMAC一直不放弃总线控制权,直到整个数组传送完 。
(3) 请求传送方式 。
请求传送方式又称查询传送方式 。 该方式的传送类似于成组传送方式,但每传送一个字节后,DMAC就检测 DREQ,若无效,则挂起;若有效,继续 DMA传送,直到一组信息传送结束由外加信号强制 DMAC中止操作 。
DMA具有下列特点:
① 它使主存既可被 CPU访问,又可被外设直接访问;
② 当传送数据块时,主存地址的确定,传送数据的计数控制等都用硬件电路直接实现;
③ 主存中要开设专用缓冲区,及时供给和接收外设的数据;
6.7.2 8237A
8237A是微机系统中实现 DMA功能的大规模集成电路控制器 。 PC/XT使用一片 8237A,PC/AT使用两片 8237A,在高档微机中常使用多功能芯片取代 8237A,但多功能芯片中的
DMA控制器与 8237A的功能基本相同 。
1,8237A的内部结构和引脚功能
8237A是具有 4个独立 DMA通道的可编程 DMA控制器
( DMAC),+5 V电源,单相时钟,40引脚双列直插式封装 。 在实际应用中,8237A必须与一片 8位锁存器一起使用,才能形成一个完整的 4通道 DMA控制器 。 8237A
经初始化后,可以控制每一个通道在存储器和 I/O口之间以最高 1.6兆波特的速率传送最多达 64 KB的数据块,而不需要 CPU
的介入 。
8237A的基本功能如下:
① 一个芯片中有 4个独立的 DMA通道 。
② 每一个通道的 DMA请求都可以被允许或禁止 。
③ 每一个通道的 DMA请求有不同的优先级,既可以是固定优先级,也可以是循环优先级 。
④ 每一个通道一次传送的最大字节数为 64 KB。
⑤ 8237A提供 4种传送方式,单字节传送方式,数据块传送方式,请求传送方式和级连传送方式 。
8237A的内部结构如图 6 - 26 所示。它主要由以下 3个部分组成:
(1) DMA通道 。
8237A内部包含 4个独立通道,每个通道包含 2个 16位的地址寄存器,2个 16位的字节寄存器,1个 6位的方式寄存器,1个
DMA请求触发器和 1个 DMA屏蔽触发器 。 此外,4个通道共用 1
个 8位控制寄存器,1个 8位状态寄存器,1个 8位暂存器,1个 8
位屏蔽寄存器和 1个 8位请求寄存器 。
(2) 读 /写逻辑 。
当 CPU对 8237A初始化或对 8237A寄存器进行读操作时,
8237A就像 I/O端口一样被操作,读 / 信号 。IOW IOR
为低电平时,CPU可以读取 8237A的内部寄存器值;当 为低电平时,CPU可以将数据写入 8237A的内部寄存器中 。
在 DMA传送期间,系统由 8237A控制总线 。 此时,8237A
分两次向地址总线上送出要访问的内存单元 20位物理地址中的低 16位,8237A输出必要的读 /写信号,这些信号分别为 I/O读
,I/O,存储器读信号 和存储器写信号 。
IOR IOW
IOR
IOW
MEMR
MEMW
(3) 控制逻辑 。
在 DMA周期内,控制逻辑通过产生相应的控制信号和 16
位要存取的内存单元地址来控制 DMA的操作步骤 。
初始化时,通过对方式寄存器进行编程,使控制逻辑可以对各个通道的操作进行控制 。
CLK:时钟输入端,通常接到 8284时钟发生器的输出引脚,
用来控制 8237A内部操作定时和 DMA传送时的数据传送速率 。
8237A的时钟频率为 3 MHz,8237A-5的时钟频率为 5 MHz,后者是 8237A的改进型,工作速度比较高,但工作原理及使用方法与 8237A相同 。
,片选输入端,低电平有效 。
RESET:复位输入端,高电平有效 。 当 RESET有效时,屏蔽寄存器被置 1( 4个通道均禁止 DMA请求 ),其他寄存器均清
0,8237A处于空闲周期,所有控制线都处于高阻状态,并禁止 4个通道的 DMA操作 。
CS
复位后必须重新初始化,否则 8237A不能进入 DMA操作 。
READY:,准备就绪,信号输入端,高电平有效 。 当所选择的存储器或 I/ O端的速度比较慢,需要延长传输时间时,
使 READY端处于低电平,8237A就会自动地在存储器读和存储器写周期中插入等待周期 。 当传输完成时,READY端变为高电平,以表示存储器或 I/ O设备准备就绪 。
ADSTB:地址选通输出信号,高电平有效 。 当此信号有效时,8237A当前地址寄存器的高 8位经数据总线 DB7~ DB0
锁存到外部地址锁存器中 。
AEN:地址允许输出信号,高电平有效 。 AEN把外部地址锁存器中锁存的高 8位地址输出到地址总线上,与芯片直接输出的低 8位地址一起共同构成内存单元的低 16位地址 。
,存储器读信号,低电平有效,输出,只用于
DMA传送 。 在 DMA读周期期间,用于从所寻址的存储器单元中读出数据 。
,存储器写信号,低电平有效,输出,只用于 DMA
传送 。 在 DMA写周期期间,用于将数据写入所寻址的存储单元中 。
,I/ O读信号,低电平有效,双向 。 当 CPU控制总线时,它是输入信号,CPU读 8237A内部寄存器 。 当 8237A控制总线时,它是输出信号,相配合,控制数据由 I/
O端口传送至存储器 。
,I/O写信号,低电平有效,双向 。 当 CPU控制总线时,它是输入信号,CPU写 8237A内部寄存器 ( 初始化 ) 。
当 8237A控制总线时,它是输出信号,与 相配合,把数据从存储器传送至 I/ O端口 。
MEMR
MEMW
IOR
IOW
MEMW
MEMW
,DMA传送过程结束信号,低电平有效,双向 。
当 DMA控制的任一通道计数结束时,会从 引脚输出一个低电平,表示 DMA传输结束 。 而当外部向 DMA控制器输入信号时,DMA传送过程将被强迫结束,无论是从外部终止 DMA过程,还是内部计数结束引起 DMA过程终止,都会使 DMA控制器的内部寄存器复位 。
DREQ0~ DREQ3,DMA请求输入信号,有效电平可由编程设定 。 这 4条 DMA请求线是外设为取得 DMA服务而送到各个通道的请求信号 。 在固定优先级的情况下,DREQ0的优先级最高,DREQ3的优先级最低 。 在优先级循环方式下,某通道的
DMA请求被响应后,随即降为最低级 。 8237A用 DACK信号作为对 DREQ的响应,因此在相应的 DACK信号有效之前,
DREQ信号必须维持有效 。
EOP
MEMR
IOW
DACK0~ DACK3,DMA对各个通道请求的响应信号,
输出的有效电平可由编程设定 。 8237A接收到通道请求,向
CPU发出 DMA请求信号 HRQ,当 8237A获得 CPU送来的总线允许信号 HLDA后,便产生 DACK信号,送到相应的 I/ O端口,表示 DMA控制器响应外设的 DMA请求,从而进入 DMA
服务过程 。
HRQ,8237A输出给 CPU的总线请求信号,高电平有效 。
当外设的 I/ O端口要求 DMA传送时,向 DMA控制器发送
DREQ信号,如果相应的通道屏蔽位为 0,即 DMA请求未被屏蔽,则 DMA控制器的 HR0端输出为有效电平,从而向 CPU发出总线请求 。
HLDA:总线响应信号,高电平有效,是 CPU对 HRQ信号的应答 。 当 CPU接收到 HRQ信号后,在当前总线周期结束之后让出总线,并使 HLDA信号有效 。
A3~ A0:地址总线低 4位,双向 。 当 CPU控制总线时,
它们是地址输入线 。 CPU用这 4条地址线对 DMA控制器的内部寄存器进行寻址,完成对 DMA控制器的编程 。 当 8237A控制总线时,由这 4条线输出要访问的存储单元的最低 4位地址 。
A7~ A4:地址线,输出,只用于在 DMA传送时,输出要访问的存储单元的低 8位地址中的高 4位 。
DB7~DB0,8位双向数据线,与系统数据总线相连。
在 CPU控制总线时,CPU可以通过 I/O读命令从 DMA控制器中读取内部寄存器的内容,送到 DB7~DB0,以了解 8237A
的工作情况 。 也可以通过 I/O写命令对 DMA控制器的内部寄存器进行编程 。 在 DMA控制器控制总线时,DB7~DB0输出要访问的存储单元的高 8位地址 ( A15~A8),并通过 ADSTB锁存到外部地址锁存器中,并和 A7~A0输出的低 8位地址一起构成
16位地址 。
8237A仅支持 64 KB寻址,为了访问超过 64KB范围的其他地址空间,系统中增设了页面寄存器 。 在 PC/XT微机系统中,
每一通道的页面寄存器是 4位寄存器 。
当一个 DMA操作周期开始时,相应的页面寄存器内容就放到系统地址总线 A19~A16上,和 8237A送出的 16位低地址一起,构成 20位物理地址 。
2,8237A
8237A的内部寄存器分为两类:一类是 4个通道共用的寄存器,另一类是各个通道专用的寄存器 。
(1) 控制寄存器 。
8237A的 4个通道共用一个控制寄存器 。 在编程时,由 CPU
向它写入控制字,而由复位信号 ( RESET) 或软件命令清除它 。
控制寄存器格式如图 6 - 28 所示 。
① D0,规定是否工作在存储器到存储器传送方式 。
8237A约定:当进行存储器之间的数据传送时,由通道 0
提供源地址,通道 1提供目的地址并进行字节计数 。 每传送一个字节需要两个总线周期,第 1个总线周期先将源地址单元的数据读入 8237A的暂存器,第 2个总线周期再将暂存器的内容放到数据总线上,然后在写信号的控制下,写入目的地址单元 。
② D1,在存储器向存储器传送时,起控制作用 。
③ D2,用来启动和停止 8237A的工作 。
④ D3,8237A可以有两种工作时序,一种是正常时序,一种是压缩时序 。
如果系统各部分速度比较高,便可以用压缩时序,这样可以提高 DMA传输的数据吞吐量 。
⑤ D4:选择各通道 DMA请求的优先级 。 当 D4= 0时为固定优先级,即通道 0优先级最高,通道 3的优先级最低;当
D4=1时为循环优先级,即在每次 DMA服务之后,各个通道的优先级都发生变化 。 比如,某次传输前的优先级次序为 2-3-0-
1,那么在通道 2进行一次传输之后,优先级次序成为 3-0-1-2。
如果这时通道 3没有 DMA请求,而通道 0有 DMA请求,那么,
在通道 0完成 DMA传输后,优先级次序成为 1-2-3-0。
DMA的优先级排序只是用来决定同时请求 DMA服务的通道的响应次序,而任何一个通道一旦进入 DMA服务后,其他通道必须等到该通道的服务结束后,才可进行 DMA服务 。
⑥ D5:若 D5=1,选择扩展的写信号 ( 比正常时序提前一个状态周期 ) 。
⑦ D6,D7:确定 DREQ和 DACK的有效电平极性 。 对这两位如何设置,取决于 I/O端口对 DREQ信号和 DACK信号的极性要求 。
控制字是 4个通道必须共同遵循的原则 。
在 PC系列机中,当 BIOS初始化时,已将控制寄存器设定为 00H,即禁止存储器到存储器的传送,允许读/写操作,
使用正常时序,固定优先级,不扩展写信号,DREQ高电平有效,DACK低电平有效 。
(2) 方式寄存器 。 8237A的每个通道都有一个方式寄存器,
4个通道的方式寄存器共用一个端口地址,方式选择命令字的格式如图 6 - 29 所示 。
IOR IOW
图 6 – 29 方式寄存器
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
通道选择:
0 0,选择 通道 0
0 1,选择通道 1
1 0,选择通道 2
1 1,选择通道 3
0 0,校验传送
0 1,写传送
1 0,读传送
1 1,无意义通道传送方式选择,
0 0,请求传送方式
0 1,单字节传送方式
1 0,数据块传送方式
1 1,级连方式地址增减方式选择,
0,地址加 1
1,地址减 1
自动重装功能选择,
0,禁止
1,允许传送类型的选择:
① DMA传送方式 。
8237A提供 4种传送方式,每个通道可以用 4种方式之一进
· 单字节传送方式 。 每次 DMA操作只传送一个字节的数据,然后自动地把总线控制权交给 CPU,让 CPU占用至少一个总线周期 。 若又有 DMA请求信号,8237A重新向 CPU发出总线请求,等获得总线控制权后,再传送下一个字节数据 。
· 数据块传送方式 。 进入 DMA操作后,连续传送数据直到整个数据块全部传送完毕 。
· 请求传送方式 。 该方式与数据块传送方式类似,只是在每传送一个字节后,8237A都对 DMA请求信号 DREQ进行测试 。 若检测到 DREQ端变为无效电平,则马上暂停传输,但测试过程仍然进行;当 DREQ又变为有效电平时,就在原来的基础上继续进行传输,直到传送结束 。
级连传输方式 。 为了实现 DMA系统扩展,几个 8237A可以进行级连 。
② DMA数据传送的类型 。
方式选择命令字的 D位和 D2位确定数据传送的类型,即写传送,读传送和校验传送 。 写传送是将数据从 I/O端口读出写入存储单元 。 读传送是将数据从存储单元读出并写入 I/O端口 。 校验传送是一种虚拟传送,8237A本身并不进行数据传送,而只是像 DMA读传送或 DMA写传送那样产生时序,产生地址信号,但存储器和 I/O端口的读 /写控制信号无效 。 校验传送一般是在器件测试时使用 。
当 D4位为 1时,通道有“自动重装功能”。
D5位控制,当前地址寄存器,的工作方式,规定地址是增量修改还是减量修改 。
(3) 地址寄存器 。
每个通道有一个 16位的基地址寄存器和一个 16位的当前地址寄存器 。 基地址寄存器存放本通道 DMA传输时所涉及到的存储区首地址或末地址,这个初始值是在初始化编程时写入的,
同时也被写入当前地址寄存器 。 当进行 DMA传送时,由当前地址寄存器向地址总线提供本次 DMA传送时的内存地址 ( 低 16
位 ) 。 当前地址寄存器的值在每次 DMA传输后自动加 1或减 1,
为传送下一个字节作好准备 。 在整个 DMA传送期间,基地址寄存器的内容保持不变 。 当通道初始化选择,自动重装,功能时,
一旦全部字节传送完毕,基地址寄存器的内容自动重新装入当前地址寄存器 。
(4) 字节寄存器 。
每个通道有一个 16位的基本字节寄存器和一个 16位的当前字节寄存器,基本字节寄存器存放本通道 DMA传输时字节数的初值 。 8237A规定:初值比实际传输的字节数少 1,初值是在初始化编程时写入的,同时,初值也被写入当前字节寄存器 。 在 DMA传送时,每传送一个字节,当前字节寄存器自动减 1,当初值由 0减到 FFFFH时,产生计数结束信号,
输出有效电平 。 当通道初始化选择,自动重装,功能时,一旦全部字节传送完毕,基本字节寄存器的内容自动重新装入当前字节寄存器 。 基本字节寄存器预置初值后将保持不变,
也不能被 CPU读出,而当前字节寄存器中的内容可以随时由
CPU读出 。
EOP
(5) 状态寄存器 。
状态寄存器的格式如图 6 - 30 所示 。 状态寄存器的高 4位表示当前 4个通道是否有 DMA请求,低 4位指出 4个通道的
DMA传送是否结束,供 CPU查询 。 它与控制寄存器共用一个端口地址 。
(6) 请求寄存器和屏蔽寄存器 。
请求寄存器和屏蔽寄存器是 4个通道公用的寄存器,使用时应写入请求命令字和屏蔽命令字,其格式如图 6 - 31 所示 。
图 6 –30 状态寄存器的格式通道 3 通道 2 通道 1 通道 0 通道 3 通道 2 通道 1 通道 0
有 D M A 请求为 1 计数结束为 1
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
图 6-31 请求寄存器和屏蔽寄存器
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
通道选择:
1,置 1 请求触发器 0 0,通 道 0
0 1,通道 1
1 0,通道 2
1 1,通道 3
无用位
0,置 0 请求触发器
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
通道选择:
1,置 1 屏蔽触发器 0 0,通 道 0
0 1,通道 1
1 0,通道 2
1 1,通道 3
无用位
0,置 0 屏蔽触发器
8237A根据请求寄存器的 D2~ D0位,将相应通道的请求触发器置,1”( 或清,0”),使通道提出,软件 DMA请求,。
8237A根据屏蔽寄存器的 D2~ D0位,将相应通道的屏蔽触发器置,1”( 或清,0”) 。 实验表明:当一个通道的屏蔽触发器置 1后,它将屏蔽来自引脚 DREQ的硬件 DMA请求,同时,
也屏蔽来自请求寄存器的软件 DMA请求 。 因此,在对通道初始化之前,应使屏蔽触发器置,1”,而在初始化之后,应使屏蔽触发器清,0”。
(7) 多通道屏蔽寄存器 。
8237A允许使用一个屏蔽字一次完成对 4个通道的屏蔽设置,其格式如图 6 - 32 所示 。 其中 D0~ D3对应于通道 0~ 3的屏蔽触发器,若某一位为 1,则对应通道的屏蔽触发器置 1。
图 6- 32 多通道屏蔽寄存器
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
1,置 1 屏蔽触发器通 道 0
无用位
0,置 0 屏蔽触发器通道 1
通道 2
通道 3
无论是 RESET复位还是软件复位,屏蔽寄存器均被置 1,
DMA请求被禁止 。 另外,如果一个通道没有设置自动重装功能,那么,一旦 DMA传送结束,信号有效,会自动置 1
屏蔽触发器 。 因此,在对 DMA通道进行初始化时必须清除屏蔽触发器 。 其方法为:对端口 DMA+ 0EH进行一次写操作,
即可清除 4个通道的屏蔽触发器 。
(8) 先 /后触发器 。
8237A只有 8根数据线,而基地址寄存器和基本字节寄存器都是 16位,在预置初值时需要分两次进行,每次写入一个字节 。
先 /后触发器是为初值的写入顺序而设置的 。 在使用先 /后触发器时,先将其清,0”,然后写字节先写低位字节,后写高位字节 。
EOP
(9) 暂存寄存器 。
暂存寄存器为 4通道共用的 8位寄存器 。 在 DMA控制器实现存储器到存储器的传送方式时,它暂存中间数据,CPU可以读取暂存寄存器中的内容,其值为最后一次传送的数据 。
6.7.3 8237A
1,8237A的初始化编程
(1) 命令字写入控制寄存器 。 在初始化时必须设置控制寄存器,以确定其工作时序,优先级方式,DREQ和 DACK的有效电平及是否允许工作等 。
在 PC系列机中,当 BIOS初始化时,已将通道的控制寄存器设定为 00H,禁止存储器到存储器的传送,允许读,写传送,正常时序,固定优先级,不扩展写信号,DREQ高电平有效,DACK低电平有效 。 因此在 PC微机系统中,如果借用
DMA CH1( CH1是预留给用户使用的 ) 进行 DMA传送,则在初始化编程时,不应再向控制寄存器写入新的命令字 。
(2) 屏蔽字写入屏蔽寄存器 。
当某通道正在进行初始化编程时,接收到 DMA请求,可能未初始化结束,8237A就开始进行 DMA传送,从而导致出错 。
因此,初始化编程时,必须先屏蔽要初始化的通道,在初始化结束后再解除该通道的屏蔽 。
(3) 方式字写入方式寄存器 。 为通道规定传送类型及工作方式 。
(4) 置 0先 /后触发器 。
对口地址 DMA+0CH执行一条输出指令 ( 写入任何数据均可 ),从而产生一个写命令,即可置,0” 先 /后触发器,为初始化基地址寄存器和基本字节寄存器作准备 。
(5) 写入基地址和基本字节寄存器 。
把 DMA操作所设计到的存储区首址或末址写入地址寄存器,把要传送的字节数减 1,写入基本字节寄存器 。 这几个寄存器都是 16位的,因此写入要分两次进行:先写低 8位 ( 先 /后触发器置 1),后写高 8位 ( 先 /,0”) 。
(6) 解除屏蔽 。
初始化之后向通道的屏蔽寄存器写入 D2~ D0=0×× 的命令字,置 0相应通道的屏蔽触发器,准备响应 DMA请求 。
(7) 写入请求寄存器 。
如果采用软件 DMA请求,在完成通道初始化之后,在程序的适当位置向请求寄存器写入 D2~ D0=1×× 的命令字,即可使相应通道进行 DMA传送 。
2,8237A在 IBM PC/ AT系统中的应用
286微机系统使用两片 8237A级连,如图 6 - 33 所示 。 它提供 7个 DMA通道,通道 0~ 3支持 8位数据传送,通道 5~ 7支持 16位数据传送 。 PC/ AT有专门的动态 RAM刷新电路,硬盘驱动器采用高速 PIO传送,无需 DMA支持,通道 1给用户使用,
通道 2服务于软盘驱动器,通道 4作为两个 DMA控制器的级联,
其余均保留备用 。
PC/AT DMAC寄存器 I/O端口地址见表 6 - 7 所示。
PC/XT地址总线的宽度是 24位的,由 A23~ A0组成,最大寻址空间可达 16 MB。
由于 8237A内部地址寄存器是 16位,只能寻址 64 KB的空间,为了扩大 8237A的寻址空间,PC/AT微机系统在 8237A芯片以外为每一个通道设置了一个 8位的页面寄存器,如图 6 -
34 所示 。
在进行 DMA读 /写传送之前,程序要把 DMA传送所涉及到的 RAM单元的高 8位物理地址写入到相关通道的页面寄存器中,把 RAM单元低 16位物理地址写入到相关通道的基本地址寄存器中,把 DMA传送的实际字节数减 1,写入到相关通道的基本字节寄存器中,从而做好初始化准备 。
图 6 – 34 扩大 8237A寻址范围示意图页面寄存器系统数据线初始化时写入高 8 位 R A M 地址
A
23
~ A
16
A
15
~ A
8
中 8 位 R A M 地址低 8 位 R A M 地址当前地址寄存器
8 2 3 7某通道地址锁存器地址驱动器 A
7
~ A
0
在进行 DMA读 /写传送之前,程序要把 DMA传送所涉及到的 RAM单元的高 8位物理地址写入到相关通道的页面寄存器中,
把 RAM单元低 16位物理地址写入到相关通道的基本地址寄存器中,把 DMA传送的实际字节数减 1,写入到相关通道的基本字节寄存器中,从而做好初始化准备 。
一旦 I/ O端口有 DMA请求,并且 DMAC控制系统三总线之后,由相关通道的 DMA应答信号控制把页面寄存器的内容送到地址总线高 8位,DMAC把相关通道的低 16位地址经过外部地址锁存和驱动送到低 16位地址总线上,选择某一存储单元 。
在 PC/ AT系统中,页面寄存器采用专用的三态输出存储器映像器 74LS612来实现 。 在高档微机中,DMAC和相关页面寄存器都被兼容的多功能芯片所取代 。 页面寄存器端口地址见表
6 - 8。
表 6 – 8 PC/AT页面寄存器的 I/O端口地址本章讨论了 I/O接口和输入 /输出传送方式,微型计算机中广泛使用的中断技术和 DMA数据传送技术 。 通过本章的学习,
读者应了解 I/O信息的组成,I/O接口的作用,I/O 端口的寻址方式等基本概念;掌握输入 /输出传送方式,常用的数据传送方式 (包括程序控制的输入 /输出方式和 DMA数据传送方式 );
熟悉中断技术的有关概念,如中断,中断源,中断的分类;
掌握中断处理的一般过程以及中断优先级的处理方法;了解
80X86/ Pentium 中断系统的基本组成,中断处理方法以及高档微处理器的中断 。 8259A具有很强的中断管理能力,使用灵活,方便 。 DMA传送方式在高速数据传送过程中起到非常重要的作用,微型计算机 DMA控制器 8237A的组成及应用也是本章的主要内容之一 。
6.2 输入 /输出传送方式
6.3 中断技术
6.4 80X86/ Pentium中断系统
6.5 可编程中断控制器
6.6 中断程序设计
6.7 DMA控制器第 6章 输入 /输出和中断技术返回主目录第 6章 输入 /输出和中断技术输入 /输出设备是计算机系统的重要组成部分,计算机通过它们与外设进行数据交换 。 微机系统中,各种输入 /输出设备通过接口与系统相连,并在接口的支持下实现各种方式的数据传送 。 微型计算机系统中常用的外围设备有:键盘,显示器,
磁带机,硬盘驱动器,软盘驱动器,模数转换器,数模转换器,
调制解调器以及一些专用设备等 。 把外围设备同微型计算机连接起来的电路称为外设接口电路,简称外设接口 。
6.1 输入 /
6.1.1 I/O信息的组成
CPU通过接口与外设交换信息,这些信息包括数据信息,
状态信息和控制信息 。
1.
数据信息可分为数字量,模拟量和开关量 。
数字量是键盘,CRT,打印机及磁盘等 I/O外设与 CPU交换的信息,它是以二进制形式表示的数或以 ASCII码表示的数或字符 。
当微型计算机用于控制系统时,大量的现场信息经过传感器把非电量 (如温度,压力,流量,位移等 )转换成电量,
并经放大处理得到模拟量的电压或电流 。
这些模拟量必须先经过 A/D转换器转换成数字量才能输入计算机;计算机控制信号的输出也必须先经过 D/A转换器把数字量转换成模拟量才能去控制执行机构 。
开关量即两个状态的量 。 如开关的断开与闭合,阀门的打开与关闭等 。 通常开关量要经过相应的电平转换才能与计算机连接 。 每个开关量只要一位二进制数表示,故对于字长为 8位
(或 16位 )的计算机,一次可输入或输出 8位 (或 16位 )开关量 。
2.
状态信息是 CPU与外设之间交换数据时的联络信息 。 CPU
通过读取外设状态信号,可知外设的工作状态 。 如输入设备的数据是否准备好,输出设备是否空闲 。 输出设备正在输出信息,则用 BUSY信号通知 CPU暂停送数 。 因此,状态信号是
CPU与 I/O外设正确进行数据交换的重要条件 。
3,控制信息控制信息是设置 I/O外设 (包括 I/O接口 )的工作模式,命令字的有关信息 。 如,启动,,,停止,信息 。
每个 I/O接口通常包含若干 I/O端口 (输入 /输出端口 )寄存器,
CPU和存储器通过这些端口与该接口所连接的外设进行信息交换 。 通常,状态信息和控制信息也是通过数据总线传送的 。
由于它们的作用不同,故在传送时赋予不同的端口 。 因此,
一个外设往往占用几个端口,如数据端口,状态端口,控制端口等 。 当一个外设的状态信息和控制信息位数较少时,可以将不同的外设的状态或控制信息归并到一起,共同使用一个端口 。 这样,CPU对外设的控制或 CPU与外设间的信息交换,
实际上就是 CPU通过 I/O指令读 /写端口的数据 。 在控制端口,
写出的数据表示 CPU对外设的控制信号;在状态端口,读入的数据是外设的状态信息;只有在数据端口,才真正地进行数据信息的交换 。
6.1.2 I/O接口的作用外围设备的种类繁多,有机械式,电子式,机电式,磁电式以及光电式等 。 其所处理的信息有数字信号,模拟信号,有电压信号,电流信号 。 不同的外围设备处理信息的速度相差悬殊,有的速度慢,有的速度快 。 另外,微型计算机与不同的外围设备之间所传送的信息格式和电平高低是多种多样的,这样就形成外设接口电路的多样化 。
由于外围设备的多样性,外设接口电路应具有如下功能:
(1) 转换信息格式 。 如串 —并转换,并 —串转换,配备校验位等
(2) 提供联络信号,协调数据传送的状态信息 。 如设备,就绪,,,忙,,数据缓冲器,满,,,空,等信号 。
(3) 协调定时差异 。 为协调微机与外设在定时或数据处理速度上的差异,使两者之间的数据交换取得同步,有必要对传输的数据或地址加以缓冲或锁存 。
(4) 进行译码选址 。 在具有多台外设的系统中,外设接口必须提供地址译码以及确定设备码的功能 。
(5) 实现电平转换 。 为使微型计算机同外设匹配,接口电路必须具有电平转换和驱动功能 。
(6) 具备时序控制 。 有的接口电路具有自己的时钟发生器,
以满足微型计算机和各种外设在时序方面的要求 。
(7) 可编程 。 对一些通用的,功能较齐全的接口电路,
应该具有可编程能力 。
6.1.3I/O
CPU对外设的访问实质上是对外设接口电路中相应端口的访问 。 I/O端口的寻址方式有两种,即 I/O指令寻址和存储器映像 I/O寻址 。
1,I/O
I/O指令寻址方式又称,专用的 I/O端口寻址,方式 。 其硬件结构及地址空间分配如图 6 - 1所示 。 这种寻址方式的特点是:存储器和 I/O端口在两个独立的地址空间中,I/O端口的读,写命令由 来控制,访问 I/O端口用专用的
IN指令和 OUT指令 。
IOR IOW
图 6 – 1 I/O指令寻址方式
C P U 存储器
20 16
控制逻辑
M E M R
CB
M E M W
I / O 接口
1616
I O WI O R
AB
DB
2
20
= 1M
存储单元
I / O 单元
I/O指令寻址方式的优点是,I/O端口的地址码一般比同系统中存储单元的地址码短,译码电路较简单;存储器同 I/O端口的操作指令不同,程序比较清晰;存储器和 I/O端口的控制电路结构相互独立,可以分别设计 。 它的缺点是:需要专门的 I/O指令,这些 I/O指令一般没有存储器访问指令丰富,所以程序设计的灵活性较差 。
2,存储器映像的 I/O
存储器映像的 I/O端口寻址的硬件结构及地址空间分配如图 6 - 2 所示 。 这种寻址方式的特点是:存储器和 I/O端口共用一个地址空间; I/O端口读,写命令通过 和来实现,所有访问存储器的指令都可用于 I/O端口,包括存储
。
MEMR MEMW
图 6 – 2 存储器映像的 I/O端口寻址存储器与 I / O 接口控制逻辑
M E M R
CB
M E M W
DB
C P U
AB
I / O 端口存储单元
1M
存储器映像的 I/O端口寻址方式的优点是:任何对存储器数据进行操作的指令都可用于 I/O端口的数据操作,不需要专门的 I/O指令,系统编程比较灵活; I/O端口的地址空间是一部分内存空间,使可大可小,外设的数目几乎不受限制 。 它的缺点是,I/O端口占用了一部分内存空间,使内存空间减少;
访问 I/O端口同访问内存一样,由于访问内存的地址长,指令的机器码也长,执行时间显然增加 。 简单外设接口框图如图 6
- 3 所示 。
图 6 –3 简单外设接口数据口
DB 数据状态口控制口
AB
CB
C P U
状态信息控制信息外设
6.2 输入 /
在微机系统中 。 大量数据在 CPU,存储器和 I/O接口之间传送 。 数据传送过程中的关键问题是数据传送的控制方式 。
微机系统中数据传送的控制方式有:程序控制方式,DMA(直接存储器存取 )方式和 I/O处理机方式 。 I/O处理机方式在微机系统中用得不多,这里不作介绍 。
6.2.1程序控制的输入 /输出方式程序控制的数据传送分为无条件传送,查询传送和中断传送,这类传送方式的特点是以 CPU为中心,由 CPU控制,通过预先编制好的输入或输出程序实现数据的传送 。 这种传送方式的数据传送速度较低,传送时要经过 CPU内部的寄存器,
同时数据的输入 /输出的响应也较慢 。
1.
无条件传送方式是假设输入接口数据已经准备好,或者输出设备是空闲的,此时 CPU无需查询状态,可直接用 IN和
OUT指令完成与接口之间的数据传送 。
采用无条件传送方式的接口电路如图 6 - 4 所示。
图 6 - 4
(a) 无条件传送的输入方式; (b)无条件传送的输出方式数据三态缓冲器来自外设地址译码器
I O / M
RD
8
8
数据总线地址总线
( a )
锁存器到外设 地址译码器
I O / M
WR
8
8
数据总线地址总线
( b )
CE
& &
当进行输入时,由于数据保持时间比 CPU的处理时间长,
输入端必须用输入缓冲器与 CPU的数据总线相连 。 当 CPU执行输入指令时,I/O读信号 有效,来自输入设备的数据到达数据总线,传送给 CPU。 显然,CPU在执行输入指令时,要求外设的数据已经准备好,否则就会出错 。
当进行输出时,由于外设速度较慢,要求接口有锁存功能,
即 CPU送给外设的数据应该在接口中保持一段时间 。 当 CPU执行输出指令时,I/O 有效,CPU输出的信息经过数据总线进入输出锁存器,输出锁存器保持这个数据,直到外设取走该数据 。 显然,CPU在执行输出指令时,必须保证锁存器是空闲的 。
从以上分析可以看出,无条件传送是最简便的传送方式,
它所需的硬件和软件都较少 。
IOR
IOW
2,查询传送方式当 CPU与外设工作不同步时,很难确保 CPU在执行输入操作时,外设一定是,准备好,的;而在执行输出操作时,外设一定是,空闲,的 。 为保证数据传送的正确进行,可采用查询传送方式 。
利用查询方式输入数据之前,CPU要查询输入数据是否准备好;利用查询方式输出数据之前,CPU要查询输出设备是否空闲 。 只有确认外设已经具备了传送条件后,才能用 IN
和 OUT指令完成数据传送 。
与无条件传送方式相比,采用查询方式的接口电路要复杂些,因为它要提供 CPU查询的电路 。
(1) 查询式输入 。
图 6 - 5 所示为查询式输入的接口电路,该电路有两个端口寄存器,即状态口寄存器和数据口寄存器 。
当输入设备准备好数据之后,发出选通信号 。 它一方面把输入数据锁存到数据锁存器中,另一方面使状态标志触发器置 1。 状态标志是一位信号,通过缓冲器后,接到 CPU数据总线的某一位上,假设接至 D7位 。 CPU先读状态口,查询
D7是否为 1。 若 D7=1,表示输入数据已经准备好,再读数据口,取走输入数据,同时使状态标志触发器复位 。 图 6 - 6 所示为查询式输入数据的程序流程图 。
图 6- 5 查询式输入的接口电路输入装置锁存器数据选通信号
+ 5V
D
R
Q
缓冲器
( 1 )
数据三态缓冲器
( 8 )
R e a d y
状态信息去数据总线 DB
地址译码
I O / M
状态端口译码
I O / M
RD
RD
地址译码数据端口译码地址总线
&
&
图 6 – 6 查询式输入数据的流程图输入状态信息
N
R E A D Y?
输入数据
Y
SCAN,IN AL,
TEST AL,80H
JZ SCAN
IN AL,
(2) 查询式输出 。 图 6 - 7 所示为查询式输出接口电路,它的状态口和数据口合用一个地址 。
当前输出设备空闲时,状态标志触发器清 0。 CPU在输出数据之前,先读取状态信息 。 假设忙闲标志接至数据线 D0位,当
D0=0时,表示输出设备空闲,CPU再对数据口执行输出指令 。
图 6 – 7 查询式输出接口电路输出装置锁存器数据
+ 5V
D Q
数据总线
DB
地址译码器状态端口
WR
地址译码器输出数据端口地址总线
R
A C K
三态缓冲器
( 1 )
I O / M
" B U S Y "
RD
I O / M
去数据总线 DB
状态信息
" B U S Y "
&
&
数据口选中信号一方面把输出数据写入锁存器,一方面使状态标志触发器置 1,通知输出设备 。 当输出设备取走当前数据后,向接口发出确认信号 ACK,使状态标志触发器清 0,
表示输出设备空闲 。
图 6 - 8 为查询式输出数据的程序流程图 。
查询输出的程序段如下:
SCAN,IN AL,状态口地址;
TEST AL,01H ;
JNZ SCAN ; 忙,
MOV AL,
OUT 数据口地址,AL ;空闲,
图 6- 8 为查询式输出数据的程序流程图 。
读状态端口
Y
B U S Y?
读出数据
N
准备输出数据
6.2.2中断控制的输入 /
,也称中断传送方式,即当外设的输入数据准备好或接收数据的锁存器为空时,主动向
CPU发出中断请求,使 CPU中断原来执行的程序 (主程序 ),转去执行为外设服务的输入或输出操作,服务完毕,CPU再继续执行原来的程序 。
中断传送方式中,CPU和外设 (甚至多个外设 )可同时工作,
从而大大提高了 CPU的效率和控制程序执行的实时性 。
中断传送时的接口电路如图 6 - 9 所示 。 它有两个端口,即数据口和中断控制口,它们合用一个口地址 。
图 6 –9 中断传送方式接口电路输出装置锁存器数据中断类型码
+ 5V
D Q
三态缓冲器
I N T R
去数据总线
DB
地址总线选通装置中断允许
WR
地址译码器
I O / M
去数据总线 DB三态缓冲器
I N T A
( 中断响应信号)
&
&
当输入设备数据准备好后,发出选通信号,该信号把数据存入锁存器,同时使 D触发器置 1,发出中断请求 。 若中断是开放的,则 CPU接收中断请求信号,在现行指令执行完后,
暂停正在执行的程序,发出中断响应信号 。 由外设将一个中断矢量放到数据总线上,CPU就转入中断服务程序,完成读取或输出数据,同时清除中断请求标志 。 中断处理完毕后,
CPU返回被中断的程序继续执行 。
为了增强中断的灵活性,在中断传送方式的接口电路中,
常常设置中断允许触发器,该触发器受 CPU控制 。 当向端口写 01H时,中断允许触发器置 1,这样,如果输入设备数据准备好,接口就可以发出中断请求了 。 当向端口写入 00H时,
中断允许触发器清 0,禁止向 CPU提出中断请求 。
6.2.3直接存储器存取传送方式在中断传送方式中,是通过 CPU执行程序来实现数据传送的,故实际传送一个字节仍需要几十到几百微秒 。 这对于高速
I/O设备以及成组交换数据的情况 (例如磁盘与内存之间的信息交换 ),速度就显得太慢了 。 为此,设想采用硬件实现在外设与内存之间直接的数据传送,而不通过 CPU,这样,数据传送速度的上限就取决于存储器的工作速度 。 这种方式称为直接存储器存取 ( Direct Memory Access,简称 DMA) 。
DMA方式的数据交换不是由 CPU执行一段程序来完成的,
而是由硬件来实现的 。 数据交换过程由单独的 DMA控制器来控制,CPU不介入 。
实际上,CPU和 DMA控制器是共享一个存储器的两个独立的处理单元,只不过 DMA控制器是一个特别简单的处理单元,
且不受程序控制 。 当 DMA和 CPU同时要求访问内存而发生冲突时,为不丢失数据,通常赋于 DMA控制器以较高的优先权,以便及时响应高速设备所提出的数据传送请求,而推迟 CPU指令的执行 。 为实现这种传送方式而设计的专用控制芯片称为 DMA
控制器 ( DMAC),较常用的为 Intel 公司的 8237A。
6.3
6.3.1
当某件事件发生时,为了对该事件进行处理,CPU中止现行程序的执行,转去执行处理该事件的程序 (俗称中断处理程序或中断服务程序 ),待中断服务程序执行完毕,再返回断点继续执行原来的程序,这个过程称为中断 。 其过程如图 6 -
10 所示 。 以外设提出交换数据为例,当 CPU 执行主程序到第 K条指令时,外设如果提出交换数据的请求,CPU响应外设交换数据的请求,转入中断状态,执行中断服务程序 。 在完成中断服务后恢复原来程序,即从第 K+ 1条指令 (断点处 )
继续执行 。 这样,便产生了保护现场和恢复现场的要求 。
图 6 – 10 中断过程示意图中断处理主程序
K
K + 1
返回
N + m
所以当 CPU转入中断处理程序时,首先应保留中断时的断点地址 K+1和 CPU寄存器状态 (即保护现场 )。 一旦数据交换完毕,必须恢复现场,再返回到断点地址 K+1,继续执行原程序 。 中断处理程序的大致流程如图 6 - 11 所示 。
采用中断技术,能实现以下功能:
① 分时操作 。
计算机配上中断系统后,CPU就可以分时执行多个用户的程序和多道作业,使每个用户认为它正在独占系统 。 此外,
CPU可控制多个外设同时工作,并可及时得到服务处理,使各个外设一直处于有效工作状态,从而大大提高主机的使用效率 。
图 6 –11 中断处理流程保护现场为外设服务恢复现场
② 实时处理 。
当计算机用于实时控制时,计算机在现场测试和控制,
网络通信,人机对话时都会具有强烈的实时性,中断技术能确保对实时信号的处理 。 实时控制系统要求计算机为它们的服务是随机发生的,且时间性很强,要求做到近乎即时处理,
若没有中断系统是很难实现的 。
③ 故障处理 。
计算机运行过程中,往往会出现一些故障,如电源掉电,
存储器读出出错,运算溢出,还有非法指令,存储器超量装载,信息校验出错等等 。 尽管故障出现的概率较小,但是一旦出现故障将使整个系统瘫痪 。 有了中断系统后,当出现上述情况时,CPU就转去执行故障处理程序而不必停机 。 中断系统能在故障出现时发出中断信号,调用相应的处理程序,
将故障的危害降低到最低程度,并请求系统管理员排除故障 。
6.3.2
引起中断的原因或发出中断请求的来源,称为中断源 。
通常中断源有以下几种:
(1) 外部设备请求中断 。
一般的外部设备 (如键盘,打印机,A/D转换器等 )在完成自身的操作后,向 CPU发出中断请求,要求 CPU为它服务 。
(2) 故障强迫中断 。
计算机在一些关键部位都设有故障自动检测装置 。 如运算溢出,存储器读出出错,外部设备故障,电源掉电以及其它报警信号等,这些装置的报警信号都能使 CPU中断,进行相应的中断处理 。
(3) 实时时钟请求中断 。
在控制中常遇到定时检测和控制,为此常采用一个外部时钟电路 (可编程 )控制其时间间隔 。 需要定时时,CPU发命令使时钟电路开始工作,一旦到达规定的时间,时钟电路发出中断请求,由 CPU转去完成检测和控制等工作 。
(4) 数据通道中断 。
数据通道中断也称直接存储器存取 (DMA)操作,如磁盘,
磁带机或 CRT等直接与存贮器交换数据所要求的中断 。
(5) 程序自愿中断 。
CPU执行了特殊指令 (自陷指令 )或由硬件电路引起的中断是程序自愿中断,是指当用户调试程序时,程序自愿中断检查中间结果或寻找错误所在而采用的检查手段,如断点中断,
单步中断等 。
6.3.3中断分类按中断处理方式,中断可分为简单中断和程序中断 。 简单中断采用周期窃用的方法来执行中断服务,有时也称数据通道或
DMA。 程序中断不是窃用中央处理机的周期来进行中断处理,
而是中止现行程序的执行转去执行中断服务程序 。
按中断产生的方式,中断可分为自愿中断和强迫中断 。 自愿中断,即通过自陷指令引起的中断,或称软件中断,例如程序自愿中断 。 强迫中断,是一种随机发生的实时中断,例如外部设备请求中断,故障强迫中断,实时时钟请求中断,数据通道中断等 。
按引起中断事件所处的地点,中断可分为内部中断和外部中断 。 外部中断也称为外部硬件实时中断,它由来自 CPU某一引脚上的信号引起 。 内部中断也称软件指令中断,它是为了处理程序运行过程中发生的一些意外情况或调试程序而提供的中断 。
6.3.4
(1) 识别中断源 。
当 CPU响应外部设备的中断请求后,必须识别出是哪一台外设请求中断,然后再转入对应于该设备的中断服务程序 。
CPU识别请求中断设备的过程称为中断源的识别 。 利用程序来查询设备的请求中断状态,从而确认出应该服务的设备号,
并转入相应设备号的中断服务程序,这种方法称为软件查询技术识别中断源 。 CPU利用识别中断指令,可识别出硬件设备中排队优先的设备,并取回占有优先权的设备的编码 (或称设备地址 ),CPU根据设备地址转入相应的中断服务程序 。
(2) 中断优先权 。
一般而言,一个系统中有多个中断源 。 当某一时刻出现两个或多个中断源提出中断请求时,中断系统应能判别优先权最高的中断请求 。 在处理完优先权最高的中断请求后,再去响应其它较低优先级的中断请求 。 中断源的优先权是根据它们的重要性事先规定好的 。
(3) 中断嵌套 。
当 CPU响应某一中断源的请求,正在执行中断处理时,若有优先权级别更高的中断源发出中断申请,则 CPU要能中断正在执行的中断服务程序,响应高优先级中断 。 在高优先级中断处理完后再返回继续执行被中断的中断服务程序,即能实现中断处理程序的嵌套 。
如果一个系统中有三个中断源,优先权的安排为:中断 1
为最高,中断 3为最低,则中断处理如图 6 - 12 所示 。
(4) 中断与返回 。
当某一中断源发出中断请求时,CPU能决定是否响应该中断请求 。 若允许响应该中断请求,CPU必须在现行的指令执行完后,把断点处的 PC(即下一条应执行的指令地址 ),各个寄存器的内容和标志位的状态,压入堆栈保留下来 (称为保护断点和现场 )。 然后转到需要处理的中断源的服务程序入口,
同时清除中断请求触发器 。 中断处理完毕,再恢复被保留下来的各个寄存器和标志位的状态 (称为恢复现场 ),最后恢复
PC值 (称为恢复断点 ),使 CPU返回断点,继续执行主程序 。
图 6 – 12 中断嵌套示意图中断 3 请求
n
中断 3
服务程序
m
中断 2
服务程序
1
中断1
服务程序
I R E T
1 + 1
I R E T
中断 1 请求
m + 1
I R E T
n + 1
断点中断 2 请求主程序
6.3.5中断优先权如果系统中有多个中断源,就要考虑其优先权问题 。 通常,多个中断源的中断请求信号都是送到 CPU同一引脚上申请中断服务的,这就要求 CPU能识别出是哪些中断源在申请中断,同时比较它们的优先权,从而决定先响应哪一个中断源的中断请求 。 另外,当 CPU正在处理中断时,也可能要响应更高级的中断请求,并屏蔽同级或较低级的中断请求,这些都需要分清各中断源的优先权 。 有些微机系统中,中断源的优先级可以由用户根据轻重缓急安排,一般可采用软件优先级排队和硬件优先级排队两种方法 。
1.
软件优先级排队是指各个中断源的优先权由软件安排,
与硬件电路关系不大 。 图 6 - 13 所示电路是一种配合软件优先级排队使用的电路,图中各中断源的优先权不是由硬件电路安排,而是由软件安排的 。
图中若干个外设的中断请求信号相,或,后,送至 CPU
的中断接收引脚 ( 如 INTR) 。 这样,只要任一外设有中断请求,CPU便可响应中断 。 在中断服务子程序前可安排一段优先级的查询程序,即 CPU读取外设中断请求状态端口,然后根据预先确定的优先级级别逐位检测各外设的状态,若有中断请求就转到相应的处理程序入口 。 其流程如图 6 - 14 所示 。
图 6 –13 软件优先级排队电路三态缓冲器
D
0
D
7
…
1
2
OC 门
I N T R 4 3
+ 5V R
2
1
OC 门
0 # 外设
7 # 外设
…
端口地址
1
1
1
图 6 –14 软件优先权查询流程图保留现场
A 申请服务?
B 申请服务?
C 申请服务?
恢复现场
外设 A 中断服务程序外设 B 中断服务程序外设 C 中断服务程序
Y
Y
Y
N
查询的顺序反映了各个中断源的优先权的高低 。 显然,
最先查询的外设,其优先权级别最高 。 这种方法的优点是节省硬件,优先权安排灵活;缺点是查询需要耗费时间,在中断源较多的情况下,查询程序较长,可能影响中断响应的实时性 。
2.
硬件优先级排队是指利用专门的硬件电路或中断控制器对系统中各中断源的优先权进行安排 。
(1) 硬件优先级排队电路 。
链式优先权排队电路是一种简单的中断优先权硬件排队电路,如图 6 - 15 所示 。 采用该方法时,每个外设对应的接口上连接一个逻辑电路,这些逻辑电路构成一个链,称为菊花链,由该菊花链来控制中断响应信号的通路 。
图 6 - 15
(a) 菊花链; (b) 菊花链逻辑电路设备 1
接口
C P U 以及总线控制逻辑
I N T A
I N T R
中断回答菊花链逻辑电路中断请求设备 2
接口菊花链逻辑电路设备 3
接口菊花链逻辑电路
( a )
三态缓冲器去数据总线 DB
中断类型码
1 无
0 有中断回答菊花链逻辑电路
I N T A
I N T R
中断请求
1 有
0 无
1 封锁后一级
0 开放后一级
( b )
1 1 1
1
1
≥1
≥1
1
从图 6 - 15 中可以看到,当一个外设有中断请求时,
CPU如果允许中断,则会发出 信号 。 如果链条前端的外设没有发出中断请求信号,那么这级中断逻辑电路就会允许中断响应信号 原封不动地往后传递,一直传到发出中断请求的外设; 如果某一外设发出了中断请求,那么本级的中断逻辑电路就对后面的中断逻辑电路实现阻塞,使 信号不再传到后面的外设 。 因而菊花链电路各个外设的中断优先权就由其在链中的位置决定,处于菊花链前端的比处于后端的优先级高 。 当某一外设收到中断响应信号后,就控制有关电路送出中断类型码,从而执行相应的中断服务程序 。
INTA
INTA
INTA
当多个外设同时发出中断请求信号时,根据电路分析可知,处于链头的外设先得到中断响应,而排在菊花链中较后位置的外设就收不到中断响应信号,因而暂时不会被处理 。
若 CPU正执行某个中断处理子程序,又有级别较高的外设提出中断请求,由于菊花链电路中级别低的外设不能封锁级别高的外设得到中断响应信号,故可响应该中断请求,从而发生中断嵌套现象 。
(2) 可编程中断控制器 。
采用可编程中断控制器是当前微型计算机系统中解决中断优先权管理的常用方法 。 通常,中断控制器包括下列部件:
中断优先权管理电路,中断请求锁存器,中断类型寄存器,
当前中断服务寄存器以及中断屏蔽寄存器等 。
其中,中断优先权管理电路用来对所处理的各个中断源进行优先权判断,并根据具体情况预先设置优先权 。 实际上,
中断控制器也可以认为是一种接口,外设提出的中断请求经该环节处理后,再决定是否向 CPU传送,CPU接受中断请求后的中断响应信号也送给该环节处理,以便得到相应的中断类型码 。
6.4.1
Intel 80X86系列微机有一个灵活的中断系统,可以处理
256个不同的中断源,每个中断源都有相应的中断类型码
( 0~255) 供 CPU识别 。 中断源可以来自 CPU外部,也可以来自 CPU内部,可分成两大类:硬件中断和软件中断,如图 6 -
16 所示 。 80386以上高档微处理器工作于保护方式时的中断情况与 8086/8088稍有不同 。
1.
硬件中断是由外部硬件产生的,又称为外部中断 。
8086/8088为外部设备提供了两条硬件中断信号线,即 NMI和
INTR,分别接收非屏蔽中断和可屏蔽中断请求信号 。
6.4 80X86/Pentium中断图 6- 16 8086/8088中断分类
I N T n 指令( 软件中断)
中断逻辑
I N T 3
指令
I N T O
指令单步中断除数为
0 中断非屏蔽中断请求中断控制系统
( 8 2 5 9 A )
硬件中断可屏蔽中断请求
N M I
I N T R
…
(1) 非屏蔽中断 。
由 NMI引脚出现中断请求信号 CPU产生的中断称为非屏蔽中断请求,它不受中断允许标志 IF的限制,其中断类型码为 2。 当 NMI引脚上出现上升沿触发时,表示非屏蔽中断请求信号有效,CPU内部会把该信号锁存起来,但要求该信号的有效电平持续 2个时钟周期以上 。 CPU接收到非屏蔽中断请求信号后,不管当前正在做什么事,都会在执行完当前指令后立即响应中断请求而进入相应的中断处理 。 在实际系统中,
非屏蔽中断通常用来处理系统中出现的重大事故和紧急情况,
如系统掉电处理,紧急停机处理等 。 在 IBM PC系列微机中,
若系统板上存储器产生奇偶校验错或 I/O通道上产生奇偶校验错或 Intel 8087/80287产生异常都会引起一个 NMI中断 。
(2) 可屏蔽中断 。
一般外部设备提出的中断请求是从 CPU的 INTR引脚上引入的,所产生的中断为可屏蔽中断 。 INTR信号是高电平触发的,与内部中断和非屏蔽中断相比,可屏蔽中断受中断标志 IF
的影响 。 只有在 IF=1的情况下,CPU才会在执行当前指令后响应可屏蔽中断请求信号,所以,即使 INTR信号有效,也必须保持到当前指令执行结束 。 如果 IF=0,即使中断源有中断请求,
CPU也不会响应,也称为中断被屏蔽 。 IBM PC系列微机中,
通常外部设备提出的中断请求信号首先通过中断控制器 8259A
预处理后,再决定是否向 CPU的 INTR引脚提出中断请求 。 系统中可屏蔽中断可以有一个或多个,CPU响应可屏蔽中断请求后,引脚送出两个负脉冲,并配合有关电路获得与中断源对应的中断类型码 。
INTA
2,软件中断软件中断是 CPU根据软件的某条指令或者软件对标志寄存器的某个标志位的设置而产生的,由于它与外部硬件电路完全无关,故也称为内部中断 。 在 80X86系统中,内部中断主要有以下几种:
(1) 除法出错中断 ——0型中断 。
当执行除法指令时,若发现除数为 0或商超过了机器所能表达数的范围,则立即产生一个中断类型码为 0的内部中断,
该中断称为除法出错中断 。 一般该中断的服务处理都由操作系统安排 。
(2) 单步中断 ——1型中断 。
若 TF=1,则 CPU处于单步工作方式,即每执行完一条指令之后就自动产生一个中断类型码为 1的内部中断,使得指令的执行成为单步执行方式 。
单步执行方式为系统提供了一种方便的调试手段,成为能够逐条指令地观察系统操作的一个窗口 。 如 DEBUG中的跟踪命令,就是将标志 TF置 1,进而去执行一个单步中断服务程序,
以跟踪程序的具体执行过程,找出程序中的问题或错误所在 。
需要说明的是,在所有类型的中断处理过程中,CPU会自动地把状态标志压入堆栈,然后清除 TF和 IF。 因此当 CPU进入单步处理程序时,就不再处于单步工作方式,而以正常方式工作 。
只有在单步处理结束后,从堆栈中弹出原来的标志,才使 CPU
返回到单步工作方式 。
80X86指令系统中没有设置或清除 TF标志的指令。
但指令系统中的 PUSHF和 POPF为程序员提供了置位或复位 TF的手段 。 例如,若 TF=0,下列指令序列可使 TF
(3) 溢出中断 ——4型中断 。
若算法操作结果产生溢出 ( OF=1),则执行 INTO指令后立即产生一个中断类型码为 4的中断 。 4型中断为程序员提供了一种处理算术运算出现溢出的手段,它通常和算术指令功能配合使用 。
PUSHF
POP AX
OR AX,0100H
PUSH AX
POPF
(4) 指令中断 ——n型中断 。
在指令系统中,介绍了中断指令 INTn,这种指令的执行也会引起内部中断,其中断类型码由指令中的 n指定 。 该指令就称为软中断指令,通常指令的代码为两个字节代码,第一字节为操作码,第二字节为中断类型码 。 但是中断类型码为 3的软中断指令却是单字节指令,因而它能很方便地插入到程序的任何地方,专供在程序中设置断点调试程序时使用,也称为断点中断 。 插入 INT3指令之处便是断点,在断点中断服务程序中,
可显示有关的寄存器,存储单元的内容,以便程序员分析到断点为止程序运行是否正确 。
还需指出,内部中断的类型码是预定好的或包含在软中断指令中,除单步中断外,其他的内部中断不受状态标志影响,中断后的服务处理须由用户自行安排 。
6.4.2中断向量表在 80X86中断系统中,无论是外部中断还是内部中断,系统都分配给每一个中断源一个确定的中断类型码,其长度为一个字节,故系统中最多允许有 256个中断源 ( 其对应类型码为
0~255) 。 那么,80X86CPU在响应中断后,是如何转入各个中断服务程序的呢?
所谓中断向量,实际上就是中断处理子程序的入口地址 。
通常在内存的最低 1 KB( 00000H~003FFH) 建立一个中断向量表,分成 256个组,每组占 4个字节,用以存放 256个中断向量 。 每个中断向量占 4个字节,其中前 2个字节存放中断处理子程序的入口地址的偏移量 ( IP,16位 ),后 2个字节存放中断处理子程序入口地址的段地址 ( CS,16位 ) 。 按照中断类型码的序号,对应的中断向量在中断向量表中按规则顺序排列,
如图 6 - 17所示 。
图 6 –17 中断向量表类型 0 中断入口( 除法出错)
类型 1 中断入口( 单步中断)
类型 2 中断入口( N M I)
类型 3 中断入口( 断点中断)
类型 4 中断入口( 溢出中断)
类型 5 中断入口类型 3 1 中断入口类型 3 2 中断入口类型 2 5 5中断入口
……
……
15 8 7 0
0 0 0
0 0 4
0 0 8
0 0 C
0 1 0
0 1 4
0 7 F
0 8 0
3 F C
供用户使用系统备用专用中断
IP
CS
IP
CS
IP
CS
图中前 5个中断类型是 80X86规定的专用中断,有着固定的意义和处理功能;类型码 5~31为系统使用或保留;类型码
32~255可以由用户自行使用 。 但是,在一种具体的微机系统中,可能对用户可使用的中断类型码另有规定,如 PC/AT中断类型码 70H~77H就已有安排,所以用户在进行系统开发和应用时应注意 。
中断类型码与中断向量在向量表中的位置之间的对应关系为:
中断向量地址指针 =4×
例如,中断类型码为 20H的中断源对应的中断向量存放在 0000,0080H( 4× 20H=80H) 开始的 4个单元中 。
如果在 00080H~00083H这 4个单元中存放的值分别为 10H、
20H,30H,40H,那么,在该系统中,20H号中断所对应的中断向量即中断处理程序的入口地址为 4030H,2010H。
又如,一个系统中对应于中断类型码为 17H的中断处理子程序存放在 1234,5670H开始的内存区域中,则对应于
17H类型码的中断向量存放在 0000,005CH( 4× 17H=5C) 开始的 4个字节中 。 所以 0段的 005CH~005FH这 4个单元中的值分别为 70H,56H,34H,12H。
6.4.3
80X86中的各种中断响应和处理过程是不相同的,其主要区别在于如何获取相应的中断类型码 。
1.
对于专用中断,中断类型码是自动形成的,而对于 INT n
指令,其类型码即为指令中给定的 n。 在取得了类型码后的处理过程如下:
① 把类型码乘 4,作为中断向量表的指针 。
② 把 CPU的标志寄存器入栈,保护各个标志位 。
③ 清除 IF和 TF标志,屏蔽新的 INTR中断和单步中断 。
④ 保存断点,即把断点处的 IP和 CS值压入堆栈,先压入
CS值,再压入 IP值 。
⑤ 从中断向量表中取中断服务程序的入口地址,分别送至 CS和 IP中 。
⑥ 按新的地址指针执行中断服务程序 。
在中断服务程序中,通常要保护现场,进行相应的中断处理,恢复现场,最后执行中断返回指令 IRET。 IRET的执行将使 CPU按次序恢复断点处的 IP和 CS值以及标志寄存器,
于是程序就恢复到断点处继续执行 。
内部中断有以下特点:
① 中断由 CPU内部引起,中断类型码的获得与外部无关,
CPU不需要执行中断响应周期去获得中断类型码 。
② 除单步中断外,内部中断无法用软件禁止,不受中断允许标志位的影响 。
③ 内部中断没有随机性,这一点与调用子程序非常相似 。
2,外部中断响应过程
(1) 非屏蔽中断响应 。 当 CPU采样到非屏蔽中断请求时,
自动提供中断类型码 2,然后根据中断类型码查到中断向量表指针,其后的中断处理过程与内部中断一样 。
(2) 可屏蔽中断响应 。
当 INTR信号有效时,如果中断允许标志 IF=1,则 CPU就会在当前指令执行完毕,响应外部的中断请求,转入中断响应周期 。
中断响应周期有 2个,每个响应周期都由 4个 T状态组成 。
CPU在每个响应周期都从 引脚上发一个负脉冲的中断响应信号 。 中断响应的第一个总线周期用来通知请求中断的外设,CPU准备响应中断,现在应该准备好中断类型码;在第二个总线响应周期中,要求请求中断的外设在接到第二个负脉冲以后 ( 第二个中断响应周期的 T3状态前 ),立即把中断类型码通过数据总线传送给 CPU。 CPU在 T4状态的前沿采样数据总线,获取中断类型码 。 如图 6 - 18 所示 。 其后的中断响应过程和内部中断一样 。
INTA
图 6 –18 中断响应总线周期
T
1
T
2
T
3
T
4
T
I
T
I
T
I
T
1
T
2
T
3
T
4
中断类型AD
7
~ A D
0
I N T A
A L E
空闲状态
C L K
当一个可屏蔽中断被响应时 CPU实际执行的总线周期有 7
个 。 即:
① 执行 2个中断响应总线周期,CPU获得相应的中断类型码,将它左移 2位形成中断向量表指针,存入暂存器 。
② 执行 1个写总线周期,把标志寄存器 FR的内容压入堆栈 。
同时,置中断允许标志 IF和单步标志 TF为 0,以禁止中断响应过程中其他可屏蔽中断的进入,同时也禁止了中断处理过程中出现单步中断 。
③ 执行 2个写总线周期,把断点地址的内容压入堆栈 。
④ 执行 1个读总线周期,从中断向量表中取出中断处理子程序入口地址的偏移量送到 IP寄存器中 。
⑤ 执行 1个读总线周期,从中断向量表中取出中断处理子程序入口地址的段基地址送到 CS寄存器中 。
(3) 中断优先权 。 图 6 - 19 所示的是 80X86中断响应和处理流程 。
所有中断都是在当前指令结束后处理的,在 80X86系统中各种中断源的优先权实际上是指被识别出来的先后 。 在当前指令执行完后 CPU首先自动查询在指令执行过程中是否有除法出错中断,溢出中断和 INT n中断发生,然后查询 NMI和
INTR,最后查询单步中断,先查询到的先被响应 。
图 6 – 19 80X86中断响应和处理流程当前指令执行结束软件中断?
Y
N M I?
I N T R?
形成中断类型码
I F = 1?
T F = 1?
执行下一条指令
N
进入中断响应取中断类型码形成中断类型码标志寄存器入栈令 T E M P = TF
清 IF 和 TF
CS,IP 入栈调用中断处理程序又有
N M I?
T E M P = 1?
执行中断处理程序
IP,CS 出栈标志寄存器出栈返回被中断的主程序
IR ET
N
N
Y
Y
Y Y
N
Y
N
Y
Y
N
N
6.4.4 IBM PC/AT中断分配在 IBM PC系列微机中,中断向量表是由 DOS操作系统在启动时建立的,用户可以修改以便增加功能 。 尽管不同档次的微机硬件配置不同,使用 DOS的版本不同,但中断向量表定义的功能基本相同 。 表 6 - 1 给出了中断分配表 。
6.4.5
1.
80386/80486及 Pentium等高档微处理器不仅具有前面讲到的所有中断类型,而且大大丰富了内部中断的功能,把许多执行指令过程中产生的错误情况也纳入了中断处理的范围,这类中断称为异常中断,简称异常 ( Exception) 。 有时也将软中断指令 INT n纳入异常中断的范围 。 异常分为三类:失效 (Faults)、
陷阱 (Traps)和中止 ( Abort) 。 三类异常的差别表现在两个方面,一是发生异常的报告方式,二是异常中断服务程序的返回方式 。
失效:若某条指令在启动之后,真正执行之前被检测到异常,产生异常中断,而且在中断服务完成后返回该指令,重新启动并执行完成,这类异常就是失效 。
例如,在读虚拟存储器时,首先产生存储器页失效或段失效,此时中断服务程序立即按被访问的页或段将虚拟存储器的内容从磁盘上转移到物理内存中,然后再返回主程序中重新执行这条指令,程序正常执行下去 。
陷阱:产生陷阱的指令在执行后才被报告,且其中断服务程序完成后返回到主程序中的下一条指令 。 例如用户自定义的中断指令 INT n就属于此类型 。
中止:该类异常发生后无法确定造成异常指令的实际位置,
例如硬件错误或系统表格中的错误值造成的异常 。 在此情况下原来的程序已无法执行,因此中断服务程序往往重新启动操作系统并重建系统表格 。
2.
为了管理各种中断,80386/80486和 Pentium等高档微处理器都设立了一个中断描述符表 IDT( Interrupt Descriptor Table) 。
表中最多可包含 256个描述符项,对应 256个中断或异常 。 描述符中包含了各个中断服务程序入口地址的信息 。 当
80386/80486等高档微处理器工作于实地址方式时,系统的 IDT
变为 80386/80486系统中的中断向量表,存于系统物理存储器的最低地址区中,共 1 KB。 每个中断向量占 4 个字节,即 2
个字节的 CS值和 2个字节的 IP值 。
当高档微处理器工作于保护方式时,系统的 IDT可以置于内存的任意区域,其起始地址存放在 CPU内部的 IDT基址寄存器中 。
有了这个起始地址,再根据中断或异常的类型码,即可取到相应的描述符项 。 每个描述符项占 8个字节,其中包括 2
个字节的选择器和 4 个字节的偏移量,这 6个字节共同决定了中断服务程序的入口地址;其余 2个字节存放类型值等说明信息 。 得到中断服务程序的入口地址便可进行相应的中断处理 。
6.5 可编程中断控制器为了使多个外部中断源共享中断资源,必须解决几个问题 。
例如,若微处理器只有一根中断请求输入线,就无法同时处理多个中断源发出的中断请求信号;另外,如何区分中断矢量,
各中断源的的优先级别如何判定等问题,也需要解决 。 这就需要有一个专门的控制电路在微处理器的控制下去管理那些中断源并处理它们发出的中断请求信号 。 这种专门管理中断源的控制电路就是中断控制器 。 可编程中断控制器 8259A就是为这个目的设计的中断优先级管理电路 。 它具有如下功能,
① 它可以接收多个外部中断源的中断请求,并进行优先级别判断,选中当前优先级别最高的中断请求,再将此请求送到微处理器的中断输入端 。
② 具有提供中断向量,屏蔽中断输入等功能 。
③ 可用于管理 8级优先权中断,也可将多片 8259A通过级连方式构成最多可达 64级优先权中断管理系统 。 8259A管理的
8级中断对应的服务程序入口地址构成的中断向量表存放在内存固定区域 。
④ 具有多种工作方式,自动提供中断服务程序入口地址,
使用灵活方便 。
6.5.1 8259A
1,8259A的引脚说明
8259A为 28脚双列直插式封装器件,管脚分配如图 6 -
20 所示。
D0~ D7:双向数据线,用来与 CPU交换数据。
INT:中断请求,输出信号,由 8259A传给 CPU,或由从
8259A传给主 8259A。
:中断响应,输入信号,来自 CPU。
IR0~ IR7:中断请求输入,由外设传给 8259A。 8259A规定的中断优先级顺序为 IR0> IR1> … > IR7。
INTA
图 6 – 20 8259A的外部引脚
CS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
28
27
26
25
24
23
22
21
20
19
18
17
16
15
WR
RD
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
C A S
0
C A S
1
V
CC
A
0
I N T A
IR
7
IR
6
IR
5
IR
4
IR
3
IR
2
IR
1
IR
0
I N T
S P / E N
C A S
2
G N D
IR0~ IR7:中断请求输入,由外设传给 8259A。 8259A规定的中断优先级顺序为 IR0> IR1> … > IR7。
CAS0~ CAS2:级连信号 。 对于主片,这三个信号是输出信号,根据它们的不同组合 000~ 111,分别确定连在哪个
IRi上的从片工作 。 对于从片,这三个信号是输入信号,以此判别本从片是否被选中 。
/,从设备编程 /允许缓冲器,双向 。 作输入信号使用时,即为,作为主设备与从设备的选择控制信号,=1时,该 8259A作为主片; 当 =0时,该
8259A作为从片 。 作输出信号使用时,即为,作为允许缓冲器接收发送的控制信号 。
SP EN
SP
EN EN
EN
A0,内部寄存器选择控制信号,输入信号 。 8259A规定,
当 A0=0时,对应的寄存器为 ICW1,OCW2和 OCW3;当 A0=1时,
对应的寄存器为 ICW2~ ICW4和 OCW1。
,片选信号,输入信号 。 一般来自地址译码器的输出 。
,读允许信号,输入 。 来自 CPU 。
,写允许信号,输入 。 来自 CPU 。
2.
图 6 - 21为 8259A的内部结构和逻辑框图 。 8259A由八个部分构成,它们是中断服务寄存器,中断优先权判断器,中断屏蔽寄存器,中断请求寄存器,中断控制逻辑,数据总线缓冲器,级连缓冲器 /比较器和读 /写控制逻辑 。
CS
RD
WR
IOR
IOW
图 6 – 21 8259A的内部结构控制电路内部控制逻辑初始化命令寄存器组操作命令寄存器组
I N T I N T A
中断服务寄存器
I S R
中断优先级判断器中断请求寄存器
I R R
IR
0
IR
1
IR
2
IR
3
IR
4
IR
5
IR
6
IR
7
中断屏蔽寄存器 I M R
内部数据总线级连缓冲器比较器
C A S
2
C A S
1
C A S
0
S P / E N
读写控制逻辑
RD
WR
A
0
CS
数据总线缓冲
D
7
~ D
0
8 8
(1) 中断请求寄存器 IRR( Interrupt Request Register) 。
IRR是一个 8位寄存器,用来接收来自 IR0~ IR7上的中断请求信号,并将 IRR相应位置位 。 外设产生中断请求信号的方式有边沿触发方式和电平触发方式,用户可根据需要通过编程进行设置 。
(2) 中断服务寄存器 ISR( Interrupt Service Register) 。
ISR是一个 8位寄存器,用来存放当前正在处理的中断请求 。
在中断嵌套方式下,可以将其内容与新进入的中断请求进行优先级比较,从而决定是否进行嵌套 。
(3) 中断屏蔽寄存器 IMR( Interrupt Mask Register) 。
IMR是 8位寄存器,用来存放中断屏蔽字,可由用户通过编程进行设置 。
当 IMR的第 i位置位时,来自 IRi的中断请求被屏蔽了,从而禁止来自 IRi的中断 。 因此用户设置 IMR的各位后,可以改变系统原来的中断优先级 。
(4) 中断优先权判断器 。
在中断响应期间,可以根据控制逻辑规定的优先权级别和
IMR的内容,把 IRR中提出中断的优先权最高的中断请求位送 ISR。
(5) 数据总线缓冲器 。
数据总线缓冲器是一个 8位三态双向缓冲器,是 8259A与局部总线的接口 。 微处理器通过它向 8259A传送命令字,控制 8259A的工作模式,同时也接收 8259A传送的工作信息及中断向量 。
(6) 控制逻辑 。
在 8259A的控制逻辑电路中,有一组初始化命令寄存器
(ICW1~ ICW4)和一组操作命令字寄存器 (OCW1~ OCW3),这 7
个寄存器可由用户根据需要通过编程进行设置,控制逻辑电路可以根据程序来管理 8259A的全部工作 。
(7) 读 /写控制逻辑 。
读 /,,
的控制下,控制着 8259A的数据总线缓冲器之间的信息传送,控制逻辑如表 6 - 2 所示 。 它把微处理器送来的命令字传送到 8259A中相应的命令寄存器中 (包括初始化命令字 ICW1、
ICW2,ICW3,ICW4 和操作控制字 OCW1,OCW2,OCW3、
OCW4),再把 8259A中相应的控制器 /寄存器中的内容 (IRR、
ISR,IMR)输出到数据总线上 。
CS
IOR )(RD )()( WRIOW
(8) 级连缓冲器 /比较器 。
级连缓冲器 /比较器用来存放和比较系统中全部 8259A的标记 IDS。 这个标记是微处理器通过数据总线送入 8259A的 。
所有的 8259A通过级连线 CAS0 ~ CAS2 三条 I/O外线实现互连 。
其中必须有一个 8259A为主片,其余的 8259A为从片 。 主片通过 CAS0~ CAS2 输出标记信息,而从片通过这三条线输入标记信息,并与自己原有的标记进行比较,如果相同则该从片被主片选中,它就在中断响应周期把自己的中断向量送到数据总线上 。
6.5.2 8259A
8259A同微处理器之间,除了提出中断申请外,还要通过 8位数据线传送数据和命令,把 8位的数据总线用作输入,
输出端口,由微处理器对 8259A写入命令,设置其工作状态,
或者由微处理器对 8259A的状态寄存器进行读出 。 这时,与一般的输入 /输出设备一样,,A0,等信号进行控制,表 6 - 2 列出了对寄存器访问的控制方法 。 在利用数据总线传送中断向量时,由来自微处理器的 信号控制,
与作为 I/O,A0,等无关 。
请求中断处理的设备通过 8259A的中断请求输入线送出高电平或者正脉冲,提出中断请求 。 8259A的 IR输入一旦变成高电平,在 IRR内与这个输入相对应的位被置 1。 下面主要介绍单个 8259A工作 (即 8259A作为主片 )时进入中断处理的过程:
CS RD WR
CS RD WR
INTA
① 当一条或多条中断请求线 (IR0~ IR7)变成高电平时,设置相应的 IRR位 。
② 在 8259A判断了中断优先权和中断屏蔽寄存器的状态后,
如果条件合适,就向微处理器发出高电平信号 INT,请求中断服务 。
③ 微处理器接到中断请求信号后,如果满足条件,则响应中断,输出回答信号为 引脚上的两个负脉冲 。
④ 8259A接到来自微处理器的第一个 脉冲时,把允许中断的最高优先级请求位置入 ISR,并把 IRR中相应的位复位 。 同时,8259A准备向数据总线发送中断向量 。
INTA
INTA
6.5.3 8259A的工作方式
8259A具有非常灵活的中断管理方式,可满足用户各种不同要求,并且这些工作方式都可以通过编程来设置 。 但是,
由于工作方式多,使用户感到 8259A的编程和使用不太容易掌握 。 为此,在讲述 8259A的编程之前,我们先对 8259A的工作方式分类进行简明的介绍 。
1.
按照优先权设置方法来分,8259A有以下两种工作方式,
(1) 普通全嵌套方式 。
普通全嵌套方式是 8259A最常用的工作方式,简称为全嵌套方式 。 该方式下中断优先权是固定的,即 IR0优先权最高,
IR1优先权最低 。 当 CPU响应中断时,8259A就把申请中断的优先权最高的中断源在 ISR中的相应位置,1”,而且把它的中断类型码送到数据总线上 。
在此中断源的中断服务程序完成之前,与它同级或优先权更低的中断源的申请就被屏蔽,只有优先权比它高的中断源的申请才是允许的 ( 当然,CPU是否响应取决于 CPU是否处在开中断状态 ) 。
(2) 特殊全嵌套方式 。
特殊全嵌套方式和普通全嵌套方式只有一点不同,在特殊全嵌套方式下,当处理某一级中断时,如果有同级的中断请求,
那么也会给予响应,从而实现一种对同级中断请求的特殊嵌套 。
特殊全嵌套方式一般用在 8259A级连系统中 。 在这种情况下,主片 8259A编程为特殊全嵌套方式 。 这样,当来自某一从片的中断请求正在处理时,一方面,和普通全嵌套方式一样,
对来自优先级较高的主片其他引脚上的中断请求进行开放;另一方面,对来自同一从片的较高优先级请求也会开放 。
另外,在特殊全嵌套方式中,中断结束的操作应注意须用软件检查刚结束的中断是否是从片的唯一中断 。 其方法是:
先向从片发一正常结束中断命令 EOI( End of Interrupt),然后读 ISR内容 。 若为 0表示只有一个中断服务,这时再向主片发一个 EOI命令;否则,说明该从片有两个以上中断,则不应发给主片 EOI命令,待该从片中断服务全部结束后,再发送
EOI命令给主片 。
2.
在实际应用中,中断源的优先权情况是比较复杂的,不一定有明显的等级,而且优先权还可能改变 。 所以,不能总是规定 IR0优先权最高,IR7优先权最低,而要根据实际情况来处理 。 故 8259A设计了两种改变优先权的方法,
(1) 自动循环方式 。
在优先权自动循环方式中,优先级队列是在变化的 。 一个设备受到中断服务以后,它的优先级自动降为最低,原来比它低一级的中断则为最高级,依次排列 。 如初始优先级队列规定为 IR0,IR1,IR2,…,IR7。 此时,若 IR4请求中断,则处理 IR4,
在 IR4被服务以后,IR4自动左循环到最低优先级,IR5 成为最高优先级,这时中断源的优先级依次为 IR5,IR6,IR7,IR0、
IR1,IR2,IR3,IR4。 这种方式一般用在系统中多个中断源优先级相同的场合 。
(2) 特殊循环方式 。
特殊循环方式与优先权自动循环方式只有一点不同,在优先权特殊循环方式中,可以编程写 OCW2来设置当前的中断优先级顺序 。 例如,确定 IR5为最低优先级,那么当前的优先级顺序为 IR6,IR7,IR0,…,IR5。
3.
我们知道,不管用哪种优先权方式工作,当一个中断请求得到响应时,8259A都会将中断服务寄存器 ISR中相应位置
,1”,为以后中断优先权电路的工作提供依据 。 当中断服务程序结束时,必须使该 ISR位清零;否则,8259A的中断控制功能就会不正常 。 这个使 ISR位复位的动作就是中断结束处理 。
注意,这里的中断结束是指 8259A结束中断的处理,而不是
CPU结束执行中断服务程序 。
8259A分自动中断结束方式和非自动中断结束方式,而非自动中断结束方式又分为普通 ( 或称一般,正常 ) 中断结束方式和特殊中断结束方式 。
(1) 自动中断结束方式 ( AEOI) 。
若采用该方式,信号的后沿,8259A将自动把中断服务寄存器 ISR中的对应位清除 。 这样,尽管系统正在为某个设备进行中断服务,但对 8259A来说,
中断服务寄存器中却没有对应位作指示,所以,就好像已经结束了中断服务一样 。 这种最简单的中断结束方式,只能用于不要求中断嵌套的情况 。
INTA
(2) 普通中断结束方式 。
这种方式配合全嵌套优先权工作方式使用 。 当 CPU用输出指令向 8259A发出普通中断结束 EOI时,8259A就会把 ISR中已置位的最高位复位,因为在全嵌套方式中,置 1的最高 ISR
位对应了最后一次被响应和被处理的中断,也就是当前正在处理的中断,所以,最高 ISR位复位相当于结束了当前正在处理的中断 。
(3) 特殊中断结束方式 ( SEOI) 。
在非全嵌套方式下,由于中断优先级不断改变,无法确知当前正在处理的是哪级中断,这时就要采用特殊中断结束方式 。 采用这种方式反映在程序中就是要发一条特殊中断结束命令,在这个命令中指出了要清除哪个 ISR位 。
这里,我们还要指出一点,不管是普通中断结束方式,
还是特殊中断结束方式,对于级连系统的从片在一个中断服务程序结束时,都必须发两次中断结束命令,一次是对主片发送的,一次则是对从片发送的 。
4.
8259A的 8个中断请求都可根据需要单独屏蔽,屏蔽是通过编程使得屏蔽寄存器 IMR相应位清,0”或置,1”,从而允许或禁止相应中断 。 8259A有两种屏蔽方式 。
(1) 普通屏蔽方式 。
普通屏蔽方式中,将 IMR某位置,1”,则它对应的中断就被屏蔽,从而使这个中断请求不能从 8259A送到 CPU。 如果该位清,0”,则允许该级中断 。
(2) 特殊屏蔽方式 。
有些情况下,希望一个中断服务程序能动态地改变系统的优先权结构 。 例如,在执行中断服务程序某一部分时,希望禁止较低级的中断请求;但在执行中断服务程序的另一部分时,又希望能够开放比本身的优先级低的中断 。
为达到这样的目的,我们自然会想到使屏蔽寄存器的对应位置 1,使本级中断受到屏蔽 。 这样,便可以为开放较低级中断请求提供可能 。 但是这样做有一个问题:每当一个中断请求被响应时,就会使 ISR对应位置 1,所以只要没有发出
EOI命令,8259A就会据此而禁止所有优先级比它低的中断 。
因此,尽管使当前处理的较高级的中断请求被屏蔽,但由于
ISR位未被复位,较低级的中断请求在发出 EOI命令之前仍不会得到响应 。
为此,在设置了特殊屏蔽方式后,再编程使 IMR某位置位,
就会同时使 ISR的对应位复位 。 这样,就不只是屏蔽当前正在处理的这级中断,而且还真正开放了其他级别较低的中断 。
当然未被屏蔽的更高级中断也可以得到响应 。
5.
外设的中断请求信号从 8259A的引脚 IRn引入,但根据实际工作需要,8259A
(1) 边沿触发方式 。
在边沿触发方式下,8259A的引脚 IRn上出现上升沿,表示有中断请求,高电平不表示有中断请求 。
(2) 电平触发方式。
在电平触发方式下,8259A的引脚 IRn上出现高电平,表示有中断请求。这种方式下,应注意及时撤除高电平,否则可能引起不应该有的第二次中断。
无论是边沿触发还是电平触发,中断请求信号 IR都应维持足够的宽度。即在第一个中断响应信号 结束之前,IR都必须保持高电平,如果 IR信号提前变为低电平,8259A会自动假设这个中断请求来自引脚 IR7。这种办法能够有效地防止由 IR输入端上严重的噪声尖峰而产生的中断。
INTA
为实现这一点,对应 IR7的中断服务程序可只执行一条返回指令,从而滤除这种中断 。 如果 IR7另有它用,仍可通过读 ISR
状态而识别非正常的 IR7中断 。 因为,正常的 IR7中断会使相应的
ISR位置,1”,而非正常 IR7中断则不会使 ISR的 D7位置,1”。
6.5.48259A的状态设定
8259A根据接收到的微处理器的命令进行工作 。 微处理器的命令分为两类:一类是初始化命令,称为初始化命令字
(ICW)。 8259A在进入操作之前,必须由初始化命令字来使它处于初始状态 。 另一类是操作命令,称为操作控制字 (OCW)。
在对 8259A进行初始化之后,用这些控制字来控制 8259A执行不同的操作方式 。 操作控制字可在初始化后的任何时刻写入
8259A。
1.
8259A有 4个初始化命令字 ICW1~ ICW4,它们按照一定的顺序送入,设置 8259A的初始状态 。 无论何时,当微处理器向
8259A发送一条 A0=0和 D4=1的命令时,这条命令就译码为 ICW1。
它启动 8259A的初始化过程产生下列动作:清除 IMR,
把最低优先级分配给 IR7,把最高优先级分配给 IR0,将从设备标志 ID置成 7,清除特殊屏蔽方式,设置读 IRR方式 。 各初始化命令字的功能如下:
(1) ICW1( 初始化字 ) 。 ICW1称为芯片控制初始化命令字 。 ICW1的各位定义如下:
1 LTIM SNGL
A0 D7 D6 D5 D4 D3 D2 D1 D0
D7,D6,D5,D2在 8086/8088系统中不用,可为 1,也可为 0。 它们在 8080/8085系统中使用 。
D4=1和 A0=0是 ICW1的标志 。 在初始化命令字设置过程结束后,当 A0=0时,D4=0表示操作控制字 OCW2或 OCW3。
LTIM用来设定中断请求信号的形式 。 如果 LTIM=0,则表示中断请求为边沿触发方式; 如果 LTIM=1,则表示中断请求为电平触发方式 。
SNGL用来指出本片 8259A是否与其他 8259A处于级连状态 。
当系统中只有一片 8259A时,SNGL为 1;当系统中有多个
8259A时,SNGL为 0。
IC4用来指出初始化过程中是否设置 ICW4。 若 IC4为 0,表示不用 ICW4;若 IC4为 1,表示用 ICW4。 在 8086/8088系统中,
ICW4是必须使用的,此时 IC4必定为 1。
(2) ICW2( 中断类型码字 ) 。
ICW2是设置中断类型码的初始化命令字 。 ICW2的各位定义如下:
A0 D7 D6 D5 D4 D3 D2 D1 D0
0 A15/T7 A14/T6 A13/T5 A12/T4 A11/T3 A10 A9 A8
编程时用 ICW2设置中断类型码高 5位 T7~ T3,低 3位插入
IR的编码 。
(3) ICW3( 级连控制字 ) 。
ICW3是标志主片 /从片的初始化命令字 。 只有在一个系统中包含多片 8259A时,ICW3才有意义 。
A0 D7 D6 D5 D4 D3 D2 D1 D0
0 IR7 IR6 IR5 IR4 IR3 IR2 IR1 IR0
从上面格式可见,如果本片为主片,则 D7~ D0对应于 IR7~
IR0引脚上的连接情况 。 如果某一引脚上连有从片,则对应位为
1 ; 如 果 未 连 从 片,则 对 应 位 为 0 。 例如,当
ICW3=F0H(11110000)时,表示 IR7,IR6,IR5,IR4引脚上接有从片,而 IR3,IR2,IR1,IR0引脚上没有从片 。
如果本片是从片,则 ICW3的格式如下:
A0 D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 0 0 0 ID2 ID1 ID0
就是说,如果本片为从片,则 ICW3的 D7~ D3不用,可以为 0,也可以为 1,但为了和以后的产品兼容,所以使它们为 0。
ID2~ ID0是从设备标志 ID的二进制代码,它等于从片 8259A的
INT端所连的主片 8259A的 IR编码 。 表 6 - 3 列出了从设备标志的编码 。
表 6-3 从设备标志编码
(4) ICW4( 中断结束方式字 ) 。
ICW4为方式控制初始化命令字 。 只有在 ICW1的 D0位为 1时,
才有必要设置 ICW4,否则不必设置 。
ICW4的格式如下:
A0 D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 0 SFNM BUF M/S AEOI uPM
D7 ~ D5位总是为 0,用来作为 ICW4的标识码 。
若 D4(SFNM)为 1,则为特殊的全嵌套方式 。 在采用特殊全嵌套方式的系统中,一般都使用了多片 8259A。
若 D3(BUF)为 1,则为缓冲方式 。 在缓冲方式下,8259A
通过总线驱动器和数据总线相连 。 此时,引脚 作为输出端来使用 。 在 8259A和 CPU之间传输数据时,启动数据总线驱动器 。
如果 8259A不通过总线驱动器和数据总线相连,则 BUF
应该设置为 0。 在单片的 8259A系统中,接高电平 。
D2(M/S)在缓冲方式下用来表示本片为从片还是主片 。 即
BUF=1时,如果 M/S=1,则表示本片为主片;如果 M/S=0,
则表示本片为从片 。 当 BUF=0时,则 M/S不起作用,可为 0 可为 1。
/SP EN
/SP EN
/SP EN
D1(AEOI)指定是否为中断自动结束方式 。 AEOI=1,则设置中断自动结束方式; AEOI=0时,不用中断自动结束方式,
这时必须在中断服务程序中使用 EOI,使 ISR中最高的优先权的位复位 。
D0( μPM) 指定微处理器的类型 。 μPM=0时,表示
8259A工作于 8080/8085系统中; μPM= 1时,表示 8259A工作于 8086/8088系统中 。
2,初始化命令字的编程顺序在 8259A进入正常工作之前,必须将系统中的每片 8259A
进行初始化 。 初始化命令字用来设定 8259A的初始状态 。 在初始化的过程中,ICW1和 ICW2总是要出现的 。
ICW3 和 ICW4 是否使用,由 ICW1 的相应位决定 。 当
SNGL=0时,需要 ICW3分别用作主片或从片的 8259A,它们的格式是不同的 。 ICW1的 IC4=1时,需要 ICW4,对于 8086/8088
系统,ICW4总是需要的 。 CPU向 8259A写入命令时,A0=0和
D4=1标志着写入 ICW1,初始化过程开始 。 随后写入的初始化命令字由 A0=1作为标志 。 初始化过程结束后,才能写入操作控制字 。 图 6 -22为对 8259A进行初始化的流程图 。
3,8259A的操作命令字在对 8259A用初始化命令字进行初始化后,就进入工作状态,准备好接收 IR输入的中断请求信号 。 在 8259A工作期间,
可通过操作命令字来使它按不同的方式进行操作 。
图 6 – 22 8259A初始化流程图存储器与 I / O 接口控制逻辑
M E M R
CB
M E M W
DB
C P U
AB
I / O 端口存储单元
1M
操作命令字是在应用程序内部设置的 。 操作命令字共有三个,可以独立使用 。
(1) OCW1( 屏蔽控制字 ) 。 OCW1称为中断屏蔽操作命令字 。 其格式如下:
A0 D7 D6 D5 D4 D3 D2 D1 D0
1 M7 M6 M5 M4 M3 M2 M1 M0
在写入 OCW1时,直接对中断屏蔽寄存器 IMR的相应屏蔽位进行置位或复位操作 。 M7~ M0代表 8个屏蔽位,用来控制
IR输入的中断请求信号 。 如果某一位 M=1,它就屏蔽对应的
IR输入 (即 M0=1屏蔽 IR0,M1=1屏蔽 IR1等等 ),禁止它产生中断输出信号 INT。
如果 M=0,则清除屏蔽状态,允许对应的 IR输入信号产生 INT输出,请求微处理器进行服务 。
屏蔽某个 IR输入,不影响其它的 IR输入的操作 。 因此利用 OCW1屏蔽某些 IR请求,可以禁止这些设备的中断请求,而其它的设备可以通过未屏蔽的 IR去申请中断 。
(2) OCW2( 中断结束和优先权循环控制字 ) 。
OCW2用来设置优先级循环方式和中断结束方式。其格式如下:
A0 D7 D6 D5 D4 D3 D2 D1 D0
0 R SL EOI 0 0 L2 L1 L0
与这些操作有关的命令和方式控制大多以组合格式使用
OCW2。 命令或方式的选择应当以组合格式来设置,而不是按位设置 。
R是优先级循环控制位 。 R=1为循环优先权,R=0为固定优先权 。
SL用来选择指定的 IR级别位 。 决定 OCW2中的 L2,L1,
L0 是否有效 。 若 SL=1,则 L2,L1,L0有效;若 SL=0,则 L 2、
L1,L0无效 。
EOI是中断结束命令位 。 在非自动中断结束命令的情况下,
EOI= 1表示中断结束命令,它使 ISR中最高优先权的位复位;
EOI=0则不起作用 。
这三个控制位的组合格式所形成的命令和方式如表 6 - 4
所示。
中断结束 -清除循环 AEOL方式 -特殊循环 L2,L1,L0用来指定操作起作用的 IR级别码 。 在表 6 - 5 的组合位控制格式中,
凡 SL=1的指令,在 L2,L1,L0所指定的 IR级别编码上都起作用 。 SL=0时,不使用 L2,L1,L0位 。 L2,L1,L0的编码与作用的 IR级别如表 6 - 5 所示 。
(3) OCW3(屏蔽和读状态控制字 )。
OCW3的功能有三个方面:一是设置和撤消特殊屏蔽方式;
二是设置中断查询方式;三是用来设置对 8259A内部寄存器的读出命令 。 其格式如下:
A0 D7 D6 D5 D4 D3 D2 D1 D0
0 0 ESMM SMM 0 1 P RR RIS
ESMM是特殊屏蔽模式允许位,是允许或禁止 SMM位起作用的控制位 。 当 ESMM= 1时,允许 SMM位起作用;当
ESMM=0时,禁止 SMM位起作用 。
SMM是设置特殊屏蔽方式控制位 。 当 ESMM=1和
SMM=0时,选择特殊屏蔽方式;当 ESMM=1和 SMM=1时,
清除特殊屏蔽方式,恢复一般屏蔽方式;当 ESMM=0时,
SMM位不起作用 。
P是查询命令位 。 当 P=1时,8259A发送查询命令;当
P=0时,不处于查询方式 。 当 ESMM=0时,这一位不起作用 。
RR是读寄存器命令位 。 当 RR=1时,允许读 IRR或 ISR;当
RR=0时,禁止读这两个寄存器 。
RIS:读 IRR或 ISR选择位 。 如果 RR=1和 RIS=1,则允许读中断服务寄存器; 如果 RR=1和 RIS=0,则允许读中断请求寄存器 IRR; 当 RR=0,则 RIS位无效 。
6.5.5 8259A应用举例
1,8259A在 PC/XT
IBM PC/XT微机只使用了一片 8259A,可处理 8个外部中断,如图 6 - 23 所示 。 其中,IRQ0接至系统板上定时器 /计数器 Intel 8253通道 0的输出信号 OUT0,用作微机系统的日时钟中断请求; IRQ1是键盘输入接口电路送来的中断请求信号,用来请求 CPU读取键盘扫描码; IRQ2是系统保留的;另外 5个请求信号接至 I/O通道,由 I/O通道扩展板电路产生 。 在 I/O通道上,
通常 IRQ3用于第 2个串行异步通信接口,IRQ4用于第一个串行异步通信接口,IRQ5用于硬盘适配器,IRQ6用于软盘适配器,
IRQ7用于并行打印机 。
图 6 – 23 IBM PC/XT与 8259A接口
IR
0
IR
1
IR
2
IR
3
IR
4
IR
5
IR
6
IR
7
I R Q
0
I R Q
1
I R Q
2
I R Q
3
I R Q
4
I R Q
5
I R Q
6
I R Q
7
中断控制器
I N T日时钟键盘保留串行口 2
串行口 1
硬盘软盘打印机
A
0
地址 A
0
I N T A C S
( 片选)
CS
WR
RD
数据 D
7
~ D
0
编程/ 中断类型码
I N T R
C P U
总线控制器
I O R
I O W
I N T AI N T A
S
2
S
1
S
0
S P / E N
C A S
2
C A S
1
C A S
0
+ 5V
NC
S
2
S
1
S
0
在 I/O地址空间中,分配给 8259A的 I/O端口地址为 20H和
21H。 对 8259A的初始化规定,边沿触发方式,缓冲器方式,
中断结束为 EOI命令方式,中断优先权管理采用全嵌套方式 。 8
级中断源的类型码为 08H~0FH。 各级中断源规定如表 6 - 6 所示 。
( 1) 8259A初始化编程 。 根据系统要求,8259A初始化编程如下:
MOV AL,00010011B ;设置 ICW1为边沿触发,单片
8259A需要 ICW4
OUT 20H,AL
MOV AL,00001000B ; 设置 ICW2中断类型码基数为
08H,
( 2) 8259A操作方式编程 。
在用户程序中,允许用 OCW1来设置中断屏蔽寄存器 IMR,
以控制各个外设申请中断允许或屏蔽 。 但注意不要破坏原设定工作方式 。 如允许日时钟中断 IRQ0和键盘中断 IRQ1,其他状态不变,则可送入以下指令:
IN AL,21H ; 读出 IMR
AND AL,0FCH ; 只允许 IRQ0和 IRQ1,其他不变
OUT 21H,AL ; 写入 OCW1,即 IMR
由于中断采用的是非自动结束方式,因此若中断服务程序结束,则在返回断点前,必须对 OCW2写入 00100000B,即 20H,
发出中断结束命令 。
MOV AL,20H ; 设置 OCW2的值为 20H
OUT 20H,AL ; 写入 OCW2的端口地址 20H
IRET ;
在程序中,通过设置 OCW3,亦可读出 IRR,ISR的状态以及查询当前的中断源 。 如要读出 IRR内容以查看申请中断的信号线,这时可先写入 OCW3,再读出 IRR。
MOV AL,20H ; 写入 OCW3,读 IRR
OUT 21H,AL
NOP ; 延时,等待 8259A的操作结束
IN AL,20H ; 读出 IRR
当 A0=1时,IMR的内容可以随时方便地读出,如在 BIOS
中,中断屏蔽寄存器 IMR的检查程序如下:
MOV AL,0 ; 设置 OCW1为 0,送 OCW1口地址,
表示 IMR为全 0
OUT 21H,AL
IN AL,21H ; 读 IMR
OR AL,AL ; 若不为 0,则转出错程序 ERR
JNZ ERR
MOV AL,OFFH ; 设置 OCW2为 FFH,送 OCW1口地址,表示 IMR为全
OUT 21H,AL
IN AL,21H ; 读 IMR
ADD AL,1 ; IMR=0FFH?
JNZ ERR ; 若不是 0FFH,则转出错程序 ERR
.,....
ERR
2,8259A在 PC/AT
在 PC/AT微机中,共有两片 8259A,如图 6 - 24 所示 。
由图 6 - 24 可见,主片 8259A原来保留的 IRQ2中断请求端用于级连从片 8259A,所以相当于主片 IRQ2又扩展了 8个中断请求端 IRQ8~IRQ15。
图 6 – 24 PC/AT与 8259A接口
8实时钟
9中断改向 0 A H
10保留
11保留
12保留
13协处理器
14硬盘
15保留中断控制器
I N T R
8 2 5 9
( 从片)
SP
0日时钟
1键盘
2
3串口 2
4串口 1
5并口 2
6软盘
7并口 1
C A S 2
C A S 1
C A S 0
SP
I N T A
+ 5V
8 2 5 9
中断控制器
( 主片)
8 0 2 8 6 /
8 0 3 8 6
C P U
I N T R
D
7
~ D
0
主片的端口地址为 20H,21H,中断类型码为 08H~0FH,
从片的端口地址为 A0H,A1H,中断类型码为 70H~77H。 主片的 8级中断已被系统用尽,从片尚保留 4级未用 。 其中 IRQ0
仍用于日时钟中断,IRQ1仍用于键盘中断 。 扩展的 IRQ8用于实时时钟中断,IRQ13来自协处理器 80187。 除上述中断请求信号外,所有的其他中断请求信号都来自 I/O通道的扩展板 。
(1) 8259A初始化编程 。
对主片 8259A的初始化编程如下:
MOV AL,11H ; 写入 ICW1,设定边沿触发,级
OUT 20H,AL
JMP INTR1 ; 延时,等待 8259A
INTR1,MOV AL,08H ; 写入 ICW2,设定 IRQ0的中断类型码为 08H
OUT 21H,AL
JMP INTR2
INTR2,MOV AL,04H ;写入 ICW3,设定主片 IRQ2级连
INTR3,MOV AL,11H ; 写入 ICW4,设定特殊全嵌套方式,普通 EOI方式
OUT 21H,AL
对从片 8259A
MOV AL,11H ; 写入 ICW1,设定边沿触发,级连方式
OUT 0A0H,AL
JMP INTR5
INTR5,MOV AL,70H ;写入 ICW2,设定从片 IR0,即
IRQ8的中断类型码为 70H
OUT 0A1H,AL
JMP INTR6
INTR6,MOV AL,02H ; 写入 ICW3,设定从片级连于主片的 IRQ2
OUT 0A1H,AL
JMP INTR7
INTR7,MOV AL,01H ; 写入 ICW4,设定普通全嵌套方式,普通 EOI方式
OUT 0A1H,AL
(2) 级连工作编程 。
当来自某个从片的中断请求进入服务时,主片的优先权控制逻辑不封锁这个从片,从而使来自从片的更高优先级的中断请求能被主片所识别,并向 CPU发出中断请求信号 。
因此,当中断服务程序结束时必须用软件来检查被服务的中断是否是该从片中唯一的中断请求 。 先向从片发出一个
EOI命令,清除已完成服务的 ISR位,然后再读出 ISR的内容检查它是否为 0。 ISR的内容为 0,则向主片发一个 EOI命令,
清除与从片相对应的 ISR位;否则,就不向主片发 EOI命令,
继续执行从片的中断处理,直到 ISR的内容为 0,再向主片发出 EOI命令 。
读 ISR
MOV AL,0BH ; 写入 OCW3,读 ISR
OUT 0A0H,AL
NOP ; 延时,等待 8259A
IN AL,0A0H ; 读出 ISR
从片发 EOI
MOV AL,20H
OUT 0A0H,AL ; 写从片 EOI
主片发 EOI命令的程序如下:
MOV AL,20H
OUT 20H,AL ; 写主片 EOI
6.6 中断程序设计
80X86系列微处理机可以处理 256个中断,分为内部中断和外部中断 。 对于不同类型的中断,处理过程略有差异,但基本上都是根据中断类型码在中断向量表中查找中断服务程序的入口地址,以便调用相应的中断服务程序 。 所以,在进行中断服务程序设计时,需要首先设置中断向量表,把需要执行的中断服务程序的入口地址事先放入中断向量表的相应存储单元,
然后才能允许中断 。 几种中断服务程序的编程原则大致相同 。
但是,由于可屏蔽中断要涉及到中断控制器的操作,所以其编程较内部中断和非屏蔽中断复杂 。
下面以可屏蔽中断为例,介绍中断程序设计的一般过程 。
1.
由于中断响应后须在中断向量表中查找中断服务程序的入口地址,所以在进入中断处理前,主程序应设置好中断向量,
使其指向相应的中断服务程序 。 在 PC系列微型计算机中,若利用其内部的 8259A处理中断,则还须在设置中断向量表之前,
首先保存原中断向量的内容,以便在执行用户程序后,恢复原状态 。 即在用户程序退出前,取出原中断向量恢复到中断向量表中 。
当设置中断向量表时,可以利用数据传送指令直接访问中断向量表的相应存储单元,写入中断向量,也可以利用 DOS系统功能调用 INT21H的 25H和 35H号功能调用修改中断向量 。
如果借用 PC/XT微机系统中的 IRQ3( 0BH) 响应外部中断,中断后须执行的子程序的过程名为 INT-PROC,其中中断向量表的设置可以用下面的程序段实现:;
:
INTSEG DW?
INTOFF DW?
:
MOV AH,35H
MOV AL,0BH
INT 21H
MOV INTSEG,ES ;
MOV INTOFF,BX ;;
CLI; 关中断,
PUSH DS
MOV AX,SEG INTPROC
MOV DS,AX
MOV DX,OFFSET INTPROC
MOV AH,25H
MOV AL,0BH
INT 21H
POP DS
2,设置中断控制器在响应可屏蔽中断前,需要对中断控制器进行设置 。 若利用 PC微机内部的 8259A处理中断,由于操作系统已经对
8259A进行过初始化及操作方式安排,所以只要对中断屏蔽寄存器 IMR进行相应处理 。 对于通过 8259A控制的硬件中断,
必须使中断屏蔽寄存器 IMR的相应位置 0,才能允许中断请求 。
同样,为了在应用程序返回 DOS后恢复原状态,应在修改
IMR之前保存原内容,并于程序退出前予以恢复 。
在程序中还可以通过控制屏蔽位,随时允许或禁止有关中断的产生 。 假设允许 IRQ3响应外部中断,编程修改 IMR的程序如下:
INTIMR DB?
:
IN AL,21H ; 读出 IMR
MOV INTIMR,AL ; 保存原 IMR
AND AL,0F7H ; 允许 IRQ3,
OUT 21H,AL ; 设置新 IMR
:; 恢复原先的 IMR
MOV AL,INTIMR ; 取出保留的 IMR
OUT 21H,AL ; 重写 OCW 1
:
3,设置 CPU的中断允许标志 IF
硬件中断来自外设,它随时都可能提出申请,除利用 IMR
控制某一个或几个中断响应外,还可以通过关中断指令 CLI和开中断指令 STI控制所有可屏蔽中断的产生 。 当不需要中断或不能中断时,就必须关中断,防止不可预测的后果 。 而在其他时间则要开中断,以便及时响应中断,为外设提供服务 。
例如,修改中断向量表和 IMR不能产生中断,所以这段时间里必须关闭中断。
为中断服务程序提供初值等时间,也不能响应中断,所以也应该关闭中断,在此之后应该开中断 。
另外,进入中断服务程序后,可以马上开中断,从而允许较高级的中断能够嵌套执行 。
4.
中断服务程序中通常须完成以下任务:保护现场,中断服务,恢复现场,向 8259A发送中断结束命令,中断返回等 。
INTPROCPROC;
PUSH AX ;
PUSH BX
:
STI ;
,;
:
CLI ;
:
POP BX ;
POP AX
MOV AL,20H ; 向 8259A发送 EOI
OUT 20H,AL
IRET ;
INTPROC ENDP
一般说来,外部中断服务程序是用来处理较急迫的事件的,因此服务时间应尽量短 。 能放在主程序中完成的任务,
就不要由中断服务程序完成,这样可以避免干扰其他中断设备的工作 。
外部中断服务程序不要使用 DOS系统功能调用 INT 21H,
因为 DOS版本的内核是不可重入的 。 例如,当主程序在执行一个 DOS系统功能调用时,产生外部中断,中断服务程序又调用这个 DOS系统功能,就出现了 DOS重入,这是不允许的 。 中断服务程序若要控制 I/O设备,最好调用 ROM BIOS功能或者对
I/O接口直接编程 。
上述中断程序的设计过程,除了对中断控制器 8259A的操作外,其他均适合内部中断和非屏蔽外部中断 。 但非屏蔽中断在 PC机中有特殊作用,一般不要改写其中断服务程序 。
6.7 DMA 控 制
6.7.1DMA概述直接存储器存取 DMA( Direct Memory Access)方式是用硬件实现存储器与存储器之间或存储器与 I/O设备之间直接进行高速数据传送,不需要 CPU的干预。 这种方式通常用来传送数据块。
DMA传送包括,RAM→I/O 端口的 DMA读传送; I/O端口
→ RAM 的 DMA写传送; RAM→RAM 的存储单元传送 。 DMA
传送过程如图 6 - 25 所示 。 从图中可以看出,系统总线分别受到 CPU和 DMAC这两个器件的控制,即 CPU可以向地址总线,
数据总线和控制总线发送信息,DMAC也可以向地址总线,
数据总线和控制总线发送信息 。 但是,在同一时间,系统总线只能受一个器件控制 。
图 6 – 25 DMA传送过程
C P U D M A C
总线请求总线响应
I / O
D M A
响应
D M A
请求
AB
DB
CB
当 CPU控制总线时,DMAC必须与总线脱离;而当
DMAC控制总线时,CPU必须与总线脱离 。 因此,CPU与
DMAC之间必须有联络信号 。
DMA传送的工作过程如下:
① I/O端口向 DMA控制器发出 DMA请求,请求数据传送 。
② DMA控制器在接到 I/O端口的 DMA请求后,向 CPU发出总线请求信号,请求 CPU脱离系统总线 。
③ CPU在执行完当前指令的当前总线周期后,向 DMA控制器发出总线请求信号 。
④ CPU随即和系统的控制总线,地址总线及数据总线脱离关系,处于等待状态,由 DMA控制器接管这 3个总线的控制权 。
⑤ DMA控制器向 I/O端口发出 DMA应答信号。
⑥ DMA控制器把进行 DMA传送涉及到的 RAM地址送到地址总线上 。 如果进行 I/O端口 → RAM传送,DMAC向 I/O端口发出 I/O读命令,向 RAM发出存储器写命令;如果进行
RAM→I/O 端口传送,DMAC向 RAM发出存储器读命令,向
I/O端口发出 I/O写命令,从而完成一个字节的传送 。
⑦ 当设定的字节数传送完毕,DMA传输过程结束,也可以由来自外部的终止信号迫使传输过程结束 。 当 DMA传送结束后,DMA控制器就将总线请求信号变成无效,并放弃对总线的控制,CPU检测到总线请求信号无效后,也将总线响应信号变成无效,于是,CPU重新控制三总线,继续执行被中断的当前指令的其他总线周期 。
DMA用硬件在外设与内存之间直接进行数据交换 。 通常 系 统 的 数 据 和 地 址 总 线 以 及 一 些 控 制 信 号 线 ( 如
IO/,,等 )是由 CPU管理的,在 DMA方式,
就要求 CPU让出总线 (也就是将这些总线置为高阻状态 ),而由 DMA控制器 (DMAC)接管总线 。 通常,大部分 DMA都有三种 DMA传送方式:
M RD WR
(1) 单字节传送方式 。
每次 DMA传送只传送一个字节的数据,传送后释放总线,
CPU至少控制一个完整的总线周期,然后测试 DMA请求线
DREQ,若有效,再进入 DMA周期 。 在这种方式中要注意:
① DMA响应信号 DACK有效前,DREQ必须保持有效;
② 若 DREQ在传送过程中一直保持有效,在两次传送之间也必须释放总线 。
(2) 成组传送方式 。
一个 DMA请求可以传送一组信息 。 在 DMAC初始化时,
由编程决定这一组信息的字节数,只要在 DACK有效之前
DREQ保持有效即可 。 一旦 DACK有效,不管 DREQ是否有效,
DMAC一直不放弃总线控制权,直到整个数组传送完 。
(3) 请求传送方式 。
请求传送方式又称查询传送方式 。 该方式的传送类似于成组传送方式,但每传送一个字节后,DMAC就检测 DREQ,若无效,则挂起;若有效,继续 DMA传送,直到一组信息传送结束由外加信号强制 DMAC中止操作 。
DMA具有下列特点:
① 它使主存既可被 CPU访问,又可被外设直接访问;
② 当传送数据块时,主存地址的确定,传送数据的计数控制等都用硬件电路直接实现;
③ 主存中要开设专用缓冲区,及时供给和接收外设的数据;
6.7.2 8237A
8237A是微机系统中实现 DMA功能的大规模集成电路控制器 。 PC/XT使用一片 8237A,PC/AT使用两片 8237A,在高档微机中常使用多功能芯片取代 8237A,但多功能芯片中的
DMA控制器与 8237A的功能基本相同 。
1,8237A的内部结构和引脚功能
8237A是具有 4个独立 DMA通道的可编程 DMA控制器
( DMAC),+5 V电源,单相时钟,40引脚双列直插式封装 。 在实际应用中,8237A必须与一片 8位锁存器一起使用,才能形成一个完整的 4通道 DMA控制器 。 8237A
经初始化后,可以控制每一个通道在存储器和 I/O口之间以最高 1.6兆波特的速率传送最多达 64 KB的数据块,而不需要 CPU
的介入 。
8237A的基本功能如下:
① 一个芯片中有 4个独立的 DMA通道 。
② 每一个通道的 DMA请求都可以被允许或禁止 。
③ 每一个通道的 DMA请求有不同的优先级,既可以是固定优先级,也可以是循环优先级 。
④ 每一个通道一次传送的最大字节数为 64 KB。
⑤ 8237A提供 4种传送方式,单字节传送方式,数据块传送方式,请求传送方式和级连传送方式 。
8237A的内部结构如图 6 - 26 所示。它主要由以下 3个部分组成:
(1) DMA通道 。
8237A内部包含 4个独立通道,每个通道包含 2个 16位的地址寄存器,2个 16位的字节寄存器,1个 6位的方式寄存器,1个
DMA请求触发器和 1个 DMA屏蔽触发器 。 此外,4个通道共用 1
个 8位控制寄存器,1个 8位状态寄存器,1个 8位暂存器,1个 8
位屏蔽寄存器和 1个 8位请求寄存器 。
(2) 读 /写逻辑 。
当 CPU对 8237A初始化或对 8237A寄存器进行读操作时,
8237A就像 I/O端口一样被操作,读 / 信号 。IOW IOR
为低电平时,CPU可以读取 8237A的内部寄存器值;当 为低电平时,CPU可以将数据写入 8237A的内部寄存器中 。
在 DMA传送期间,系统由 8237A控制总线 。 此时,8237A
分两次向地址总线上送出要访问的内存单元 20位物理地址中的低 16位,8237A输出必要的读 /写信号,这些信号分别为 I/O读
,I/O,存储器读信号 和存储器写信号 。
IOR IOW
IOR
IOW
MEMR
MEMW
(3) 控制逻辑 。
在 DMA周期内,控制逻辑通过产生相应的控制信号和 16
位要存取的内存单元地址来控制 DMA的操作步骤 。
初始化时,通过对方式寄存器进行编程,使控制逻辑可以对各个通道的操作进行控制 。
CLK:时钟输入端,通常接到 8284时钟发生器的输出引脚,
用来控制 8237A内部操作定时和 DMA传送时的数据传送速率 。
8237A的时钟频率为 3 MHz,8237A-5的时钟频率为 5 MHz,后者是 8237A的改进型,工作速度比较高,但工作原理及使用方法与 8237A相同 。
,片选输入端,低电平有效 。
RESET:复位输入端,高电平有效 。 当 RESET有效时,屏蔽寄存器被置 1( 4个通道均禁止 DMA请求 ),其他寄存器均清
0,8237A处于空闲周期,所有控制线都处于高阻状态,并禁止 4个通道的 DMA操作 。
CS
复位后必须重新初始化,否则 8237A不能进入 DMA操作 。
READY:,准备就绪,信号输入端,高电平有效 。 当所选择的存储器或 I/ O端的速度比较慢,需要延长传输时间时,
使 READY端处于低电平,8237A就会自动地在存储器读和存储器写周期中插入等待周期 。 当传输完成时,READY端变为高电平,以表示存储器或 I/ O设备准备就绪 。
ADSTB:地址选通输出信号,高电平有效 。 当此信号有效时,8237A当前地址寄存器的高 8位经数据总线 DB7~ DB0
锁存到外部地址锁存器中 。
AEN:地址允许输出信号,高电平有效 。 AEN把外部地址锁存器中锁存的高 8位地址输出到地址总线上,与芯片直接输出的低 8位地址一起共同构成内存单元的低 16位地址 。
,存储器读信号,低电平有效,输出,只用于
DMA传送 。 在 DMA读周期期间,用于从所寻址的存储器单元中读出数据 。
,存储器写信号,低电平有效,输出,只用于 DMA
传送 。 在 DMA写周期期间,用于将数据写入所寻址的存储单元中 。
,I/ O读信号,低电平有效,双向 。 当 CPU控制总线时,它是输入信号,CPU读 8237A内部寄存器 。 当 8237A控制总线时,它是输出信号,相配合,控制数据由 I/
O端口传送至存储器 。
,I/O写信号,低电平有效,双向 。 当 CPU控制总线时,它是输入信号,CPU写 8237A内部寄存器 ( 初始化 ) 。
当 8237A控制总线时,它是输出信号,与 相配合,把数据从存储器传送至 I/ O端口 。
MEMR
MEMW
IOR
IOW
MEMW
MEMW
,DMA传送过程结束信号,低电平有效,双向 。
当 DMA控制的任一通道计数结束时,会从 引脚输出一个低电平,表示 DMA传输结束 。 而当外部向 DMA控制器输入信号时,DMA传送过程将被强迫结束,无论是从外部终止 DMA过程,还是内部计数结束引起 DMA过程终止,都会使 DMA控制器的内部寄存器复位 。
DREQ0~ DREQ3,DMA请求输入信号,有效电平可由编程设定 。 这 4条 DMA请求线是外设为取得 DMA服务而送到各个通道的请求信号 。 在固定优先级的情况下,DREQ0的优先级最高,DREQ3的优先级最低 。 在优先级循环方式下,某通道的
DMA请求被响应后,随即降为最低级 。 8237A用 DACK信号作为对 DREQ的响应,因此在相应的 DACK信号有效之前,
DREQ信号必须维持有效 。
EOP
MEMR
IOW
DACK0~ DACK3,DMA对各个通道请求的响应信号,
输出的有效电平可由编程设定 。 8237A接收到通道请求,向
CPU发出 DMA请求信号 HRQ,当 8237A获得 CPU送来的总线允许信号 HLDA后,便产生 DACK信号,送到相应的 I/ O端口,表示 DMA控制器响应外设的 DMA请求,从而进入 DMA
服务过程 。
HRQ,8237A输出给 CPU的总线请求信号,高电平有效 。
当外设的 I/ O端口要求 DMA传送时,向 DMA控制器发送
DREQ信号,如果相应的通道屏蔽位为 0,即 DMA请求未被屏蔽,则 DMA控制器的 HR0端输出为有效电平,从而向 CPU发出总线请求 。
HLDA:总线响应信号,高电平有效,是 CPU对 HRQ信号的应答 。 当 CPU接收到 HRQ信号后,在当前总线周期结束之后让出总线,并使 HLDA信号有效 。
A3~ A0:地址总线低 4位,双向 。 当 CPU控制总线时,
它们是地址输入线 。 CPU用这 4条地址线对 DMA控制器的内部寄存器进行寻址,完成对 DMA控制器的编程 。 当 8237A控制总线时,由这 4条线输出要访问的存储单元的最低 4位地址 。
A7~ A4:地址线,输出,只用于在 DMA传送时,输出要访问的存储单元的低 8位地址中的高 4位 。
DB7~DB0,8位双向数据线,与系统数据总线相连。
在 CPU控制总线时,CPU可以通过 I/O读命令从 DMA控制器中读取内部寄存器的内容,送到 DB7~DB0,以了解 8237A
的工作情况 。 也可以通过 I/O写命令对 DMA控制器的内部寄存器进行编程 。 在 DMA控制器控制总线时,DB7~DB0输出要访问的存储单元的高 8位地址 ( A15~A8),并通过 ADSTB锁存到外部地址锁存器中,并和 A7~A0输出的低 8位地址一起构成
16位地址 。
8237A仅支持 64 KB寻址,为了访问超过 64KB范围的其他地址空间,系统中增设了页面寄存器 。 在 PC/XT微机系统中,
每一通道的页面寄存器是 4位寄存器 。
当一个 DMA操作周期开始时,相应的页面寄存器内容就放到系统地址总线 A19~A16上,和 8237A送出的 16位低地址一起,构成 20位物理地址 。
2,8237A
8237A的内部寄存器分为两类:一类是 4个通道共用的寄存器,另一类是各个通道专用的寄存器 。
(1) 控制寄存器 。
8237A的 4个通道共用一个控制寄存器 。 在编程时,由 CPU
向它写入控制字,而由复位信号 ( RESET) 或软件命令清除它 。
控制寄存器格式如图 6 - 28 所示 。
① D0,规定是否工作在存储器到存储器传送方式 。
8237A约定:当进行存储器之间的数据传送时,由通道 0
提供源地址,通道 1提供目的地址并进行字节计数 。 每传送一个字节需要两个总线周期,第 1个总线周期先将源地址单元的数据读入 8237A的暂存器,第 2个总线周期再将暂存器的内容放到数据总线上,然后在写信号的控制下,写入目的地址单元 。
② D1,在存储器向存储器传送时,起控制作用 。
③ D2,用来启动和停止 8237A的工作 。
④ D3,8237A可以有两种工作时序,一种是正常时序,一种是压缩时序 。
如果系统各部分速度比较高,便可以用压缩时序,这样可以提高 DMA传输的数据吞吐量 。
⑤ D4:选择各通道 DMA请求的优先级 。 当 D4= 0时为固定优先级,即通道 0优先级最高,通道 3的优先级最低;当
D4=1时为循环优先级,即在每次 DMA服务之后,各个通道的优先级都发生变化 。 比如,某次传输前的优先级次序为 2-3-0-
1,那么在通道 2进行一次传输之后,优先级次序成为 3-0-1-2。
如果这时通道 3没有 DMA请求,而通道 0有 DMA请求,那么,
在通道 0完成 DMA传输后,优先级次序成为 1-2-3-0。
DMA的优先级排序只是用来决定同时请求 DMA服务的通道的响应次序,而任何一个通道一旦进入 DMA服务后,其他通道必须等到该通道的服务结束后,才可进行 DMA服务 。
⑥ D5:若 D5=1,选择扩展的写信号 ( 比正常时序提前一个状态周期 ) 。
⑦ D6,D7:确定 DREQ和 DACK的有效电平极性 。 对这两位如何设置,取决于 I/O端口对 DREQ信号和 DACK信号的极性要求 。
控制字是 4个通道必须共同遵循的原则 。
在 PC系列机中,当 BIOS初始化时,已将控制寄存器设定为 00H,即禁止存储器到存储器的传送,允许读/写操作,
使用正常时序,固定优先级,不扩展写信号,DREQ高电平有效,DACK低电平有效 。
(2) 方式寄存器 。 8237A的每个通道都有一个方式寄存器,
4个通道的方式寄存器共用一个端口地址,方式选择命令字的格式如图 6 - 29 所示 。
IOR IOW
图 6 – 29 方式寄存器
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
通道选择:
0 0,选择 通道 0
0 1,选择通道 1
1 0,选择通道 2
1 1,选择通道 3
0 0,校验传送
0 1,写传送
1 0,读传送
1 1,无意义通道传送方式选择,
0 0,请求传送方式
0 1,单字节传送方式
1 0,数据块传送方式
1 1,级连方式地址增减方式选择,
0,地址加 1
1,地址减 1
自动重装功能选择,
0,禁止
1,允许传送类型的选择:
① DMA传送方式 。
8237A提供 4种传送方式,每个通道可以用 4种方式之一进
· 单字节传送方式 。 每次 DMA操作只传送一个字节的数据,然后自动地把总线控制权交给 CPU,让 CPU占用至少一个总线周期 。 若又有 DMA请求信号,8237A重新向 CPU发出总线请求,等获得总线控制权后,再传送下一个字节数据 。
· 数据块传送方式 。 进入 DMA操作后,连续传送数据直到整个数据块全部传送完毕 。
· 请求传送方式 。 该方式与数据块传送方式类似,只是在每传送一个字节后,8237A都对 DMA请求信号 DREQ进行测试 。 若检测到 DREQ端变为无效电平,则马上暂停传输,但测试过程仍然进行;当 DREQ又变为有效电平时,就在原来的基础上继续进行传输,直到传送结束 。
级连传输方式 。 为了实现 DMA系统扩展,几个 8237A可以进行级连 。
② DMA数据传送的类型 。
方式选择命令字的 D位和 D2位确定数据传送的类型,即写传送,读传送和校验传送 。 写传送是将数据从 I/O端口读出写入存储单元 。 读传送是将数据从存储单元读出并写入 I/O端口 。 校验传送是一种虚拟传送,8237A本身并不进行数据传送,而只是像 DMA读传送或 DMA写传送那样产生时序,产生地址信号,但存储器和 I/O端口的读 /写控制信号无效 。 校验传送一般是在器件测试时使用 。
当 D4位为 1时,通道有“自动重装功能”。
D5位控制,当前地址寄存器,的工作方式,规定地址是增量修改还是减量修改 。
(3) 地址寄存器 。
每个通道有一个 16位的基地址寄存器和一个 16位的当前地址寄存器 。 基地址寄存器存放本通道 DMA传输时所涉及到的存储区首地址或末地址,这个初始值是在初始化编程时写入的,
同时也被写入当前地址寄存器 。 当进行 DMA传送时,由当前地址寄存器向地址总线提供本次 DMA传送时的内存地址 ( 低 16
位 ) 。 当前地址寄存器的值在每次 DMA传输后自动加 1或减 1,
为传送下一个字节作好准备 。 在整个 DMA传送期间,基地址寄存器的内容保持不变 。 当通道初始化选择,自动重装,功能时,
一旦全部字节传送完毕,基地址寄存器的内容自动重新装入当前地址寄存器 。
(4) 字节寄存器 。
每个通道有一个 16位的基本字节寄存器和一个 16位的当前字节寄存器,基本字节寄存器存放本通道 DMA传输时字节数的初值 。 8237A规定:初值比实际传输的字节数少 1,初值是在初始化编程时写入的,同时,初值也被写入当前字节寄存器 。 在 DMA传送时,每传送一个字节,当前字节寄存器自动减 1,当初值由 0减到 FFFFH时,产生计数结束信号,
输出有效电平 。 当通道初始化选择,自动重装,功能时,一旦全部字节传送完毕,基本字节寄存器的内容自动重新装入当前字节寄存器 。 基本字节寄存器预置初值后将保持不变,
也不能被 CPU读出,而当前字节寄存器中的内容可以随时由
CPU读出 。
EOP
(5) 状态寄存器 。
状态寄存器的格式如图 6 - 30 所示 。 状态寄存器的高 4位表示当前 4个通道是否有 DMA请求,低 4位指出 4个通道的
DMA传送是否结束,供 CPU查询 。 它与控制寄存器共用一个端口地址 。
(6) 请求寄存器和屏蔽寄存器 。
请求寄存器和屏蔽寄存器是 4个通道公用的寄存器,使用时应写入请求命令字和屏蔽命令字,其格式如图 6 - 31 所示 。
图 6 –30 状态寄存器的格式通道 3 通道 2 通道 1 通道 0 通道 3 通道 2 通道 1 通道 0
有 D M A 请求为 1 计数结束为 1
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
图 6-31 请求寄存器和屏蔽寄存器
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
通道选择:
1,置 1 请求触发器 0 0,通 道 0
0 1,通道 1
1 0,通道 2
1 1,通道 3
无用位
0,置 0 请求触发器
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
通道选择:
1,置 1 屏蔽触发器 0 0,通 道 0
0 1,通道 1
1 0,通道 2
1 1,通道 3
无用位
0,置 0 屏蔽触发器
8237A根据请求寄存器的 D2~ D0位,将相应通道的请求触发器置,1”( 或清,0”),使通道提出,软件 DMA请求,。
8237A根据屏蔽寄存器的 D2~ D0位,将相应通道的屏蔽触发器置,1”( 或清,0”) 。 实验表明:当一个通道的屏蔽触发器置 1后,它将屏蔽来自引脚 DREQ的硬件 DMA请求,同时,
也屏蔽来自请求寄存器的软件 DMA请求 。 因此,在对通道初始化之前,应使屏蔽触发器置,1”,而在初始化之后,应使屏蔽触发器清,0”。
(7) 多通道屏蔽寄存器 。
8237A允许使用一个屏蔽字一次完成对 4个通道的屏蔽设置,其格式如图 6 - 32 所示 。 其中 D0~ D3对应于通道 0~ 3的屏蔽触发器,若某一位为 1,则对应通道的屏蔽触发器置 1。
图 6- 32 多通道屏蔽寄存器
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
1,置 1 屏蔽触发器通 道 0
无用位
0,置 0 屏蔽触发器通道 1
通道 2
通道 3
无论是 RESET复位还是软件复位,屏蔽寄存器均被置 1,
DMA请求被禁止 。 另外,如果一个通道没有设置自动重装功能,那么,一旦 DMA传送结束,信号有效,会自动置 1
屏蔽触发器 。 因此,在对 DMA通道进行初始化时必须清除屏蔽触发器 。 其方法为:对端口 DMA+ 0EH进行一次写操作,
即可清除 4个通道的屏蔽触发器 。
(8) 先 /后触发器 。
8237A只有 8根数据线,而基地址寄存器和基本字节寄存器都是 16位,在预置初值时需要分两次进行,每次写入一个字节 。
先 /后触发器是为初值的写入顺序而设置的 。 在使用先 /后触发器时,先将其清,0”,然后写字节先写低位字节,后写高位字节 。
EOP
(9) 暂存寄存器 。
暂存寄存器为 4通道共用的 8位寄存器 。 在 DMA控制器实现存储器到存储器的传送方式时,它暂存中间数据,CPU可以读取暂存寄存器中的内容,其值为最后一次传送的数据 。
6.7.3 8237A
1,8237A的初始化编程
(1) 命令字写入控制寄存器 。 在初始化时必须设置控制寄存器,以确定其工作时序,优先级方式,DREQ和 DACK的有效电平及是否允许工作等 。
在 PC系列机中,当 BIOS初始化时,已将通道的控制寄存器设定为 00H,禁止存储器到存储器的传送,允许读,写传送,正常时序,固定优先级,不扩展写信号,DREQ高电平有效,DACK低电平有效 。 因此在 PC微机系统中,如果借用
DMA CH1( CH1是预留给用户使用的 ) 进行 DMA传送,则在初始化编程时,不应再向控制寄存器写入新的命令字 。
(2) 屏蔽字写入屏蔽寄存器 。
当某通道正在进行初始化编程时,接收到 DMA请求,可能未初始化结束,8237A就开始进行 DMA传送,从而导致出错 。
因此,初始化编程时,必须先屏蔽要初始化的通道,在初始化结束后再解除该通道的屏蔽 。
(3) 方式字写入方式寄存器 。 为通道规定传送类型及工作方式 。
(4) 置 0先 /后触发器 。
对口地址 DMA+0CH执行一条输出指令 ( 写入任何数据均可 ),从而产生一个写命令,即可置,0” 先 /后触发器,为初始化基地址寄存器和基本字节寄存器作准备 。
(5) 写入基地址和基本字节寄存器 。
把 DMA操作所设计到的存储区首址或末址写入地址寄存器,把要传送的字节数减 1,写入基本字节寄存器 。 这几个寄存器都是 16位的,因此写入要分两次进行:先写低 8位 ( 先 /后触发器置 1),后写高 8位 ( 先 /,0”) 。
(6) 解除屏蔽 。
初始化之后向通道的屏蔽寄存器写入 D2~ D0=0×× 的命令字,置 0相应通道的屏蔽触发器,准备响应 DMA请求 。
(7) 写入请求寄存器 。
如果采用软件 DMA请求,在完成通道初始化之后,在程序的适当位置向请求寄存器写入 D2~ D0=1×× 的命令字,即可使相应通道进行 DMA传送 。
2,8237A在 IBM PC/ AT系统中的应用
286微机系统使用两片 8237A级连,如图 6 - 33 所示 。 它提供 7个 DMA通道,通道 0~ 3支持 8位数据传送,通道 5~ 7支持 16位数据传送 。 PC/ AT有专门的动态 RAM刷新电路,硬盘驱动器采用高速 PIO传送,无需 DMA支持,通道 1给用户使用,
通道 2服务于软盘驱动器,通道 4作为两个 DMA控制器的级联,
其余均保留备用 。
PC/AT DMAC寄存器 I/O端口地址见表 6 - 7 所示。
PC/XT地址总线的宽度是 24位的,由 A23~ A0组成,最大寻址空间可达 16 MB。
由于 8237A内部地址寄存器是 16位,只能寻址 64 KB的空间,为了扩大 8237A的寻址空间,PC/AT微机系统在 8237A芯片以外为每一个通道设置了一个 8位的页面寄存器,如图 6 -
34 所示 。
在进行 DMA读 /写传送之前,程序要把 DMA传送所涉及到的 RAM单元的高 8位物理地址写入到相关通道的页面寄存器中,把 RAM单元低 16位物理地址写入到相关通道的基本地址寄存器中,把 DMA传送的实际字节数减 1,写入到相关通道的基本字节寄存器中,从而做好初始化准备 。
图 6 – 34 扩大 8237A寻址范围示意图页面寄存器系统数据线初始化时写入高 8 位 R A M 地址
A
23
~ A
16
A
15
~ A
8
中 8 位 R A M 地址低 8 位 R A M 地址当前地址寄存器
8 2 3 7某通道地址锁存器地址驱动器 A
7
~ A
0
在进行 DMA读 /写传送之前,程序要把 DMA传送所涉及到的 RAM单元的高 8位物理地址写入到相关通道的页面寄存器中,
把 RAM单元低 16位物理地址写入到相关通道的基本地址寄存器中,把 DMA传送的实际字节数减 1,写入到相关通道的基本字节寄存器中,从而做好初始化准备 。
一旦 I/ O端口有 DMA请求,并且 DMAC控制系统三总线之后,由相关通道的 DMA应答信号控制把页面寄存器的内容送到地址总线高 8位,DMAC把相关通道的低 16位地址经过外部地址锁存和驱动送到低 16位地址总线上,选择某一存储单元 。
在 PC/ AT系统中,页面寄存器采用专用的三态输出存储器映像器 74LS612来实现 。 在高档微机中,DMAC和相关页面寄存器都被兼容的多功能芯片所取代 。 页面寄存器端口地址见表
6 - 8。
表 6 – 8 PC/AT页面寄存器的 I/O端口地址本章讨论了 I/O接口和输入 /输出传送方式,微型计算机中广泛使用的中断技术和 DMA数据传送技术 。 通过本章的学习,
读者应了解 I/O信息的组成,I/O接口的作用,I/O 端口的寻址方式等基本概念;掌握输入 /输出传送方式,常用的数据传送方式 (包括程序控制的输入 /输出方式和 DMA数据传送方式 );
熟悉中断技术的有关概念,如中断,中断源,中断的分类;
掌握中断处理的一般过程以及中断优先级的处理方法;了解
80X86/ Pentium 中断系统的基本组成,中断处理方法以及高档微处理器的中断 。 8259A具有很强的中断管理能力,使用灵活,方便 。 DMA传送方式在高速数据传送过程中起到非常重要的作用,微型计算机 DMA控制器 8237A的组成及应用也是本章的主要内容之一 。