OpenEdv-开源电子网

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

ucos 两个任务请求一个信号量的问题

[复制链接]

7

主题

54

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1020
金钱
1020
注册时间
2015-12-8
在线时间
446 小时
发表于 2017-8-25 15:59:00 | 显示全部楼层 |阅读模式
5金钱
请教一下,用ucos实现这样的功能,按键按下,运行A任务,再按一下运行B任务,再按一下,又运行A任务,如此反复,  同时在A任务运行的过程中,按下按键,A任务停止运行,直接运行b任务,
我建了3个任务,按键任务,A,B任务,请问一个信号量,怎么给两个任务用了,代码如下
[mw_shl_code=applescript,true]//任务1的任务函数
void task1_task(void *p_arg)    //  按键任务  有限级4
{
        u8 key;
//        u8 num;
        OS_ERR err;
        while(1)
        {
      key=KEY_Scan(0);          //得到键值
                   if(key)
                {                                                  
                  switch(key)
                  {                                 
                               
                     case KEY1_PRES:        //控制LED1翻转
                        //  OSTaskSemPost(&Task2_TaskTCB,OS_OPT_POST_NONE,&err);        //使用系统内建信号量向任务task2发送信号量
                                                          OSSemPost (&MY_SEM,OS_OPT_POST_ALL,&err);//发送全局信号量   all所有任务都发送 1 最高任务
//                           LED0=1;
//                                                   LED1=1;
//                        
                             break;
//                     case KEY2_PRES:        //控制LED1翻转         
//                          LED1=0;
//                                         OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s   时,分,秒,毫秒
//                                      LED2=0;
//                                         OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s   时,分,秒,毫秒
//                                                  LED3=0;
//          OSTimeDlyHMSM(0,0,3,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s   时,分,秒,毫秒               
//                     break;
                                     default: break;
                               
                   }
      }       
               
               

                OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err);                   //延时10ms
        }
}

//任务2的任务函数
void task2_task(void *p_arg)                             //点亮小灯任务 优先级6
{       
//        static u8 num;
        OS_ERR err;
        while(1)
        {
                //OSTaskSemPend(0,OS_OPT_PEND_BLOCKING,0,&err);                //请求任务内建的信号量   请求信号量
                OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);         //请求信号量 timeout为0一直等待下去,直到信号量出现
                num1++;
//       
        {       
                LED1 = 0;
                OSTimeDlyHMSM(0,0,2,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s   时,分,秒,毫秒
                LED0 = 0;
                OSTimeDlyHMSM(0,0,2,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s   时,分,秒,毫秒
                LED2 = 0;
                OSTimeDlyHMSM(0,0,2,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s   时,分,秒,毫秒
                LED3 = 0;
        }
//        else
//        {
//       
//         LED0 = 1;
//         LED1 = 1;
//         LED2 = 1;
//         LED3 = 1;
//        }
       
          OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s   时,分,秒,毫秒
        }
}

void task0_task(void *p_arg)                      //关闭小灯任务 优先级5
{       
//        static u8 num;
        OS_ERR err;
        while(1)
        {
        OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);         //请求信号量 timeout为0一直等待下去,直到信号量出现
                num2++;  // MY_SEM.Ctr


{
       
         LED0 = 1;
         LED1 = 1;
         LED2 = 1;
         LED3 = 1;
        }
        OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s   时,分,秒,毫秒
        }
}[/mw_shl_code]

最佳答案

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

你这个明显的是信号量来做任务同步的,肯定需要两个信号量
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-8-25 15:59:01 | 显示全部楼层
你这个明显的是信号量来做任务同步的,肯定需要两个信号量
开往春天的手扶拖拉机
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2017-8-25 17:05:16 | 显示全部楼层
本帖最后由 jiutianshenjian 于 2017-8-25 17:15 编辑

没看懂你为什么要用信号量.
A、B如果不是很占时间的话,
你A和Bwhile(1)里面先放个几百小时延时,在按键时分别调用OSTimeDlyResume(A/B)。
按一下使A就绪,再按一下使B就绪。

刚看到你写的要打断一个的运行,马上运行另一个 。
那是不是可以按键时改变任务优先级,使每次就绪的任务优先级变成高优先级。那如果优先级高并且就绪了,那应该能达到你的目的吧?
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2017-8-25 17:11:44 | 显示全部楼层
信号量应该是用来在哪请求在哪的后面释放。然后别的地方就可以用了。
就好比上厕所蹲坑,坑是共享资源。你进去把门一锁。用完了一开别人就可以用了,然后他进去一锁,其他人就等着门开。
你上面写的感觉不是信号量存在的意义。
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2017-8-25 17:43:42 | 显示全部楼层
左工威武
小小蜗牛
回复

使用道具 举报

14

主题

112

帖子

0

精华

高级会员

Rank: 4

积分
500
金钱
500
注册时间
2017-4-25
在线时间
110 小时
发表于 2017-9-14 18:39:49 | 显示全部楼层
正准备说用uc/os实验下,这个思路蛮好的!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 13:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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