📄 chapter8.htm
字号:
</blockquote>
<p align="left"> </p>
<h2 align="center"><font face="宋体" color="#FFFFFF" size="6">§8.2
中断操作时序</font></h2>
<p align="center"> </p>
<h3 align="left"><font face="宋体" size="5" color="#FFFFFF">一、硬件中断</font></h3>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">
硬件中断分为可屏蔽中断和不可屏蔽中断。若系统中同时有多个可屏蔽中断产生,此时,必须要求有中断优先级控制手段来决定允许哪一个中断请求信号进入CPU。</font></p>
<h3 align="left"><font face="宋体" size="5" color="#FFFFFF">1、中断优先级控制方法</font></h3>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">1)软件查询方法</font></p>
</blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">
利用软件程序对硬件电路逐个进行查询,中断优先级决定于软件查询程序中设定的顺序。</font></p>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">2)简单硬件电路方法---菊花链电路</font></p>
</blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF"> <span
style="text-decoration: overline">INTA</span>信号只能发送到发出中断请求信号的接口,当接口收到<span
style="text-decoration: overline">INTA</span>信号后,才撤消中断请求信号。中断优先级取决于与CPU的靠近程度,越靠近CPU的接口,其优先级就越高。</font></p>
</blockquote>
<p align="center"><img src="juhual.gif" width="640" height="350"
alt="juhual.gif (8324 bytes)"></p>
<blockquote>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">3)专用硬件电路---可编程中断控制器8259。</font></p>
</blockquote>
</blockquote>
<blockquote>
<h4 align="left"><font face="宋体" size="5" color="#FFFFFF">2、可屏蔽中断的响应过程</font></h4>
</blockquote>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF"> 当CPU在INTR引脚上接收到一个高电平的中断请求信号,并且当前的中断允许标志IF=1,CPU就会在当前指令执行完后,开始响应外部的中断请求。CPU会在当前总线周期和下一个总线周期中,从<span
style="text-decoration: overline">INTA</span>引脚上往外设端口发送两个负脉冲(每个总线周期一个),这两个负脉冲都从T<sub>2</sub>一直维持到T4的开始。外设接口收到第二个负脉冲后,立即将中断类型码送到数据总线的低8位D<sub>7</sub>~D<sub>0</sub>上,通过AD<sub>7</sub>~AD<sub>0</sub>传输给CPU。在这两个总线周期的其余时间,AD<sub>7</sub>~AD<sub>0</sub>都是浮空的。</font></p>
</blockquote>
<p align="center"><img src="zhdxy.gif" width="622" height="282"
alt="zhdxy.gif (5512 bytes)"></p>
<blockquote>
<p align="left"> </p>
<p align="left"><img src="../main/ii1.gif" alt="ii1.gif (154 bytes)" width="34"
height="34"><font face="宋体" size="5" color="#FFFFFF">说明:</font></p>
</blockquote>
<blockquote>
<blockquote>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">a、INTR信号必须是一个至少维持2个时钟周期的高电平信号;</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">b、8086工作在最小模式时,中断响应信号由<span
style="text-decoration: overline">INTA</span>引脚发出,若工作在最大模式,信号<span
style="text-decoration: overline">S</span><sub>2</sub>=<span
style="text-decoration: overline">S</span><sub>1</sub>=<span
style="text-decoration: overline">S</span><sub>0</sub>=0,由总线控制器组合后送出中断响应信号;</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">c、当同时出现总线保持和中断请求时,CPU先对总线保持请求响应;</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">d、中断响应的第一个总线周期用来通知发送中断请求的设备准备好中断类型码。中断响应的第二个总线周期中,CPU接收外设发送来的中断类型码;</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">e、中断类型码只能通过数据总线的低8位进入CPU;</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">f、ALE在每个总线周期的T1状态输出高电平,用来锁存地址信息;</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">g、在8086中,在两个总线周期之间要插入3个或2个空闲周期T<sub>I</sub>。8088中不插入空闲周期。</font></p>
</blockquote>
</blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">CPU响应中断而进入中断处理子程序的过程如下:</font></p>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">1)从数据总线上读取中断类型码,将其存入内部暂存器;</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">2)将标志寄存器的值压栈;</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">3)将IF和TF清零。避免在当前的中断响应过程被另一个中断请求所打断,避免以单步方式执行中断处理子程序;</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">4)保存断点;</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">5)根据中断类型码,在中断向量表中得到中断向量,由此转到相应的中断处理子程序。</font></p>
</blockquote>
<h4 align="left"><font face="宋体" size="5" color="#FFFFFF">3、非/不可屏蔽中断</font></h4>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">
实际系统中,常将系统掉电处理设置为非/不可屏蔽中断。不可屏蔽中断的处理过程与可屏蔽中断的处理过程很相似,不同之处在于:</font></p>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">1)NMI信号为一个上升沿触发信号,并且要求在上升沿之后,维持两个时钟周期的高电平。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">2)NMI不受IF的控制。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">3)NMI的中断类型码为2,不需要从外部总线上读取中断类型码,中断向量表地址固定为0:0008~000BH。</font></p>
</blockquote>
</blockquote>
<h3 align="left"><font face="宋体" size="5" color="#FFFFFF">二、软件中断</font></h3>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">软件中断的特点如下:</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">1)利用中断指令(INT
n)进入中断处理子程序,中断类型码由指令提供;</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">2)进入中断时,不需要执行中断响应总线周期,也不需要从外部总线上读取中断类型码;</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">3)不受中断标志IF的影响;</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">4)正在执行软件中断时,若有外部硬件的非屏蔽中断请求,则执行完当前指令后,立即响应该非屏蔽中断请求。若有外部硬件的可屏蔽中断请求,若中断处理子程序中执行了开中断指令STI,则执行完当前指令后,响应该可屏蔽中断请求。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">5)软件中断没有随机性,而硬件中断是随机产生的。</font></p>
</blockquote>
<p align="left"> </p>
<h2 align="center"><font face="宋体" color="#FFFFFF" size="6">§8.3
可编程中断控制器8259A</font></h2>
<p align="left"> </p>
<h3 align="left"><font face="宋体" size="5" color="#FFFFFF">一、8259A的引脚信号</font></h3>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF"> 8259A是专用的可编程中断控制器,一片8259A可以管理8级中断,为DIP28封装。</font></p>
</blockquote>
<p align="center"><img src="8259a.gif" width="358" height="374"
alt="8259a.gif (4918 bytes)"></p>
<blockquote>
<p align="left"><big><big>8259A的14引脚为GND,28引脚为VCC。</big></big></p>
<p align="left"><big><big>D<sub>7</sub></big></big><font face="宋体" size="5"
color="#FFFFFF">~D<sub>0</sub>---数据总线信号。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">INT---中断请求信号,与CPU的INTR引脚相连。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF"><span
style="text-decoration: overline">INTA</span>---用来接收CPU的中断应答信号,为连续两个总线周期中的两个负脉冲。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF"><span
style="text-decoration: overline">RD</span>---读信号,用来读取8259A的内部寄存器的值。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF"><span
style="text-decoration: overline">WR</span>---写信号,用来对8259A写入控制字。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF"><span
style="text-decoration: overline">CS</span>---片选信号。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">A<sub>0</sub>---端口地址选择信号。8259A对应两个端口地址,其中,较低的地址为偶地址(A<sub>0</sub>=0),较高的地址为奇地址(A<sub>0</sub>=1)。与8255A和8253相似,若8259A于8086CPU直接相连,则将系统地址总线的A<sub>1</sub>接8259A的A<sub>0</sub>,以便保证从CPU一端观看时,8259A的地址为连续的两个偶地址。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">IR<sub>7</sub>~IR<sub>0</sub>---中断源输入信号,用来从I/O设备中接收中断请求。在8259A的级连方式中,主片的该类引脚连接从片的INT信号。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">CAS<sub>2</sub>~CAS<sub>0</sub>---从片选择信号,用来指出哪一个IRn上相连有从片。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF"><span
style="text-decoration: overline">SP</span>/<span style="text-decoration: overline">EN</span>---该引脚为一个双向引脚。作为输入时,决定本片8259A是主片还是从片,<span
style="text-decoration: overline">SP</span>/<span style="text-decoration: overline">EN</span>=1,则为主片,<span
style="text-decoration: overline">SP</span>/<span style="text-decoration: overline">EN</span>=0,则为从片。若为输出,该引脚作为数据总线缓冲器的启动信号。当8259A工作在缓冲方式时,该引脚为输出,当8259A工作在非缓冲方式时,该引脚为输入。</font></p>
</blockquote>
<h3 align="left"><font face="宋体" size="5" color="#FFFFFF">二、8259A的内部结构和工作原理</font></h3>
<p align="center"><img src="8259nbjg.gif" width="500" height="520"
alt="8259nbjg.gif (12599 bytes)"></p>
<blockquote>
<h4 align="left"><font face="宋体" size="5" color="#FFFFFF">1、编程结构</font></h4>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">1)内部寄存器</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF"> 8259A包括有7个内部寄存器,其中4个称为初始化命令字ICW<sub>1</sub>~ICW<sub>4</sub>,3个称为操作命令字OCW<sub>1</sub>~OCW<sub>3</sub>。初始化命令字一般在系统启动时的初始化程序中设定,在系统工作过程中一般不再修改。操作命令字由应用程序设定,用来对中断处理过程做动态控制,可以根据系统运行过程中的具体情况而进行多次修改。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">2)处理部件</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">
包括有中断请求寄存器IRR(Interrupt Request Register)、中断优先级裁决器(Priority
Resolver)和当前中断服务寄存器ISR(In Service Register),该部分用来接收和处理从引脚IR<sub>7</sub>~IR<sub>0</sub>进入的中断请求信号。</font></p>
<h4 align="left"><font face="宋体" size="5" color="#FFFFFF">2、产生INT信号的工作过程</font></h4>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">1)8位的中断请求寄存器IRR对应接收IR<sub>7</sub>~IR<sub>0</sub>上的中断请求信号,将具有中断请求引脚IR<sub>n</sub>的对应IRR位锁存置1。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">2)若中断屏蔽寄存器IMR(OCW<sub>1</sub>)中的对应位为1,则禁止该中断请求信号通过;若中断屏蔽寄存器IMR(OCW<sub>1</sub>)中的对应位为0,则允许该中断请求信号通过而进入中断优先级裁决器。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">3)中断优先级裁决器将新进入的中断请求与当前正在处理的中断(ISR存放正在处理的中断请求)进行比较,若判断出新进入的中断请求具有足够高的优先级,中断优先级裁决器会通过相应的逻辑电路使8259A的INT输出引脚为1,从而向CPU发出一个中断请求。</font></p>
<h4 align="left"><font face="宋体" size="5" color="#FFFFFF">3、响应INTA信号的过程</font></h4>
<p align="left"><font face="宋体" size="5" color="#FFFFFF"> 如果CPU的IF=1,CPU在执行完当前的指令后,就会响应从INTR引脚进入的中断,CPU从<span
style="text-decoration: overline">INTA</span>引脚上往8259A回送两个负脉冲。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">
第一个负脉冲到达时,8259A执行如下操作:</font></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -