一个完整的中断处理系统必须实现以下功能:
引起程序中断的事件称为中断源
先响应优先级别最高的中断申请
具体方法:
基本过程应包括5个基本阶段:
8086提供两条外部中断请求线,和一条与中断有关的控制线:NMI,INTR, INTA(中断响应)。
由高到低:
8086用0-255来区分256个不同中断源,并对应给出中断向量。
0~4: 5个内部中断,有固定的定义和处理功能;
5~31:系统保留,用户一般不应使用
32~255:用户使用作为硬件或软件中断,也可不用,作为数据存储区。
8086/8088系统支持最多256个中断,对应每一个中断,都有一个中断服务程序,该中断服务程序的入口地址称为中断向量。
每个中断向量占用4个字节,前两个字节(低位)为服务程序的IP(偏移量),后两个字节(高位)为服务程序的CS(段地址)。低字节在低位,高字节在高位。
256中断向量构成一个中断向量表,放在(内存的最低区域)0段的0~3FFH区域内,每个占4个字节
存放中断向量的位置=中断类型号×4(0段)开始的4个内存单元。
!!!用户在使用中断服务程序之前,必须采取一定的方法,将中断服务程序的入口地址送到与中断类型相应地中断向量表中。(中断服务程序是自己定义的)
中断申请管理接口的主要功能:
可编程中断控制器 8259A 是专门用于微型计算机系统中断管理的大规模集成电路芯片。用于管理Intel 8080/8085、8086/8088、80286/80386的可屏蔽中断。
8259A的基本功能
8位三态双向缓冲器,常与 8086 低8位数据总线 D 0 D_0 D0~ D 7 D_7 D7 相连,相应将CPU地址总线的 A 1 A_1 A1 和 8259A 的 A 0 A_0 A0相连?
读 / 写控制逻辑用于接收 CPU 的读/写命令 R D ‾ \overline {RD} RD, W R ‾ \overline {WR} WR,以及片选信号 C S ‾ \overline {CS} CS 和 端口选择信号 A 0 A_0 A0:。
I R 0 {IR}_0 IR0 ~ I R 7 {IR}_7 IR7
扩展中断级,最多至64级。多片连接时,一片为主片,其余为从片。
用以比较正在处理的中断和刚刚进入的中断请求之间的优先级别,以决定是否产生多重中断或中断嵌套。
控制逻辑是8259A 的内部控制器。
根据中断请求寄存器IRR 和 中断屏蔽寄存器IMR 通过 优先权比较器PR判断优先级,向 8259A 内部及其他部件发出控制信号,并向 CPU 发出中断请求信号 INT 和接收 CPU的中断请求信号 I N T A ‾ \overline {INTA} INTA,使中断服务寄存器 ISR 相应位置“1”,并使中断请求寄存器 IRR 相位复“0”。
当CPU 的第二个 I N T A ‾ \overline {INTA} INTA 信号到来,控制 8259A 送出中断类型号,使CPU 转入中断服务子程序。
若是中断结束方式为自动结束方式,则在第二个INTA 周期后沿将中断服务寄存器ISR复位。
8259A 有 6 种工作方式:
这些工作方式都是通过 8259A 的初始化命令字( I C W 1 {ICW}_1 ICW1~ I C W 4 {ICW}_4 ICW4)和操作命令字( O C W 1 {OCW}_1 OCW1~ O C W 4 {OCW}_4 OCW4)来设定。
边沿触发器方式(中断请求输入端出现上升沿触发信号)
电平触发方式(只有中断请求输入端出现高电平信号才能实现中断请求)
中断查询方式 (8259A向CPU发送INT信号,但是CPU可以不理(关中断IF),而是靠CPU不断查询8259A)
查询时:系统先关中断,然后将查询方式命令字 O C W 3 {OCW}_3 OCW3送到8259A,再对8259A执行一条输入指令,8259A 便将查询字送上数据总线。查询字格式如下:
7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
W2 | W1 | W0 |
I=1表示 有中断请求
W2W1W0 表示当前中断源请求的最高优先级。
全嵌套方式 和 特殊嵌套方式。
改变优先级的方式
优先级自动循环方式:
设置成该模式后,自动规定 I R 0 {IR}_0 IR0优先级最高, I R 7 {IR}_7 IR7优先级最低。
当某一中断请求 I R i {IR}_i IRi中断服务结束后,其优先级自动降级为最低,紧跟其后的 I R i + 1 {IR}_{i+1} IRi+1优先级变为最高,其余类推:由高到低为: I R i {IR}_{i} IRi, I R i + 2 {IR}_{i+2} IRi+2 … I R 7 {IR}_{7} IR7… I R 0 {IR}_{0} IR0,. I R 1 {IR}_{1} IR1… I R i {IR}_{i} IRi
例: I R 4 {IR}_{4} IR4 中断服务完后: I R 5 {IR}_{5} IR5, I R 6 {IR}_{6} IR6, I R 7 {IR}_{7} IR7, I R 0 {IR}_{0} IR0, I R 1 {IR}_{1} IR1, I R 2 {IR}_{2} IR2, I R 3 {IR}_{3} IR3, I R 4 {IR}_{4} IR4
优先级特殊循环方式:
与优先级自动循环方式区别在于:优先级特殊循环方式设置完后,由编程来指定最低优先级(最高优先级也确定了,例指定 I R 4 {IR}_{4} IR4为最低,则 I R 5 {IR}_{5} IR5为最高)
其实就是对 ISR对应位的 复“0” 处理。
中断自动结束方式(AEOI)
该结束方式的设置是在 8259A 初始化时实现。
CPU 进入中断响应周期,并在发出第二个 I N T A ‾ \overline {INTA} INTA脉冲后自动将 ISR对应位清“0”。
只有一片8259A 且多个中断不会嵌套的情况下才会使用该结束方。否则优先级混乱出错。
中断非自动结束方式(EOI)(2种)
两种EOI结束命令都是在8259A的操作命令中实现的。
IRR 和 ISR 用 O C W 3 OCW_3 OCW3来读
IMR 用 端口 A 0 A_0 A0为0的地址来读( O C W 1 OCW_1 OCW1?)
初始化设置 中断有效触发方式,是否级联及嵌套方式,中断结束方式,缓冲器
(1)芯片控制初始化命令字 I C W 1 ICW_1 ICW1 格式:
D 7 D_7 D7 | D 6 D_6 D6 | D 5 D_5 D5 | D 4 D_4 D4 | D 3 D_3 D3 | D 2 D_2 D2 | D 1 D_1 D1 | D 0 D_0 D0 | … | A 0 A_0 A0 |
---|---|---|---|---|---|---|---|---|---|
/ | / | / | 1 | LTIM | ADI | SNGL | I C 4 IC_4 IC4 | … | 0 |
I C W 1 ICW_1 ICW1 初始命令字写入条件: A 0 A_0 A0=0,命令字特征位 D 4 D_4 D4=1。
I C 4 IC_4 IC4:初始化过程中是否写入 I C W 4 ICW_4 ICW4 。
LTIM:指出中断信号的有效触发方式:
SNGL:指出是否为多片级联。1为单片,0为多片。意味着要写 I C W 3 ICW_3 ICW3
其余只在8080/8085微机中有效。
(2)中断类型初始化命令字 I C W 2 ICW_2 ICW2 格式:
D 7 D_7 D7 | D 6 D_6 D6 | D 5 D_5 D5 | D 4 D_4 D4 | D 3 D_3 D3 | D 2 D_2 D2 | D 1 D_1 D1 | D 0 D_0 D0 | … | A 0 A_0 A0 |
---|---|---|---|---|---|---|---|---|---|
T 7 T_7 T7 | T 6 T_6 T6 | T 5 T_5 T5 | T 4 T_4 T4 | T 3 T_3 T3 | I D 2 ID_2 ID2 | I D 1 ID_1 ID1 | I D 0 ID_0 ID0 | … | 1 |
I C W 2 ICW_2 ICW2 初始命令字写入条件: A 0 A_0 A0=1,且必须紧跟着 I C W 1 ICW_1 ICW1写入。
I D 2 ID_2 ID2~ I D 0 ID_0 ID0:系统自动填入 I R i {IR}_{i} IRi的编码
T 7 T_7 T7~ T 3 T_3 T3: I R i {IR}_{i} IRi的中断类型号高5位。
I C W 2 ICW_2 ICW2写入的可以理解成是 I R 0 {IR}_{0} IR0的中断级别, I R i {IR}_{i} IRi一次递增。
(3)主/从片 初始化命令字 I C W 3 ICW_3 ICW3 格式:
主片:
D 7 D_7 D7 | D 6 D_6 D6 | D 5 D_5 D5 | D 4 D_4 D4 | D 3 D_3 D3 | D 2 D_2 D2 | D 1 D_1 D1 | D 0 D_0 D0 | … | A 0 A_0 A0 |
---|---|---|---|---|---|---|---|---|---|
S 7 S_7 S7 | S 6 S_6 S6 | S 5 S_5 S5 | S 4 S_4 S4 | S 3 S_3 S3 | S 2 S_2 S2 | S 1 S_1 S1 | S 0 S_0 S0 | … | 1 |
从片:
D 7 D_7 D7 | D 6 D_6 D6 | D 5 D_5 D5 | D 4 D_4 D4 | D 3 D_3 D3 | D 2 D_2 D2 | D 1 D_1 D1 | D 0 D_0 D0 | … | A 0 A_0 A0 |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | I D 2 ID_2 ID2 | I D 1 ID_1 ID1 | I D 0 ID_0 ID0 | … | 1 |
I C W 3 ICW_3 ICW3 初始命令字写入条件: A 0 A_0 A0=1,且仅当 多片8259A级联时,主片从片都必须写入 I C W 3 ICW_3 ICW3。
主片: S 7 S_7 S7~ S 0 S_0 S0 分别表示 I R 7 IR_7 IR7~ I R 0 IR_0 IR0上是否有从片,为1表示有
从片: I D 2 ID_2 ID2~ I D 0 ID_0 ID0 对应 I R i IR_i IRi的编码 i 。
(4)方式控制初始化命令字 I C W 4 ICW_4 ICW4 格式:
D 7 D_7 D7 | D 6 D_6 D6 | D 5 D_5 D5 | D 4 D_4 D4 | D 3 D_3 D3 | D 2 D_2 D2 | D 1 D_1 D1 | D 0 D_0 D0 | … | A 0 A_0 A0 |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | SFNM | BUF | M/S | AEOI | uPM | … | 1 |
I C W 4 ICW_4 ICW4 初始命令字写入条件:仅当 I C W 4 ICW_4 ICW4 中 D 0 D_0 D0 ( I C 4 IC_4 IC4 )为1时才需要写入 I C W 4 ICW_4 ICW4,且 A 0 A_0 A0为1。
uPM( D 0 D_0 D0):设置微处理器类型,8259A连接到80x86 时,该位必须为“1”。
AEOI( D 1 D_1 D1):设置中断结束方式,AEOI=1,表示该中断自动结束;AEOI=0表示非自动结束,具体哪种非自动结束由中断方式命令字 O C W 2 OCW_2 OCW2控制。
BUF ( D 3 D_3 D3)+ M/S( D 2 D_2 D2) :设置缓冲器。BUF=0表示非缓冲方式,说明本片8259A 和系统数据总线之间没有缓冲器;当 D 3 D_3 D3 D 2 D_2 D2=10时,本片为缓冲方式且是从片;当 D 3 D_3 D3 D 2 D_2 D2=11时,本片为缓冲方式且是主片。
SFNM( D 4 D_4 D4):设置嵌套方式,SFNM=1时,表示8259A处于多片中断控制系统中,采用特殊全嵌套方式;SFNM=0时,采用全嵌套方式。
其余位不用,一般为0。
(1)屏蔽操作命令字 O C W 1 OCW_1 OCW1( A 0 A_0 A0=1)
D 7 D_7 D7 | D 6 D_6 D6 | D 5 D_5 D5 | D 4 D_4 D4 | D 3 D_3 D3 | D 2 D_2 D2 | D 1 D_1 D1 | D 0 D_0 D0 | … | A 0 A_0 A0 |
---|---|---|---|---|---|---|---|---|---|
M 7 M_7 M7 | M 6 M_6 M6 | M 5 M_5 M5 | M 4 M_4 M4 | M 3 M_3 M3 | M 2 M_2 M2 | M 1 M_1 M1 | M 0 M_0 M0 | … | 1 |
设置条件: A 0 A_0 A0=1
M i M_i Mi 为 1 ,表示对应的中断屏蔽 I R i IR_i IRi被屏蔽;为0则开放。
屏蔽是指不会向CPU发出 INT信号。
读IMR:RD活跃且 A 0 A_0 A0=1
(2)中断方式命令字 O C W 2 OCW_2 OCW2( A 0 A_0 A0=0 且 D 4 D_4 D4 D 3 D_3 D3=00)
D 7 D_7 D7 | D 6 D_6 D6 | D 5 D_5 D5 | D 4 D_4 D4 | D 3 D_3 D3 | D 2 D_2 D2 | D 1 D_1 D1 | D 0 D_0 D0 | … | A 0 A_0 A0 |
---|---|---|---|---|---|---|---|---|---|
R | SL | EOI | 0 | 0 | L 2 L_2 L2 | L 1 L_1 L1 | L 0 L_0 L0 | … | 1 |
设置条件: A 0 A_0 A0=0 且 D 4 D_4 D4 D 3 D_3 D3=00
R( D 7 D_7 D7):循环方式设置,R=1,则表示采用优先级循环方式;若R=0,则为非循环方式。
EOI( D 5 D_5 D5):EOI=1, 表示 O C W 2 OCW_2 OCW2的作用之一是作为结束中断命令EOI,应在IRET之前,若 EOI=0,则不作为中断命令。
SL( D 6 D_6 D6):低三位是否有效。若SL=1,则末尾低三位有效。否则无效。(若是特殊的中断结束命令,即特殊非自动结束方式,该位指出要结束的中断,要清除的ISR)
特殊优先循环的设置最低优先级命令用 D 7 D_7 D7 D 6 D_6 D6 D 5 D_5 D5 =110的 O C W 2 OCW_2 OCW2。
(3)状态操作命令字 O C W 3 OCW_3 OCW3( A 0 A_0 A0=0 且 D 4 D_4 D4 D 3 D_3 D3=01)
D 7 D_7 D7 | D 6 D_6 D6 | D 5 D_5 D5 | D 4 D_4 D4 | D 3 D_3 D3 | D 2 D_2 D2 | D 1 D_1 D1 | D 0 D_0 D0 | … | A 0 A_0 A0 |
---|---|---|---|---|---|---|---|---|---|
/ | ESMM | SMM | 0 | 1 | P | RR | RIS | … | 1 |
设置条件: A 0 A_0 A0=0 且 D 4 D_4 D4 D 3 D_3 D3=01
P( D 2 D_2 D2):设置查询方式。P=1,表面 8259A 采用中断查询方式,可用CPU随时查询IRR。
ESMM,SMM( D 6 D_6 D6 D 5 D_5 D5):设置或撤销特殊屏蔽方式。 D 6 D_6 D6 D 5 D_5 D5=11,进入特殊屏蔽方式, D 6 D_6 D6 D 5 D_5 D5=10,返回正常屏蔽方式
RR,RIS( D 1 D_1 D1 D 0 D_0 D0):读8259A内部寄存器的状态:RR=1表示要读了,RIS=0表示读IRR;RIS=1表示要读ISR。把 O C W 3 OCW_3 OCW3送给8259A,然后用输入指令 IN 读出就行。
端口分配及读/写操作功能 表:
C S ‾ \overline {CS} CS | W R ‾ \overline {WR} WR | R D ‾ \overline {RD} RD | A 0 A_0 A0 | 功能 |
---|---|---|---|---|
0 | 0 | 1 | 0 | 写 I C W 1 ICW_1 ICW1 |
0 | 0 | 1 | 1 | 写 I C W 2 ICW_2 ICW2或 I C W 3 ICW_3 ICW3或 I C W 4 ICW_4 ICW4 |
0 | 0 | 1 | 1 | 写 O C W 1 OCW_1 OCW1 |
0 | 0 | 1 | 0 | 写 O C W 2 OCW_2 OCW2或 O C W 3 OCW_3 OCW3 |
0 | 0 | 1 | 0 | 读 IRR 或 ISR(由 O C W 3 OCW_3 OCW3决定) |
0 | 1 | 0 | 1 | 读 IMR |
0 | 1 | 0 | 1 | 读 状态? |
注意!8259 要用了OCW1开中断!
常会用到 ICW4 01H
!!! 74138:A B C端口 C是高位!
MOV AL,13H ;ICW1:13H 边沿触发 单片 写ICW4
OUT 地址0,AL
MOV AL,前五位地址+000 ;ICW2
OUT 地址1,AL
;ICW3 用于多片 基本不用
MOV AL,01H ;ICW4 ;非自动结束,8086模式
MOV AL, NOT 开中断位 ;开中断
OUT 地址1,AL
!!! 非自动结束方式一定要在中断服务最后发出OCW2,发出中断结束命令!
中断服务程序
现场保护
PUSH...
MOV AL,20H
OUT 地址0,AL
do sth...
POP ...
IRET
;设中断服务标号为 INTPROC
MOV AX,0
MOV DS,AX
MOV BX,中断类型号*4
MOV AX,OFFSET INTPROC
MOV [BX],AX
MOV AX,SEG INTPROC
MOV [BX+2],AX