FreeRTOS compatibile con Arduino R4 UNO WIFI?

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 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?

#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

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).

1 Like

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:

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?

Ma che libreria RTC stai usando? La UNO R4 WiFi ha la sua apposita libreria per il RTC incorporato nella MCU e ... funziona correttamente sotto FreeRTOS (la sto usando).

Guglielmo

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... :sweat_smile: :wink: )?

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

Guglielmo

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

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

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

Guglielmo

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

Guglielmo

1 Like

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

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

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, è 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 :wink:

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 :grin:

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