第6章 输入输出与中断 输入/输出接口概述 6.1 CPU与外设之间的数据传送方式 6.2 中断技术 6.3 中断控制器8259A 6.4
6.1 输入/输出接口概述 在CPU与外部设备进行信息交换时至少有两方面的困难: CPU和外设的速度差异非常大 电路 I/O 设备 在CPU与外部设备进行信息交换时至少有两方面的困难: CPU和外设的速度差异非常大 CPU不能和外设直接通过引脚连接 CPU和外设之间必须要设置输入/输出接口(I/O接口),作为CPU与外设进行信息交换的桥梁。
6.1.1 输入/输出接口的功能 I/O地址译码与设备选择 (1) 信息的输入/输出 (2) 命令、数据和状态的缓冲与锁存 (3) 信息转换 所有外设都通过I/O接口挂接在系统总线上,在同一时刻,总线只允许一个外设与CPU进行数据传送。 信息的输入/输出 (2) 通过I/O接口,CPU可以从外部设备输入各种信息,也可将处理结果输出到外设; CPU可以通过向I/O接口写入命令字来控制I/O接口的工作,还可以随时监测与管理I/O接口和外设的工作状态; I/O接口还可以通过接口向CPU发出中断请求。 接口不仅应缓存CPU送给外设的信息,也要缓存外设送给CPU的信息。以实现CPU与外设之间信息交换的同步。 命令、数据和状态的缓冲与锁存 (3) CPU与外设之间的时序和速度差异很大,为了确保计算机和外设之间可靠地进行信息传送,要求接口电路应具有信息缓冲能力。 信息转换 (4) I/O接口还要实现信息格式变换、电平转换、码制转换、传送管理以及联络控制等功能。
6.1.2 CPU与输入/输出接口之间的信息 主 外 机 设 接口电路 CPU与外设通信时传送的信息由:数据信息、状态信息及控制信息 DB AB CB 数据信息 控制信息 状态信息 三种信息的格式可能是一直的,都是0、1代码,但是他们所起到的功能可能是不一样的。例如我们打印一个表格,那么这个表格的内容就是数据(不一定是数值)。 既然有三种信息,那么在这个图上 是怎么样传输的呢?主机到接口电路这端,只能通过IN、OUT指令通过数据总线进行传输,是不是只能传送数据信息?其实状态信息和控制信息也是当成数据信息通过数据总线传输的,只不过他们传输到不同的寄存器。和CPU中的寄存器其实是类似的,只不过我们不用名字引用,而用端口的地址引用而已。 每个端口有不同的地址。 这就是不同端口的地址。 表示外设当前所处的状态: 输入时,输入设备是否准备好(READY) 输出时,输出设备是否处于忙(BUSY) 由CPU发出、用于控制I/O接口的工作方式以及外设的启动和停止等信息。 不同的信息进入不同的寄存器,通常将这些寄存器和他们的控制逻辑统称为IO端口。CPU可对端口的信息直接读写。对应三种端口:数据端口、状态端口、命令端口(控制端口)。三种信息分别进入三种端口的寄存器,完成不同的功能。但是传输的通道都是一样的,都是通过数据总线。
6.1.3 输入/输出端口的编址方式 统一编址 1 独立编址 2 在微型计算机系统中,CPU对外设的访问实际上是对外设接口电路中相应的I/O端口进行访问。 I/O端口的编址通常有两种不同的方式: 统一编址 1 独立编址 2
两种编址方式比较(一) 内 存 空 间 内 存 空 间 I/O 空 间 分别是分离编址?还统一编址? I/O 空 间
(1)统一编址(存储器映像编址) 指I/O端口与存储器共享一个寻址空间,又称为统一编址。在这种系统中,CPU可以用同样的指令对I/O端口和存储器单元的进行访问。 优点: 不必设置专用的IO指令,简化了指令系统;对I/O口的访问更灵活方便。 IO地址空间可大可小,可以根据外设数目调整。 缺点:I/O端口占用了主存地址,相对减少了主存的可用范围。 通常在存储器地址空间里,分出一块连续的地址空间作为IO端口的地址空间。 把IO端口当做存储器一样访问。
(2)I/O独立编址(一) 指主存地址空间和I/O端口地址空间相互独立,分别编址。CPU通过指令来区分是访问I/O口还是存储单元 优点: 操作存储器指令和操作端口指令明显分开,清晰易读。 缺点: 专用I/O指令的功能一般比较弱; CPU要提供区分存储器访问和IO访问的控制信号。
2、I/O独立编址(二) 80X86系列微处理器采用:I/O独立编址方式 CPU使用地址总线中的A0~A15来寻址I/O口,故最大I/O空间是64K个字节端口(或32K个字端口)
6.2 CPU与外设之间的数据传送方式 无条件方式 6.2.1 查询方式 6.2.2 程序控制方式 中断方式 6.2.3 DMA方式 前三种 通过执行程序 来完成数据传送 叫程序控制传送方式。 DMA方式 6.2.4
6.2.1 无条件传送方式 是最简单的I/O控制方式,CPU可以随时根据需要,无条件地读写I/O端口。 外设要求:简单,数据变化缓慢。外设被认为始终处于就绪状态。始终准备好数据或者始终准备好接收数据。 Eg:输入数据时,IN指令。送出地址,译码后选通三态缓冲器,将数据传送至数据总线。 Eg:输出数据时,OUT指令。送出地址,译码后选通锁存器,将数据送至外设。
无条件程序控制方式 根据按键转向相应的服务程序。 START: MOV DX,INPORT IN AL,DX;读入按键状态 TEST AL,01H;判断最低位按键 JNZ K1;最低位按键没闭合,转 …………………;处理K0的程序 JMP EXIT K1:TEST AL,02H; JNZ K2;次低位按键没闭合,转 …………..处理K1的程序 JMP EXIT ………………….
6.2.2 程序查询方式(条件传送方式 ) 读取状态端口 N Y 读/写数据端口 状态端口复位 6.2.2 程序查询方式(条件传送方式 ) READY? 读取状态端口 读/写数据端口 Y N 状态端口复位 传送完? 使用无条件传送方式,很难保证传送的时候数据一定是准备好了的。所以采用程序查询方式更优 特点:利用查询方式进行数据输入输出的过程中,CPU将大量时间耗费在读取和检测外设状态上,真正用于传送数据的时间很少,这样大大降低了CPU的效率。 查询控制的程序流程
程序查询方式的输入接口电路 输入装置输入数据,同时给出上升沿信号给触发器和锁存器。 IN指令读入状态---测试状态----IN指令读入数据
查询式输入程序段 在查询输入的过程中,读入的数据是8位或16位,而读入的状态位是1位,设状态口的地址为PORT S1,输入数据口的地址为PORT_IN,传送数据的总字节数为COUNT 1,则查询式输入数据的程序段为: MOV BX, 0;初始化指针 MOV CX, COUNT 1;字节数 MOV DX, PORT_S1 READ S1 : IN AL, DX ;读入状态位 TEST AL, 01H;数据准备好否? JZ READ S1 ;否,循环检测 MOV DX, PORT_IN IN AL, DX ;已准备好,读入数据 MOV [BX], AL; 存到内存缓冲区中 INC BX;修改地址指针 LOOP READ S1;未传送完,继续传送
2.查询式输出 IN指令读入状态(输出装置不忙,则Q端清0)---测试状态----OUT指令输出数据
查询式输出程序段 输出的数据是8位或16位,而读入的状态位是1位,设状态口的地址为PORT_S2,输出数据口的地址为PORT_OUT,传送数据的总字节数为COUNT_2,输出的数据放在2000H开始的一段存储区中。 MOV BX, 2000H;初始化地址指针 MOV CX, COUNT_2;字节数 MOV DX, PORT_S2 READ_S2 : IN AL, DX ;读入状态位 TEST AL, 80H;外设准备好否? JNZ READ_S2 ;否,循环检测 MOV AL, [BX];从内存缓冲区中取数据 MOV DX, PORT_OUT OUT DX, AL ;输出数据 INC BX ;修改地址指针 LOOP READ_S2 ;未传送完,继续传送
6.2.3 中断方式 CPU被动、而外设主动的I/O操作方式,较大地提高了CPU的工作效率,并使系统具有了实时处理功能 断点 主程序 中断服务程序 中断请求 对外设 进行处理 继续执行 返回断点 接口特点:避免了CPU 反复低效率的查询,适用于CPU任务繁忙、而数据传送不太频繁的系统中。缺点是硬件电路和处理过程都比较复杂;(中断控制芯片)
中断传送方式的接口电路 输入设备输入数据,同时给出上升沿选通信号,经过D触发器提中断请求,如果中断允许,产生INTR中断。CPU停止当前程序执行,给出INTA应答,外设送入中断矢量,转入中断服务程序。读取数据。
6.2.4 DMA方式 内存与外设间数据传输频繁时,采用中断方式,每传送一次数据,就必须经历中断处理的全部步骤,浪费时间,而且需要CPU中的寄存器作为传输的中介。 DMA方式:是一种不需要CPU干预也不需要软件介入的高速数据传送方式。在外设(如磁盘)与内存之间成批传送数据时,完全在DMA控制器 (DMAC)控制下完成外设与内存的数据传送,而不必 CPU的干预。
DMA方式原理方框图 DB HOLD CPU HLDA 请求 I/O MEM DMAC AB 响应 HOLD CPU HLDA AB MEM I/O 请求 DMAC 进行DMA传送前,首先需要将参数写入到DMAC中,有DMAC的工作方式,放在存储器单元的地址,传送的数据个数等等。 在传送的过程中,DMAC要控制传送个数递减,存储器单元地址递增。 响应
6.3 中断技术 中断概述 6.3.1 中断的处理过程(略) 6.3.2 8086/8088的中断 6.3.3
6.3.1 中断概念 中断源:引起中断的事件,或能够发出中断请求信号的外设 中断类型号:处理器对各类中断的中断源进行的统一编号N,N的取值范围是0~255 中断向量表:中断向量即中断服务程序的入口地址,也就是中断服务程序的第一条指令的地址在存储器中的存放位置。 中断优先级:在系统中多个中断源可能同时提出中断请求时,需要按中断的轻重缓急给每个中断源指定一个优先级别 中断屏蔽:当中断源申请中断时,CPU可以由软件设置,使之不能响应。称为中断屏蔽。 1、中断源有两类:第一类叫内部中断,由程序预先安排的INT n指令引起,或者是由于运算中产生的某些错误(例如除法出错、溢出等)引起的。 第二类叫外部中断,由外部设备或者协处理器向CPU发出中断申请引起的。
6.3.3 8086/8088中断 8 2 5 9 A 外部中断 可屏蔽中断 (INTR) 18脚 (硬件中断) 6.3.3 8086/8088中断 外部中断 (硬件中断) 内部中断 (软件中断) 可屏蔽中断 (INTR) 18脚 不可屏蔽中断 (NMI) 17脚 (执行指令所引起的) IRQ0 IRQ1 IRQ2 IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 非屏蔽中断请求 8 2 5 9 A NMI INTR 中断逻辑 INT n 指令 INTO 指令4 除法 出错0 单步1 (TF=1) 断点3 中断 CPU 8086/8088中断源
NMI中断:上升沿触发、中断类型号2、即中断入口地址在0008H~000BH。CPU在每个指令周期的最后一个机器周期采样NMI引脚。 外部中断 NMI中断:上升沿触发、中断类型号2、即中断入口地址在0008H~000BH。CPU在每个指令周期的最后一个机器周期采样NMI引脚。 INTR中断:高电平触发、外部中断源通过8259连入INTR引脚。 内部中断(软件中断): 由中断指令INT n 引起 由CPU的某些运算错误引起 除法错中断:类型号0 ; 溢出中断:类型号4. INTO指令。 由调试程序debug设置的中断 单步中断:类型号1 ; 断点中断:类型号3 是否屏蔽由8259的中断屏蔽寄存器、IF标志位等决定。是否会产生中断,取决于是否有中断源、该中断没有被屏蔽。 是否IF=1决定了CPU会不会响应该中断。 INTO指令:带符号数进行加减运算之后应该加上INTO指令。该指令判断是不是溢出,如果溢出,则转向4号中断执行中断服务程序,否则继续往下执行。
2.中断优先级顺序 概括的说:内部中断的优先级高于外部中断,外部中断中NMI中断的优先级高于INTR中断,单步执行中断优先级最低。
3 中断向量表 中断向量:中断服务程序的入口地址,包括段地址(存放于高字单元)和偏移地址(存放于低字单元)。 3 中断向量表 中断向量:中断服务程序的入口地址,包括段地址(存放于高字单元)和偏移地址(存放于低字单元)。 中断向量表:存放中断向量的表格。位于内存空间的最低地址(000H-3FFH),长度1KB,可容纳256类中断向量(2564=1024)。 中断向量在表中的存放位置=4*n
8086/8088的中断向量表 用户不能修改 08H~0FH为8259A中断 10H~1FH为BIOS中断 不允许用户修改 以上是IBM PCl对中断向量表使用的规定。但在具体的微机系统中又有特殊的规定。 中断服务程序可以写在不固定的位置,但是需要将中断矢量写入到中断向量表中。 08H~0FH为8259A中断 10H~1FH为BIOS中断 不允许用户修改 20H~3FH为DOS中断 可由用户使用
4、中断处理过程 中断类型码的获取 (1) 对于除法中断、单步中断、不可屏蔽中断NMI,断点中断和溢出中断,CPU分别自动提供中断类型号0~4。 (2) 对于用户自己确定的软件中断INT n,类型号由n决定。 (3) 对外部可屏蔽中断INTR,可用硬件电路设计产生。也可用可编程中断控制器8259A获得中断类型号。 获得中断类型码后,如何进入中断服务程序 中断类型码乘以4,得中断向量表的向量首址指针 取中断向量:把向量表指针所指的4个连续字节的内容作为中断服务程序的入口地址,分别送给IP和CS 按新的CS:IP指针执行中断服务程序 响应中断后第一件要做的事情就是获取中断类型号。中断类型吗的获取有三种情况:入上三种。
8086的中断过程 按照优先级顺序,最高优先级的是内部中断,然后是NMI中断,然后是INTR中断,最后是单步中断。 尽管不同的中断,向量号不同,但获取向量号后响应中断的过程都是一样的。 响应中断的过程中间加上NMI的判断,是为了系统能够及时处理外部紧急事件提出的中断请求。 响应中断的过程中间加上单步中断的判断,目的是:在系统单步工作时又产生了其它的中断的情况下,尽管系统首先识别出其它中断,但在执行该服务程序之前,还能识别出单步中断,并首先开始执行单步中断服务程序。也就是 在中断服务程序中 继续单步执行。
6-4 中断控制器8259A 8位可编程中断控制器。专门用于系统的中断控制,管理8086/8088的外部中断请求。 功能: 单片8259能管理8级中断,并且可级联管理64级 可对任一级中断单独屏蔽或允许 中断被响应后,可直接提供中断类型号 可通过编程选择其工作方式 1、先看其引脚结构再看功能1。 可编程的含义:通过对芯片编程,使芯片实现不同的功能。 中断比较多的情况下,使用中断控制器来管理中断。 用来管理系统的硬件中断。
8259A内部结构 数据总线缓冲器 控 制 逻 辑 读 / 写逻辑 优先权电路 中断服务寄存器 ISR 级连缓冲 / 比较器 IR0 IR7 :: 中断请求寄存器 IRR 优先权电路 PR 中断服务寄存器 ISR 中断屏蔽寄存器 IMR 控 制 逻 辑 数据总线缓冲器 读 / 写逻辑 级连缓冲 / 比较器 INTA INTR DB RDWRA0 CS CAS0CAS1CAS2 SP / EN 内部总线 1、数据总线驱动器 和CPU的DB相连,用于传送CPU给8259的命令字、8259的状态字、和中断类型号n。 2、读写控制逻辑接收CPU送来的读写命令信号、片选信号、端口选择信号A0。A0用来选择8259的两个地址,奇地址和偶地址。注意:片选线CS用来区别哪一个芯片工作,而地址线A0用来选择不同的端口。在可编程接口芯片中都存在这个规律。 3、级联缓冲比较器:8259和系统的链接有两种方式:缓冲方式和非缓冲方式。8259A,可以直接接在数据总线上叫做非缓冲方式。这时候SP、EN引脚用来做输入端,如果=1,则8259为主片,如果为0则变为从片。如果是单片8259 则该引脚接高电平。缓冲方式,指8259通过总线驱动器和数据总线相连。
IRR中断请求寄存器: 8位寄存器,用来保存外来中断请求 可用上升沿或者电平触发(编程控制) PR:优先级判别器 数据总线缓冲器 :: 中断请求寄存器 IRR 优先权电路 PR 中断服务寄存器 ISR 中断屏蔽寄存器 IMR 控 制 逻 辑 数据总线缓冲器 读 / 写逻辑 级连缓冲 / 比较器 INTA INTR DB RDWRA0 CS CAS0CAS1CAS2 SP / EN 内部总线 IRR中断请求寄存器: 8位寄存器,用来保存外来中断请求 可用上升沿或者电平触发(编程控制) PR:优先级判别器 对IRR中中断的优先级进行判别,取出最高优先级的中断请求送到ISR 如果当前有中断执行,则决定允许中断嵌套否
IMR: ISR: 8位寄存器,保存正在处理的中断请求。 只有已被PR确定为最高优先级,并被CPU响应的中断请求相应ISR才置位 IR0 IR7 :: 中断请求寄存器 IRR 优先权电路PR 中断服务寄存器 ISR 中断屏蔽寄存器 IMR 控 制 逻 辑 数据总线缓冲器 读 / 写逻辑 级连缓冲 / 比较器 INTA INTR DB RDWRA0 CS CAS0CAS1CAS2 SP / EN 内部总线 ISR: 8位寄存器,保存正在处理的中断请求。 只有已被PR确定为最高优先级,并被CPU响应的中断请求相应ISR才置位 保持到中断处理结束 IMR: 8位寄存器,当某位为1,则屏蔽该位的中断请求,由软件设置。
2、8259A外部引脚 D7~D0 数据总线(双向) RD 读输入 WR 写输入 A0 8259A的地址线,选择端口地址 CS 片选,选择由哪片芯片工作 CAS2~CAS2 级连控制线 SP/EN 区分主、从片或者启动缓冲器 INT 向CPU输出的中断请求信号 INTA CPU返回的中断响应 IR0~IR7 来自外设的8个中断请求输入 DIP封装 28引脚的芯片。 一方面考虑 管脚 什么功能?和谁相连?输入输出?
6.4.2 8259A的工作方式 8259A有多种工作方式,这些工作方式是通过编程来设定的,非常灵活。 中断管理方式是通过初始化时写入初始化命令字和操作命令字来设置的。初始化命令字ICW1-ICW4,由初始化程序设置。操作命令字OCW1-OCW3 由应用程序设定,用来对中断处理过程进行控制。
1.中断响应顺序 当有一条或若干条中断请求(IR0~IR7)变高,中断请求寄存器IRR的相应位置位。 若中断请求线中至少有一条是中断允许的,则8259A由INT引脚向CPU送出中断请求信号。 若CPU是处在开中断状态,则在当前指令执行完以后,用INTA信号作为响应。 8259A在接收到CPU的INTA信号后,使最高优先权的ISR位置位,而相应的IRR位复位。 8086/8088CPU启动另一个中断响应周期,输出另一个INTA脉冲。在这个周期中,8259A向数据总线输送一个8位的中断类型码。CPU在此周期中,读取此中断类型码并把它乘以4,就可以从中断向量表中取出中断服务程序的入口地址。这样中断响应周期就完成了,CPU就可转至中断服务程序执行。
2、8259A的中断优先级管理 中断优先级:可以固定设置 或者 循环设置 (1)完全嵌套方式(默认): 特点:固定0-7级,IR0级别最高,IR7级别最低。 (2)特殊全嵌套方式:用于8259级联时 与完全嵌套方式区别在于可以嵌套响应同级中断请求。 (3)优先级自动循环方式 特点:执行完的中断,优先级变最低,最高优先级将分配给该中断的下一级中断。初始化时 默认最高优先级IR0 特殊全嵌套方式用于级联的情况,当主片的IR0引脚上有中断请求,已经响应该中断。当IR0引脚上的从片的另一引脚也产生中断请求,对主片来说就出现了同级中断响应,但是也能分出优先级的高低。
3、8259A的中断屏蔽管理 (1) 普通屏蔽方式:通过对中断屏蔽寄存器(IMR)的设定,实现对中断请求的屏蔽。中断屏蔽寄存器的每一位对应了一个级别的中断请求,当某一位为1时,与之相应的某一级别的中断请求被屏蔽。CPU在响应某一中断请求时,还可以在主程序或中断服务程序中对IMR的某些位置1,以禁止高级别中断的进入。 特殊屏蔽方式用途及使用方法 用途:希望一个中断服务程序能动态地改变系统的优先级结构。 例如:当CPU正在处理中断程序的某一部分时,希望禁止低级中断请求,但在执行中断服务程序的另一部分时,希望开放较低级中断请求,此时可采用特殊屏蔽方式。通过OCW3设置/取消特殊屏蔽方式。在特殊屏蔽方式下,如果屏蔽某一级中断(通过OCW1置位IMR寄存器中的某位),则其ISR相应位清“0”,这样就开放了低级的中断。 功能:此方式可以实现对本级中断进行屏蔽,而允许优先级比它高或者低的中断进入。 (2)特殊屏蔽方式:总是在中断处理程序中使用。当一个优先级较高的中断请求正在被处理时,若设置了特殊屏蔽方式,并使用IMR寄存器将自身屏蔽掉,以允许优先级较低的中断进入正在处理的高级别中断。
4、8259A的中断结束管理 中断结束方式:中断结束时,对ISR中置1的相应位清零,什么时刻使ISR中对应位置0就产生不同的中断结束方式。 普通EOI结束方式: CPU用输出指令往8259A发EOI命令时清零ISR中对应位。即设置OCW2 放在IRET指令前。设置OCW2的EOI=1,即R、SL、EOI=001 例 MOV AL,20H ;00100000B OUT 20H,AL 特殊EOI结束方式: CPU在程序中向8259A发中断结束命令。并指明要结束的中断。 设置OCW2的EOI=1,即R、SL、EOI=011;L2~L0指明中断结束的对应位 自动EOI结束方式:处理器一进入中断过程,8259A自动将ISR中对应位清零。 ICW4的AEOI=1 中断结束处理,事实上是对ISR中对应位的处理。什么时候对ISR中正在服务的中断位清零,决定了结束方式的不同。 通常可以有三种结束方式: 自动中断结束方式是处理器一进入中断过程,8259A自动将ISR中对应位清零。 普通结束方式:CPU用输出指令往8259A发EOI命令时清零ISR中对应位。即设置OCW2. 特殊中断结束方式:CPU在程序中向8259A发中断结束命令。 注意:ISR中正在服务的中断位清零(中断结束)和中断服务程序结束 是两个不同的概念,二者时间可以不一致。但一般要求的理想情况要一致为好。所以自动结束方式通常不使用。
6.4.3 8259A的编程及应用 ICW1 ICW2 级联方式 ICW3 需要ICW4 ICW4 N SNGL=1 Y(SNGL=0) Y(IC4=1) (IC4=0) 两类命令字: 初始化命令字有四个ICW1、ICW2、ICW3、ICW4,首先输入ICW1,然后输入ICW2、 ICW3、 ICW4,由ICW1决定是否输入ICW3、 ICW4。系统复位后只设置一次,必须顺序填写。 操作命令字 OCW1、OCW2、OCW3 1、关于8259A的编程主要有三个方面: 初始化命令字的写入,即ICW1~ICW4的写入 操作命令字的使用,OCW1~OCW3 工作状态信息的读取,包括读取IRR、ISR、IMR三个寄存器和1个查询字。 2、初始化命令字写入寄存器:ICW1~ICW4 ,由初始化程序设置。一经写定,在系统工作过程中不再更改 操作命令字写入寄存器:OCW1~OCW3。由应用程序设定,控制中断处理过程,在系统工作过程中可以重新设置
ICW1:芯片控制初始化命令字 IC4 SNGL * 1 LTIM ICW1 * 1 LTIM A0 D7 D6 D5 D4 D3 D2 D1 D0 ICW1 0=边沿触发方式 1=电平触发方式 1 级联,写ICW3 单片,不写ICW3 1 不需设置ICW4 设置ICW4 8088/8086不用 标志位 例: IBMPC/XT系统初始化中,设ICW1=13H,如何设置8259?设端口地址20H,21H。 MOV AL,13H OUT 20H,AL
ICW2:设置中断类型号初始化命令字 ICW2 1 8259A输送的中断向量 D7 D6 D5 D4 D3 D2 D1 D0 T3 A0 * 自动填入 D7 D6 D5 D4 D3 D2 D1 D0 IR7 T7 T6 T5 T4 T3 1 1 1 IR6 T7 T6 T5 T4 T3 1 1 0 IR5 T7 T6 T5 T4 T3 1 0 1 IR4 T7 T6 T5 T4 T3 1 0 0 IR3 T7 T6 T5 T4 T3 0 1 1 IR2 T7 T6 T5 T4 T3 0 1 0 IR1 T7 T6 T5 T4 T3 0 0 1 IR0 T7 T6 T5 T4 T3 0 0 0 MOV AL,40h OUT 21H,AL ICW2命令字用来设置中断类型号的基值 例:假如设IR0的中断类型号为40H,那么中断初始化时的ICW2该如何设置?
ICW3 标识主片从片初始化命令字 ICW3 (主控制器) 1 Si: 0:IRi端未接8259从片 1 :IRi端接有8259从片 A0 D7 D6 D5 D4 D3 D2 D1 D0 1 1 S7 S6 S5 S4 S3 S2 S1 S0 Si: 0:IRi端未接8259从片 1 :IRi端接有8259从片 问题:如何区别主片和从片呢?答:主片和从片的地址是不同的。用地址区分。 ICW3 (从控制器) A0 D7 D6 D5 D4 D3 D2 D1 D0 1 0 0 0 0 0 ID2 ID1 ID0 1 从片识别地址,编码000~111表示从片接在哪个主片输入端上
例 :在某系统中,主8259A的IR2, IR3端连接两个8259A从片,主8259A端口地址为20H、21H,从8259A端口地址分别为A0H、A1H和B0H,B1H,其设置ICW3的程序如下: 主片程序: MOV AL, 0CH ; 0 0 0 0 1 1 0 0B OUT 21H, AL 从片程序: MOV AL, 02H ; 0 0 0 0 0 0 1 0B OUT 0A1H, AL 从片程序: MOV AL, 03H ; 0 0 0 0 0 0 1 1B OUT 0B1H, AL
ICW4 方式控制初始化命令字 (1)完全嵌套方式(默认): (2)特殊全嵌套方式:用于8259级联时 1 A0 D7 D6 D5 D4 D3 D2 D1 D0 1 0 0 0 SFNM BUF M / S AEOI µPM 1—86 / 88模式 0—80 / 85模式 1—自动EOI 0—非自动EOI(常用) (1)完全嵌套方式(默认): 特点:固定0-7级,IR0级别最高,IR7级别最低。 (2)特殊全嵌套方式:用于8259级联时 与完全嵌套方式区别在于可以嵌套响应同级中断请求。 0 X 非缓冲方式 1 0 缓冲方式/从控制器 1 1 缓冲方式/主控制器 1—特殊全嵌套方式 0—完全嵌套方式
2 操作命令字 由CPU向8259A送三个字节的操作命令字OCW(Operation Command Word), 用以规定8259A的工作方式,如: • 中断屏蔽 • 结束中断 • 优先权循环 • 中断状态 等。 操作命令字是在应用程序中设置的,设置时,顺序上没有严格的要求。OCW1必须写入奇地址端口,OCW2、OCW3必须写入偶地址端口
命令字中的M7~M0对应IMR的各位。Mi=1表示该中断被屏蔽,Mi=0表示该中断开放。 OCW1-中断屏蔽操作命令字 OCW1是中断屏蔽命令字,命令格式如图。 命令字中的M7~M0对应IMR的各位。Mi=1表示该中断被屏蔽,Mi=0表示该中断开放。 A0 D7 D6 D5 D4 D3 D2 D1 D0 1 1 M7 M6 M5 M4 M3 M2 M1 M0 中断屏蔽 1——屏蔽IRi引起的中断请求 0——允许IRi引起的中断请求
例:IBM PC/XT机中,8259A的端口地址为20H、21H,若要屏蔽IR2,IR3,IR5引脚进入的中断,则程序如下: 程序:MOV AL, 0 0 1 0 1 1 0 0B OUT 21H, AL 若要取出8259A当前IMR寄存器中的内容,并允许IR0 IR1中断则程序如下: IN AL, 21H AND AL, 0FCH OUT 21H,AL
OCW2 优先权循环方式和中断结束方式操作字 A0 D7 D6 D5 D4 D3 D2 D1 D0 0 R SL EOI 0 0 L2 L1 L0 0 0 1 非特殊EOI命令 0 1 1 特殊EOI命令 1 0 1 自动优先权循环,常规EOI 1 0 0 自动优先权循环 0 0 0 取消自动优先权循环(固定优先权) 1 1 1 在特殊EOI时循环,由L2~L0指定结束IRi 1 1 0 特殊优先权循环,由L2~L0设定最低优先权 0 1 0 无操作 0 0 0 0 有 0 0 1 1 效 0 1 0 2 的 0 1 1 3 中 1 0 0 4 断 1 0 1 5 请 1 1 0 6 求 1 1 1 7 级 别 中断结束 L2~L0 :当SL=1时有效,当设置为特殊结束EOI命令时,指出清除中断服务寄存器中的哪一位。当设置为特殊优先级循环时,指出循环开始时设置的最低优先级。 R=1:循环优先权; R=0:固定优先权 SL=1:由L0~L2指定IRi位;SL=0:L0~L2无效;EOI=1:中断结束
OCW3----特殊屏蔽方式和查询方式的命令 RIS A0 D7 D6 D5 D4 D3 D2 D1 D0 * ESMM SMM 1 P RR OCW3 0* :无效 10:特殊屏蔽方式复位 11:特殊屏蔽方式置位 标志位 1:查询8259A状态 0:不查询 0* :无效 10:下次RD有效读IRR 11:下次RD有效读ISR 读ISR或IRR内容: MOV AL, 0AH ;读IRR OUT 20H, AL IN AL, 20H ;AL=IRR MOV AL, 0BH ;读ISR IN AL, 20H ;AL=ISR P=1设置8259为中断查询方式工作,这种方式下,CPU靠发送查询命令,读取查询字能知道:当前外设有无中断请求,以及最高优先级的中断是哪个。 MOV AL, 0CH OUT 20H, AL IN AL, 20H 若:AL=1xxxx010B,说明当前最高中断请求为IR2。 取消特殊屏蔽方式: MOV AL, 48H OUT 20H, AL 1、查询字的结构 I - - - - W2 W1 W0 2、如果是读取IMR寄存器的内容,直接用 IN AL,21H ;IMR寄存器从奇地址端口读取。 置特殊屏蔽方式: MOV AL, 68H OUT 20H, AL ESMM——特殊的屏蔽模式允许位; SMM——特殊屏蔽模式位; RR——读操作,RR=1; RIS——读哪个寄存器。 8259的工作方式编程没有固定的顺序,各命令字之间用地址信号A0和特征标志位区别
P、RR、RIS的组合状态 P RR RIS 操作 * 无操作 1 下一个RD指令,读取IRR的内容 下一个RD指令,读取ISR的内容 * 无操作 1 下一个RD指令,读取IRR的内容 下一个RD指令,读取ISR的内容 下一个RD指令,读取中断状态
总结:由于8259A只设计了一个地址信号A0,所以其端口地址不太规则: A0=0时,可以写入ICW1、OCW2、OCW3 当A0=1时,可以写入ICW2~ICW4、OCW1 状态读取 对于IMR,可以在任意时刻,使用IN指令,从奇地址端口读取 对于ISR、IRR,需要先送出读状态命令字,由OCW3形成,然后IN指令,从偶地址端口读出。如果要多次读同样的寄存器,只需写一次命令字即可。 查询方式工作:是否有中断,是通过发P命令后,从偶地址读取状态字。 1、只有两个端口地址,但是要写7个寄存器和读3个寄存器,使用什么样的方法来区分这些寄存器呢? 主要从三个方面考虑:第一,A0地址来区分 第二,初始化时按照顺序来。第三,部分寄存器有一些标志位。
2、8259A的应用 在IBM PC/XT系统中只用一片8259A中断控制器,用来提供8个中断请求,其中IR0优先级最高,IR0~IR7分别用于日历时钟中断、键盘中断、保留、网络通信、异步通信中断、硬盘中断、软盘中断、打印机中断,设ICW2的高5位为00001,对应的中断类型号为08H-0FH,片选地址为20H、21H,那么8259的使用步骤如下:
1)初始化 MOV AL,13H OUT 20H,AL ;设置ICW1,上升沿触发,单片不设ICW3,需设置ICW4 MOV AL,08H MOV AL,0DH ;设置ICW4,缓冲方式主片、非自动EOI MOV AL,0H ;写OCW1,允许所有的中断
2)送中断向量 IP CS 将中断向量送入中断向量表。 例如异步通信中断IR4,中断类型码为12,那么其中断向量在中断向量表中的位置为12*4=48 0030H IP 0031H 0032H CS 0033H
MOV AX,0 ;中断入口表 MOV ES,AX ;段地址送ES MOV BX,n*4 ;偏移量送DI MOV AX,OFFSET INTRAD MOV ES: [BX],AX MOV AX,SEG INTRAD MOV ES: [BX+2],AX STI
;中断服务子程序 PUSH DS ;保护现场 PUSH AX PUSH CX PUSH DX STI ;开中断,允许中断嵌套 … ;执行中断处理程序 CLI ;关中断 POP DX ;恢复现场 POP CX POP AX POP DS MOV AL,20H ;中断结束命令OCW2 OUT 20H,AL IRET ;中断返回
分析:1、边沿触发->ICW1的LTIM=0、单级使用SNGL=1,嵌套需要设置ICW4;所以,ICW1=13H 系统中有3个中断源,从8259A的IR0、IR2、IR4端引入中断,以边沿触发,中断类型号分别为50H、52H、54H,中断入口地址分别为5020H、6100H、3250H,段地址为1000H。使用完全嵌套方式,普通EOI结束,试编写初始化程序,使CPU能正确响应任何一级中断;并编写一段中断服务子程序,保证中断嵌套的实现和正确返回。 分析:1、边沿触发->ICW1的LTIM=0、单级使用SNGL=1,嵌套需要设置ICW4;所以,ICW1=13H IC4 SNGL * 1 LTIM A0 D7 D6 D5 D4 D3 D2 D1 D0 2、中断类型号设置:基类型IR0 :50H=01010000;ICW2=50H 3、完全嵌套方式,普通EOI结束设置:ICW4的SFNM=0;AEOI=0,uPM=1;ICW4=01H
程序: ;设置中断向量表 ;初始化程序 MOV AX, 1000H ;段地址 MOV DS, AX MOV DX, 5020H ;偏移地址 MOV AL, 50H ;中断类型号 MOV AH, 25H INT 21H ;写50H的中断入口地址 MOV DX, 6100H ;偏移地址 MOV AL, 52H ;中断类型号 INT 21H ;写52H的中断入口地址 MOV DX, 3250H ;偏移地址 MOV AL, 54H ;中断类型号 INT 21H ;写54H的中断入口地址
;8259A初始化命令字 CLI ;防止初始化时被中断影响 MOV AL, 13H ;定义ICW1,单片,边沿触发 OUT 20H, AL MOV AL, 50H ;定义ICW2,中断号50H~57H OUT 21H, AL MOV AL, 01H ;定义ICW4,完全嵌套, 非缓冲, 普通EOI MOV AL, 0EAH ;定义OCW1,屏蔽IR1,3,5,6,7 STI
;中断服务子程序 PUSH DS ;保护现场 PUSH AX PUSH CX PUSH DX STI ;开中断,允许中断嵌套 … ;执行中断处理程序 CLI ;关中断 POP DX ;恢复现场 POP CX POP AX POP DS MOV AL,20H ;中断结束命令 OUT 20H,AL IRET ;中断返回
7-2 可屏蔽中断处理过程 可屏蔽中断处理过程:中断请求;中断响应;保护现场;转入执行中断服务子程序;恢复现场;中断返回。 CPU响应INTR中断的三个条件: 外设提出中断申请 本中断位未被屏蔽:中断接口电路8259的中断屏蔽寄存器未对该中断进行屏蔽 中断允许:IF标志位是否置为1.(IF=1 开中断) CPU对三种中断的响应方法。
四、INTR中断响应周期时序 (P274) CPU从引脚/INTA 发中断响应信号,接口芯片接收此信号,把中断类型号准备好; 对INTR中断的响应,要经过2个INTA周期,每个周期有4个时钟周期,即4个T状态。第一个响应周期,通知外设准备响应中断, 外设应该准备好中断向量号,第二个中断响应总线周期,CPU将接收外设接口发来的中断类型号。 向量类型 INTA CLK AD7~AD0 T1 T2 T3 T4 第 一 个中断响应周期 第 二 个中断响应周期 INTR中断响应时序
6.3.2 中断的处理过程 中断请求 1 中断响应 2 中断处理 3
1.中断请求 外设需要CPU服务时,首先要发出一个有效的中断请求信号送到CPU的中断输入端。 8088/8086CPU的NMI为边沿触发,而INTR为电平触发。为了保证产生的中断能被CPU处理,INTR中断请求信号应保持到该请求被CPU响应为止。CPU响应后,INTR信号还应及时撤除,以免造成多次响应。
2.中断响应 响应中断请求的3个条件: (1)一条指令执行结束。 (2)CPU处于开中断状态。 (3)没有总线请求。在复位(RESET)、总线保持(HOLD)等总线请求时,CPU不工作,当然就不能响应中断。 中断响应时,CPU除了要向中断源发出中断响应信号外,还要自动完成下述3项工作: (1)关闭中断。CPU响应中断时,需立即关中断(使IF=0),以保证保护现场、断点和获取中断入口地址等工作不受影响。 (2)保护现场和断点。将标志寄存器FR(PSW)、断点的段基址(CS值)和偏移地址(IP值)压入堆栈,以保证中断结束后能正常返回被中断的程序。 (3)获得中断服务程序入口,转入中断服务程序。
3.中断处理 保护现场。保护现场是指把中断服务程序中要用到的寄存器的原内容压入堆栈保存起来。 开中断。CPU响应中断时会自动关闭中断(使IF=0)。若进入中断服务程序后允许中断嵌套,则需用指令开中断(使IF=1)。 执行中断处理程序。完成具体的中断处理。 关中断。确保有效地恢复被中断程序的现场。 恢复现场。就是把先前保护的现场进行恢复,也即把所保存的有关寄存器内容按入栈的相反顺序从堆栈中弹出,使这些寄存器恢复到中断前的状态。 开中断返回。其操作正好是CPU硬件在中断响应时自动保护硬件现场和断点的逆过程,即CPU会自动地将堆栈内保存的断点信息和标志信息弹出到IP、CS和FR中,保证被中断的程序从断点处继续往下执行。
6.3.3 8086/8088的中断 中断类型 1 中断优先级顺序 2 中断向量表 3 中断处理过程 4 8086/8088系统中给每种中断都赋予一个中断类型码(或称中断号),编号为0~255。CPU可根据中断类型码的不同来识别不同的中断源。 中断类型 1 中断优先级顺序 2 中断向量表 3 中断处理过程 4
1.中断类型 8086/8088系统的中断源: 外部中断:来自CPU外部 内部中断:来自CPU内部
1)外部中断 也称为硬件中断,它是由外部硬件或外设接口产生的。 8086/8088CPU为外部设备提供了两条中断信号线NMI和INTR。 非屏蔽中断 ★ 可屏蔽中断 ★
(1)非屏蔽中断 由NMI引脚上出现的上升沿触发,它不受中断允许标志IF的控制,其中断类型码固定为2。 CPU接收到非屏蔽中断请求信号后,会在执行完当前指令后立即响应中断请求而进入相应的中断处理。 非屏蔽中断通常用来处理系统中出现的重大故障或紧急情况。
(2)可屏蔽中断 从CPU的INTR端引入,高电平有效。可屏蔽中断受中断允许标志位IF的控制,只有当IF=1,CPU才会响应INTR请求。如果IF=0,即使中断源有中断请求,CPU也不会响应。 在微型计算机中,外部设备的中断请求是通过中断控制器8259A来进行统一管理的,由8259A决定是否允许一个外设向CPU发出中断请求。
2)内部中断 内部中断是CPU执行了某些指令或者软件对标志寄存器中某个标志位进行设置而产生的,由于它与外部硬件电路完全无关,故也称为软件中断。 在8086/8088 CPU中,内部中断可分为5种类型: 除法出错中断 单步中断 断点中断 溢出中断 中断指令INT n 以上所述内部中断的类型码均是固定,除单步中断外,其他的内部中断不受IF状态标志影响。
(1)除法出错中断 在执行除法指令时,若发现除数为0或商超过了结果寄存器所能表示的最大范围,则立即产生一个中断类型码为0的中断。
(2)单步中断 8086/8088 CPU的标志寄存器中有一位陷阱标志TF。 CPU每执行完一条指令都会检查TF的状态。若发现TF=1,则CPU就产生中断类型码为1的中断,使CPU转向单步中断的处理程序。 单步中断广泛地用于程序的调试。
(3)断点中断 8086/8088指令系统中有一条专用于设置断点的指令INT 3。CPU执行该指令就会产生一个中断类型码为3的中断。 INT 3指令是单字节指令,因而它能很方便地插入程序的任何地方,专门用于在程序中设置断点来调试程序,它也称为断点中断,插入INT 3指令之处便是断点。 在断点中断服务程序中,可显示有关的寄存器、存储单元等内容,以便程序员分析到断点为止程序运行是否正确。
(4)溢出中断 若算术指令的执行结果发生溢出(OF=1),则执行INTO指令后立即产生一个中断类型码为4的中断。
(5)中断指令INT n INT n是用户自定义的软件中断指令,CPU执行中断指令INT n也会引起内部中断,其中断类型码由指令中的n指定。
2.中断优先级顺序
3.中断向量表 每个中断源都有一个中断类型码。中断类型码长度为一个字节,故8086/8088最多允许处理256种类型的中断(中断类型码为0~255)。 中断向量表位于内存的最低1K字节(即内存中00000H~003FFH区域),用以存放256个中断向量,即256个中断的服务程序入口地址。 每个中断向量占4个字节,其中低位字(2个字节)存放中断服务程序入口地址的偏移量,高位字(2个字节)存放中断服务程序入口地址的段地址。 中断向量在表中的存放地址=4×中断类型码n 取连续的4n和4n+l字节单元的内容装入IP,取4n+2和4n+3单元的内容装入CS,即可转入中断服务程序。 图6.16
图6.16 中断向量表
4.中断处理过程 中断类型码的获取 ★ 中断类型码的获取 ★ 中断处理 ★
1)中断类型码的获取 有两种方法获取中断类型码: 对于软件中断:类型码为0、1、3、4的中断类型码由系统自动形成;对于INT n指令,类型码由指令指定。 对于硬件中断:若为NMI中断,则由系统自动产生中断类型码2;若为INTR中断,则CPU转入2个连续周期的中断响应周期,并在第2个中断响应周期采样数据总线,获取中断类型码。
2)中断处理 图6.17 将类型码乘4,计算出中断向量的地址。 硬件现场保护。即将标志寄存器F压入堆栈,以保护当前指令执行结果的特征。 清除IF和TF标志,屏蔽新的INTR中断和单步中断。 保存断点,即把断点处的IP和CS值压入堆栈,先压入CS值,再压入IP值。 根据计算出来的地址从中断向量表中取出中断服务程序的入口地址(段和偏移),分别送至CS和IP中。 转入中断服务程序执行。进入中断服务程序后,首先要保护在中断服务程序中要使用的寄存器内容,然后进行相应的中断处理, 现场恢复与中断返回。在中断返回前恢复保护的寄存器内容,最后执行中断返回指令IRET。IRET的执行将使CPU按次序恢复断点处的IP、CS和标志寄存器,从而使程序返回到断点处继续执行。 图6.17
图6.17 8086/8088中断处理顺序流程图
6.4 中断控制器8259A Intel 8259A 是8位可编程的中断控制器。它具有 8 级优先权控制,多片8259A通过级联还可扩展至对64个中断源实现优先级控制。 8259A可以根据不同的中断源向CPU提供不同的中断类型码,还可根据需要对中断源进行中断屏蔽。 8259A有多种工作方式,可以通过编程来选择,以适应不同的应用场合。 8259A的内部结构及引脚 6.4.1 8259A的工作方式 6.4.2 8259A的编程及应用 6.4.3
6.4.1 8259A的内部结构及引脚 8259A的内部结构 1 8259A的引脚 2
1.8259A的内部结构 图6.18 中断请求寄存器IRR 中断服务寄存器ISR 中断屏蔽寄存器IMR 中断优先权判别电路 数据总线缓冲器 ★ 中断服务寄存器ISR ★ 中断屏蔽寄存器IMR ★ 中断优先权判别电路 ★ 数据总线缓冲器 ★ 读/写控制逻辑 ★ 级连缓冲器 ★
图6.18 8259A的内部结构
1)中断请求寄存器IRR 图6.18 保存从IR0~IR7来的中断请求信号。 某一位为1表示相应引脚上有中断请求信号。
2)中断服务寄存器ISR 图6.18 记录正在处理中的中断请求信息,它的每一位IS0~IS7分别对应IR0~IR7。 当任何一级中断被响应,CPU正在执行它的中断服务程序时,ISR寄存器中的相应位置“1”,一直保持到该级中断处理过程结束为止。 多重中断情况下,ISR寄存器中有多位被同时置“1”。
3)中断屏蔽寄存器IMR 图6.18 存放中断屏蔽字,它的每一位分别与IR0~IR7相对应。其中为1的位所对应的中断请求输入将被屏蔽,为0的位所对应的中断请求输入不受影响。
4)中断优先权判别电路 图6.18 监测从IRR、ISR和IMR来的输入,经过判定最高优先权,确定是否应向CPU发出中断请求。 在中断响应时,它要确定ISR寄存器哪一位应置1,并将相应的中断类型码送给CPU。在中断结束EOI命令时,它要决定ISR寄存器哪一位应复位。
5)数据总线缓冲器 图6.18 是8259A与系统数据总线的接口,它是8位双向三态缓冲器。 凡是CPU对8259A编程的控制字,都是通过它写入8259A的;8259A的状态信息,也是通过它读入CPU的;在中断响应周期,8259A送至数据总线的中断矢量也是通过它传送的。
6)读/写控制逻辑 图6.18 一片8259A只占两个I/O端口地址,用地址线A0来选择端口,端口地址的高位由片选信号输入。 CPU能通过读/写控制逻辑实现对8259A读出内部寄存器的内容(状态信号)和将命令写入有关的控制寄存器。
7)级联缓冲器 图6.18 级联缓冲器是实现8259A芯片之间的级连,使得中断源可由8级扩展至64级。
2.8259A的引脚 D7~D0是双向三态数据线,它可直接与系统的数据总线相连。 IR0~IR7 是 8 条外界中断请求输入线。 RD是读命令信号线,当其有效时,控制信息由 8259A 至 CPU。 WR是写命令信号线,当其有效时,控制信息由 CPU 写入至 8259A。 CS是选片信号线,由地址高位控制。 A0用以选择 8259A 内部的不同寄存器,通常直接连至地址总线的A0。 INT中断请求线,用于向CPU发中断请求信号。 INTA中断响应线,用于接收CPU的中断响应信号。 CAS2~CAS0是级连信号线,当8259作为主片时,这三条为输出线;作为从片时,则此三条线为输入线。这三条线与SP/EN线相配合,实现 8259A 的级连。
6.4.2 8259A的工作方式 8259A具有非常灵活的中断管理方式,可满足用户各种不同的要求,且这些工作方式都可以通过编程来设置。 中断响应顺序 1 8259A中断优先级管理 2 8259A中断屏蔽管理 3 8259A中断结束管理 4 8259A的级联 5
1.中断响应顺序 图6.18 当有一条或若干条中断请求(IR0~IR7)变高,中断请求寄存器IRR的相应位置位。 若中断请求线中至少有一条是中断允许的,则8259A由INT引脚向CPU送出中断请求信号。 若CPU是处在开中断状态,则在当前指令执行完以后,用INTA信号作为响应。 8259A在接收到CPU的INTA信号后,使最高优先权的ISR位置位,而相应的IRR位复位。 8086/8088CPU启动另一个中断响应周期,输出另一个INTA脉冲。在这个周期中,8259A向数据总线输送一个8位的中断类型码。CPU在此周期中,读取此中断类型码并把它乘以4,就可以从中断服务程序入口地址表中取出中断服务程序的入口地址。这样中断响应周期就完成了,CPU就可转至中断服务程序执行。
2.8259A中断优先级管理 完全嵌套方式 ★ 自动循环方式 ★ 特殊完全嵌套方式 ★
1)完全嵌套方式 各中断请求的中断优先级就是固定不变的。8259A加电后就处于这种方式,默认IR0优先级最高(0级为最高级),IR7优先级最低(7级为最低级)。 高优先级的中断可中断低优先级的中断,实现中断嵌套。
2)自动循环方式 在实际应用中,许多中断源的优先权级别是一样的,若采用完全嵌套方式,则低级别中断源的中断请求有可能总是得不到服务。解决的方法是使这些中断源轮流处于最高优先级。这就是自动中断优先级循环方式。 在自动循环方式下,从IR0~IR7引入的中断轮流具有最高优先级,即当任何一级中断被处理完,它的优先级别就被修改为最低,而最高优先级分配给该中断的下一级中断。 例如,现正在处理IR2引入的中断服务,如处理完毕,IR2变为最低优先级,IR3为最高优先级,IR4为次高优先级,依次排序。
3)特殊完全嵌套方式 用在8259A有级联的情况。 当任何一个从8259A接收到一个中断请求,经本8259A判定为最高优先级,则响应这个中断,通过INT引脚向主片8259A相应的IR端提出中断请求。 如果此时主片8259A中ISR相应位已置“1”,说明该从片8259A的其它输入端已提出过中断请求,且正在服务,而从片8259A判别出刚申请的中断优先级最高,因此应停止现行中断服务程序转到刚申请的中断服务程序。 8259A有级连的情况下,按完全嵌套方式管理优先级,即接在主片8259A IR0上的从片比接在IR1上的从片具有高的优先级,而主片上IR0、IR1上的中断比接在主片IR2上的从片具有高的优先级,依次类推。
3.8259A中断屏蔽管理 8259A的8个中断请求都可根据需要单独屏蔽,屏蔽是通过编程使得屏蔽寄存器IMR相应位置0或置l,从而允许或禁止该位所对应的中断。 8259A有两种屏蔽方式: 普通屏蔽方式 ★ 特殊屏蔽方式 ★
1)普通屏蔽方式 将IMR某位置1,则它对应的IR就被屏蔽,从而使这个中断请求不能从8259A送到CPU。 如果该位置0,则允许该IR中断传送给CPU。
2)特殊屏蔽方式 在执行一个中断服务程序时,可能希望优先级别比正在服务的中断源低的中断能够中断当前的中断服务程序。 在第i位的IRi的处理中,若希望使除IRi以外的所有IR中断请求均可被响应,则首先设置特殊屏蔽方式,再编程将IRi屏蔽掉(使IMR中的IMi位置1),这样就会使ISR的ISi位复位。这时,除了正在服务的这级中断被屏蔽(不允许产生进一步中断)外,其他各级中断全部被开放。 这样,正在服务的优先级高的中断可以被优先级低的中断申请中断。
4.8259A中断结束管理 当8259A响应某一级中断为其服务时,中断服务寄存器ISR的相应位置“1”,当有更高级的中断申请来到时,ISR相应位又置“1”。 在中断服务结束时,ISR相应位清“0” 。 中断结束管理就是用不同的方式使ISR中相应位清“0”。 分为: 普通中断结束方式 ★ 特殊中断结束方式 ★ 自动中断结束方式 ★
1)普通中断结束方式 配合全嵌套优先权工作方式使用。 当CPU用输出指令向8259A发出正常中断结束EOI命令时,8259A就会把ISR中已置1的位中的级别最高位复位。因为在全嵌套方式中,置1的级别最高ISR位对应了最后一次被响应的和被处理的中断,也就是当前正在处理的中断,所以,把已置1的位中级别最高的ISR位复位相当于结束了当前正在处理的中断。
2)特殊中断结束方式(SEOI) 在非全嵌套方式下,由于中断优先级不断改变,无法确知当前正在处理的是哪一级中断,这时就要采用特殊SEOI中断结束方式。 在程序中是要发一条特殊中断结束命令,这个命令中指出要清除ISR中的哪一位。
3)自动中断结束方式(AEOI) 若采用AEOI方式,则在第二个中断响应信号的后沿,8259A将自动把中断服务寄存器ISR中的对应位清除。这样,尽管系统正在为某个设备进行中断服务,但对8259A来说,中断服务寄存器中却没有保留正在服务的中断的状态。所以,对8259A来说,好像中断服务已经结束了一样。 只能用于没有中断嵌套的情况。 在级联方式下,一般用非自动中断结束方式,无论是普通中断结束方式,还是特殊中断结束方式,在一个中断服务程序结束时,都必须发两次中断结束命令,一次是发给主片的,另一次则是发给从片的。
5.8259A的级联 图6.20 当中断源超过8个时,可采用8259A的级联工作方式。指定一片8259A为主控芯片(主片),它的SP端接+5V,INT接到CPU上。而其余的8259A芯片均作为从片,它的SP端接地,INT输出分别接到主片的IR输入端。由于8259A有8个IR输入端,故一个主片8259A最少可以连接1片从片8259A,最多可以连接8片从片8259A,所以8259A级联最少允许15个IR中断请求输入,最多允许有64个IR中断请求输入。 不管是主片还是从片,每一片8259A都有各自独立的初始化程序,以便设置各自的工作状态。在中断结束时要连发两次EOI命令,分别使主片和相应的从片完成中断结束操作。 在中断响应中,若中断请求来自于从片,则中断响应时主片8259A会通过CAS0~CAS2来通知相应的从片8259A,而从片8259A把IR对应的中断类型码送至数据总线。 在级联方式下,可采用前面提到的特殊全嵌套方式,以允许从片上优先级更高的IR产生中断。在将主片初始化为特殊全嵌套方式后,从片的中断响应结束时,要用软件来检查中断状态寄存器ISR的内容,查询本从片上还有无其他中断请求未被处理。如果没有,则连发两个EOI,使从片及主片结束中断。若还有其他未被处理的中断,则应只向从片发一个EOI命令,而不向主片发EOI命令。
图6.20 8259A构成的级联
6.4.3 8259A的编程及应用 8259A是可编程中断控制器,在它工作之前,必须通过软件向其写入控制命令的方法来确定其工作状态,这就是8259A的编程。 控制命令分为: 初始化命令字(ICW) 操作命令字(OCW) 8259A的编程 1 8259A的应用 2
1.8259A的编程 初始化编程 ★ 操作方式编程 ★
1)初始化编程 ICW1 ICW2 ICW3 ICW4
(1) ICW1 写ICW1意味着重新初始化8259A。
(2) ICW2 表6.2 ICW2为中断类型码寄存器,用于存放中断类型码(中断向量码)。 CPU响应中断时,8259A将该寄存器内容放到数据总线上供CPU读取。 在8086/8088系统中,8259A在第二个中断响应周期,将向CPU输送中断向量码,其中的T7~T3是由ICW2规定的,而低3位则是由8259A自动插入的。 表6.2
表6.2 8259A的中断向量码
(3) ICW3 仅在多片8259A级联时需要写入。 主片8259A的ICW3与从片的ICW3在格式上不同。
(4) ICW4
2)操作方式编程 由CPU向8259A送3个字节的操作命令字OCW,以规定8259A的操作方式,改变8259A的中断控制方式、屏蔽中断源以及读出8259A的工作状态信息。 OCW可在8259A初始化以后的任何时刻写入,写的顺序也没有严格要求。 OCW1 OCW2 OCW3
(1) OCW1 OCW1是中断屏蔽命令字,其每一位可以对相应的中断请求输入线进行屏蔽。
(2) OCW2 图6.27 OCW2的作用是对8259A发出中断结束命令EOI,它还可以控制中断优先级的循环。 D7位R是优先级循环控制位。R=0时表示使用固定优先级,IR7最低,IR0最高。当R=1时,表示使用循环优先级。 D6位SL是特殊循环控制。当SL=1时,使L2~L0对应的IRi为最低优先级。SL=0时,L2~L0的编码无效。 D5位EOI是中断结束命令。该位为1时,则复位现行中断的ISR中的相应位,而在特殊EOI时使L2~L0对应的ISi位复位。
图6.27 OCW2的格式
(3) OCW3 OCW3是屏蔽方式和状态读出控制字 。
2.8259A的应用 在IBM PC/XT系统中,只用一片8259A中断控制器,用来提供8级中断请求,其中IR0优先级最高,IR7优先级最低。 IR0~IR7分别用于日历时钟中断、键盘中断、保留、网络通信、异步通信中断、硬盘中断、软盘中断和打印机中断。 设8259A的ICW2高5位T7~T3=00001,对应的中断类型码为08H~0FH。 片选地址为20H、21H。 步骤: 初始化 ★ 送中断向量 ★ 中断子程序结束 ★
(1)初始化 MOV AL,13H OUT 20H,AL;写ICW1,单片,边沿触发,需要ICW4 MOV AL,8 MOV AL,0DH OUT 21H,AL;写ICW4,缓冲工作方式,8088/8086配置 MOV AI,0 OUT 21H,,AL;写OCW1,允许IR0~IR7全部8级中断请求
(2)送中断向量 根据中断源的中断类型码送中断向量。 例如,异步通信中断IR4,其中断向量类型码为00001100B=12(0CH),则中断向量的偏移量(IP值)与段地址(CS)在中断向量表中的存放地址为12×4=48(30H)、49(31H)、50(32H)、51(33H)。其中30H、3IH存放指令指针IP,32H、33H存放代码段码CS。
(3)中断子程序结束 由于8259A采用中断工作方式,且ICW4中的D1位(即AEOI)为0,这意味着采用正常结束中断,因此,在中断子程序结束前必须发EOI命令和IRET命令。 MOV AL,20H OUT 20H,AL;写OCW2命令,使ISR相应 位复位(即发EOI命令) IRET;开放中断允许,并从中断返回