Будет ли функция задержки() в void SerialEvent() также останавливать код, выполняющийся в функции voidloop()?

Будет ли функция задержки() в void SerialEvent() также останавливать код, выполняющийся в функции voidloop()?

Речь идет об Arduino Uno.

, 👍1


2 ответа


1

Это основная функция ядра Arduino:

int main(void)
{
    init();

    initVariant();

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

    setup();

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

    return 0;
}

serialEventRun() запускает функцию serialEvent(), если она назначена, так что да, задержка в SerialEventRun приведет к задержке цикла.

,

0

В процессоре Atmega328p Uno имеется только один процессор; он может делать только одно дело одновременно. Если он выполняет код функции SerialEvent(), то по определению он не выполняет код в функции цикла() или где-либо еще.

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

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

,