Come emerge da QUESTA discussione, nella sezione Inglese del forum, l'implementazione nel "core" Arduino R4 della funzione delay(), è errata e può dare adito a problemi ...
Fortunatamente però, la funzione è dichiarata con attributo "weak":
__attribute__((weak)) void delay(uint32_t ms)
... e quindi può essere facilmente ridefinita riscrivendola come nel "core" AVR (soluzione suggerita nella discussione che ho indicato).
Quindi, in un programma che debba girare su Arduino UNO R4 (Nano, Minima, WiFi) si può fare:
#if defined(ARDUINO_NANO_R4) || defined(ARDUINO_UNOR4_MINIMA) || defined(ARDUINO_UNOR4_WIFI)
void delay(unsigned long ms)
{
uint32_t start = micros();
while (ms > 0) {
yield();
while ( ms > 0 && (micros() - start) >= 1000) {
ms--;
start += 1000;
}
}
}
#endif
void setup() {
// put your setup code here, to run once:
delay(500);
// ...
}
void loop() {
// put your main code here, to run repeatedly:
// ...
}
Su quella discussione parlavano appunto della delay(), ma siccome il mio inglese fa relativamente schifo, sembra che venga usata appunto la funzione millis() male.
Comunque una conferma, vuol dire che la funzione delay() nel core delle schede R4 usa in realtà millis() e quindi, pur in modo sbagliato, non è bloccante come la funzione originale?
Oppure siccome è in una while risulta comunque bloccante?