嵌入式学习小组
直播中

陈存楼

7年用户 1117经验值
私信 关注

ucos两个任务请求一个信号量的问题怎么解决

请教一下,用ucos实现这样的功能,按键按下,运行A任务,再按一下运行B任务,再按一下,又运行A任务,如此反复,  同时在A任务运行的过程中,按下按键,A任务停止运行,直接运行b任务,
我建了3个任务,按键任务,A,B任务,请问一个信号量,怎么给两个任务用了,代码如下
[AppleScript] 纯文本查看 复制代码
//任务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   时,分,秒,毫秒}}

回帖(4)

任斌

2020-5-22 10:47:19
你这个明显的是信号量来做任务同步的,肯定需要两个信号量
举报

刘平

2020-5-22 11:06:16
没看懂你为什么要用信号量.
A、B如果不是很占时间的话,
你A和Bwhile(1)里面先放个几百小时延时,在按键时分别调用OSTimeDlyResume(A/B)。
按一下使A就绪,再按一下使B就绪。
刚看到你写的要打断一个的运行,马上运行另一个 。
那是不是可以按键时改变任务优先级,使每次就绪的任务优先级变成高优先级。那如果优先级高并且就绪了,那应该能达到你的目的吧?
举报

李金云

2020-5-22 11:13:48
信号量应该是用来在哪请求在哪的后面释放。然后别的地方就可以用了。
就好比上厕所蹲坑,坑是共享资源。你进去把门一锁。用完了一开别人就可以用了,然后他进去一锁,其他人就等着门开。
你上面写的感觉不是信号量存在的意义。
举报

王文娥

2020-5-22 11:27:04
左工威武
举报

更多回帖

发帖
×
20
完善资料,
赚取积分