OpenEdv-开源电子网

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

求问如何使几个无限循环程序可以互相打断?

[复制链接]

1

主题

10

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-3-21
在线时间
8 小时
发表于 2019-4-19 15:20:52 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 Ane 于 2019-4-19 18:50 编辑

新人第一次发帖,学STM32没多久,原子的教程里很多实验还没看。

现在想编一个程序能够实现:有3种模式,每个都是一个无限循环程序,想让这3种模式可以互相打断。
求问有没有可能做到以及怎样可以做到?
(几个模式就当是通过按键来选择吧)
中断和UCOS都是有优先级的,不能做到互相打断吧。

提前感谢各位的指导!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-3-21
在线时间
8 小时
 楼主| 发表于 2019-4-19 15:48:54 | 显示全部楼层
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-19 15:52:17 | 显示全部楼层
还没看就看,看完估计你就不会有这个需求了
回复

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5265
金钱
5265
注册时间
2012-8-25
在线时间
1025 小时
发表于 2019-4-19 16:20:32 | 显示全部楼层
不是每个任务本来就是无限循环的吗?  你才3个,系统至少支持上百个吧.
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-3-21
在线时间
8 小时
 楼主| 发表于 2019-4-19 18:42:59 | 显示全部楼层
nashui_sx 发表于 2019-4-19 15:52
还没看就看,看完估计你就不会有这个需求了

你好,可以稍稍指点下吗?应该使用什么方法处理
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-3-21
在线时间
8 小时
 楼主| 发表于 2019-4-19 18:46:47 | 显示全部楼层
本帖最后由 Ane 于 2019-4-19 20:46 编辑
gotofly21 发表于 2019-4-19 16:20
不是每个任务本来就是无限循环的吗?  你才3个,系统至少支持上百个吧.

不太明白呀
我的3个任务都是无限循环,比如先让任务1运行了,然后要调出任务2,于是任务2执行了,这样就是2打断了1,但是还想让1打断2、1打断3、3打断1、2打断3、3打断2。我看UCOS的是有优先级的,能用UCOS吗
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-19 19:26:46 | 显示全部楼层
本帖最后由 nashui_sx 于 2019-4-19 19:29 编辑
Ane 发表于 2019-4-19 18:42
你好,可以稍稍指点下吗?应该使用什么方法处理

假如能容忍执行完这当前循环再切换,这样最简单
volatile u8 zhuangtai=0;
void 中断函数(void)
{
    zhuangtai=x;
}
void main(void)
{
       while(1)
       {
                while(zhuangtai==0)
                {
                 //循环0

                }        
                while(zhuangtai==1)
                {
                 //循环1
                        
                }               
                 while(zhuangtai==2)
                {
                 //循环2
                        
                }  
       }                              
}

回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-3-21
在线时间
8 小时
 楼主| 发表于 2019-4-19 20:46:07 | 显示全部楼层
nashui_sx 发表于 2019-4-19 19:26
假如能容忍执行完这当前循环再切换,这样最简单
volatile u8 zhuangtai=0;
void 中断函数(void)

您的程序给了我很大启发,但是有些地方不明白:1、“容忍执行完这当前循环”是什么意思?循环是无限循环,永远也执行不完吧。2、另外不太明白程序中 中断函数里的zhuangtai=x, 这是把x赋给zhaugntai吗?

我按2中理解将按键中断实验的一个按键中断服务程序修改成如下://外部中断4服务程序
void EXTI4_IRQHandler(void)
{
        u8 mode;
        delay_ms(10);        //消抖
        if(KEY0==0)         
        {                                 
                mode=1;
                EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中断标志位
        }                           
}



其他按键的中断服务程序类似,主函数如下:
int main(void)
{
        u8 mode;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);    //初始化延时函数
        uart_init(115200);         //串口初始化
        LED_Init();                                  //初始化LED端口  
        EXTIX_Init();       //初始化外部中断输入
        LED0=0;                                            //先点亮红灯
        LED1=0;
       
        while(1)
        {
//          printf("OK\r\n");        //打印OK提示程序运行
//                delay_ms(1000);          //每隔1s打印一次
               
                while(mode==1)
                {
                        MOVEFORWARD();
                }
                while(mode==2)
                {
                        TURNLEFT();
                }
                while(mode==3)
                {
                        TURNRIGHT();
                }
                while(mode==4)
                {
                        STOP();
                }
        }
}



然后按键并没有反应。。。

好晕,这样怎么实现几个无限循环相互打断呢
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-20 09:22:45 | 显示全部楼层
Ane 发表于 2019-4-19 20:46
您的程序给了我很大启发,但是有些地方不明白:1、“容忍执行完这当前循环”是什么意思?循环是无限循环 ...

看你这四个小车肯定能容忍这行完这个循环,因为执行完while里面的函数才会判断mode是否退出,不能容忍的意思就是还在执行while里面的函数,mode改变就想退出,那样要上系统,把当前任务挂起,执行别的任务

再说一个小车这个简单的逻辑就要这样while套while,不是个号习惯

你写的代码思路实现你想要的没问题,先调试按键,看看每次按能不能串口打印出来按键,可以的话 主函数没啥问题
回复

使用道具 举报

24

主题

119

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2610
金钱
2610
注册时间
2017-4-4
在线时间
344 小时
发表于 2019-4-20 09:43:02 | 显示全部楼层
直接在while循环里边嵌套switch语句就可以了。如果满足就每次都循环执行case里的语句,不满足我就执行其他模式。
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2019-4-20 09:50:39 | 显示全部楼层
Ane 发表于 2019-4-19 18:46
不太明白呀
我的3个任务都是无限循环,比如先让任务1运行了,然后要调出任务2,于是任务2执行了 ...

优先级设一样不就行了。。。还有。只有中断才能打断用户进程,ucos的那个是任务自动放弃CPU,叫做任务切换。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-3-21
在线时间
8 小时
 楼主| 发表于 2019-4-20 18:46:38 | 显示全部楼层
谢谢各位大佬的指点,我花时间消化思考下(`・ω・′)ゞ(`・ω・′)ゞ(`・ω・′)ゞ
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-3-21
在线时间
8 小时
 楼主| 发表于 2019-5-13 11:00:12 | 显示全部楼层
用条件判断如if(……)+break可以跳出while循环(一种模式),再经过switch选择到其它模式。

(做的不是小车,要让电机正转反转循环,所以while不可避免)
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 19:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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