Как разбить бесконечный цикл for (;;) в C?

У меня есть жизненный бесконечный цикл, который позволяет датчику продолжать обновлять свои значения. Однако я хотел бы разбить это на цикл, когда другой датчик вносит новые значения. Как я могу переключиться с одного бесконечного цикла на другой?

Текущий код:

for(;;){

    SON_Start();
    // Wait 65ms for max range time
    delay10ms(7);
    // Read Range
    i = SON_Read(SON_ADDRESSES[sonarReading]);
    // pause
    delayMs(100);
        if(i<15)
        drive(200, RadCW);

    }

Что я хотел бы добавить:

Если Sensor2 возвращает показание (например, Sensor2 > 20), то я хочу разбить цикл и перейти к другому циклу бесконечности для начала новой функции.

Ответ 1

Если вы ищете "переключение между двумя бесконечными циклами", он может быть "завернут" третьим контуром, и это "переключение" может быть выполнено простым break.

Но так как вы хотите, чтобы ваша программа однажды остановилась, этот цикл можно было бы разместить внутри функции, и вы могли бы использовать return; для ее завершения:

void myMagicLoop()
{
    for(;;)
    {
        for(;;)
        {
            if ( I should stop )
                return;

            if ( I should switch to second loop )
                break;
        }
        for(;;)
        {
            if ( I should stop )
                return;

            if ( I should switch back to first loop)
                break;
        }
    }
}

И где-то вы просто вызываете:

myMagicLoop();

Надеюсь, что это поможет.

Ответ 2

Это будет переключаться между циклом A и контуром B.

for (;;)
{
    // Loop  A
    for (;;)
    {
        if WANT_TO_SWITCH
        {
            break;
        }

    }

    // Loop  B
    for (;;)
    {

        if WANT_TO_SWITCH
        {
            break;
        }

    }
}

Ответ 3

Вы используете break;, чтобы разбить цикл и передать управление за пределы его конечной фигурной скобки. Например

for(;;) {
   if( whatever ) {
      break;
   }
}
//break gets you here

Ответ 4

Команда "break" должна делать то, что вам нужно?

Ответ 5

В качестве альтернативы вы можете рассмотреть возможность перезаписи с помощью подхода, управляемого событиями. Это, конечно, зависит от того, на что способно ваше оборудование, но по крайней мере вы должны иметь возможность создавать некоторые события таймера.

Тогда код будет выглядеть примерно так:

static volatile bool sensor_1_ready;
static volatile bool sensor_2_ready;

for(;;)
{
  switch(state_machine)
  {
    case READING_SENSOR_1:
      if(sensor_2_ready)
      {
        state_machine = READING_SENSOR_2;
      }
      else if(sensor_1_ready)
      {
        process sensor 1
      }
      break;

    case READING_SENSOR_2:

      if(!sensor_2_ready && some_timeout_etc)
      {
        state_machine = READING_SENSOR_1;
      }
      else if(sensor_2_ready)
      {
        process sensor 2
      }
      break;
  }
}

void callback_sensor_1 (void)  // some sort of interrupt or callback function
{
  sensor_1_ready = true;
}

void callback_sensor_2 (void)  // some sort of interrupt or callback function
{
  sensor_2_ready = true;
}

(Прежде чем комментировать переменные волатильности, обратите внимание, что волатильность там, чтобы предотвратить опасные оптимизации компилятора и не, чтобы служить в качестве некоторого защитного барьера/атомного доступа/памяти и т.д.)

Ответ 6

Лучший способ сделать это - изменить оператор for на что-то вроде:

for (; Sensor2 <= 20;) {
...

В качестве альтернативы вы можете изменить его из инструкции for в while:

while (Sensor2 <= 20) {
...

Если это не соответствует вашим потребностям, вы всегда можете использовать break.

Ответ 7

Другим вариантом может быть использование сигналов (SIGUSR1, SIGUSR2) для переключения из одного цикла в другой. Что-то в этом роде:

void sensor2(int signum)
{
   for (; ;)
      ...
      /* Need to process sensor 1 now */
      kill(pid, SIGUSR1);
}

void sensor1(int signum)
{
    for (; ;)
      ...
      /* Need to process sensor 2 now */
      kill(pid, SIGUSR2);
}


int main()
{
   /* register the signal handlers */
   signal(SIGUSR1,  sensor1);
   signal(SIGUSR2,  sensor2);
   ...
}