Arduino UNO R4 - funzione delay()

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 ... :roll_eyes:

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:
  // ...
}

... correggendo così il problema :slight_smile:

Guglielmo

2 Likes

Stesso discorso anche per millis() e micros()?

Su quella discussione parlavano appunto della delay(), ma siccome il mio inglese fa relativamente schifo, sembra che venga usata appunto la funzione millis() male.

Ma cosa c’entra millis() con la delay()?

... viene usata (male) per scrivere la funzione delay() ... basta che guardi l'inizio della discussione:

__attribute__((weak)) void delay(uint32_t ms)
{
  auto const start = millis();
  auto const stop = start + ms;
  while(millis() < stop) yield();
}

Guglielmo

Quindi paradossalmente millis() dovrebbe essere implementata correttamente, si spera.

Modo implicito per non usare delay()! :rofl: :neutral_face:

In realtà si tratta del primo passo per l’eliminazione definitiva della funzione delay()

:rofl: :wink:

... subdolo :smiling_face_with_horns:

Guglielmo

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?

Ai fini pratici, dal punto di vista dell’utente è comunque bloccante.

TUTTI i "core" Arduino, per la funzione delay(), usano millis() in modo bloccante.

Guglielmo