打印

c51编程问题

[复制链接]
4058|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指令的作用就明白了

使用特权

评论回复
5
xwj| | 2011-12-21 09:28 | 只看该作者
错误的做法,会造成同级或低级中断再也无法响应。

堆栈可以自己重新设置,但中断响应级是你改不了的,所以RETI是必须执行。
方法其实很简单,某个空函数里嵌入汇编加上RETI即可,然后调用这个空函数。

使用特权

评论回复
6
mygodbody|  楼主 | 2011-12-21 10:22 | 只看该作者
谢谢各位了那怎么实现中断结束后使跳到程序开始呢?

使用特权

评论回复
7
HORSE7812| | 2011-12-21 10:57 | 只看该作者
这个问题太复杂了。简单点的办法就是在RETI前把堆栈中的返回地址修改为0x0000,但控制得不好的话则可能引发其他方面的问题。个人愚见。

使用特权

评论回复
8
mygodbody|  楼主 | 2011-12-21 11:06 | 只看该作者
RE8楼
在中断没返回之前按下复位键这样行不??
谢谢

使用特权

评论回复
9
gx_huang| | 2011-12-21 12:58 | 只看该作者
这个肯定不行的,无法再次进入中断。
要搞清楚中断的原理。

使用特权

评论回复
10
mygodbody|  楼主 | 2011-12-21 13:04 | 只看该作者
复位后为什么无法再次进入中断啊求指点。。

使用特权

评论回复
11
mcu5i51| | 2011-12-21 13:29 | 只看该作者
复位后可以进入中断,但前提是你要真正的复位,直接跳到主程序入口不可取;
如果你要软复位也需要执行RETI清除已经发生的中断,一个简单的方法就是使用一个不用的低优先级中断,在复位条件满足时触发这个中断,此中断中禁止全局中断后修改返回地址为0再执行RETI指令,由于中断优先级最低,进入时其他中断都执行完成,不会有其他副作用;
或者在你的T0中保证没有其他中断嵌套也行;
否则可以使用复位标志的方法在主程序中禁用总中断开关后执行跳转到地址0执行的方法;

使用特权

评论回复
12
xuyaqi| | 2011-12-21 13:47 | 只看该作者
问题是为什么要这样干

使用特权

评论回复
13
mcu5i51| | 2011-12-21 14:18 | 只看该作者
用RETI指令清除MCU内部的中断标记,Mcu会根据这些标记区分优先级,且没有对外的接口

使用特权

评论回复
14
xuyaqi| | 2011-12-21 14:31 | 只看该作者
本帖最后由 xuyaqi 于 2011-12-21 14:33 编辑

to12:我是问楼主为什么不愿执行RETI

使用特权

评论回复
15
kama225| | 2011-12-21 14:42 | 只看该作者
不是很懂

使用特权

评论回复
16
好!不走调| | 2011-12-21 16:12 | 只看该作者
堆栈都乱掉了。。。

使用特权

评论回复
17
mzh1245| | 2011-12-21 19:18 | 只看该作者
堆栈跑飞

使用特权

评论回复
18
lrenyu| | 2011-12-21 22:31 | 只看该作者
学习了。

使用特权

评论回复
19
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 (程序开始)

使用特权

评论回复
20
mcu5i51| | 2011-12-22 11:38 | 只看该作者
LS 好啰嗦

clr a
push acc
push acc
reti
反正到了0地址一切都会初始化

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

15

帖子

1

粉丝