中断
中断:是指CPU在正常运行程序时,由于内部/外部事件或由程序触发,而转到为中断事件服务的程序中去,服务完毕再返回执行原程序,这一过程称为中断。
- 硬件中断:由外部硬件产生的中断
- 软件中断:由程序预先安排的中断
- 中断的特征:具有随机性
中断类型
微机中,中断源大致可分为两类:一类是硬中断(外部中断);另一类是软中断(内部中断);此外还有一种特殊中断(异常)。
硬中断
- 可屏蔽中断INTR
外部设备通过中断控制器向微处理器申请而产生的中断。CPU可以用指令进行屏蔽(CLI) 和 开放(STI)。 - 不可屏蔽中断NMI
外部设备通过中断请求线NMI向微处理器申请而产生的中断。CPU必须响应,不能屏蔽。中断号为2
软中断
由程序中发出中断指令INT n 产生的,n为中断号。软中断处理过程中,CPU不发中断响应信号,也不要求中断控制器提供中断号,包括DOS中断功能和BIOS中断功能。
- DOS功能调用
INT 21H。功能庞大,包含0~6CH个子功能,包括对设备、文件、目录及内存的管理功能,是用户访问系统资源的主要途径。与硬件依赖性小,兼容性好。 - BIOS功能调用
存在ROM中,独立于DOS的I/O中断服务程序,直接对I/O设备进行控制,也是用户访问系统资源的途径之一。与硬件依赖性大,兼容性差。
特殊中断:不由外部设备产生,也不由INT n 产生,而是由内部突发事件产生。不可屏蔽。如:0号:除数为零中断;1号:单步中断;3号:断点中断;4号:溢出中断。
中断号
中断号与中断号的获取
- 中断号
系统给每个中断分配了一个中断号,以便识别处理。
CPU通过中断号(n)×4
得到中断向量表中的位置,从中就能取出中断服务程序的地址(CS:IP)。 - 中断号的获取
- 对于可屏蔽中断:在中断响应周期从中断控制器中获取
- 对于软中断INT n:中断号即为n
- 对于不可屏蔽中断及特殊中断:系统预先设置好
NMI中断号为02H,非法除数中断号为0H
中断响应周期
CPU收到中断请求,执行完当前指令,若IF=1,则进入中断响应周期,连续发出两个中断应答信号INTA完成中断响应周期。
- ++置位中断服务寄存器ISR++:第一个INTA1使CPU输出总线封锁信号,而8259根据选中的最高优先级,在ISR相应位置1,以登记。
- ++读取中断号++:第二个INTA2使CPU撤销总线的封锁信号,中断控制器将中断号送到数据线,由CPU读入。
中断号的分配
中断触发方式和中断排队方式
- 中断触发方式
- 边沿触发
- 电平触发
触发方式在中断控制器初始化时设定。PC微机系统的可屏蔽中断采用正跳变边沿触发方式。
- 中断排队方式
- PC微机中断优先级的顺序是:
软件中断->不可屏蔽中断->可屏蔽中断 - 当系统有多个中断源同时申请中断时,CPU在一个时刻只能响应处理一个中断,就必须进行优先级排队
中断排队的方式有:
- 按优先级排队:
优先级高的先响应。 - 循环轮流排队:
不分级别,CPU轮流响应各个中断源的中断请求。
- 中断嵌套
当CPU正处理某个中断时,出现更高级中断源的申请,CPU暂停该中断服务,转而去处理更高级中断的服务,待处理完后,再返回到被中断的服务程序继续执行。
高级中断可中断低级中断,级别相同或级别低的中断源不能打断级别高的中断服务。
中断向量与中断向量表
中断向量表中的中断向量存储着中断服务程序的入口地址。
中断向量与中断向量表
- 中断向量
- 中断服务程序预先放在程序存储区中
- 该服务程序的入口地址由段基址CS(2个字节)和偏移地址IP(2个字节)两个部分共4个字节组成。此即为中断向量
- 根据中断向量可计算出中断服务程序的起始地址:CS左移4位再加上IP。中断服务程序从此开始执行
- 中断向量表
- 所有的中断向量集中存放到存储器的某一区域,这一区域称之为中断向量表
- PC中,规定存储器的000H-03FFH作为中断向量存储区(共1024个字节),每个中断向量包含4个字节,可容纳256个中断向量,即可处理256个中断服务程序
- IP放在两个低字节单元,CS放在两个高字节单元
- 中断号×4得到一个指针,指向中断向量表,找到在中断向量表中的中断向量就可获取中断服务程序的入口地址
- 中断向量的填写
分系统填写和用户填写两种情况:
- 系统设置的中断服务程序,其中断向量由系统负责填写。其中,由BIOS提供的服务程序在加电后由BIOS负责填写;DOS提供的服务程序由DOS在启动时负责填写
- 用户开发的中断系统,由用户负责填写,可采用MOV指令直接向中断向量表中填写中断向量
用到存字符串指令:STOSW - 执行操作:把AX的内容存放到DI指定的附加段的字单元中,并根据DF值修改DI的内容
- 在执行该指令之前,必须把要存入的数据预先存入AX中,必须预置DI的初值
- DI所指向的存储单元只能在附加段中,即必须是ES:[DI]
例:设60H号的中断的服务程序的段基址是SEG_INTR60,偏移地址OFFSET_INTR60, 程序如下:
用MOV指令填写中断向量
CLI ;关中断
CLD
MOV AX,0 ;设置中断向量表的基地址为0
MOV ES,AX
MOV DI,4*60H ;中断向量指针->DI
MOV AX,OFFSET_INTR60 ;中断服务程序的偏移地址->AX
STOSW ;AX->[DI][DI+1]中,然后DI+2
MOV AX,SEG_INTR60 ;中断服务程序的段基址->AX
STOSW ;AX->[DI+1][DI+2]
STI
也可以用下述程序段将入口地址直接写入中断向量表
MOV AX,0 ;
MOV ES,AX
MOV BX,4*60H ;4*中断号->BX
MOV AX,OFFSET_INTR60 ;中断服务程序的偏移地址
MOV ES:[BX],AX ;装入60H号中断向量的低字段
MOV AX,SEG_INTR60 ;中断服务程序的段基址
MOV ES:[BX+2],AX ;装入60H号中断向量的高字段
中断处理过程
可屏蔽中断的处理过程
- 中断申请与响应握手
- 标志位的处理与断点保存
- 向中断服务程序转移并执行中断服务程序
- 返回断点
不可屏蔽中断的处理过程
- 中断申请与响应握手
必须立即响应,但不发中断响应信号。
系统安排中断号为2。 - 标志位的处理与断点保存
与可屏蔽中断类似。 - 向中断服务程序转移并执行中断服务程序
NMI中断向量的两个字放在0008H和000AH处。 - 返回断点
软件中断的处理过程与此类似
中断控制器
82C59A外部特性和内部寄存器
1.外部特性
面向CPU的信号
面向外设的8根中断请求线
面向同类芯片的中断请求级联线
8259A的外部引脚
- D7-D0:双向数据输入/输出引脚,用以与CPU进行信息交换
- IR7-IR0:8级中断请求信号输入引脚
- INT:中断请求信号输出引脚,高电平有效,用以向CPU发中断请求,应接在CPU的INTR输入端
- INTA(上划线):中断响应应答信号输入引脚,低电平有效,接在CPU的中断应答信号输出端
- RD、WR(上划线):读/写控制信号输入引脚,低电平有效,实现对8259A内部有关寄存器内容的读写操作
- CS(上划线):片选信号输入引脚,低电平有效,决定了8259A的端口地址范围
- A0:8259A两组内部寄存器的选择信号输入引脚,决定8259A的端口地址
- CAS2-CAS0:级连信号引脚,当8259A为主片时,为输出;否则为输入,实现芯片的级连。三个引脚信号的不同组合000~111,刚好对应于8个从片
- SP/EN:级连管理信号输入引脚,在非缓冲方式下,若8259A在系统中作主片用,则SP=1;否则SP=0;在缓冲方式下,则用作8259A外部数据总线缓冲器的启动信号
- +5V、GND:电源和接地引脚
2. 内部寄存器
①中断请求寄存器(IRR)
存放IR线上提出了中断请求的中断源,对应于连接在IR0~IR7线上的外设所产生的中断请求。哪一根输入线有请求,哪位就置“1”
②中断屏蔽寄存器(IMR)
是对中断请求IRi起屏蔽作用,即对中断请求IRi是屏蔽还是允许,寄存器8位对应8个中断屏蔽。哪个中断被屏蔽,哪位就写“1”,即禁止IRi提出中断请求。若写“0”,则允许IRi的提出中断请求。
③中断服务寄存器ISR
ISR被用来存放正在被服务的所有中断级,包括尚没服务完而中途被别的中断所打断了的中断级。
在非自动中断结束方式下,ISR的复位,要有中断结束命令EOI来执行。
④优先权分析器(PR)
当在IRi输入端有中断产生时,送到PR,PR检查进来的中断请求的优先级并和“正在服务中的中断”进行比较,确定是否让这个中断请求送给处理器。
82C59A端口地址
- 82C59A是系统资源,其端口地址由系统分配
- 主片的两个端口地址为20H和21H;从片的两个端口地址为0A0H和0A1H
- 具体使用哪个端口地址,根据是哪个初始化命令字ICW和哪个操作命令字OCW而有所不同(即由A0决定)
82C59A的工作方式
- 中断触发方式
确定中断请求的启动方式
- 边沿触发方式。IR0-IR7线上出现由低到高的跳变,表示有中断请求
- 电平触发方式。IR0-IR7线上出现高电平时,表示有中断请求
- 中断级联方式
82C59可以单片使用,也可以多片使用,级联方式应用时有主片和从片的问题。
3. 中断屏蔽方式
- 常规中断屏蔽方式:常用。通过向屏蔽寄存器写入8位屏蔽码来屏蔽或开放相应位的中断。++1:屏蔽;0:开放++
- 特殊屏蔽方式。少用。允许比正在服务的中断级别低的中断申请。
- 中断优先级排队
- 完全嵌套方式:
只能高优先级中断低优先级的中断。 - 特殊完全嵌套方式:
同级优先级的中断可以相互中断 - 优先级轮换方式。被服务完的中断源优先级将自动变为最低,而其后的中断源的优先级将变为最高。优先级轮换方式有两种
- 优先级自动轮换方式:当一个中断被服务后,自动降为最低,初始顺序是:IR0,IR1,…
- 优先级指定轮换方式:与自动的差别是,初始轮换的优先级可以由程序指定。
- 中断结束方式
- 自动结束方式
在中断响应周期,就自动清零了该中断源的ISR寄存器中被置1的位。这常用于没有中断嵌套的系统。 - 非自动结束方式
在中断服务程序后,必须使用中断结束命令EOI才能清除ISR中的相应位。这是最常用的中断结束方式。它有两种形式:- 指定中断结束命令:即要指定结束中断请求线IRi的编号。
- 不指定中断结束命令:不指定IRi的编号。
82C59A的编程命令
编程命令是为建立中断工作方式和实现中断处理而设置。共有7个命令,分为初始化命令ICW(1~4)和操作命令OCW(1~3)两类。
++初始化命令++: 确定中断控制器的基本配置或工作方式
++操作命令++:执行由ICW命令定义的基本操作
初始化命令字(ICW1-ICW4)
必须在对82C59A初始化时完成。需要按顺序发送ICW1 –ICW4
中断请求触发方式和单片/多片的设置(ICW1)
功能:设定中断请求的触发方式、级联和CPU的特性。
若8259A采用电平触发,单片使用,需要ICW4
则:
MOV AL,00011011B ;ICW1的内容
OUT 20H,AL ;写入ICW1端口 ,20H为微机主片的端口(地址A0=0)
;(A0=0)
中断号的设置(ICW2)
功能:提供给CPU的中断类型号
IRQ0~7低3位上的编码和高5位上的中断类型码一起构成一个完整的8位中断类型号
注意:向ICW2写入中断类型号只写高5位,低3位写0,即08H
MOV AL,08H ;中断类型号的高5位
OUT 21H,AL ;写入ICW2的端口(A0=1)
中断级联方式的设置(ICW3)
例如:从片的请求线INT连到主片的IR2,则:
主片的ICW3=00000100B=04H
MOV AL,04H ;主片的ICW3
OUT 21H,AL
从片的ICW3=00000010B=02H
MOV AL,02H ;从片的ICW3
OUT 0A1H,AL ;从片的地址由译码决定
(0A1H为从片的端口地址)
中断优先级排队方式和中断结束方式设置(ICW4)
- A0=1
- D5-D7高3位为0
- D4(SFNM)
=1特定完全嵌套方式
=0 一般完全嵌套方式 - D3(BUF)
=1 为缓冲方式,SP/EN 作输出
线,用于控制缓冲器的方向
=0 为非缓冲方式,SP/EN作输入线 - D2(M/S)
=1 为缓冲方式下作主片
=0 为缓冲方式下作从片
注:非缓冲方式(BUF=0时),则M/S无意义,
此时主/从由SP端外输入决定。
- D1(AEOI)
=1 自动结束方式,ISR有自动
复位(清0)功能
=0 为非自动结束方式,要发EOI命令 - D0(uPM)
=1 用于16位以上微机
=0 用于8位微机
例:某计算机的CPU为80286,而8259A与系统总线之间采用缓冲器连接,非自动结束方式,正常完全嵌套,只用1片8259A。
ICW4=00001101B=0DH
相应的初始化程序段:
MOV AL,0DH
OUT 21H,AL
操作命令字( OCW1-OCW3 )
初始化后,即在程序执行中,使用OCW命令对中断控制器进行动态控制。
不需要按顺序发送,在程序中任意安排。
中断屏蔽/开放操作(OCW1)
例:要使中断源IR3开放,其余被屏蔽。
则:OCW1=11110111B=F7H
相应的程序段:
MOV AL,0F7H
OUT 21H,AL ;OCW1内容送端口
中断结束控制和中断优先级排队控制操作(OCW2)
一些实例:
a.不指定的EOI命令,全嵌套方式:00100000
b.指定的EOI命令,全嵌套方式: 01100L2L1L0
c.不指定的EOI方式,优先级自动轮换:10100000
d.自动EOI方式,优先级自动轮换:10000000
e.自动EOI方式,取消优先级自动轮换:00000000
f.指定的EOI方式,优先级特殊轮换:11100L2L1L0
g.优先级特殊轮换:11000L2L1L0
特定的屏蔽/开放操作(OCW3)
功能:
- 用来设置查询中断方式
- 设置特定屏蔽方式
- 读取8259A的IRR,ISR寄存器的内容
读状态操作(OCW3格式中的D1 D0 )
8259A内部有3个寄存器IRR,ISR,IMR可供CPU读出当前的内容。
(1)读IRR和ISR的方法
CPU先指定读哪个寄存器,然后再发IN指令,才能读取ISR和IRR中的内容。当8259A初始化后,自动指向读IRR寄存器。
(2)读IMR的方法
不需要先发指定命令,只要读奇地址端口。
例:读ISR寄存器的内容
分两步:
- 通过OCW3指定被读的寄存器
OCW3为00001011B=0BH,表示下个RD要读ISR - 用IN指令读出ISR寄存器的内容
MOV AL,0BH ;OCW3表示读ISR
OUT 20H,AL ;20H为OCW3的口地址
IN AL,20H ;读ISR寄存器
82C59A对中断管理的作用
- 接收和扩充I/O设备的中断请求
- 进行中断优先级排队
- 向CPU提供中断号
- 进行中断的开放与屏蔽
- 执行中断结束命令
可屏蔽中断系统
中断系统的初始化
在系统运行之前,系统中的每个8259A必须按先后次序接收CPU的2-4个ICW初始化命令字进行初始化。初始化命令字必须按规定的顺序写入。
对16位机,且多片,则主片与从片的ICW3要分别写。
用户对系统诊断资源的使用
两类编程命令:初始化命令字ICW和操作命令字OCW。
ICW:
- 在初始化里完成,必须按一定的顺序。
- 在PC机中已有系统软件完成,不需要也不允许由用户自己去设置。
- 一般只对于没有配置完善操作系统的单板微机上进行。
OCW:
- 没有一定的顺序,一般也不安排在程序的开头。
- 在初始化后的任何时候进行动态控制。
修改中断向量
当使用PC机的某个中断号时,需分三步修改:
- 用35H号功能,获取原中断向量。
- 用25H号功能,设置新中断向量,取代原中断向量。
- 新服务程序执行完毕后,利用25H号功能恢复原中断向量。
例:修改中断号为60H的中断向量。
第1步:
MOV AH,35H ;取原中断向量
MOV AL,60H ;60H为原中断号
INT 21H ;中断向量存到ES:BX
MOV OLD_SEG,ES ;保存原中断向量
MOV OLD_OFF,BX
第2步:
MOV AH,25H ;设置新中断向量
MOV AL,60H ;中断号
MOV DX,SEG INTRn ;INTRn是新中断程序的入口地址
MOV DS,DX ;DS指向新中断程序段地址
MOV DX,OFFSET INTRn ;DX指向新中断程序偏移地址
INT 21H ;新中断向量存到向量表
第3步:
MOV AH,25H ;恢复旧的中断向量
MOV AL,60H ;中断号
MOV DX,OLD_SEG
MOV DS,DX ;DS指向旧中断程序段基址
MOV DX,OLD_OFF ;DX指向旧中断程序偏移地址
INT 21H ;旧中断向量存到向量表
发中断屏蔽/开放和中断结束命令
- 在主程序中,用OCW1执行中断屏蔽与开放
开放IRQ2中断的方法:
IN AL,21H ;读IMR寄存器
AND AL,0FBH ;对应IRQ2的位置0
OUT 21H,AL
关闭IRQ2中断的方法:
IN AL,21H ;读IMR寄存器
OR AL,04H ;对应IRQ2的位置1
OUT 21H,AL
- 在中断服务程序中,使用OCW2发中断结束信号EOI,使用IRET中断返回
编写中断服务程序
中断服务程序一般格式
INT-P PROC FAR
PUSH … ;保护寄存器的内容
…
PUSH …
STI
… ;中断服务程序体
MOV AL,20H ;不指定中断结束方式
OUT 20H,AL ;发EOI命令,对微机
POP … ;恢复寄存器(与保护时的顺序相反)
…
POP …
IRET ;中断返回
INT-P ENDP
中断应用程序设计
中断的实际应用有两种情况:一是利用微机系统配置的中断资源,直接调用来开发自己的中断系统;二是用户自己设计的中断系统,通常是在单片机上或单板机上设计的中断系统。下面举例说明利用系统的中断资源来设计的中断应用系统的方法。
例:中断用于数据采集系统
(1)要求:从通道5采集1024个8位数据;数据以中断方式送缓冲区BUFR;结束信号EOC经GAL20V8组合后送IRQ9去中断请求;指定方式结束;A/D转换器ADC0809的选择端口地址320H,启动为321H,读数端口为322H;主片82C59A端口:OCW1端口为21H,OCW2端口20H;从片OCW1的端口0A1H, OCW2的端口为0A0H。
电路图:
(2)分析:
中断源:由ADC0809的转换结束信号EOC的上升沿申请中断。
中断:由于是从IRQ9引入中断请求,因此连到从片82C59的IR1端口,其中断号是71H; 82C59的两个端口地址是0A0H和0A1H。
操作:由于是主从结构的82C59中断控制,所以对主从片都要进行操作。
在程序设计时,按主程序和服务程序两个模块进行设计,而利用系统的中断资源,不需要进行初始化。
程序
MOV AX,3571H ;取原中断向量并保存
INT 21H
MOV INT0A-OFF,BX
MOV BX,ES
MOV INT0A-SEG,BX
CLI ;置新中断向量
MOV AX,2571H
MOV DX,SEG A-D
MOV DS,DX
MOV DX,OFFSET A-D
INT 21H
MOV AX,DATA ;恢复数据段
MOV DS,AX
STI
IN AL,21H ;开放从片中断(主片IR2)
AND AL,0FBH
OUT 21H,AL
MOV DX,0A1H ;开放IRQ9
IN AL,DX
AND AL,0FDH
OUT DX,AL
;程序主体
MOV CX,1024 ;设置采样次数
MOV AX,OFFSET BUFF
MOV POINT,AX ;设置内存指针
MOV DX,320H ;选择通道号
MOV AL,05H
OUT DX,AL
BEGIN:MOV DX,321H ;启动转换
MOV AL,00H
OUT DX,AL
STI ;开中断
HLT ;等待中断
DEC CX ;修改采样次数
JNZ BEGIN ;没有结束,继续
CLI ;恢复原中断向量
MOV AX,2571H
MOV DX,INT0A-SEG
MOV DS,DX
MOV DX,INT0A-OFF
INT 21H
MOV AX,DATA ;恢复数据段
MOV DS,AX
STI
IN AL,21H ;屏蔽主8259
OR AL,04H
OUT 21H,AL
MOV DX,0A1H ;屏蔽IRQ9
IN AL,DX
OR AL,02H
OUT DX,AL
MOV AX,4C00H ;返回DOS
INT 21H
;中断服务程序
A-D PROC FAR
PUSH AX ;保护现场
PUSH DX
PUSH DI
CLI ;关中断
MOV DX,322H ;读数据
IN AL,DX
NOP
MOV DI,POINT ;存数据
MOV [DI],AL
INC DI
MOV POINT,DI ;修改指针
MOV AL,20H ;主片的中断结束命令
OUT 20H,AL
MOV DX,0A0H ;从片的中断结束命令
MOV AL,61H
OUT DX,AL
POP DI ;恢复现场
POP DX
POP AX
STI ;开中断
IRET
A-D ENDP