首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用互斥锁调用独立的任务nXc

使用互斥锁调用独立的任务nXc
EN

Stack Overflow用户
提问于 2015-09-22 00:16:43
回答 1查看 293关注 0票数 0

我刚开始使用nXc编写我的NXT2.0机器人的代码,我需要它来跟踪其他机器人并同时检查障碍物。然而,这两个任务有时会相互冲突,当我遇到障碍时,它会将其视为一个对象,并继续前进,而不是停止。

我的项目目标:跟随一个领导者机器人,当它遇到障碍物时停止,在障碍物被清除后,继续跟随它前面的领导者机器人。

下面是我的代码:

代码语言:javascript
复制
    #define NEAR 50
    #define TURNTIME 540
    #define MOVETIME 1000

    mutex moveMutex;

    //check for robot in front of it
    task check_robot(void)
    {
         while(true)
         {
             if (SensorUS(IN_2)<=NEAR)
             {
                 Acquire(moveMutex);
                 OnFwd(OUT_BC,50);  //if it is within range of 50cm, move
                 Release(moveMutex);
             }
             if (SensorUS(IN_2)>NEAR)
             {
                 Acquire(moveMutex);  //this section allows the robot to turn
                 OnFwd(OUT_C,50);     //left and right to look for the 
                 Wait(TURNTIME);      //leader
                 OnRev(OUT_B,50);
                 Wait(TURNTIME);
                 OnRev(OUT_C,50);
                 Wait(TURNTIME);
                 OnFwd(OUT_B,50);
                 Wait(TURNTIME);
                 if (SensorUS(IN_2)<=NEAR)
                 {
                      Acquire(moveMutex);
                      OnFwd(OUT_BC,50);   //if it finds the leader, it moves
                      Release(moveMutex);
                 }
                 else
                 {
                      Acquire(moveMutex);
                      OnFwd(OUT_C,50);       //repeats the search process
                      Wait(TURNTIME);
                      OnRev(OUT_B,50);
                      Wait(TURNTIME);
                      OnRev(OUT_C,50);
                      Wait(TURNTIME);
                      OnFwd(OUT_B,50);
                      Wait(TURNTIME);
                      Release(moveMutex);
                 }
             }
             Release(moveMutex);
         }
    }

    task check_obstacles(void)
    {
         Acquire(moveMutex);
         until(((SENSOR_1)==1)||((SENSOR_3)==1));   //when any one of the
         OnRev(OUT_BC,50);                          //touch sensors are
         Wait(1000);                                //pressed, it is supposed
         Off(OUT_BC);                               //to stop until both
         until(((SENSOR_1)==0)&&((SENSOR_3)==0));   //are released, then
         OnFwd(OUT_BC,50);                          //continue moving
         Release(moveMutex);
    }

    task main(void)
    {
         SetSensorTouch(IN_1);
         SetSensorUltrasonic(IN_2);
         SetSensorTouch(IN_3);
         SetSensorColorFull(IN_4);

         while(true)
         {
             Precedes(check_robot,check_obstacles);
         }
    }

对如何改进这一点有什么想法吗?使用子例程而不是任务会更好吗?使用子例程或任务的好处是什么?

EN

回答 1

Stack Overflow用户

发布于 2015-09-27 12:49:00

您不能使用嵌套函数来获取导致其任务崩溃的同一互斥变量。acquire函数会挂起任务,直到互斥变量被释放。这个link读懂了这个工具是如何工作的。对不起,我的英语使用了谷歌翻译。:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32699978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档