打印

C,如何在程序运行任何状态下,直接跳转至主循环

[复制链接]
4173|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
at0755|  楼主 | 2014-8-23 13:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序有很多个子函数,内部还有大量循环

如何在串口收到指定数据时,直接跳回主循环?(不考虑正在执行比串口更高优先级中断的情况)

本想在串口中断中直接判断数据后Goto,查了下不能跨函数

难道只能在每个子模块每个循环里加标志位检测?

相关帖子

沙发
NWPU_CHEN| | 2014-8-23 14:12 | 只看该作者
露珠想法真丰富

使用特权

评论回复
板凳
at0755|  楼主 | 2014-8-23 14:16 | 只看该作者
NWPU_CHEN 发表于 2014-8-23 14:12
露珠想法真丰富

:L

有简单方法?

使用特权

评论回复
地板
NWPU_CHEN| | 2014-8-23 14:27 | 只看该作者
at0755 发表于 2014-8-23 14:16
有简单方法?

你为什么要跳到主函数?另外多模块协同处理,加标志位作为因果连接点挺好啊,难道不能满足你要求?那露珠加break跳出去得了。。。。

使用特权

评论回复
5
chenluck| | 2014-8-23 14:30 | 只看该作者
使用用软件复位指令

使用特权

评论回复
6
xyz549040622| | 2014-8-23 14:33 | 只看该作者
程序本来就在主函数中一直执行,你如何要跳回去呢,可以设立这样的标志 bit1,bit2
if(bit1)
{}
if(bit2)
{}
中断中改变bit的状态

使用特权

评论回复
7
at0755|  楼主 | 2014-8-23 14:36 | 只看该作者
NWPU_CHEN 发表于 2014-8-23 14:27
你为什么要跳到主函数?另外多模块协同处理,加标志位作为因果连接点挺好啊,难道不能满足你要求?那露珠 ...

加标志位是好,可是大量子函数,大量循环如果还嵌套的程序,很麻烦啊

使用特权

评论回复
8
at0755|  楼主 | 2014-8-23 14:38 | 只看该作者
chenluck 发表于 2014-8-23 14:30
使用用软件复位指令

复位时会重置主循环之前设置的参数,不能满足要求

使用特权

评论回复
9
at0755|  楼主 | 2014-8-23 14:43 | 只看该作者
本帖最后由 at0755 于 2014-8-23 14:47 编辑
xyz549040622 发表于 2014-8-23 14:33
程序本来就在主函数中一直执行,你如何要跳回去呢,可以设立这样的标志 bit1,bit2
if(bit1)
{}


标志位是能够实现,就是觉得麻烦啊

程序很多个子函数,子函数可能在多个位置在等待端口状态,每个子程序中多个循环这种之类的

程序本身结构不复杂,但想任何时间,串口一收到指定数据,立即返回主循环


如果这个返回有高实时性要求,难道只能进每个子函数时、进每个循环时、每个循环中,甚至每条语句前后都加一个判断标志位?

使用特权

评论回复
10
xyz549040622| | 2014-8-23 14:53 | 只看该作者
at0755 发表于 2014-8-23 14:43
标志位是能够实现,就是觉得麻烦啊

程序很多个子函数,子函数可能在多个位置在等待端口状态,每个子程序 ...

保证主循环的执行,不超过人眼的识别范围,这样就可以达到立即的效果

使用特权

评论回复
11
xyz549040622| | 2014-8-23 14:55 | 只看该作者
at0755 发表于 2014-8-23 14:36
加标志位是好,可是大量子函数,大量循环如果还嵌套的程序,很麻烦啊

程序大了正常吧,没有标志位怎么办?

使用特权

评论回复
12
NWPU_CHEN| | 2014-8-23 14:57 | 只看该作者
at0755 发表于 2014-8-23 14:43
标志位是能够实现,就是觉得麻烦啊

程序很多个子函数,子函数可能在多个位置在等待端口状态,每个子程序 ...

你想多了,设定全局标志完全满足你要求,况且你能加多少标志?你这收数据能加几个?如果牵扯实时性任务切换,裸奔感觉不能满足时还需嵌入os来解决

使用特权

评论回复
13
at0755|  楼主 | 2014-8-23 15:17 | 只看该作者
xyz549040622 发表于 2014-8-23 14:55
程序大了正常吧,没有标志位怎么办?


我以为有简单办法,比如串口中断中判断下数据,直接Goto一下回主程序了,没仔细想 :lol

看来只能是老老实实往程序里插标志位判断去了



使用特权

评论回复
14
at0755|  楼主 | 2014-8-23 15:19 | 只看该作者
NWPU_CHEN 发表于 2014-8-23 14:57
你想多了,设定全局标志完全满足你要求,况且你能加多少标志?你这收数据能加几个?如果牵扯实时性任务切 ...

嗯,谢谢

我这个程序结构很简单,控制几个步进,检测一些IO,只是流程比较长

因为用的串口屏,想在屏上加个软件急停的功能

使用特权

评论回复
15
xyz549040622| | 2014-8-23 15:22 | 只看该作者
at0755 发表于 2014-8-23 15:17
我以为有简单办法,比如串口中断中判断下数据,直接Goto一下回主程序了,没仔细想

看来只能是老老 ...

程序流程做好,设立一两个标志位就好了

使用特权

评论回复
16
匿名  2014-8-23 17:00
.

.ggg

使用特权

评论回复
17
kseeker| | 2014-8-24 08:31 | 只看该作者
C做不到,在C++,C#,Java,等现代语言里,这种需求可以靠异常机制来很好的完成。
不过你的程序不复杂的话,有一个变通的办法可以考虑:直接复位,之后不清除内存,检查复位原因。

使用特权

评论回复
18
chen_jhhb| | 2014-8-24 08:54 | 只看该作者
这种方式好像不好,流程设计的不好

使用特权

评论回复
19
匿名  2014-8-24 09:22
一般程序中都不建议goto语句的,goto很容易使到goto之前的资源得不到释放导致内存泄露,你的情况应该是函数调用函数,而且有多层, 可以考虑在函数中使用 throw 抛出异常,主循环中使用 try...catch 的方法截获异常,可以抛出整型值, 通过 catch(int)的形式 , 这样也可以判断抛出异常的类型

使用特权

评论回复
20
msblast| | 2014-8-24 11:02 | 只看该作者
setjmp
longjmp

使用特权

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

本版积分规则

12

主题

59

帖子

1

粉丝