OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6938|回复: 21

新人求助,如何从子函数的某一步返回到主函数的某一步

[复制链接]

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-3-4
在线时间
0 小时
发表于 2015-11-4 11:26:44 | 显示全部楼层 |阅读模式
5金钱
简单的说就是希望可以在子函数中的某一步程序执行完之后返回到主函数中段的一句指令,尝试过用goto函数,发现不允许夸函数,有什么好的办法么?谢谢了

最佳答案

查看完整内容[请看2#楼]

goto不行的。 楼主是新手,搞这种,只会把自己搞死。 老鸟给个建议: 一定要做,是有办法的,longjmp,自己百度关键字。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-4 11:26:45 | 显示全部楼层
goto不行的。
楼主是新手,搞这种,只会把自己搞死。

老鸟给个建议:
一定要做,是有办法的,longjmp,自己百度关键字。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

1041

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3696
金钱
3696
注册时间
2011-5-23
在线时间
2008 小时
发表于 2015-11-4 11:32:30 | 显示全部楼层
no zuo no die!
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-11-4 11:34:37 | 显示全部楼层
这种情况第一次见,如果不是楼主程序有极特殊需求,可能就是楼主编程逻辑不够清晰

1.子函数写入主函数,然后goto
2.参考开发指南IAP章节,看看有没有办法吧
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-3-4
在线时间
0 小时
 楼主| 发表于 2015-11-4 11:53:51 | 显示全部楼层
回复【3楼】龙之谷:
---------------------------------
我也是第一次写,所以确实是不熟练,就是来问问有没有这种写法,如果没有的话,那只能是修改逻辑了
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-3-4
在线时间
0 小时
 楼主| 发表于 2015-11-4 11:55:32 | 显示全部楼层
回复【2楼】aozima:
---------------------------------
我错了,。。新手一枚,请多指教
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2015-11-4 12:50:51 | 显示全部楼层
幸好没有goto过去,看来编译器还是很严谨,如果goto过去,麻烦大了!
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12691
金钱
12691
注册时间
2012-11-26
在线时间
3710 小时
发表于 2015-11-4 13:37:03 | 显示全部楼层
。。。。。。
学无止境
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2015-11-4 14:34:16 | 显示全部楼层
unsigned char goto_flag = 0;

//主函数
main()
{
    //代码段
goto_table:
    //代码段
    fun();
    if(goto_flag == 1)
    {
        goto goto_table;
    }
    //代码段
}

//子函数
fun()
{
    //代码段
    //若此处跳转,goto_flag 置位,立即return 退出
    goto_flag = 1;
    return;
    //代码段
}
回复

使用道具 举报

32

主题

223

帖子

0

精华

高级会员

Rank: 4

积分
695
金钱
695
注册时间
2015-9-23
在线时间
120 小时
发表于 2015-11-5 19:06:09 | 显示全部楼层
goto   就不要用了吧。。。
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2015-11-6 08:26:04 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
老大,他是想子函数不执行完,不退出然后直接跳转到主函数某步(不是原来的地址),他这种要求除非自己管理栈,否则什么关键字都不行!
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-9 23:20:06 | 显示全部楼层
回复【11楼】无痕幽雨:
---------------------------------
用longjmp是可以的。

在用libjpeg的时候,学到这个技能的。
用setjmp和longjmp,出现异常的时候,直接跳转到setjmp位置
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2015-11-10 13:54:22 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
longjmp是长跳转,那栈是自己管理?还是编译器管理??
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2015-11-11 11:40:04 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
老大,你说的是这个吧?http://blog.csdn.net/wuhenyouyuyouyu/article/details/49779679,这个和楼主要求还是不太一样的,如果非要用这种方式解决问题,我感觉是楼主的程序架构或者是程序流程没有设计好!
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-11 23:14:09 | 显示全部楼层
回复【14楼】无痕幽雨:
---------------------------------
就是这个.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2015-11-12 09:11:07 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
编程规范里面连goto都禁止,更何况是这个跨函数的!把我的11楼删除吧,对新人没啥好处!
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2015-11-12 09:12:49 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
错了,是13楼,删除吧,对新人来说只有坏处,没有好处!
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-3-4
在线时间
0 小时
 楼主| 发表于 2015-11-12 10:58:00 | 显示全部楼层
谢谢各位的帮助了,我改了下程序逻辑,好像可以工作了,还要再试试,新手学生还在学习,多谢大家的指导了。
回复

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2013-6-5
在线时间
141 小时
发表于 2015-11-14 16:41:07 | 显示全部楼层
回复【11楼】无痕幽雨:
---------------------------------
长跳转就可以,这个功能是成对使用的,在将来要跳回来的位置先保存堆栈和变量,然后可以在任何位置跳转回这一点,这个实际上是一种错误恢复机制。其实最可怕的是定义函数指针把某个系统函数入口地址递给他,然后再调用。
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2015-11-16 09:15:41 | 显示全部楼层
回复【19楼】zhxzhx:
---------------------------------
这种东东不是正途,禁止使用为好!自己玩玩可以!很难维护升级的!
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2013-6-5
在线时间
141 小时
发表于 2015-11-17 23:08:13 | 显示全部楼层
回复【20楼】无痕幽雨:
---------------------------------但是要做完善的错误恢复机制,没这个还不行,这个其实也没什么危险,它把变量和堆栈都保存了,实际上等于实在时间上回溯了,和goto种跳转是两回事。
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2015-11-18 09:47:07 | 显示全部楼层
回复【21楼】zhxzhx:
---------------------------------
存在既有它存在的道理!特殊场合还是有用的,我只是说不适合楼主的应用。我目前的应用一般错误存储记录,严重错误等待看门狗复位。和您的应用场景又不同!
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 12:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表