打印

C51中断子程序中能否使用return

[复制链接]
19796|49
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
864|  楼主 | 2009-10-15 14:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问C51中断子程序中能否使用return 强制退出中断,以前一直没这么写过 也没见过,今天听人家说可以 我一下子懵了 可以不可以都说不出个原因来,因此向大家请教 谢谢

相关帖子

沙发
bhsdlmj| | 2009-10-15 15:03 | 只看该作者
return一般放在末尾吧   有放在半山腰的么? 没有吧

使用特权

评论回复
板凳
arm_fan168| | 2009-10-15 15:08 | 只看该作者
应该可以吧,看一下反汇编代码,如果return对应的反汇编代码的返回指令是RETI就可以,如果是RET就会有问题了,因为51MCU在一个中断服务的过程中是屏蔽其它同优先级的中断的,如果没有RETI而返回,就会一直屏蔽下去。

使用特权

评论回复
地板
864|  楼主 | 2009-10-15 15:09 | 只看该作者
2# bhsdlmj
就是当有条件判断的时候可能有分支的时候,你的意思就是可以在里面用的? 如果不写的话中断子程序末尾是不是有一条默认是“return”?

使用特权

评论回复
5
864|  楼主 | 2009-10-15 15:11 | 只看该作者
3# arm_fan168
谢谢,没看到代码 只是别人告诉我他这么用结果可行。  听你一说我大致明白了 再次谢谢

使用特权

评论回复
6
arm_fan168| | 2009-10-15 15:24 | 只看该作者
应该没问题,编译器这点智能应该还是有的。

使用特权

评论回复
7
864|  楼主 | 2009-10-15 15:28 | 只看该作者
6# arm_fan168
哦 谢谢 我以前在中断子程序末尾也不加return  那末尾返回的时候是不是有一条隐藏的默认的“return”?

使用特权

评论回复
8
bhsdlmj| | 2009-10-15 15:31 | 只看该作者
2# bhsdlmj  
就是当有条件判断的时候可能有分支的时候,你的意思就是可以在里面用的? 如果不写的话中断子程序末尾是不是有一条默认是“return”?
864 发表于 2009-10-15 15:09

看了这个资料 你就会懂了吧 这是我以前读过的

return网页.rar

1.37 MB

使用特权

评论回复
9
864|  楼主 | 2009-10-15 15:33 | 只看该作者
8# bhsdlmj
谢谢 我看看

使用特权

评论回复
10
arm_fan168| | 2009-10-15 15:33 | 只看该作者
不是隐藏的默认的“return”。编译器在编译一个普通的C51函数的时候,会在函数的结尾处生成RET指令,而编译C51的中断服务函数的时候,会在结尾处生成RETI指令。可以理解为,那个结束的大括号就是告诉编译器这个函数结束了。

使用特权

评论回复
11
bhsdlmj| | 2009-10-15 15:38 | 只看该作者
中断程序里面加return我还真没加过!

撇开中断不谈,就说普通的函数。

我是这样弄的  第一是return放末尾 第二是 return的量的类型与函数类型一致。好像就这两点吧
嗨 我以前做过总结的 后来给弄丢了

如果函数末尾没有return 并且函数名字前没有void,那么也是会返回值得,返回一个不确定值。
这是谭浩强的书说的。知道这回事就行。我以前试过是这样的。 不过不一定所有编译器都这样弄。

使用特权

评论回复
12
864|  楼主 | 2009-10-15 15:40 | 只看该作者
10# arm_fan168
恩 明白了 谢谢

使用特权

评论回复
13
864|  楼主 | 2009-10-15 15:40 | 只看该作者
11# bhsdlmj
谢谢 正看你资料

使用特权

评论回复
14
bhsdlmj| | 2009-10-15 15:41 | 只看该作者
请问C51中断子程序中能否使用return 强制退出中断,以前一直没这么写过 也没见过,今天听人家说可以 我一下子懵了 可以不可以都说不出个原因来,因此向大家请教 谢谢 ...
864 发表于 2009-10-15 14:55


对于这个帖子我的建议是“千万不要强制退出中断,即使能正确运行”!

使用特权

评论回复
15
864|  楼主 | 2009-10-15 15:49 | 只看该作者
14# bhsdlmj
哦 好的 我只想弄明白return在中断里面能否到达正常退出的问题 谢谢你的热心帮助

使用特权

评论回复
16
bhsdlmj| | 2009-10-15 15:52 | 只看该作者
哦对了 我想起来了  还有一点 就是 返回 指针时要特别 注意!!!

使用特权

评论回复
17
864|  楼主 | 2009-10-15 15:55 | 只看该作者
16# bhsdlmj
恩 懂你要表达的意思,我只是想知道单单写个return是不是起到RETI的作用

使用特权

评论回复
18
bhsdlmj| | 2009-10-15 15:59 | 只看该作者
是的。前面那人说的对!普通函数return是RET  中断return是RETI。
不过可以说成是不加return时,隐藏了个return。



不是隐藏的默认的“return”。编译器在编译一个普通的C51函数的时候,会在函数的结尾处生成RET指令,而编译C51的中断服务函数的时候,会在结尾处生成RETI指令。可以理解为,那个结束的大括号就是告诉编译器这个函数 ...
arm_fan168 发表于 2009-10-15 15:33

使用特权

评论回复
19
bhsdlmj| | 2009-10-15 16:08 | 只看该作者
哦对了 我想起来了  还有一点 就是 返回 指针时要特别 注意!!!
bhsdlmj 发表于 2009-10-15 15:52


还有一点要说 一个特例:

就是当有并列结构时,可以从子程序的多个位置返回。


函数名(a . b)
{
     if (a > b) {
           return 萝卜;
     }
     elseif (a < b){
           return 白菜;
     }
     return 地瓜;
}

使用特权

评论回复
20
864|  楼主 | 2009-10-15 16:09 | 只看该作者
19# bhsdlmj
恩 明白,谢谢你的热心

使用特权

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

本版积分规则

864
个人签名:每天定心一小时!

18

主题

240

帖子

0

粉丝