第八章 中断控制器8259讲义.docx
《第八章 中断控制器8259讲义.docx》由会员分享,可在线阅读,更多相关《第八章 中断控制器8259讲义.docx(29页珍藏版)》请在冰豆网上搜索。
第八章中断控制器8259讲义
第八章中断控制技术和8259
第一节中断控制技术补充
一中断处理的隐操作及堆栈的使用
⒈隐操作
CPU响应中断转去执行中断服务程序之前,其状态标志和程序断点地址进栈,以及中断返回时,断点和标志信息的退栈,是由机器硬件安排自动完成的,无需外界干预,故称为中断处理的隐操作,这些操作都使用堆栈。
⒉堆栈
堆栈是一种专用的"后进先出"(LIFO)的存储区,用来保存断点、现场信息及传递子程序所需的参数,广泛用于中断处理、子程序调用及返回处理。
8088/8086的堆栈设置在存储器中,由SS堆栈段寄存器和SP堆栈指针来定位。
SS指向当前栈的段基址,是栈区的最低地址。
SP包含距段基址的偏移地址,也称为堆栈的深度,一个栈最大的深度只能占有64KB空间。
SP作为堆栈指针始终指向栈顶(TOS),栈顶在程序执行过程中,随着进栈(PUSH)与退栈(POP)操作而发生变化,有所谓向下生长和向上生长之分。
8088/8086的堆栈是向下生长型,即在进栈操作时,栈顶向下生长,使堆栈的地址单元号从大到小,递减2,趋向堆栈段基址SS;在退栈操作时,堆栈地址单元号从小到大,递增2,趋向栈底,空栈时,SP指向堆栈段的最高地址,即栈底。
栈底也就是SP的初值,栈底一经设定就固定不变。
⒊堆栈操作
①建栈操作
STACK1SEGMENTSTACK
BUFFERDB30DUP(0)
TOP_STACKLABELWORD
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,SS:
STACK1
START:
┆
MOVAX,STACK1
MOVSS,AX ;将当前堆栈段基址送入SS
MOVSP,TOP_STACK ;将堆栈段偏移地址送入SP
┆
②进栈操作
PUSHAX
PUSHBX
③弹栈操作
POPAX
POPBX
二中断向量的装入
中断向量并非常驻内存,而是开机上电时,由程序装入内存指定的中断向量区的。
BIOS程序负责0~1FH共32个中断向量的装入。
用户若想使用硬、软中断,则要将中断服务程序入口地址装入中断向量指针所指定的中断向量表中。
下面举例说明填写中断向量表所用的三种方式:
⒈用MOV指令填写中断向量表。
例如,假设中断类型号为60H,中断服务程序的段基址是SEG_INTR,偏移地址是OFFSET_INTR(006DH)。
则填写中断向量表的程序段为:
┆
CLI
CLD
MOVAX,0
MOVES,AX
MOVDI,4*60H ;中断向量指针→DI
MOVAX,OFFSET_INTR ;中断服务程序偏移值→AX
STOSW ;AX→[DI][DI+1]中,然后DI+2
MOVAX,SEG_INTR ;中断服务程序的段基址→AX
STOSW ;AX→[DI+2][DI+3]
STI
┆
┆
⒉将中断服务程序的入口地址直接写入中断向量表,其程序段为:
┆
┆
MOVAX,00H
MOVES,AX
MOVBX,60H*4 ;中断号*4→BX
MOVAX,006DH ;中断服务程序偏移地址
MOVES:
[BX],AX ;装入偏移地址
PUSHCS
POPAX ;中断服务程序段基址
MOVES:
[BX+2],AX ;装入段基址
┆
┆
⒊采用DOS功能调用"INT21H"中的AH=25H来装入中断向量,其程序段为:
MOVAL,N ;中断号
MOVAH,25H ;设置中断向量
MOVDX,SEG_INTR
MOVDS,DX ;DS指向中断程序段址
MOVDX,OFFET_INTR ;DX指向中断程序偏移量
INT21H
┆
┆
三编写中断服务程序
⏹编写内部中断服务程序与编写子程序类似
⏹利用过程定义伪指令PROC/ENDP
⏹第1条指令通常为开中断指令STI
⏹最后用中断返回指令IRET
⏹通常采用寄存器传递参数
⏹主程序需要调用中断服务程序
⏹调用前,需要设置中断向量
⏹利用INTn指令调用中断服务程序
⏹编写80H号中断服务程序
⏹功能:
显示以“0”结尾字符串的功能
⏹利用显示器功能调用INT10H
⏹字符串缓冲区首地址为入口参数
⏹DS:
DX(段地址:
偏移地址)传递参数
codesegment
assumecs:
code,ds,code
intoffdw?
intsegdw?
intmsgdb‘AInstructionInterrupt!
’
db0dh,0ah,0
start:
movax,code
movds,ax
movax,3580h
int21h
movintoff,bx;保存偏移地址
movintseg,es;保存段基地址
pushds
movdx,offsetnew80h
movax,segnew80h
movds,ax
movax,2580h
int21h
popds
movdx,offsetintmsg
int80h
new80hproc
sti;开中断
pushax;保护寄存器
pushbx
pushsi
movsi,dx
new1:
moval,[si]
cmpal,0
jznew2
movbx,0
movah,0eh
int10h
incsi
jmpnew1
new2:
popsi;恢复寄存器
popbx
popax
iret;中断返回
new80hendp
movdx,intoff
movax,intseg
movds,ax
movax,2580h
int21h
movax,4c00h
int21h
codeends
endstart
第二节中断控制器8259A
一8259A简介
⒈概述
Intel8259A是可编程中断控制器PIC,可用于管理Intel8080/8085、8086/8088、80286/80386的可屏蔽中断。
⒉8259A的基本功能
①优先级排队管理:
根据任务的轻重缓急或设备的特殊要求,分配中断源的中断等级。
8259A具有全嵌套、循环优先级、特定屏蔽多种方式的优先级排队管理。
②接受外部设备的中断请求:
经过优先权判决找到哪一个中断源的中断请求级别最高,然后再向CPU提出中断申请INT;或者拒绝外设的中断请求,予以屏蔽。
一片8259A可以接受8个中断请求,经过级联可扩展至8片8259A,实现64级中断。
③提供中断类型号:
为CPU实现程序的转移给出中断服务程序入口地址指针。
8259A最突出的特点是具有对中断服务程序入口地址的寻址能力,也就是当CPU响应中断申请时,通过8259A提供的中断类型号可以找到中断服务程序的入口地址,转移到中断服务程序去执行。
二8259A的外部特性和内部结构
⒈外部特性
8259A为28脚双列直插式芯片。
外部引脚如上图所示。
各引脚的功能如下表所示。
8259A引脚定义及功能表
⒉内部结构
① 中断请求寄存器IRR
8位,每一位对应一个I/O设备,用来记录发生中断请求的外设。
当某一外设(I/O设备)发出中断请求信号IRQ时,对应位被置“1”。
简言之:
用来存放要请求服务的所有中断请求信号。
② 中断服务寄存器ISR
8位,用来存放正在被服务,包括尚未服务完毕而中途被别的中断打断了的所有中断级。
③ 优先权判决电路PR
用来识别各中断请求信号的优先级别。
当多个中断请求信号同时产生时,由判优电路判定哪一个中断请求具有最高优先权,若有中断正在被服务,则还需与ISR的当前中断服务优先级相比较,以决定是否将8259A的中断申请线INT上升为高电平。
④ 中断屏蔽寄存器IMR
IMR对IRR起屏蔽作用,即对中断请求IR是禁止还是允许。
寄存器8位(D0~D7)对应8级中断屏蔽。
哪一级中断被屏蔽,哪位就写1,即禁止IR提出中断请求;反之,就写0,不屏蔽,即允许IR提出中断请求。
屏蔽操作由屏蔽命令OCW1执行。
IMR可很方便地读和写。
⑤ 控制逻辑
用于向8259A内部其它部件发控制信号,外部向CPU发INT信号,接收CPU发来的
信号,控制8259A进入中断服务状态。
控制逻辑是8259A全部功能的核心,包括一组方式控制字寄存器和一组操作命令字寄存器,以及相关的控制电路。
⑥ 数据总线缓冲器
8位双向三态缓冲器,是8259A与CPU之间数据接口。
当CPU对8259A进行读操作时,数据总线缓冲器用来传输从8259A内部读至CPU的数据/状态信息和中断类型码,写操作时由CPU向8259A内部写入控制命令字。
⑦ 读/写控制逻辑
用于控制对8259A的读、写操作。
控制信号有:
、
、
、A0共同控制,完成规定的操作。
8259A芯片内可写的寄存器有:
各种命令寄存器,可读的寄存器有:
IRR、ISR、IMR等状态寄存器。
具体参考下表。
A0
功能
0100
1100
0010
1010
×110
×××1
写入ICW1、OCW2和OCW3
写入ICW2~ICW4和OCW1
读出IRR、ISR和查询字
读出IMR
数据总线高阻状态
数据总线高阻状态
⑧级连缓冲器
多片8259A可级连使用,最多可以组成64级中断优先级控制,此时一片8259A作主片,另外1~8片作从片,主从片的CAS0~CAS2并接在一起,作为级连总线。
在中断响应过程中,主片的CAS0~CAS2为输出线,从片的CAS0~CAS2为输入线。
在第一个
负脉冲结束时,主片把被响应的中断请求的从片编码送入CAS0~CAS2级连总线。
从片接收后,将主片送来的编码与自己的编码相比较,若相同,表明从片被选中,则在第二个中断响应总线周期把中断类型码送至D7~D0,供CPU读取。
⒊中断优先级分析器(参考下图)
首先,由8个“与门”逻辑选出参加中断优先级排队的中断请求级,即8位IRR与8位IMR各位分别送入“与门”输入端,只有当IRR位置“1”(有中断请求)和:
IMR位置“0”(开放中断请求)同时成立时,相应“与门”输入位有效。
其次,优先级编码器从参加排队的那些中断优先级中选出当前最高优先级,作为下一步比较的一个输入(A2A1A0)
最后,把来自ISR的当前正在服务的优先级(B2B1B0)与当前请求的最高优先级(A2A1A0)一起送入比较器进行比较,当比较器A>B端输出有效时,并且只要当前存在非屏蔽的中断请求,“或门”输出有效时,8259A即向CPU提出中断请求INT。
三8259A的中断响应过程
⒈中断响应周期
⒉中断响应过程
①当中断请求线(IR0~IR7)上有一条或若干条变为高电平,则使IRR相应的位置1;
②当IRR的某一位或若干位被置1后,若IMR中相应的位为1,则屏蔽该中断请求,若IMR中相应位为0,则中断请求送PR;
③PR把接到的中断请求的最高优先级与ISR正中在服务的中断级比较,若前者级别高于后者,或CPU不在服务中,则置INT为高电平,否则INT低电平;
④CPU采样到INT为高后,响应中断进入连续的两个可屏蔽中断响应周期;
⑤8259A接到第一个
负脉冲后,将对应的ISR位置位,而相应的IRR被复位;
⑥8259A接到第二个
负脉冲后(第二个中断响应周期),在该脉冲期间,8259A向CPU发出中断类型码。
⑦若8259A处于AEOI(自动中断结束)方式,则第二个
负脉冲结束时,相应的ISR位被复位。
否则(工作在非自动中断结束方式)要等到CPU向8259A送内含中断结束(EOI)命令的OCW2后,相应的ISR位才被复位。
至此,CPU根据中断类型码,从中断矢量表中获取对应的中断服务程序入口地址进入中断服务。
第一个负脉冲到达时,8259A完成以下3个动作:
①使IRR的锁存功能失效。
这样,在IR7~IR0线上的中断请求信号就不予接收,直到第二个负脉冲到达时,才又使IRR的锁存功能有效。
②使当前中断服务寄存器ISR中的相应位置1,以便为中断优先级裁决器以后的工作提供判断依据。
③使IRR寄存器中相应位(即刚才设置的位)清0.
第二个负脉冲到达时,8259A完成下列动作:
①将中断类型寄存器中的内容ICW2送到数据总线的D7~D0,CPU将此作为中断类型码。
②如果ICW4(方式控制字)中的中断自动结束位为1,那么,在第二个
结束时,8259A会将第一个
脉冲到来时设置的当前中断服务寄存器ISR的相应位清0。
注意:
在自动结束中断方式下,当前ISR的置1位由第2个
脉冲后沿清除。
而在非自动结束中断方式下,ISR的置1位一直保持直到中断服务程序结束时,由CPU向8259A发出结束命令为止。
也就是说,对非自动中断结束方式,在中断服务程序中,中断返回之前,要由CPU向8259A发一个中断结束命令,以清除ISR中被置“1”的位。
四8259A的级联连接
⏹一个系统中,8259A可以级连,有一个主8259A,若干个(最多8个)从8259A
⏹级连时,主8259A的三条级连线CAS0~CAS2作为输出线,连至每个从8259A的CAS0~CAS2
⏹每个从8259A的中断请求信号INT,连至主8259A的一个中断请求输入端IR
⏹主8259A的INT线连至CPU的中断请求输入端
⏹
/
在非缓冲方式下,规定该8259A是主片(
=1)还是从片(
=0)
五8259A的初始化命令字和操作命令字
㈠初始化命令字
⏹初始化命令字ICW最多有4个
⏹8259A在开始工作前必须写入
⏹必须按照ICW1~ICW4顺序写入
⏹ICW1和ICW2是必须送的
⏹ICW3和ICW4由工作方式决定
⏹ICW1必须写入偶地址端口,其余必须写入奇地址端口。
⏹偶地址较低,奇地址较高
⒈芯片控制初始化命令字(ICW1)
触发方式,通过写ICW1的D3位来选择,ICW1的格式如下:
其中:
D4位为ICW1的特征位,必须为“1”。
D3位决定电平触发方式(LTIM):
D3=1,为电平触发;D3=0,为边沿触发。
D1位决定单片使用(SNGL):
D1=1,为单片使用;D1=0,为多片级联方式。
D0位决定是否需要初始命令字ICW4配合,(对8088/8086一般都需使用ICW4),D0=1,需要ICW4;D0=0,不需要ICW4。
其他位只对8位微机(8085)有效,故写0。
例如,若8259A采用电平触发,单片使用,需要ICW4,则程序段为:
MOV AL,1BH ;ICW1的内容
OUT 20H,AL ;写入ICW1端口(A0=0)
注意:
这里的例子是8088的例子。
⒉中断类型号的设定(ICW2)
8259A提供给CPU的中断类型号是一个8位代码,是通过初始化命令ICW2提供的。
只有高5位是在初始化编程时,通过命令字ICW2写入的,它的低3位是由中断请求线IRi的二进制编码(如IR4的编码为100)决定,并且是在第一个
到来时,将这个编码写入低3位的。
ICW2的格式如下:
例如,在PC系列中断系统中,硬盘中断类型号的高5位是08H,它的中断请求线连到8259A的IR5上,在向ICW2写入中断类型号时,只写中断类型号的高5位(08H),低3位可以取0:
MOV AL,08H ;ICW2的内容(中断类型号高5位)
OUT 21H,AL ;写入ICW2的端口(A。
=1)
当CPU响应硬盘中断请求时,8259A把IR5的编码101作为低3位构成一个完整的8位中断类型号0DH,经数据总线发送给CPU。
可见,外部硬中断中断源的中断号(8位代码)是由两部分构成的,即高5位(ICW2)+低3位(IRi的编码)。
注意:
这里的例子是8088的例子。
⒊级联方式的设定(ICW3主片/从片的初始化命令)
若主控输入端IRi上联接从控,则Si=1;否则,Si=0。
例如,假设主控的IR3和IR6的两个输入端分别联接了从控A与B。
故:
主控ICW3的值=01001000B=48H
MOV AL,48H ;ICW3(主)内容
OUT 21H,AL ;写入ICW3端口(A0=1)
3位从控标志码可有8种编码,表示从控的中断请求线INT被连到主控的哪一个输入端IRi。
例如,假设从控A和B的请求线INT分别联到主控的IR3和IR6,故:
从控A的ICW3的内容=00000011B=03H
从控B的ICW3的内容=00000110B=06H
MOV AL,03H ;ICW3(从片A)内容
OUT 21H,AL ;写入ICW3(从片A)端口(A0=1)
说明:
级联方式下从控制器中断申请及响应的过程
假定一个从控的IR输入端已接收到一个中断申请,并假设这个申请比起其他申请和比起这个从控内正在服务中的等级来具有最高级的优先权,那么这个从控的INT脚变为高电平,向主控制器提出中断申请。
主控接到这个申请后,要进行判优,如果这个申请与其他的申请及服务中的等级(可能来自其他从控制器)相比是最高优先等级,则主控制器的INT脚变为高电平,向CPU提出中断请求。
在CPU看来,级联的“中断响应序列”和不是级联的“中断响应序列”是一样的,然而对于8259A是不同的。
第一个
脉冲使所有的8259A得到通知:
中断申请已被允许。
与此同时,作为主控制器的8259A在CAS0~2总线上放上申请被响应的从控制器的ID码,通知让它在下一个中断响应序列
时,送出中断类型号到数据总线上,这样就完成了中断响应。
在中断响应时,主控器和从控器分别将对应的ISR位置位。
这也就意味着在中断完成后必须发出两个EOI命令(若不是自动EOI方式),一个给主控器,一个给从控器。
⒋特殊完全嵌套方式的设定(ICW4)
0
0
0
SFNM
BUF
M/
AEOI
μPM
D4:
D4=1,特殊完全嵌套方式,一般作为级联时主片的方式,工作在该方式时与工作在一般完全嵌套方式仅一点不同:
在中断处理过程中,对优先级相等的同级中断也给予响应,能实现同级中断嵌套;
D4=0,一般完全嵌套方式,一般作为级联时从片的方式,或单片使用时的方式;
D3:
D3=1,缓冲方式,是指8259A和DB之间需加一缓冲器(提高DB带负载能力),此时
/
作为输出线
,用以锁存或开启缓冲器;
D3=0,非缓冲方式,
/
作为主从片选择
。
D2:
D2=1,在D3=1时(缓冲方式),主片;
D2=0,在D3=1时(缓冲方式),从片。
在D3=0时,D2无意义。
D1:
D1=1,自动中断结束方式(AEOI);
D1=0:
非自动中断结束方式。
D0:
D0=1,8259A用于80X86CPU系统;
D0=0,8259A用于非80X86CPU系统。
㈡操作命令字
8259A有3个操作命令字,即OCW1~OCW3。
操作命令字是在应用程序内部设置的。
设置时,次序上没有严格的要求,但是,对端口地址有严格规定,即OCW1必须写入奇地址端口,OCW2和OCW3必须写入偶地址端口。
⒈中断屏蔽操作命令字(OCW1)
①正常屏蔽方式
8259A的IMR中断屏蔽寄存器,可以屏蔽一个或几个IR的中断请求,它加强了对中断的控制能力,此时本级中断优先级在ISR中的登录位ISi尚未清除,即使本级中断的IRi被屏蔽,优先权比它低的中断仍然得不到响应。
一个中断源提出中断申请时,虽然它被屏蔽(即相应的M位置1),但它的中断不一定被忽略,因此当它的屏蔽位复位时,并且,若它的IRR位未撤消,则会产生中断。
若在IMR复位之前撤掉IR申请,则中断就不会产生响应。
OCW1的格式如下
例如,要使中断源IR3开放,其余均被屏蔽,则OCW=11110111B
MOV AL,OF7H ;OCW1内容
OUT 21H,AL ;OCW1端口(A0=1)
IMR寄存器的内容,还可以读出,如BIOS中有一段检查中断屏蔽寄存器的程序:
MOV AL,00H ;置IMR为全"0"
OUT 21H,AL ;OCW1口地址
IN AL,21H ;读IMR
OR AL,AL ;检查是否为全"0"
JNZ D6 ;不为0,则出错
MOV AL,OFFH ;置IMR为全"1"
OUT 21H,AL ;OCW1口地址
IN AL,21H ;读IMR
ADD AL,1 ;检查是为全"1"
JNZ D6 ;不为全"1",出错
D6为出错处理(略)
②特定屏蔽方式
它用于开放低级中断,允许比正在服务中的中断级别低的中断请求。
特定屏蔽方式的操作见下面关于OCW3的介绍。
⒉中断优先级和中断结束方式操作命令字(OCW2)
其中:
D0~D2位:
L0~L2是用来指定中断等级(0~7)。
这指定的等级是为了对指定的ISR复位或指定设备的优先权。
它和D6位SL配合使用。
D5位:
EOI用于所有需要使用中断结束命令的情况。
若置1,则在中断服务完成之后需要发送中断结束命令。
若置0,则不需要发送中断结束命令(如中断自动结束)。
D6位:
SL用来设置需要指定的操作。
若SL置1,则需要指定,并且用L0~L2位来指定