Какие функции фреймворка Arduino потерпят неудачу, если я использую свой собственный бесконечный цикл вместо стандартного loop()?

loop

У меня есть сильное желание заменить предоставленную фреймворком функцию loop() моей собственной, например так:

__attribute__((always_inline)) inline void fastLoop()
{
}

void setup()
{
   // Выполнение настройки здесь...
   Serial.begin(115200);

   // Теперь зацикливаемся
   for(;;)
      fastLoop();
}

Таким образом, мой цикл встроен, и я экономлю довольно много циклов, избегая не только затрат на обслуживание Arduino, но и стоимости вызова функции, которая даже для функции void должна составлять не менее 6 циклов на AVR (> =2 для RCALL и 4 для RET).

Это код фреймворка для вызова loop() из main():

for (;;) {
    loop();
    if (serialEventRun) serialEventRun();
}

Мой вопрос: что делает этот материал serialEvent? Какие функции платформы перестанут работать должным образом с моим собственным циклом?

Конечно, при условии, что мой цикл имеет наблюдаемые побочные эффекты, как того требует стандарт C++ (иначе его можно оптимизировать).

, 👍0


1 ответ


1

Это зависит от того, на какой "Arduino" вы его используете.

Например, на Arduino Uno не будет работать только система SerialEvent. Все остальное, что имеет значение, — это прерывания.

Вот main() на ядре Arduino AVR:

int main(void)
{
    init();

    initVariant();

#if defined(USBCON)
    USBDevice.attach();
#endif

    setup();

    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }

    return 0;
}

Как видите, loop() запускается точно так же, как ваш fastLoop(), только не inline, и добавление в вызове serialEventRun(), если он был определен.

Если обработчики последовательных событий не определены, то он там все равно ничего не сделает.

Чтобы сэкономить тактовые циклы, вы получите больше преимуществ (пока вы не хотите использовать millis(), delay(), последовательную связь и т. д.) от отключения прерываний.

Однако на ESP32 или ESP8266 вы обнаружите, что ваш сторожевой таймер истекает и сбрасывает устройство. Это связано с тем, что он полагается на код, который регулярно запускается для управления WiFi-соединением, которое продолжает «пинать собаку». Без его выполнения (которое можно вызвать, вызвав функцию yield()) время ожидания сторожевого таймера истекает.

,

Я не вижу редактирования вопроса. но ваш ответ выглядит так, как будто вы его не дочитали до конца, @Juraj

@Juraj Мне нужно было пойти поесть., @Majenko