Будет ли функция задержки() в void SerialEvent() также останавливать код, выполняющийся в функции voidloop()?
Будет ли функция задержки() в void SerialEvent() также останавливать код, выполняющийся в функции voidloop()?
Речь идет об Arduino Uno.
@René, 👍1
2 ответа
Это основная функция ядра Arduino:
int main(void)
{
init();
initVariant();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
serialEventRun()
запускает функцию serialEvent()
, если она назначена,
так что да, задержка в SerialEventRun приведет к задержке цикла.
В процессоре Atmega328p Uno имеется только один процессор; он может делать только одно дело одновременно. Если он выполняет код функции SerialEvent(), то по определению он не выполняет код в функции цикла() или где-либо еще.
Из этого правила есть небольшое исключение: подпрограммы обслуживания прерываний запускаются на короткое время при возникновении соответствующих прерываний. Фактически, один из способов работы функции задержки() зависит от обновлений таймера, которые происходят в виде прерываний. (Другой способ — выполнить цикл, время выполнения которого точно известно, определенное количество раз).
Но процедуры обслуживания прерываний выполняют одно, очень короткое задание и возвращают процессор к тому, что он делал непосредственно перед этим (delay() в функции SerialEvent()), поэтому никакой другой пользовательский код не может быть выполнен до тех пор, пока задержка не закончится .
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату