关于单片机中断多优先级的软件扩展方法
发布时间:2009/2/4 0:00:00 访问次数:711
1 引言
所谓中断是指当cpu正在处理某件事情的时候,外部发生的某一事件(如一个电平的变化,一个脉冲沿的发生或定时器计数溢出等)请求cpu迅速去处理,于是cpu暂时中止当前的工作,转去处理所发生的事件。中断服务处理完该事件以后,再回到原来被中止的地方继续原来的工作,这样的一个过程称之为中断。以8051为例,中断系统含有5个中断源,分别是外部中断0请求(int0),外部中断1请求(int1),定时/计数器0溢出中断请求(t0),定时/计数器1溢出中断请求(t1)以及串行口中断请求(tx/rx)。既然系统含有5个中断源,就有可能出现数个中断源同时提出中断请求的情况,这样,设计人员必须事先根据它们的轻重缓急来为每个中断源确定cpu对其的响应顺序。然而,对于中断优先级寄存器ip来说,只可能设定两级优先,即控制位为1时对应的中断源为高级中断,反之,控制位为0时对应的为低级中断。这样就出现一个问题:如果一个中断正在执行,如何才能让它响应同级甚至是低级中断请求呢?
2 中断多优先级的扩展
根据8051的结构特点,其中断系统中含有两个不可寻址的“优先级生效”触发器。一个用于指出cpu是否正在执行高优先级的中断服务程序,这个触发器为1时,系统将屏蔽所有的中断请求;另一个则指出cpu是否正在执行低优先级中断服务程序,该触发器为1时,将阻止除高优先级以外的一切中断请求。由此可见,若要响应同级甚至是低级中断请求,必须使得该“优先级生效”触发器清零。但该触发器又是不可寻址的,所以无法用软件直接清零。遍历系统所提供的111条指令,只有reti可以达到此目的。该指令可在cpu执行该指令时,一方面清除中断响应时所置位的“优先级生效”触发器,另一方面可从当前栈顶弹出断点地址送入程序计数pc,从而返回主程序。
3 软件扩展方法
3.1 高级中断源响应低级中断源的软件设计
现以当前ie=84h(开放外部中断1及总控制位),ip=04h设定int1为高优先级 正在执行外部中断1服务子程序为例来进行说明。如欲响应串行口中断,也就是要实现高级中断源响应低级中断源,设计时可加入如下代码而无须改变ip寄存器的内容:
push ie ;ie内容入栈保护
mov ie , #10010000b ;开放串行口中断
call pp ;继续执行原中断子程序,但可
随时响应串行口中断请求
...
pop ie ;恢复原ie内容
reti
pp: reti
3.2 同级中断源之间的响应
上述代码体现了高级中断源(int1)响应低级中断源(串行口)的软件实现方法。但是, 8051系统共含有5个中断源,因此必须解决同优先级中断之间的嵌套问题,具体源程序如下:
org 0000h
ljmp main
org 0003h
ljmp x0 ;int0入口地址
org 000bh
ljmp t0 ;t0入口地址
org 0013h
ljmp x1 ;int1入口地址
org 001bh
ljmp t1 ;t1入口地址
org 0023h
ljmp ss ;串行口入口地址
main: mov ie ,#9fh ;开放所有中断
mov ip,#03h ;设定int0、t0为高优先级
sjmp $
x0: push dpl
push dph
mov dptr,#x0rl
push dpl
push dph
reti ;(pc)=x0rl,清"高优先级生效"
触发器,此时可响应其它中断请求
x0rl:· ;int0子程序的真实入口地址
·
·
·
pop dph
pop dpl
reti
t0: push dpl
push dph
mov dptr,#t0rl
push dpl
push dph
reti ;(pc)=t0rl,清"高优先级生效"
触发器,此时可响应其它中断请求
t0rl: · ;t0子程序的真实入口地址
·
·
·
pop dph
pop dpl
reti
x1: push dpl
push dph
mov dptr,#x1rl
push dpl
1 引言
所谓中断是指当cpu正在处理某件事情的时候,外部发生的某一事件(如一个电平的变化,一个脉冲沿的发生或定时器计数溢出等)请求cpu迅速去处理,于是cpu暂时中止当前的工作,转去处理所发生的事件。中断服务处理完该事件以后,再回到原来被中止的地方继续原来的工作,这样的一个过程称之为中断。以8051为例,中断系统含有5个中断源,分别是外部中断0请求(int0),外部中断1请求(int1),定时/计数器0溢出中断请求(t0),定时/计数器1溢出中断请求(t1)以及串行口中断请求(tx/rx)。既然系统含有5个中断源,就有可能出现数个中断源同时提出中断请求的情况,这样,设计人员必须事先根据它们的轻重缓急来为每个中断源确定cpu对其的响应顺序。然而,对于中断优先级寄存器ip来说,只可能设定两级优先,即控制位为1时对应的中断源为高级中断,反之,控制位为0时对应的为低级中断。这样就出现一个问题:如果一个中断正在执行,如何才能让它响应同级甚至是低级中断请求呢?
2 中断多优先级的扩展
根据8051的结构特点,其中断系统中含有两个不可寻址的“优先级生效”触发器。一个用于指出cpu是否正在执行高优先级的中断服务程序,这个触发器为1时,系统将屏蔽所有的中断请求;另一个则指出cpu是否正在执行低优先级中断服务程序,该触发器为1时,将阻止除高优先级以外的一切中断请求。由此可见,若要响应同级甚至是低级中断请求,必须使得该“优先级生效”触发器清零。但该触发器又是不可寻址的,所以无法用软件直接清零。遍历系统所提供的111条指令,只有reti可以达到此目的。该指令可在cpu执行该指令时,一方面清除中断响应时所置位的“优先级生效”触发器,另一方面可从当前栈顶弹出断点地址送入程序计数pc,从而返回主程序。
3 软件扩展方法
3.1 高级中断源响应低级中断源的软件设计
现以当前ie=84h(开放外部中断1及总控制位),ip=04h设定int1为高优先级 正在执行外部中断1服务子程序为例来进行说明。如欲响应串行口中断,也就是要实现高级中断源响应低级中断源,设计时可加入如下代码而无须改变ip寄存器的内容:
push ie ;ie内容入栈保护
mov ie , #10010000b ;开放串行口中断
call pp ;继续执行原中断子程序,但可
随时响应串行口中断请求
...
pop ie ;恢复原ie内容
reti
pp: reti
3.2 同级中断源之间的响应
上述代码体现了高级中断源(int1)响应低级中断源(串行口)的软件实现方法。但是, 8051系统共含有5个中断源,因此必须解决同优先级中断之间的嵌套问题,具体源程序如下:
org 0000h
ljmp main
org 0003h
ljmp x0 ;int0入口地址
org 000bh
ljmp t0 ;t0入口地址
org 0013h
ljmp x1 ;int1入口地址
org 001bh
ljmp t1 ;t1入口地址
org 0023h
ljmp ss ;串行口入口地址
main: mov ie ,#9fh ;开放所有中断
mov ip,#03h ;设定int0、t0为高优先级
sjmp $
x0: push dpl
push dph
mov dptr,#x0rl
push dpl
push dph
reti ;(pc)=x0rl,清"高优先级生效"
触发器,此时可响应其它中断请求
x0rl:· ;int0子程序的真实入口地址
·
·
·
pop dph
pop dpl
reti
t0: push dpl
push dph
mov dptr,#t0rl
push dpl
push dph
reti ;(pc)=t0rl,清"高优先级生效"
触发器,此时可响应其它中断请求
t0rl: · ;t0子程序的真实入口地址
·
·
·
pop dph
pop dpl
reti
x1: push dpl
push dph
mov dptr,#x1rl
push dpl
热门点击
- PICC编译环境编写PIC单片机程序的探讨
- National Semiconductor
- 3D忆阻器混合芯片面世 实现人工神经网络
- 单片机端点描述符
- 单片机USB设备登录编辑器
- 关于单片机中断多优先级的软件扩展方法
- 单片机设备描述符
- 单片机USB描述符
- 单片机配置描述符
- 单片机接口描述符
推荐技术资料
- 硬盘式MP3播放器终级改
- 一次偶然的机会我结识了NE0 2511,那是一个远方的... [详细]