c51编程问题

[复制链接]
5071|25
 楼主| mygodbody 发表于 2011-12-20 20:02 | 显示全部楼层 |阅读模式
请问在51单片机系统中,在T0定时器中断服务子程序中,如果满足某条件就执行一长转移指
令(LJMP),指向了主程序中某个地址,就直接返回了主程序,而并没有执行RETI指令,真
正返回主程序,请问这种方式可以吗?没有执行RETI,而这时是运行主程序还是运行中断程
序?谢谢各位!
HWM 发表于 2011-12-20 22:28 | 显示全部楼层
re LZ:

这种用转移指令跳出中断服务程序是不妥的(除非是特殊用法)。如此进入主程序后因中断系统某些标志未被复位(这些工作是由RETI完成的),致使后续中断无**确进入。所以,那是在中断状态下执行着非中断服务的程序(主程序)。

评分

参与人数 1威望 +1 收起 理由
mygodbody + 1

查看全部评分

ejack 发表于 2011-12-21 07:17 | 显示全部楼层
这样做最直接的隐患就是栈只增不减,如果是频繁产生的中断则很快就会跑飞。
ayb_ice 发表于 2011-12-21 07:55 | 显示全部楼层
LZ去看看RETI指令的作用就明白了
xwj 发表于 2011-12-21 09:28 | 显示全部楼层
错误的做法,会造成同级或低级中断再也无法响应。

堆栈可以自己重新设置,但中断响应级是你改不了的,所以RETI是必须执行。
方法其实很简单,某个空函数里嵌入汇编加上RETI即可,然后调用这个空函数。
 楼主| mygodbody 发表于 2011-12-21 10:22 | 显示全部楼层
谢谢各位了那怎么实现中断结束后使跳到程序开始呢?
HORSE7812 发表于 2011-12-21 10:57 | 显示全部楼层
这个问题太复杂了。简单点的办法就是在RETI前把堆栈中的返回地址修改为0x0000,但控制得不好的话则可能引发其他方面的问题。个人愚见。
 楼主| mygodbody 发表于 2011-12-21 11:06 | 显示全部楼层
RE8楼
在中断没返回之前按下复位键这样行不??
谢谢
gx_huang 发表于 2011-12-21 12:58 | 显示全部楼层
这个肯定不行的,无法再次进入中断。
要搞清楚中断的原理。
 楼主| mygodbody 发表于 2011-12-21 13:04 | 显示全部楼层
复位后为什么无法再次进入中断啊求指点。。
mcu5i51 发表于 2011-12-21 13:29 | 显示全部楼层
复位后可以进入中断,但前提是你要真正的复位,直接跳到主程序入口不可取;
如果你要软复位也需要执行RETI清除已经发生的中断,一个简单的方法就是使用一个不用的低优先级中断,在复位条件满足时触发这个中断,此中断中禁止全局中断后修改返回地址为0再执行RETI指令,由于中断优先级最低,进入时其他中断都执行完成,不会有其他副作用;
或者在你的T0中保证没有其他中断嵌套也行;
否则可以使用复位标志的方法在主程序中禁用总中断开关后执行跳转到地址0执行的方法;
xuyaqi 发表于 2011-12-21 13:47 | 显示全部楼层
问题是为什么要这样干
mcu5i51 发表于 2011-12-21 14:18 | 显示全部楼层
用RETI指令清除MCU内部的中断标记,Mcu会根据这些标记区分优先级,且没有对外的接口
xuyaqi 发表于 2011-12-21 14:31 | 显示全部楼层
本帖最后由 xuyaqi 于 2011-12-21 14:33 编辑

to12:我是问楼主为什么不愿执行RETI
kama225 发表于 2011-12-21 14:42 | 显示全部楼层
不是很懂
好!不走调 发表于 2011-12-21 16:12 | 显示全部楼层
堆栈都乱掉了。。。
mzh1245 发表于 2011-12-21 19:18 | 显示全部楼层
堆栈跑飞
lrenyu 发表于 2011-12-21 22:31 | 显示全部楼层
学习了。
dengm 发表于 2011-12-22 00:42 | 显示全部楼层
本帖最后由 dengm 于 2011-12-22 14:41 编辑

怎么实现中断结束后使跳到程序开始呢?

      ;
         PUSH ACC  ; 保存 A
         MOV A, SP
         XCH A, R0
         DEC R0
         MOV @R0, #00     ; 压地址 00:00 (程序开始)
         DEC R0
         MOV @R0, #00
         MOV R0, A  ;     恢复 R0
         POP ACC     ;     恢复 A
         RETI          ; 离开中断 到 00:00 (程序开始)
mcu5i51 发表于 2011-12-22 11:38 | 显示全部楼层
LS 好啰嗦

clr a
push acc
push acc
reti
反正到了0地址一切都会初始化
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

15

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部