论文部分内容阅读
1.引言
所谓中断是指当CPU正在处理某一事情的时候,外部发生的某一事件(例如一个电平的 变化,一个脉冲沿的发生或定时器计数溢出等)请求CPU马上去处理,于是CPU中止当 前的工作,转去处理所发生的事件。处理完该事件以后,再回到原来被中止的地方继续工作 ,这一个过程称为中断。以8051为例,中断系统含有5个中断源,既然系统含有5个中 断源,就有可能出现数个中断源同时提出中断请求的情况,这样,设计人员必须事先根据它 们的轻重缓急来为每个中断源确定CPU对其的响应顺序。然而,对于中断优先级寄存器I P来说,只可能设定两级优先,即高优先级和低优先级。这样就出现一个问题:如果一个中 断正在执行,如何才能让它响应同级甚至是低级中断请求呢?
2.中断多优先级的扩展
根据8051的结构特点,其中断系统中含有两个不可寻址的“优先级生效”触发器。一个 用 于指出CPU是否正在执行高优先级的中断服务程序,这个触发器为1时,系统将屏蔽所有 的中断请求;另一个则指出CPU是否正在执行低优先级中断服务程序,该触发器为1时, 将阻止除高优先级以外的一切中断请求。由此可见,若要响应同级甚至是低级中断请求,必 须使得该"优先级生效"触发器清零。但该触发器又是不可寻址的,所以无法用软件直接清零 。遍历系统所提供的111条指令,只有RETI指令可以达到此目的。该指令可在CPU 执行该指令时,一方面清除中断响应时所置位的“优先级生效”触发器,另一方面可从当前 栈顶弹出断点地址送入程序计数PC,从而返回主程序。
3.软件扩展方法
8051系统共含有5个中断源,以下程序能够解决同优先级中断之间的嵌套问题,具体源 程序如下:
ORG
0
LJMP MAIN
ORG 0003H
LJMP INTEX0 ;INT0入口地址
ORG 000BH
LJMP INTET0 ;T0入口地址
ORG 0013H
LJMP INTEX1 ;INT1入口地址
ORG 001BH
LJMP INTET1 ;T1入口地址
ORG 0023H
LJMP INTESS ;串行口入口地址
MAIN: MOV IE ,#9FH ;开放所有中断
MOV IP,#03H ;设定INT0、T0为高优先级
SJMP
$
INTEX0: PUSH DPL
PUSH DPH
MOV DPTR,#X0RL
PUSH DPL
PUSH DPH
RETI ;(PC)=X0RL,清“高优先级生效”触发器,此时可响应其它中断请求
X0RL:... ;INT0子程序的真实入口地址
•
•
•
POP DPH
POP DPL
RETI
INTET0: PUSH DPL
PUSH DPH
MOV DPTR,#T0RL
PUSH DPL
PUSH DPH
RETI ;(PC)=T0RL,清“高优先级生效”触发器,此时可响应其它中断请求
T0RL:... ;T0子程序的真实入口地址
•
•
POP DPH
POP DPL
RETI
INTEX1: PUSH DPL
PUSH DPH
MOV DPTR,#X1RL
PUSH DPL
PUSH DPH
RETI ;(PC)=X1RL,清“高优先级生效”触发器,此时可响应其它中断请求
X1RL:...
;INT1子程序的真实入口地址
•
POP DPH
POP DPL
RETI
INTET1: PUSH DPL
PUSH DPH
MOV DPTR,#T1RL
PUSH DPL
PUSH DPH
RETI ;(PC)=T1RL,清“高优先级生效”触发器,此时可响应其它中断请求
T1RL: ...
;T1子程序的真实入口地址
•
•
POP DPH
POP DPL
RETI
INTESS: PUSH DPL
PUSH DPH
MOV DPTR,#SSRL
PUSH DPL
PUSH DPH
RETI ;(PC)=SSRL,清“高优先级生效”触发器,此时可响应其它中断请求
SSRL: • ;串行口子程序的真实入口地址
•
•
POP DPH
POP DPL
RETI
上述程序利用IP寄存器给出了两级优先级,其中INT0、T0为高优先级,INT 1、T1串行口为低优先级。为使某中断能响应同级甚至低级中断,只要在中断服务子程序 中用RETI指令清除相应的不可寻址的"优先级生效"触发器即可。程序一开始的两条PU SH指令的作用是对原始数据进行入栈保护(如此时DPTR中的数据不需保留,则这两条 压栈指令也可不要,相应的弹栈指令也可不要),然后将其真实子程序入口地址入栈,并经 RETI出栈后弹给PC指针,以便在执行完RETI后正确执行真实子程序。当该中 断服务子程序执行完毕后,RETI将返回主程序断点处以继续执行原来程序。
所谓中断是指当CPU正在处理某一事情的时候,外部发生的某一事件(例如一个电平的 变化,一个脉冲沿的发生或定时器计数溢出等)请求CPU马上去处理,于是CPU中止当 前的工作,转去处理所发生的事件。处理完该事件以后,再回到原来被中止的地方继续工作 ,这一个过程称为中断。以8051为例,中断系统含有5个中断源,既然系统含有5个中 断源,就有可能出现数个中断源同时提出中断请求的情况,这样,设计人员必须事先根据它 们的轻重缓急来为每个中断源确定CPU对其的响应顺序。然而,对于中断优先级寄存器I P来说,只可能设定两级优先,即高优先级和低优先级。这样就出现一个问题:如果一个中 断正在执行,如何才能让它响应同级甚至是低级中断请求呢?
2.中断多优先级的扩展
根据8051的结构特点,其中断系统中含有两个不可寻址的“优先级生效”触发器。一个 用 于指出CPU是否正在执行高优先级的中断服务程序,这个触发器为1时,系统将屏蔽所有 的中断请求;另一个则指出CPU是否正在执行低优先级中断服务程序,该触发器为1时, 将阻止除高优先级以外的一切中断请求。由此可见,若要响应同级甚至是低级中断请求,必 须使得该"优先级生效"触发器清零。但该触发器又是不可寻址的,所以无法用软件直接清零 。遍历系统所提供的111条指令,只有RETI指令可以达到此目的。该指令可在CPU 执行该指令时,一方面清除中断响应时所置位的“优先级生效”触发器,另一方面可从当前 栈顶弹出断点地址送入程序计数PC,从而返回主程序。
3.软件扩展方法
8051系统共含有5个中断源,以下程序能够解决同优先级中断之间的嵌套问题,具体源 程序如下:
ORG
0
LJMP MAIN
ORG 0003H
LJMP INTEX0 ;INT0入口地址
ORG 000BH
LJMP INTET0 ;T0入口地址
ORG 0013H
LJMP INTEX1 ;INT1入口地址
ORG 001BH
LJMP INTET1 ;T1入口地址
ORG 0023H
LJMP INTESS ;串行口入口地址
MAIN: MOV IE ,#9FH ;开放所有中断
MOV IP,#03H ;设定INT0、T0为高优先级
SJMP
$
INTEX0: PUSH DPL
PUSH DPH
MOV DPTR,#X0RL
PUSH DPL
PUSH DPH
RETI ;(PC)=X0RL,清“高优先级生效”触发器,此时可响应其它中断请求
X0RL:... ;INT0子程序的真实入口地址
•
•
•
POP DPH
POP DPL
RETI
INTET0: PUSH DPL
PUSH DPH
MOV DPTR,#T0RL
PUSH DPL
PUSH DPH
RETI ;(PC)=T0RL,清“高优先级生效”触发器,此时可响应其它中断请求
T0RL:... ;T0子程序的真实入口地址
•
•
POP DPH
POP DPL
RETI
INTEX1: PUSH DPL
PUSH DPH
MOV DPTR,#X1RL
PUSH DPL
PUSH DPH
RETI ;(PC)=X1RL,清“高优先级生效”触发器,此时可响应其它中断请求
X1RL:...
;INT1子程序的真实入口地址
•
POP DPH
POP DPL
RETI
INTET1: PUSH DPL
PUSH DPH
MOV DPTR,#T1RL
PUSH DPL
PUSH DPH
RETI ;(PC)=T1RL,清“高优先级生效”触发器,此时可响应其它中断请求
T1RL: ...
;T1子程序的真实入口地址
•
•
POP DPH
POP DPL
RETI
INTESS: PUSH DPL
PUSH DPH
MOV DPTR,#SSRL
PUSH DPL
PUSH DPH
RETI ;(PC)=SSRL,清“高优先级生效”触发器,此时可响应其它中断请求
SSRL: • ;串行口子程序的真实入口地址
•
•
POP DPH
POP DPL
RETI
上述程序利用IP寄存器给出了两级优先级,其中INT0、T0为高优先级,INT 1、T1串行口为低优先级。为使某中断能响应同级甚至低级中断,只要在中断服务子程序 中用RETI指令清除相应的不可寻址的"优先级生效"触发器即可。程序一开始的两条PU SH指令的作用是对原始数据进行入栈保护(如此时DPTR中的数据不需保留,则这两条 压栈指令也可不要,相应的弹栈指令也可不要),然后将其真实子程序入口地址入栈,并经 RETI出栈后弹给PC指针,以便在执行完RETI后正确执行真实子程序。当该中 断服务子程序执行完毕后,RETI将返回主程序断点处以继续执行原来程序。