# FreeRTOS compatibile con Arduino R4 UNO WIFI?

**URL:** <https://forum.arduino.cc/t/freertos-compatibile-con-arduino-r4-uno-wifi/1209322>\
**Category:** Software\
**Created:** [January 10, 2024, 9:54am UTC](https://forum.arduino.cc/t/freertos-compatibile-con-arduino-r4-uno-wifi/1209322 "2024-01-10T09:54:33Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![skelos](https://avatars.discourse-cdn.com/v4/letter/s/839c29/32.png) [@skelos](https://forum.arduino.cc/u/skelos)\
**Post date:** [January 10, 2024, 9:54am UTC](https://forum.arduino.cc/t/freertos-compatibile-con-arduino-r4-uno-wifi/1209322/1 "2024-01-10T09:54:33Z")

</div>

Ciao ragazzi,  
scusate ma ho un dubbio espresso sinteticamente nel titolo.

Ho scritto il codice che incollo di seguito per testare con la scrittura sulla seriale due banalissimi task : compila, fa l'upload su Arduino ma non mi va...  
Tutto quello che fa è dirmi "Pronto!" come da messaggio nel setup ma non mostra nessun messaggio dei due task. Quello che mi aspetto è che mi mostri messaggi sulla seriale con le cadenze imposte nei task.

Su [git hub](https://github.com/feilipu/Arduino_FreeRTOS_Library) trovo le referenze della compatibilità e la da per ok con Arduino UNO R3. Io suppongo che Arduino R4 Wifi sia retrocompatibile con la R3.

Ho sbagliato qualcosa nel codice oppure FreeRTOS non è compatibile con R4 Wifi?

```arduino
#include <Arduino_FreeRTOS.h>

void Notifiche(void *parms);
void Misura(void *parms);

void setup() {

  Serial.begin(9600);  
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB, on LEONARDO, MICRO, YUN, and other 32u4 based boards.
  }

  Serial.println("Pronto!");

  // put your setup code here, to run once:
  // Priorità più è alta più è la priorità
  xTaskCreate(Notifiche, "Notifiche", 128, NULL, 2, NULL);
  xTaskCreate(Misura, "Misura", 128, NULL, 1, NULL);
}

void loop() {
  // put your main code here, to run repeatedly:

}

void Notifiche(void *parms){    
  Serial.println("Notifichem one shot");
  while(true){
      Serial.println("Notifiche");
      vTaskDelay(1000/portTICK_PERIOD_MS);
  }
};

void Misura(void *parms){
  Serial.println("Misura one shot");
  while(true){
    Serial.println("Misura");
    vTaskDelay(2000/portTICK_PERIOD_MS);
  }
};

```

Avreste un'idea sul cosa sto sbagliando

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [January 10, 2024, 10:23am UTC](https://forum.arduino.cc/t/freertos-compatibile-con-arduino-r4-uno-wifi/1209322/2 "2024-01-10T10:23:04Z")

</div>

> [@skelos](#):
>
> Avreste un'idea sul cosa sto sbagliando

SI, non aver guardato gli esempi della libreria specifica per UNO R4 che, pur avendo lo stesso nome di quella fatta per AVR da Phillip Stevens (feilipu), in realtà **è diversa** e va usata in altro modo (_è molto più vicina alla realtà di FreeRTOS™_).

Quindi, nell'IDE, guarda gli esempi specifici per la UNO R4, troverai un esempio di FreeRTOS™ in cui vedrai come si deve scrivere il codice.

Guglielmo

_P.S.: E t'assicuro che funziona bene dato che ci sto sviluppando un nuovo corso di FreeRTOS™ (prima li basavo su PIC32 e su AVR ATmega1284)._

---

<div class="post-metadata">

**Author:** ![skelos](https://avatars.discourse-cdn.com/v4/letter/s/839c29/32.png) [@skelos](https://forum.arduino.cc/u/skelos)\
**Post date:** [January 11, 2024, 1:08pm UTC](https://forum.arduino.cc/t/freertos-compatibile-con-arduino-r4-uno-wifi/1209322/3 "2024-01-11T13:08:22Z")

</div>

Ciao,  
sto provando FreeRTOS e per ora sta funzionando bene!  
Grazie soprtatutto a Gugliemo e ai suoi sempre validi consigli.

Non im torna però una cosa: non mi si aggiorna l'RTC nonostante invochi l'apposito metodo:

```arduino
void temperatura_thread_func(void *pvParameters)
{
  Serial.println("Thread temperatura_thread_func setup ...");

  for(;;)
  {
    // Misura e aspetta
    bmx280.measure();
    do{
      delay(100);
    }while(!bmx280.hasValue());

    // Ricalcolo valori temporali
    rtc.refresh();
    int yy = rtc.year();
    int mm = rtc.month();
    int dd = rtc.day();
    int hh = rtc.hour();
    int mi = rtc.minute();
    int ss = rtc.second();

       // Mostra misure e stati 
    Serial.print("Pr. : ");
    Serial.print(bmx280.getPressure());
    Serial.print(" Temp. : ");
    Serial.print(bmx280.getTemperature());
    Serial.print(" orario: ");
    Serial.print(pad2(hh));Serial.print(":");Serial.print(pad2(mm));Serial.print(":");Serial.print(pad2(hh));
    Serial.println("");

    vTaskDelay(configTICK_RATE_HZ*intervallo_di_rilevazione_secondi); // intervallo_di_rilevazione_secondi secondi

  }
}

```

Ma il risultato è :

Starting scheduler ...  
Thread temperatura\_thread\_func setup ...  
Pr. : 99859.00 Temp. : 23.53 orario: **14:01:14**  
Pr. : 99861.00 Temp. : 23.50 orario: **14:01:14**  
Pr. : 99860.00 Temp. : 23.47 orario: **14:01:14**  
Pr. : 99859.00 Temp. : 23.45 orario: **14:01:14**

E come vedete l'oraio è sempre lo stesso.

Non è la pila, ho caricato uno sketch tradizionale (senza FreeRTOS) ed il valore viene aggiornato...

Ho provato a fare un thread che si occupa solo di aggiornare il timer ma mi dà un eccezione...

Avete qualche idea?

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [January 11, 2024, 1:53pm UTC](https://forum.arduino.cc/t/freertos-compatibile-con-arduino-r4-uno-wifi/1209322/4 "2024-01-11T13:53:22Z")

</div>

> [@skelos](#):
>
> Non im torna però una cosa: non mi si aggiorna l'RTC nonostante invochi l'apposito metodo:

Ma che libreria RTC stai usando? La UNO R4 WiFi [ha la sua apposita libreria per il RTC](https://docs.arduino.cc/tutorials/uno-r4-wifi/cheat-sheet#rtc) incorporato nella MCU e ... funziona correttamente sotto FreeRTOS (_la sto usando_).

Guglielmo

---

<div class="post-metadata">

**Author:** ![skelos](https://avatars.discourse-cdn.com/v4/letter/s/839c29/32.png) [@skelos](https://forum.arduino.cc/u/skelos)\
**Post date:** [January 11, 2024, 1:55pm UTC](https://forum.arduino.cc/t/freertos-compatibile-con-arduino-r4-uno-wifi/1209322/5 "2024-01-11T13:55:21Z")

</div>

Ciao,  
come RTC ho un DS3231 (perchè mi scoccia doverlo reinizializzare ogni volta che ricompilo e faccio upload e quindi ho preso quello con la pila) e libreria la uRTCLib.

Provo a cambiare la libreria (e riscrivere leggendo gli esempi prima... 😅 😉 )?

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [January 11, 2024, 2:11pm UTC](https://forum.arduino.cc/t/freertos-compatibile-con-arduino-r4-uno-wifi/1209322/6 "2024-01-11T14:11:58Z")

</div>

> [@skelos](#):
>
> come RTC ho un DS3231 (perchè mi scoccia doverlo reinizializzare ogni volta che ricompilo e faccio upload e quindi ho preso quello con la pila)

... e a cosa pensi che serva il pin VRTC che è sul connettore a 3 pin? A collegare una pila ed ad alimentare il RTC interno quando scolleghi l'alimentazione 🙄

Guglielmo

---

<div class="post-metadata">

**Author:** ![skelos](https://avatars.discourse-cdn.com/v4/letter/s/839c29/32.png) [@skelos](https://forum.arduino.cc/u/skelos)\
**Post date:** [January 11, 2024, 2:32pm UTC](https://forum.arduino.cc/t/freertos-compatibile-con-arduino-r4-uno-wifi/1209322/7 "2024-01-11T14:32:31Z")

</div>

WOW! Cavolo... mi manca ancora un pò di studio. 😞 Non lo sapevo. Ora vedo di documentarmi per capire come collegarla.  
Grazie ancora Guglielmo.

---

<div class="post-metadata">

**Author:** ![skelos](https://avatars.discourse-cdn.com/v4/letter/s/839c29/32.png) [@skelos](https://forum.arduino.cc/u/skelos)\
**Post date:** [January 11, 2024, 2:49pm UTC](https://forum.arduino.cc/t/freertos-compatibile-con-arduino-r4-uno-wifi/1209322/8 "2024-01-11T14:49:52Z")

</div>

> [@skelos](#):
>
> `Serial.print(pad2(hh));Serial.print(":");Serial.print(pad2(mm));Serial.print(":");Serial.print(pad2(hh));`

Ho trovato due errori nel mio codice (proprio quello che ho postato sopra qui!).  
Funziona anche con il DS3231...  
Scusatemi.

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [January 11, 2024, 2:53pm UTC](https://forum.arduino.cc/t/freertos-compatibile-con-arduino-r4-uno-wifi/1209322/9 "2024-01-11T14:53:09Z")

</div>

> [@skelos](#):
>
> Funziona anche con il DS3231...

Sicuramente, ma ... perché duplicare l'hardware quando esiste già integrato nella MCU? 🙄

Guglielmo

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [January 11, 2024, 7:15pm UTC](https://forum.arduino.cc/t/freertos-compatibile-con-arduino-r4-uno-wifi/1209322/10 "2024-01-11T19:15:26Z")

</div>

> [@gpb01](#):
>
> ... **perché duplicare l'hardware** quando esiste già integrato nella MCU?

... dopo un po' di ricerche, mi rispondo da solo ... **per avere la dovuta precisione** che invece il RTC della UNO R4 non può offrire dato che ... NON hanno previsto il cristallo esterno da 32768 KHz e si sono invece affidati all'oscillatore interno "LOCO" che però, da prove effettuate, può sbagliare anche +/- 1 sec. al minuto 😮

Guglielmo

---

<div class="post-metadata">

**Author:** ![skelos](https://avatars.discourse-cdn.com/v4/letter/s/839c29/32.png) [@skelos](https://forum.arduino.cc/u/skelos)\
**Post date:** [January 12, 2024, 10:05am UTC](https://forum.arduino.cc/t/freertos-compatibile-con-arduino-r4-uno-wifi/1209322/11 "2024-01-12T10:05:10Z")

</div>

Per la miseria! E' tantissimo 1 sec/min.

Grazie per aver condiviso, ancora un volta, la tua conoscenza.

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [January 12, 2024, 10:22am UTC](https://forum.arduino.cc/t/freertos-compatibile-con-arduino-r4-uno-wifi/1209322/12 "2024-01-12T10:22:33Z")

</div>

> [@skelos](#):
>
> Per la miseria! E' tantissimo 1 sec/min.

Allora, entro un certo limite, è possibile aggiustare (_sperimentalmente_) la cosa in funzione della propria scheda ...

... libreria RTC della UNO R4, file RTC.cpp, [linea 455](https://github.com/arduino/ArduinoCore-renesas/blob/031f36ed732dea8034d0bd7325c79ec88b726548/libraries/RTC/src/RTC.cpp#L455), è la seguente:

`.freq_compare_value_loco = 255,`

... ecco aumentando o diminuendo leggermente quel valore si può correggere l'errore, ma, di certo, NON si arriva mai alla precisione di un oggetto con il quarzo o meglio di un oggetto come il DS3231.

Però, se si ha accesso a internet, minimizzando l'errore, si può tenere il RTC piuttosto preciso, aggiornandolo, es. ogni 24H, con l'ora che si preleva dalla rete via NTP ;)

Guglielmo

P.S.: Solo per puntualizzare, quel campo è un uint32\_t: `uint32_t freq_compare_value_loco;` che si trova definito dentro **FspTransfer.h** nel "core". Mi raccomando solo di fare piccole variazioni, qualche unità, non decine 😁

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [July 10, 2024, 10:22am UTC](https://forum.arduino.cc/t/freertos-compatibile-con-arduino-r4-uno-wifi/1209322/13 "2024-07-10T10:22:48Z")

</div>

Closed on July 10, 2024, 10:22am UTC

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.
