【问题标题】:Using mutexes to call separate tasks nXc使用互斥锁调用单独的任务 nXc
【发布时间】:2015-09-21 16:16:43
【问题描述】:

我是使用 nXc 为我的 NXT 2.0 机器人编码的新手,我需要它来跟随其他机器人并同时检查障碍物。但是,这两个任务有时会相互冲突,当我遇到障碍物时,它会将其视为对象并继续前进而不是停止。

我的项目目标:跟随领头机器人,遇到障碍物停下,障碍物清除后,继续跟随前面的领头机器人。

下面是我的代码:

    #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);
         }
    }

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

【问题讨论】:

  • 创建使用互斥锁但遇到问题的最小程序。然后贴出代码。没有代码,任何人都很难给出一个好的答案。
  • 你见过this page吗?它清楚地解释了何时应该使用互斥锁,并提供了一个示例。
  • 感谢您的回复!是的,我已经看过该页面,但我想确切地知道互斥锁是如何工作的,以及在子例程上使用互斥锁的好处,反之亦然。我已经在顶部编辑了我的代码!

标签: nxc


【解决方案1】:

您不能使用嵌套函数来获取导致任务崩溃的相同互斥变量。 Acquire 函数暂停任务,直到 mutex 变量被释放 this link 以阅读您了解该工具的工作原理。 对不起,我的英语使用了谷歌翻译。 :)

【讨论】:

  • 谢谢卢卡斯!这是否意味着我必须为每个任务定义不同的互斥变量?另外,如果我希望机器人同时做两件事(在这种情况下检查领导者并检查黑线),如果我不希望任务发生冲突,使用子例程或互斥锁会更好吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多