Arduino: можно ли зацикливаться в цикле ()? - PullRequest
0 голосов
/ 04 ноября 2019

Мне интересно, есть ли какие-либо причины не выполнять цикл внутри функции loop().

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

Вот два способа сделать это с Arduino.

В следующем примере я не блокирую функцию loop():

const int PIN_LED = 2;
const int BLINKING_LIMIT = 1000;

int blinkCount = 0;

void setup() {
  // initialize serial:
  pinMode(PIN_LED, OUTPUT);
}

// Here, I make sure not to "lock" the loop() function
void loop() {
  blinkCount++;
  if (blinkCount < BLINKING_LIMIT) {
    digitalWrite(PIN_LED, HIGH);
    delay(200);
    digitalWrite(PIN_LED, LOW);
    delay(200);
  }
}

Во второмВо-первых, в функции loop() есть длинный цикл (который может длиться еще дольше). Arduino "заблокирован" внутри цикла for:

// Here, I make sure not to "lock" the loop() function
void loop() {

  for (int i = 0; i < BLINKING_LIMIT; i++) {
    digitalWrite(PIN_LED, HIGH);
    delay(200);
    digitalWrite(PIN_LED, LOW);
    delay(200);
  }
}

Какова лучшая практика? Должен ли я заботиться о том, чтобы не «заблокировать» функцию loop(), или мне просто все равно? Будет ли приемлем бесконечный цикл внутри функции loop()?

Ответы [ 4 ]

0 голосов
/ 05 ноября 2019

Если вы просто хотите, чтобы светодиод мигал, это не важно, но если вы хотите что-то добавить в свой код, поведение будет другим:

void loop() {
    blinkCount++;
    if (blinkCount < BLINKING_LIMIT) {
        digitalWrite(PIN_LED, HIGH);
        delay(200);
        digitalWrite(PIN_LED, LOW);
        delay(200);
    }
    //ANYTHING ELSE
}

В этой части ваш светодиод будет мигатьи остальная часть вашего кода будет выполняться каждые 400 мс примерно.

void loop() {
    for (int i = 0; i < BLINKING_LIMIT; i++) {
        digitalWrite(PIN_LED, HIGH);
        delay(200);
        digitalWrite(PIN_LED, LOW);
        delay(200);
    }
    //ANYTHING ELSE
}

В этой части ваш светодиод будет мигать "BLINKING_LIMIT" раз, и только после этого будет выполняться остальная часть вашего кода.

Просто будьте осторожны, если хотите что-то добавить.

0 голосов
/ 04 ноября 2019

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

0 голосов
/ 04 ноября 2019

loop() и setup() - это всего лишь две функции, определенные для Arduino. Он будет скомпилирован с основным кодом для вашей доски.

Код платы Arduino будет примерно таким:

void main()
{
  setup();
  for(;;) {
    loop();
  }
}

И у вас просто есть возможность написать код для setup и loop. Это как @Piglet сказал. Это ваш код, и вы можете написать его так, как хотите.

Вы не можете "заблокировать" цикл, поскольку он не является прерыванием и за вашим циклом нет операционной системы.

Один разцикл завершается, он снова вызывается автоматически. Таким образом, вы также можете написать:

void loop()
{
  for(;;) {
    // your code
  }
}

Если вам это нравится, цикл никогда не прекратится, и вы можете написать его как на процессоре 8051;)

0 голосов
/ 04 ноября 2019

Просто пофиг. Вложенные циклы - супер распространенная практика в программировании. Многие проблемы не могут быть эффективно решены без него.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...