Использование мьютексов для вызова отдельных задач nXc

Я новичок в использовании 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);
         }
    }

Любые мысли о том, как я могу улучшить это? Было бы лучше использовать подпрограммы вместо задач, и каковы преимущества использования подпрограмм или задач?

1 ответ

Вы не можете использовать вложенную функцию для получения той же переменной мьютекса, которая вызывает сбой в их задаче. Функция Acquire приостанавливает задачу до тех пор, пока не будет выпущена переменная mutex по этой ссылке, чтобы вы поняли, как работает инструмент. Извините, мой английский использовал Google Translate.:)

Другие вопросы по тегам