MCS-51系统中断优先级的软扩展
;定义绝对段,设置断向量
JMP T0_ISR_SHELL
?PR?TO_ISR_SHELL?XX SEGMENT CODE ;声明再定位段
T0_ISR_SHELL:
PUSH IE ;保存IE
MOV IE,#TO_INT_MASK
;设置当前中断屏蔽字
CALL ResetIntSys:复位中断系统
CALL T0_ISR:调用中断服务例程的主体
POP IE ;恢复IE
RET
这里,T0_ISR为定时器0(T0)的ISR的主体部分。其应以一般函数的形式,用汇编或C编写。ResetIntSys为仅含一条中断返回指令(IRET)的函数,即ResetIntSys:RETI。其用于复位中断系统,以使在相应ISR执行过程中,系统仍可响应其它中端源提出的中断请求,以便实现中断嵌套。这样就达到了防止同级和低级优先级中断的目的。(凹丫丫范文网fanwen.oyaya.net收集整理)
高优先级的中断源可以提出中断请求,但未必会被立即响应。因为在当前策略下,尚不能实现真正的“中断嵌套”(即高优先级的中断服务例程可中断低优先级的中断服务例程而嵌套执行),而仅有最高优先级的中断(X1)才可以实现这种真正的“中断嵌套”。因为在8051系统里,中断能否嵌套仅取决于其相应的“物理中断优先级”(各中断源的物理中断优先级由中断优先级寄存器IP中的相应位决定,且仅有二级)。下面分三种情况说明方法一的特点和不足:
①当外部中断1(X1,其具有最高的逻辑中断优先级和最高的物理中断优先级)提出中断请求时,系统将立即响应,而不管系统此时忙否。如果此时 系统正在执行其它中断的ISR,X1的ISR将以嵌套形式执行,因为其它中断湖泊的物理中断优先级都为最低(51系统仅有两级物理优先级:最高或最低)。
②当定时器0(T0,其优先级为2)的中断请求正被响应时,来自串口(S,其优先级为3)和外部中断0(X0,其优先级为4)的中断请求将被禁止;而只允许外部中断1(X1,其优先级为0)和定时器1(T1,其优先级为1)提出中断请求。如果是X1提出中断请求,则X1的ISR将立即嵌套执行;如果是T1提出,尽管其优先级高于当前中断T0,但因其物理中断优先级与T0一样(同为最低),故而将不会像X1那样被系统立即响应,并嵌套执行,而只能等待,直到T0的中断服务例程执行完毕。
③如果在串口(S,其优先级为3)中断正被响应过程中,定时器1(T1,其优先级为1)与定时器0(T0,其优先级为2)分别提出中断请求。由于它们有高于S的优先级,所以系统允许它们提出中断请求;但因其物理优先级与S一样,故而直到S的中断服务例程执行完毕,系统才会受理T1与T0的中断请求。逻辑上,由于T1具有高于T0的优先级,所以T1应先为系统响应。但因物理优先级相同时,中断请求的响应次序取决于内部查询顺序,而T0先于T1,所以实际上T0先 系统响应,即出现了“优先级反转”的问题。
可见,方法一虽然可以部分地达到“扩充中断优先级”的目的,但其存在两个问题:
*某些高优先级中断不能中断嵌套低优先级中断;
*会出现“优先级中反转”。
方法二和方法三是针对方法一的这两个不足而提出的,并最终实现对51系统的中断优先级的真正扩展。
2.2 方法二
该方法是在方法一基础上,为解决“优先级反转”的问题,而实施的简单策略而得。
根据方法一中对“优先级反转”问题的分析可知,出现该问题的原因是:各中断源的逻辑优先级与其内部查询顺序不一致。只要在系统设计时,兼顾中断源相关事件的紧迫程度与中断源的内部查询逻辑:将最紧迫的事件(如掉电)赋以最高的优先级0,并使其与系统中的最先被查询的中断源(外部中断0<X0>)相关联;使次紧迫的事件的优先为1,并使之与系统内第二个被查询的中断源(定时器0<T0)相关联。以此类推,给紧追程度最低的事
《MCS-51系统中断优先级的软扩展(第2页)》