OpenEdv-开源电子网

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

如何跳出函数

[复制链接]

7

主题

26

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-7-19
在线时间
19 小时
发表于 2017-6-29 19:56:06 | 显示全部楼层 |阅读模式
20金钱
void main(void){
    whlie(1)
    {
        A:......
        B:......
        C:......
        D:......
        E:......
        F:......
    }
}
void TIM2_IRQHandler(void)
{
    if(a==1)......
}

主函数在不停的循环ABCDEF五步,如何能使到达TIM2并满足条件判断后,使主函数不管进行到哪一步,一律跳转到步骤C呢?
(我是用在机器的紧急停止按钮上的,检测到按钮按下了,不管在进行什么程序,一律停止并跳转到主程序的某一步)

最佳答案

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

enum{ TASK_A, TASK_B, TASK_C, TASK_D, TASK_E, TASK_F, }; volatile unsigned char TaskState; void main(void){ TaskState = A; whlie(1) { switch(TaskState) { case A: break; case B: break; case C: break; case D: break; case E: break; ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2017-6-29 19:56:07 | 显示全部楼层

enum{
TASK_A,
TASK_B,
TASK_C,
TASK_D,
TASK_E,
TASK_F,
};

volatile unsigned char  TaskState;

void main(void){
   TaskState = A;
    whlie(1)
    {
     switch(TaskState)
        {
        case A:
            break;
        
        case B:
            break;

        case C:
            break;

        case D:
            break;

        case E:
            break;

        case F:
            break;
    }
}
void TIM2_IRQHandler(void)
{
    if(a==1)
      {
       TaskState = C;
       }
}
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

7

主题

26

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-7-19
在线时间
19 小时
 楼主| 发表于 2017-6-29 20:40:54 | 显示全部楼层

这里的ABCDE全部都是子函数,这里每个子函数里面又有好多层的子子函数,我需要不管他运算到哪个子函数的哪个子子函数里,都得马上跳转出来,难道要上百个子子函数都全部加这样的判断吗?
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2017-6-29 20:52:43 | 显示全部楼层
直接复位后执行,硬件直接处理掉,程序要根据自己的实际东西进行设计,按键处理是大几十毫秒级的,单片机随便都应付得来,可以去了解状态的设计思路
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

7

主题

26

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-7-19
在线时间
19 小时
 楼主| 发表于 2017-6-29 22:33:15 | 显示全部楼层
DongInker 发表于 2017-6-29 20:52
直接复位后执行,硬件直接处理掉,程序要根据自己的实际东西进行设计,按键处理是大几十毫秒级的,单片机随 ...

现在需要实际程序不能复位,复位后代价太大了,计算好久的程序好多变量都要重头来了(把变量周期性的存储起来也不适合我这实际),没有其他办法吗大哥?
回复

使用道具 举报

7

主题

26

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-7-19
在线时间
19 小时
 楼主| 发表于 2017-6-29 23:32:02 | 显示全部楼层
DongInker 发表于 2017-6-29 20:52
直接复位后执行,硬件直接处理掉,程序要根据自己的实际东西进行设计,按键处理是大几十毫秒级的,单片机随 ...

其实我是想问,有没函数可以直接引导程序跳到某一步。就像goto那样,但他好像只能从主函数引导到主函数某处,或子函数引导到子函数。我现在想从中断函数引导到主函数,接着之后主函数会在引导点哪里开始走,走完之后又一切照常的循环mian里的while(1)。
回复

使用道具 举报

7

主题

26

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-7-19
在线时间
19 小时
 楼主| 发表于 2017-6-29 23:36:30 | 显示全部楼层
DongInker 发表于 2017-6-29 20:52
直接复位后执行,硬件直接处理掉,程序要根据自己的实际东西进行设计,按键处理是大几十毫秒级的,单片机随 ...

不知道setjmp()和longjmp()能不能用得上,我试下
回复

使用道具 举报

2

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-10-9
在线时间
10 小时
发表于 2017-6-30 09:36:22 | 显示全部楼层
本帖最后由 Pro_Xiao 于 2017-6-30 09:38 编辑

你把C函数代码直接复制到中断里,按了按钮进中断执行C,中断优先级不要设置最高,额外设置个更高优先级的中断用于跳出这个包含C的中断,包含C的中断接收到这个更高优先级的中断后跳出,继续回到main中从按下按钮的时刻运行ABCDEFG
回复

使用道具 举报

6

主题

25

帖子

1

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2017-6-12
在线时间
28 小时
发表于 2017-6-30 09:43:54 | 显示全部楼层
裸跑环境还是有操作系统的环境?
回复

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2017-1-19
在线时间
13 小时
发表于 2017-6-30 11:05:52 | 显示全部楼层
在TIM2里面写一个goto,让它直接跳过去,这样行得通吗?
回复

使用道具 举报

0

主题

24

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2017-6-30
在线时间
7 小时
发表于 2017-6-30 14:58:43 来自手机 | 显示全部楼层
在中断里修改 TaskState = C
回复

使用道具 举报

7

主题

26

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-7-19
在线时间
19 小时
 楼主| 发表于 2017-6-30 17:05:59 | 显示全部楼层
Pro_Xiao 发表于 2017-6-30 09:36
你把C函数代码直接复制到中断里,按了按钮进中断执行C,中断优先级不要设置最高,额外设置个更高优先级的中 ...

这样的话,执行中断中的C后,就不会接着进行D,再接着进行E啊。
我需要收到中断后,就执行CDEFGABCDEFGABCDEFGABCDEFGABCDEFG...这样main函数一直正常循环运算下去啊
回复

使用道具 举报

7

主题

26

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-7-19
在线时间
19 小时
 楼主| 发表于 2017-6-30 17:06:17 | 显示全部楼层
djyos 发表于 2017-6-30 09:43
裸跑环境还是有操作系统的环境?

裸跑的
回复

使用道具 举报

7

主题

26

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-7-19
在线时间
19 小时
 楼主| 发表于 2017-6-30 17:39:14 | 显示全部楼层
李卓晖 发表于 2017-6-30 11:05
在TIM2里面写一个goto,让它直接跳过去,这样行得通吗?

goto不能跨函数指向的,就是用其他能跨函数的跳转,那么问题来了,你从TIM2跳转到main的while(1)中,接下去执行的内容都算是在TIM2的代码吧?那样这个中断执行的程序不就没有止境,程序永远跑不回正常的main里了?不知这样理解对不对
回复

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2017-7-1 09:29:09 来自手机 | 显示全部楼层
dipolo 发表于 2017-6-30 17:39
goto不能跨函数指向的,就是用其他能跨函数的跳转,那么问题来了,你从TIM2跳转到main的while(1)中,接下 ...

理论上是这样子的,所以还是推荐跑个系统这样子这个问题就很简单了
回复

使用道具 举报

6

主题

25

帖子

1

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2017-6-12
在线时间
28 小时
发表于 2017-7-1 12:51:45 | 显示全部楼层
一般来说,产品方案设计时,要力争避免使用高级技巧,这样容易出问题,建议你从方案角度,检查一下有没有办法避免。同样,操作系统设计,要以方便用户避免使用机巧。如果控制比较复杂,建议你选用一个操作系统。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 13:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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