Go Down

Topic: Funzionamento micros() ed errore su variabile ... (Read 317 times) previous topic - next topic

pgiagno

Mi sembra strano...
E in effetti lo è.

A questo punto credo che sia necessario conoscere ESATTAMENTE il modello di ESP32 dell'OP.

Poi sperare che qualcun altro con lo stesso modello posti i risultati ottenuti.

È come se le istruzioni Serial.print e Serial.println bloccassero l'incremento di micros().

Ciao,
P.

gpb01

#16
Aug 19, 2019, 08:43 am Last Edit: Aug 19, 2019, 08:43 am by gpb01
È come se le istruzioni Serial.print e Serial.println bloccassero l'incremento di micros().
Non bloccano nulla, ma, visto che lui le ha messe nel lopp() in cui calcola micros(), introducono, come ho già detto, ritardi variabili in funzione di ciò che devono stampare.

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

Per fare una prova che abbia un senso occorrono due variabili, t1 e t2 ... acquisisce t1, fa il delay(1000), acquisisce t2 e stampa la differenza tra t2-t1 ... solo così si evitano ritardi dovuti da altre cose.

Guglielmo
Search is Your friend ... or I am Your enemy !

pgiagno

Verissimo, ma nè Standardoil né io riusciamo a spiegarci i risultati pubblicati nel post #6.

Quelli del nano sono corretti (introducono circa 430 microsecondi ad ogni ciclo), quelli dell'ESP32 sembra che non introducano ritardi ad ogni ciclo.

Interessante.

Ciao,
P.

gpb01

#19
Aug 19, 2019, 08:52 am Last Edit: Aug 19, 2019, 08:52 am by gpb01
Ricorda che ESP in realtà gira con FreeRTOS™ e che la tua applicazione è un task del sistema ... :)

Guglielmo
Search is Your friend ... or I am Your enemy !

Claudio_FF

#20
Aug 19, 2019, 09:25 am Last Edit: Aug 23, 2019, 11:48 pm by Claudio_FF
E inoltre la CPU dell'ESP è *molto* più veloce, i ritardi accumulati potrebbero non vedersi, ma per agevolare i processi in background esterni alla propria applicazione ho letto che nel proprio loop è bene inserire un piccolo delay di qualche millisecondo.

Secondo me si dovrebbero vedere valori congruenti su entrambe le architetture con questo esempio che, salvo un jitter di qualche millisecondo che non si accumula, mediamente stampa esattamente una volta al secondo.
Code: [Select]
uint32_t t0;
uint32_t t1;


void loop()
{
    t0 = micros();

    if (t0 - t1 >= 1000000)
    {
        t1 += 1000000;
        Serial.println(t0);  // una volta al secondo +/- jitter
    }

    delay(5);
}
Una domanda ben posta è già mezza risposta.

Stilita

#21
Aug 19, 2019, 10:14 am Last Edit: Aug 19, 2019, 10:19 am by Stilita
Ho provato a fare questo programma, che dovrebbe fare la media di 10000 iterazioni, per aumentare la risoluzione, ma con Nano da 21336 e con Esp32 46420.

Dai risultati che posto ci devono essere alcuni errori...mah.
Uso ESP-wroo-32

Code: [Select]
unsigned long tim;

void setup() {
  Serial.begin(115200);
  Serial.println("stampa iniziale");    // gli faccio fare una stampata a vuoto, per inizializzare l'ESP32.
}
void loop() {
  for (long t = 0; t < 9999; t++) {    //10000 iterazioni per aumentare la risoluzione
    tim = tim + micros();              //accumulo i micro()
}
  tim = tim / 10000;                    //e li divido per 10000, media
  Serial.println(tim);                  // li stampo
  for (; ;);
}

  
Probabilmente l'errore sta che i micro() si dovrebbero azzerare ad ogni ciclo, ma in ogno caso il risultato strano è che il Nano ha dei tempi inferiori.
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

gpb01

... io ancora NON ho capito tu cosa vuoi misurare. Magari se spieghi esattamente cosa vuoi fare vediamo di fare la misura esatta ... ::)

Guglielmo
Search is Your friend ... or I am Your enemy !

Stilita

#23
Aug 19, 2019, 10:45 am Last Edit: Aug 19, 2019, 10:46 am by Stilita
... io ancora NON ho capito tu cosa vuoi misurare. Magari se spieghi esattamente cosa vuoi fare vediamo di fare la misura esatta ... ::)
M'incuriosiva questo post, e volevo vedere la differenza di tempo tra un 8 bit tipo Nano, e uno più veloce tipo ESP32.

https://forum.arduino.cc/index.php?topic=631448.0
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

gpb01

#24
Aug 19, 2019, 10:56 am Last Edit: Aug 19, 2019, 10:56 am by gpb01
QUALE differenza di tempo? Tra cosa? ... non esiste una differenza di tempo se non tra due cose congruenti ::)

Normalmente, nell'esecuzione del codice, gli ESP sono più veloci di Arduino, ma certo NON puoi misurarlo con una dealy() ... al limite con il tempo impiegato ad effettuare una serie di calcoli complessi ...

Guglielmo
Search is Your friend ... or I am Your enemy !

Stilita

QUALE differenza di tempo? Tra cosa? ... non esiste una differenza di tempo se non tra due cose congruenti ::)

Normalmente, nell'esecuzione del codice, gli ESP sono più veloci di Arduino, ma certo NON puoi misurarlo con una dealy() ... al limite con il tempo impiegato ad effettuare una serie di calcoli complessi ...

Guglielmo
Differenza di tempo tra fare eseguire 10000 cicli di for sia con Nano che con esp32
ma forse dovrei usare millis().
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

gpb01

#26
Aug 19, 2019, 11:01 am Last Edit: Aug 19, 2019, 11:01 am by gpb01
Puoi usare micros() ma come ti ho già detto, secondo questo pseudo-codice ...

Code: [Select]
t1 = micros();
tuo ciclo di for
t2 = micros();
tempo_impiegato = t2 - t1;
stampi tempo_impiegato

... è il solo modo corretto ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Stilita

Ok, fatto, in questo caso una for con una semplice addizione all'interno
mi ha dato i seguenti risultati:
Nano   10060924 micros.
Esp32      83937  micros.

Quindi in questo caso 120 volte più veloce ESP32.

Code: [Select]
unsigned long tim;
unsigned long t1;
unsigned long c;
void setup() {
  Serial.begin(115200);
  Serial.println("stampa iniziale");    // gli faccio fare una stampata a vuoto, per inizializzare l'ESP32.
}
void loop() {
  t1 = micros();
  for (unsigned long t = 0; t < 10000000; t++) {
    c = c + t;
  }

  Serial.println(micros() - t1);
  for (; ;);
}
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

Go Up