由于作为中断源的外围设备在中断请求的产生、响应等诸方面差异很大,加上微型计算机系统对于整个中断系统管理上的灵活性要求,中断控制器对中断的管理必须非常灵活,这种灵活性要涉及中断的触发、屏蔽、嵌套、结束方式以及优先级判别和总线连接方式几个主要方面。作为一种典型的中断控制器,8259A支持多种不同的中断触发、屏蔽、嵌套、结束方式以及中断优先级判别和总线连接方式,以满足微机系统对中断控制器的灵活性需求。
1.中断触发方式
中断触发方式指的是触发中断的信号采用何种方式,主要包括电平触发和边沿触发两种中断触发方式两种,8259A支持这两种触发方式。对于8259A,电平触发要求输入的中断请求信号为高电平并保持到第一个中断响应信号结束之前,边沿触发是利用中断请求线由低到高的跳变来标识中断请求。在电平触发方式下,要求中断请求得到响应之后请求输入端必须及时撤除高电平,如果在CPU进入中断处理过程并且开放中断前未去掉高电平信号,则可能引起不应该发生的第二次中断。相比之下,边沿触发方式不需要考虑撤除信号的问题,使用起来要方便一些。X86微机系统中使用边沿触发方式。
2.优先级管理方式
优先级管理方式即中断管理器用以判断中断请求优先级的方式,中断管理器必须对中断请求的优先级给出明确的定义,以决定同时产生的多个中断请求中的哪一个能够得到响应。一般来讲,优先级的管理主要可以分为固定优先级和可变优先级两大类。
1)固定优先级
在固定优先级方式下,各中断源的优先级是预先设定而且固定不变的。固定优先级方式实现上比较简单,是一种最常被采用的管理方式。8259A支持固定优先级方式,在该方式下,中断源的优先级根据其连接关系决定,连接到IR0上的中断源具有最高的优先级,IR1次之,然后依次降低级别直到IR7。
虽然固定优先级简单易于实现,但是固定优先级对于不同的中断源是不公平的。高优先级的中断源总是能够得到更快的响应,低优先级的中断源总是排在高优先级中断源的后面。如果优先级排列不当,则有可能造成低优先级的中断请求总被高优先级的中断请求所覆盖而无法得到响应的现象。为此,中断控制器还要提供一种对各中断源更加公平的优先级管理方式,在这种方式中,各中断源的优先级不再固定而是根据其历史状态决定,在不同的时刻同一个中断源可能具有不同的中断优先级。
2)优先级自动循环
最常见的可变优先级管理方式就是优先级自动循环方式。在该方式下,刚刚被响应过的中断源具有最低的优先级,以保证各中断源之间的公平。8259A支持该管理方式。在该方式下,8259A各中断源的优先级被初始化为从IR0到IR7依次降低,在某个中断服务程序完成了一个中断源的服务工作后,该中断源的优先级自动降为最低,而原先比它低一级的中断源自动升为最高级。例如,IR4提出请求并得到响应后,自动降为最低优先级,IR5变为最高优先级,优先级从高向低依次为:IR5、IR6、IR7、IR0、IR1、IR2、IR3、IR4。优先级自动循环方式适用于系统中多个中断源的优先级难以分清的情况,使得各中断源的请求得到响应的机会均等。
3)优先级特殊循环
除了自动循环优先级之外,中断控制器还有可能提供一些更加灵活的可变优先级管理方式,以满足一些更加灵活和定制化的系统需求。比如8259A还提供一种被称作“优先级特殊循环方式”的优先级管理方式,该方式是通过OCW2指令字编程人为地指定某个中断源的优先级降为最低,其他中断源的级别也随之改变。
3.中断屏蔽方式
中断屏蔽,即通过软件命令字分别对不同的中断请求允许或禁止其参与优先级判别。一般来讲,中断的屏蔽是依靠一个中断屏蔽寄存器IMR来完成的,IMR和IRR、ISR具有相同的位宽,IMR中的每一个位对应于一个中断请求,该位为0或1决定了对应的中断请求是否被屏蔽。
除了通过IMR屏蔽中断请求之外,正在执行的中断服务也会造成对中断请求的屏蔽。在一个具有优先级i的中断请求正被服务时,中断服务寄存器ISR中该中断请求所对应的位ISRi将被置位,此时所有中断优先级低于i的中断请求都将被中断控制器所屏蔽。这意味着在优先级为i的中断请求正在被服务时,只有优先级高于i且未被中断屏蔽寄存器IMR显式屏蔽的中断请求才能够参加优先级判别从而被中断控制器所响应。这种中断屏蔽方式被称为“常规屏蔽方式”,也是基于X86微处理器的微机系统所使用的屏蔽方式。
在常规屏蔽方式中,如果某个中断请求正在被处理,该中断请求对应的ISRi位被置位,则低于该中断请求优先级的那些中断请求都将被屏蔽而不能进入优先级判别。如果在某些特殊情况下需要对低优先级的中断请求进行响应,一种很自然的想法就是在将IMRi位置位的同时将ISRi位复位,从而允许中断优先级低于i的中断请求。但是这时会出现中断服务程序依然在执行,中断请求IRi还在被处理,但是从外界看来ISRi被清零,即中断服务已经结束的问题。为了避免这种现象,中断控制器提供了特殊屏蔽方式。
在特殊屏蔽方式下,对某个中断屏蔽位IMRi的置位将同时允许其他未被IMR显式屏蔽的中断请求进入优先级判别,即使该中断请求的优先级低于当前ISR中记录的正在服务的中断请求,从而将中断请求屏蔽的控制权完全交给用户程序,允许通过软件设置的方式产生任何一种屏蔽组合。
4.中断嵌套方式
中断嵌套方式决定哪些优先级的中断可以被嵌套,也就是说,当一个优先级为i的中断正在被响应时,那些具有高于i、等于i和低于i优先级的中断请求是否应当被响应。根据我们前面的分析,很明显优先级高于i的中断请求是一定被响应的(即中断的嵌套),优先级低于i的中断请求有可能被屏蔽(常规屏蔽方式)或者被人工设置为可响应(特殊屏蔽方式而且IMRi位被置位),而对于优先级等于i的中断请求是否可以被响应则依赖于中断控制器的中断嵌套方式。对于8259A来讲,这两种不同的嵌套方式被命名为一般全嵌套方式和特殊全嵌套方式。(www.xing528.com)
1)一般全嵌套方式
一般全嵌套方式是中断控制器最常用和最基本的一种嵌套方式,如果对8259A初始化后没有用操作命令字设置为其他嵌套方式,则8259A就自动按一般全嵌套方式工作。在这种方式下,在为某中断服务期间禁止同级的中断请求,而较高级的中断请求仍可经INT端向CPU提出。也就是说,当ISRi位被置位时,优先级等于i和低于i的那些中断请求都会被屏蔽(除非使用特殊中断屏蔽方式显式置位IMRi而清除了ISRi),只有优先级高于i的中断请求可以被响应,从而实现中断的嵌套。
2)特殊全嵌套方式
特殊全嵌套方式与一般全嵌套方式的区别,是在为某中断服务期间不禁止同级的中断请求,即当ISRi位被置位时,优先级高于i和等于i的中断都可以被响应,只有优先级低于i的中断请求被屏蔽(除非使用特殊中断屏蔽方式显式置位IMRi而清除了ISRi)。这种方式所要解决的问题是,在多片级联的情况下,当某从片的中断得到响应、进入中断服务期间,来自该从片的更高级的中断请求仍能为主片所识别(对主片来说,同一从片的8个中断都是一个级别),并向CPU提出请求。所以,在级联的情况下,主片应设置为特殊全嵌套方式,从片则应当设置为一般全嵌套方式。
5.中断结束方式
当某一个中断请求被CPU响应后,该中断在ISR中的相应位被置位,表示CPU正在为该中断服务。该ISR位应当在中断服务结束、中断返回之前的适当时刻被复位,否则中断控制器就无法判断中断服务的结束,也就不能响应该中断源新的请求。这项复位ISR位的工作称为中断结束处理。
1)自动中断结束方式
为了防止没有经验的程序员忘记在中断服务程序中结束中断导致ISR位无法复位的问题,自动结束中断是一种比较好的选择。但是,对于中断控制器来讲,依靠什么信号来判断中断服务程序的结束并自动复位ISR位是一个比较难以解决的问题。8259A芯片是依靠中断响应信号作为复位ISR位以结束中断的触发条件的,当X86微处理器发出的第二个中断响应周期的INTA信号后沿时,中断控制器自动清除对应的ISR位。当然,为该中断服务的中断服务程序并不因此而受到影响。
自动中断结束方式存在一个比较严重的问题,在CPU响应一个中断,运行该中断的服务程序的时候,为了允许更高级别的中断,中断处理程序通常会使用STI指令开中断。而这时中断响应信号早已发送过,中断控制器中ISR对应位已经清除,当新的中断请求到来时,不管这个新的中断请求的优先级是否高于当前正在服务的中断请求,8259A都会向CPU发出INT信号。这就有可能引起低级别或同级别的中断源中断高级别中断服务程序的不合理现象,这种现象叫做“重复嵌套”。为了防止这种现象的产生,服务程序必须在关中断的状态下执行,这又引起高级别的中断也无法被响应的问题。正是因为自动中断结束方式有这些难以解决的问题,虽然8259A支持自动中断结束方式,但是在X86微机系统中并不使用自动中断结束方式来结束中断。
2)一般中断结束方式
仔细研究自动中断结束方式的中断结束过程,可以发现自动中断结束带来问题的根本原因在于ISR位过早地被清除而造成中断控制器无法指明当前是否有中断在被处理和哪个中断源引起的中断在被处理。因此,解决这个问题的途径在于找到清除ISR位的合适时机。在8259A的自动中断结束方式中,CPU第二个中断响应信号INTA的后沿是能够被作为中断结束标志的最后一个标志,而这个信号来临的时候中断服务程序还没有真正开始,而不是已经结束。换句话说,我们无法找到一个合适的信号提供正确的中断结束时机来使用自动中断结束方式,这个用来结束中断的信号只能由中断服务程序来提供(一般在中断服务处理即将完成而使用IRET中断返回之前)。
在自动中断结束方式中,中断控制器在第二个中断响应周期的INTA信号时是可以判断出当前正在被处理的是来自哪个设备的中断请求的(要知道,这时中断控制器还在向CPU发送中断类型码),那么中断控制器自然知道哪个ISR位应当被清除。而在非自动中断结束方式下,中断结束的命令可能在中断服务过程的任何时刻发出,那么如何确定哪个ISR位应当被清除呢?
一种可行的办法是自动找到当前正在被服务的中断请求所对应的ISR位,这就要求中断控制器能够有办法找到哪个中断请求正在被服务。在一般全嵌套方式中,具有最高优先级的中断请求一定是正在被服务、而且应当被结束的中断请求,那么将其对应的ISR位清零即可完成中断结束的工作。这种中断结束的方式被称作一般中断结束方式。
在一般中断结束方式中,中断服务程序在使用IRET指令返回之前发出中断结束命令,将具有最高优先级的中断请求对应的ISR位清除,从而结束当前正在处理的中断。这种处理方式适合于一般全嵌套方式,而在特殊全嵌套方式下就不再适用了。在多片级联的中断控制器中,主片工作在特殊全嵌套方式下,当来自从片的高优先级中断请求中断了一个正在被服务的来自同一个从片的低优先级请求,从而形成中断嵌套的时候,主片中ISRi位同时代表了两个中断请求正在被服务。这时,如果主片使用一般中断结束方式来结束中断,由中断控制器自动寻找要被清除的ISRi位,则主片的ISRi位被清除,而此时另一个中断请求的服务尚未结束,这就带来了状态表示上的错误。解决此问题的方法是在从片的某中断服务结束时用软件检查被服务的中断是否为该从片唯一的中断。为此,先向从片发一个一般的中断结束命令,清除已完成服务的ISR中优先级最高的位,然后再读出ISR的内容,检查它是否为0,如果为0,则向主片发一个中断结束命令,清除主片ISR中与该从片相对应的位。如果从片的ISR的内容不为0,则不向主片发中断结束命令,该中断返回后,CPU继续为该从片被打断的中断服务。
3)特殊中断结束方式
除了一般中断结束方式之外,中断控制器还提供了一种被称作特殊中断结束方式的中断结束方式。该方式要求中断服务程序在IRET指令之前通过OCW2指令字发出一条特殊中断结束命令,并在这个命令中指出要清除哪个ISR位。特殊中断结束方式可理解成人为地将ISR中某一位复位。而一般中断结束方式要复位的ISR位是8259A自动寻找的。
6.总线连接方式
由于中断控制器必须将中断类型码发送给CPU,而且需要接收CPU发来的各种控制命令并向CPU发送其状态信息,所以中断控制器必须与系统中的数据总线连接,这种连接的方式也可以有很多种。对于8259A而言,其数据线引脚允许与系统数据总线直接相连,但有时有一片或多片8259A希望有自己的局部数据总线,这时需要在8259A的数据线与系统数据总线之间加一个缓冲器。在8259A数据引脚和系统数据总线之间有缓冲器分隔时,称8259A工作在缓冲方式下,这时/为输出信号,用作允许缓冲器接收和发送的控制信号(EN)。当不处于缓冲方式时,/为输入信号,用来指明该8259A是主片(SP=1)还是从片(SP=0)。8259A是否工作在缓冲方式由其初始化命令字决定,在基于X86微处理器的微机系统中,8259A工作在非缓冲方式。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。