微机原理ch08中断和8259芯片
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8中断和8259芯片
8.1概述
中断是一个过程,这个过程一般由微处理器外部或内部硬件引起的。
CPU在执行程序的过程中被内部或外部事件所打断,CPU暂时中止现行程序的执行,转而去执行预先安排好的程序,即中断数服务程序(ISR),待处理完毕后又回到原先的断点继续执行原来的程序。
中断请求的实现要由软件来实现,编写软件需要了解硬件是如何工作的。
在计算机系统中,凡是能引起中断的事件被称为中断源,即中断的来源。
通常中断源有以下几种:
一般的I/O设备,如打印机
数据通道中断源,如磁盘
实时时钟
故障源,如电源故障,存储出错
软件中断
为了满足各种情况的要求,中断系统应具备以下的功能:
实现中断响应、中断服务及返回
实现中断优先权排队
实用文档
实现中断嵌套
中断一般是随机发生的,因而中断涉及的基本问题很多,如:
CPU何时检测中断请求信号
CPU如何响应中断请求
CPU如何识别中断源
CPU如何转去执行中断服务程序,如何从中断服务程序返回
如何实现中断优先排队,如何处理多重中断
如何管理中断
中断优先权(priority)是指系统设计者事先根据事件的轻重缓急,给每个中断源确定的优先服务的级别。
系统根据中断优先权的高低确定优先为哪个中断服务。
8.1.1中断源的识别
中断源的识别可以通过向量中断或中断查询等方法来实现。
8.1.1.1中断查询
或称查询中断
查询中断和查询传送方式是有本质区别的:
查询传送方式需要CPU花费很多时间不断地循环询问接口电路,以等待设备的就实用文档
序信号。
查询中断是一种由中断启动而不是由微处理器启动的查询方法。
中断源A
中断源B
…
中断源H
查询方法的接口电路
实用文档
8.1.1.2向量中断
Vectored Interrupt
该方法对中断源的识别最快。
CPU响应中断时,通过中断响应信号选通中断接口,中断接口将中断向量号送至数据总线,CPU根据中断向量号获知中断服务程序的入口地址。
8.1.2中断优先级排队
硬件优先级排队
实用文档
8.1.2.1菊花链优先级排队
实用文档
8.1.2.2优先级编码电路
中断请求0
中断请求1
…
中断请求7 INTR
D3~D0
由8:3优先级编码器、优先级寄存器、3位数字比较器组成的一种中断优先级排队电路。
(编码器、译码器、比较器参见数字电路的组合逻辑)
优先级寄存器的内容可以由用户设定,其中一位为禁止位,优先级寄存器保留着正在进行的中断服务的编码。
设:优先级最低的线通过编码器后的编码为000B,最高的线编码为111B
如果CPU当前正在进行一个中断服务,则优先级寄存器输出低电平,寄存器保留着正在服务的中断编码。
如果CPU当前没有进行一个中断服务,则优先级寄存器输出高电平。
8.1.2.3采用专用的中断优先级管理芯片
采用专门的可编程芯片来完成中断优先级的管理,如Intel 8259A。
实用文档
实用文档
地址总线
中断类型寄存器CPU
INTR
INTA 控制总线当前中断服务寄存器
中断请求锁存器
优先级管理逻辑
中断屏蔽寄存器
地址/数据总线
控制总线
数据总线总线控制逻辑
IR0IR1
IR7
…
8.1.3 中断嵌套
中断嵌套是指在中断过程中,CPU 又收到优先级更高的中断请求,若条件满足CPU 将暂停当前的中断服务,转去为更高优先级的中断服务,待返回后再继续执行被打断的中断服务程序,形成嵌套的中断。
硬件中断优先级排队方案在软件的配合下都可以方便地实现中断嵌套。
软件查询中断优先级排队方法只要编写相应的处理程序段也可以实现中断嵌套,但程序相对复杂、费时,一般不采用。
8.1.4 中断处理
CPU 响应了中断就转入中断服务程序中,在ISR 中要做如下工作: 保护现场
CPU响应中断时自动保护了CS、IP和Flag寄存器,在中断服务程序中会用到
另一些寄存器,为了保证中断返回后主程序正确继续执行,必须把这些寄存器
压入堆栈保护起来,称为保护现场。
如允许中断被嵌套需打开中断
CPU在响应中断时已自动关闭中断(IF=0)不允许其他的中断来打断他。
如果
允许比他优先级更高的中断来打断,则需要用STI指令打开中断。
中断服务
这是ISR的核心,即完成外部设备要求CPU完成的工作。
恢复现场
在中断返回前要把保护现场压入堆栈的寄存器的内容恢复为先前的值。
需要注
意的是出栈的顺序与入栈的顺序相反。
中断返回
中断服务程序的最后一条指令是IRET。
执行IRET指令,CPU自动从堆栈中弹
出Flag、IP和CS,返回主程序继续执行。
8.28088/86中断系统
Intel 8088/86具有一个简单而灵活的中断系统,采用向量中断机制,能处理256个中断,用中断向量号0~255来区别,可用软件也可用硬件来启动中断。
中断源可来自内部,也可来自外围芯片。
实用文档
8.2.1中断类型
8.2.1.1内部中断
内部中断是通过软件调用的非屏蔽中断,是CPU根据软件中的某条指令或者软件对标志寄存器中某些标志的设置而产生的。
8.2.1.1.1除法错中断
在执行除法指令时,若除数为0或商超过寄存器所能表示的范围,则立即产生一个向量号为0的内部中断,称为除法错中断。
8.2.1.1.2溢出中断
若上一条会使溢出标志(OF)置1,那么执行INTO指令时立即产生一个向量号为4的中断。
若溢出标志(OF)为0,则INTO指令不起作用。
8.2.1.1.3单步中断
若单步标志(TF)为1,则在每条指令执行结束后,CPU自动产生一个向量号为1实用文档
的中断,使程序单步执行,为用户提供调试手段。
8088/86的指令系统中并没有一条设置TF的指令,那么,如何设置TF呢?
8.2.1.1.4指令中断
实用文档
((SP)+1):(SP))←(IP)
(IP)←(n x 4)
8.2.1.2外部中断
通过外部的硬件产生的中断,也称硬件中断。
8.2.1.2.1非屏蔽中断
通过CPU的NMI(Non-Maskable Interrupt)引脚向CPU提出的中断请求。
CPU 在当前指令执行结束后予以响应,其中断号为2。
主要用于处理系统的意外或故障,如:
电源掉电
存储器读写错误
协处理器异常
…
非屏蔽中断不受IF的屏蔽,整个系统中只能有一个该种中断。
8.2.1.2.2可屏蔽中断
通过CPU的INTR引脚向CPU提出的中断请求。
当IF为1时,在当前指令结束后CPU予以响应,同时输出可屏蔽中断响应信号-INTA。
若IF为0,则可屏蔽中断被禁止,称之为关中断。
实用文档
要使CPU处于开中断的状态,需要使用开中断指令:STI,使IF=1。
要使CPU处于关中断的状态,需要使用关中断指令:CLI,使IF=0。
关中断的情况有:
系统复位后
任何一个中断(内部的或外部的)被响应后
执行关中断指令STI后
8.2.2中断向量和中断向量表
Interrupt Vector, Interrupt Vector Table
中断向量是中断服务程序的入口地址,该地址是一个逻辑地址,含有段地址CS和偏移地址IP,是一个32位远指针。
中断向量表是一种表数据结构,是中断服务程序入口地址表,占用内存00000H~003FFH的1K空间。
这个表中共有256个表项,对应于向量号0~255,每个表项为两个字,其中高字为CS,低字为IP。
实用文档
实用文档
} INT FF
} INT 31
} INT 05
} INT 04 signed number overflow } INT 03 breakpoint } INT 02 NMI } INT 01 single-step } INT 00 divide error
} INT 32
Intel 公司规定: 0~4是专用中断。
5~31为将来扩展或特殊用途而保留。
32~255是用户可以使用的中断向量。
在PC 机中,ROM-BIOS 设置部分中断向量,DOS 启动后也建立一些中断向量。
实用文档
8.2.3 中断响应过程
结束当前指令执行下一条指令
内部中断非屏蔽中断可屏蔽中断TF=1IF=1
读中断向量号
标志寄存器入栈执行中断服务程序令TEMP=TF,IF=TF=0
CS ,IP 入栈进入中断服务程序
又有NMI
TEMP=1
CS ,IP 出栈标志寄存器出栈返回被中断的程序
N N N N N
N N
Y
Y
Y
Y
Y
Y
Y 除法错(0),INTO(4),INT n
向量号2单步中断(1)
12
3456
CPU 在执行程序过程中,如果出现:
内部中断,或
外部中断,即中断请求信号有效
8088/86按图中的左半部分顺序查询,并获得中断向量号,中断的优先级:
内部中断(软件中断) 非屏蔽中断 可屏蔽中断
单步中断
获取中断向量号的处理过程:
1)将标志寄存器压入堆栈,以保护各个标志位
2)使IF和TF为0,禁止可屏蔽中断和单步中断
3)IF=0,是为了能够在中断响应过程中暂时屏蔽外部其他中断,以免还没有完成
当前的中断响应过程而又被另一个中断请求打断。
4)TF=0,是为了避免CPU以单步方式执行中断处理程序。
5)将断点保护在堆栈中
6)断点是指在响应中断时,主程序中当前指令下面的一条指令的地址,即CS和
IP中的值。
7)从中断向量号n乘以4的内存地址中取中断向量送CS:IP
8)(n×4) (n×4+1)→IP,(n×4+2) (n×4+3)→CS
9)控制转移到CS:IP指示的中断服务程序入口地址,执行处理程序。
10)中断服务程序最后的一条指令是IRET,该指令将标志寄存器和断点地址出栈恢
复为中断前的值,于是控制又回到断点处继续执行。
IRET 中断返回指令
格式:IRET
操作:(IP)←((SP)+1):(SP))
实用文档
实用文档
8.2.4 中断响应时序
指令的最后时钟周期
2~3个空闲周期
8.3中断控制器Intel 8259A
Intel 8259A是一种可编程中断控制器,是为管理8080/8085和8088/86微处理器的可屏蔽中断而设计的,也可以用于80286。
一片8259A可以管理8级中断,通过多片级联可以扩展至64级,每一级中断都可以单独被屏蔽或允许。
8259A在中断响应周期可提供相应的中断向量号。
实用文档
8.3.18259A内部结构和引脚
INTA
Pin description
实用文档
实用文档
SP EN
/ Host processor
Interface D0 ~ D7
RD WR CS A0INT INTA
Cascade Interface
CAS0 ~ CAS2
IR0IR1IR2IR3IR4IR5IR6IR7
+Vcc
GND
Block diagram
8.3.2
8259A 的中断过程
1) 8259A 的一条或几条IR i 信号有效(高电平),表示请求中断,使IRR 的相应位
D i 置位。
2) 8259A 对这些请求进行分析,如果中断允许则向CPU 发出INT 信号。
3) CPU 在允许可屏蔽中断时对INTR 作出响应,产生中断响应周期。
4) 8259A 收到第一个-INTA 有效信号后,使最高优先级的ISR 位置位,对应的IRR
位复位。
5) 8259A 收到第二个-INTA 有效信号时,把中断向量号送上数据总线,供CPU
读取。
6) CPU 利用中断向量号转至中断服务程序,直到IRET 指令返回。
实用文档
8.3.3 8259A 的工作方式
全嵌套方式特殊嵌套方式自动循环方式特殊循环方式
优先级循环方式
优先级固定方式
设置优先级方式
结束中断处理方式
自动中断结束方式
非自动中断结束方式
普通中断结束方式特殊中断结束方式
屏蔽中断源方式
普通屏蔽方式特殊屏蔽方式中断触发方式
边缘触发方式电平触发方式数据线连接方式
缓冲方式非缓冲方式
8259A 工作方式
8.3.4
8259A 的编程
编程分为:
初始化编程 中断操作编程
8259A 能够开始工作之前必须进行初始化编程,即给8259A 写入初始化命令字(Initialization Command Word, ICW )。
在8259A 工作期间,可以通过写入操作命令字(Operation Command Word, OCW )将选定的操作传送给8259A ,使之按照新的要求工作。
同时,还可以读取8259A 的信息,以便了解其工作状态。
实用文档
8.3.4.1 初始化命令字ICW
ICW 共有4个,是8259A 在开始工作前必须写入的,且必须按照ICW1~ICW4的顺序写入,设置的流程如下:
A0D7D6D5D4D3D2D1D0
ICW1
ICW2
ICW3
ICW4
8.3.4.1.1 ICW1初始化命令字
A0D7D6D5D4D3D2D1
D0
ICW1
实用文档
8.3.4.1.2 ICW2中断向量命令字
A0D7D6D5D4D3D2D1D0ICW2
8.3.4.1.3 ICW3级连命令字
A0D7D6D5D4D3D2D1D0ICW3 (Master Device)
A0D7D6D5D4D3D2D1D0ICW3 (Slave Device)
8.3.4.1.4 ICW4中断方式命令字
A0D7D6D5D4
D3
D2D1
D0
ICW4
实用文档
8.3.4.2 操作命令字OCW
8259A 工作期间可以随时接受操作命令字,OCW 共有3个:OCW1,OCW2,OCW3,写入时没有顺序要求。
8.3.4.2.1
OCW1屏蔽命令字
OCW1
8.3.4.2.2 OCW2中断结束优先级循环命令字
A0D7D6D5D4D3D2D1D0OCW2
8.3.4.2.3 OCW3屏蔽和读状态命令字
实用文档
OCW3
8.3.5 8259A 在IBM PC 系列机上的应用
8.3.5.1 IBM PC/XT 的硬件中断
Timer channel 0
of the 8253keyboard
available
com2
com1printer lpt2floppy disk
parallel printer lpt1
IRQ2 to IRQ7available through expansion slot
A5
A6
A7
A8
A9
AEN
实用文档
8.3.5.2IBM PC/AT的硬件中断
IRQ8
IRQ9
IRQ10
IRQ11
IRQ12
IRQ13
IRQ14
实用文档
实用文档
IBM PC/AT机使用两个8259A形成级连系统,在ROM-BIOS对它们的进行初始化。
1)利用上升沿做为中断请求IRQ的有效信号。
2)IRQ0~IRQ7的中断向量号为08H~0FH,IRQ8~IRQ15的中断向量号为
70H~77H。
3)采用普通全嵌套优先级方式,顺序从高到低:IRQ0~IRQ2,IRQ8~IRQ15,
IRQ3~IRQ7且不能改变。
实用文档
实用文档
4)采用普通中断结束方式,需要在中断服务程序中发送普通EOI命令。
5)采用普通屏蔽方式,通过写入IMR允许中断,但注意不要破坏原屏蔽状态,如
允许IRQ0(日时钟中断),IRQ1(键盘中断)
实用文档
8.4中断服务程序
8.4.1内部中断服务程序
主程序(用户的应用程序)通过中断指令INT n执行内部中断服务程序。
编写内部中断服务程序与编写子程序类似,都是用伪指令proc/endp。
不同的是:进入中断服务程序后,通常要执行指令STI开放可屏蔽中断,最后执行IRET指令返回调用程序。
内部中断服务程序通常采用寄存器传递参数。
主程序在调用内部中断服务程序之前,必须修改中断向量,使其指向相应的中断服务程序,可以利用DOS功能调用21H的功能25H来实现:
主程序在结束之前要将修改的中断向量恢复回来,可以利用DOS功能调用21H的功能35H来实现:
实用文档
例:
编写80H号中断服务程序,显示以0结尾的字符串,字符缓冲区首地址为该中断服务程序的入口地址,利用DS:DX来传送。
主程序首先获取80H原中断向量并保存之,然后设置新的中断向量,之后主程序就可以调用80H中断服务程序了。
主程序最后应恢复原中断,达到返回到DOS后而不改变系统状态的目的。
实用文档
实用文档
lp2: pop si ;恢复现场
pop bx
pop ax
iret ;中断结束
new80h endp
8.4.2外部中断服务程序
外部中断服务程序用于实现系统与外设交换信息。
编写外部中断服务程序具有一定的特殊性,较编写内部中断服务程序复杂。
编写外部中断服务程序需要注意的问题:
发送中断结束命令
8259A采用普通中断结束方式,需要发送EOI命令
一般只能存储器单元传送数据
中断是随机发生的,除CS、IP外,其他寄存器是不可预知的。
不要使用DOS功能调用
DOS内核规定DOS功能调用是不可重入的。
最好使用ROM-BIOS调用,或
直接对I/O接口编程。
中断服务程序尽量短小,保证实时性。
主程序方面
实用文档
需要修改中断向量
控制CPU的IF标志
设置8259A的IMR
例:
8259A的IRQ0(中断向量号为08H)来自于定时计数器8253,每隔55ms产生一次,实现日时钟计时。
本程序用新的08H号中断服务程序暂时代替计时程序,使得每次中断显示一串信息,显示10次后,恢复原中断服务程序,返回DOS。
;数据段
intmsg db ’A 8259A Interrupt!’, 0dh, 0ah, 0
counter db 0 ;中断次数记录单元
;-------------------------------------------
;代码段
mov ax, 3508h ;获取原中断向量
int 21h
push es ;利用堆栈保存原中断向量
push bx
cli ;关中断
push ds
实用文档
实用文档
实用文档
实用文档
实用文档。