Vai al contenuto
PLC Forum


Thread paralleli ESP32


mdc93

Messaggi consigliati

Salve a tutti,

ho una domanda relativa allo sviluppo firmware.

Supponiamo che io debba gestire un' uscita tramite il MCU che deve essere per 10 ms alta e per 1 ms bassa in modo periodico.

Nel mentre ho il mio programma main che viene eseguito in loop. E' possibile parallelizzare i due task? 

C'è un modo per gestire parallelamente un' uscita digitale e allo stesso momento eseguire il task del main parallelamente?

Ho visto la gestione con i task tramite RTOS; secondo voi c'è un modo più semplice?

Medesima cosa può valere per la gestione di input da seriale...vorrei farlo parallelamente al loop e non in polling.

Grazie 

Link al commento
Condividi su altri siti


Beh, la cosa più semplice è gestire il tutto ad interrupt.

Ti fai un tick di sistema (un interrupt che viene eseguito ogni tot) da 1ms, metti l'uscita a 1, conti 10 tick, al decimo la metti a 0, al tick successivo lo rimetti a 1 e così via. Le operazioni le fai ovviamente dentro la routine di interrupt, è molto breve e apparentemente va in parallelo al tuo programma.

Non so il dettaglio del ESP32, ma per esempio, sugli STM32 puoi proprio definire un tick di sistema che non ti impegna i normali timer. E' ovviamente usato anche dai vari OS per gestire i tempi dei vari task.

Link al commento
Condividi su altri siti

53 minuti fa, Ctec ha scritto:

Beh, la cosa più semplice è gestire il tutto ad interrupt.

Ti fai un tick di sistema (un interrupt che viene eseguito ogni tot) da 1ms, metti l'uscita a 1, conti 10 tick, al decimo la metti a 0, al tick successivo lo rimetti a 1 e così via. Le operazioni le fai ovviamente dentro la routine di interrupt, è molto breve e apparentemente va in parallelo al tuo programma.

Non so il dettaglio del ESP32, ma per esempio, sugli STM32 puoi proprio definire un tick di sistema che non ti impegna i normali timer. E' ovviamente usato anche dai vari OS per gestire i tempi dei vari task.

Grazie mille, la tua risposta mi ha fatto aprire: Arduino Timer Interrupts Tutorial & Examples (deepbluembedded.com) ed adesso ho capito bene cosa intendi dire. Chiaramente diciamo che quello che viene fattto all'interno della funzione di interrupt deve essere molto veloce

Link al commento
Condividi su altri siti

Considera che te devi solo incrementare un byte ogni interrupt (una somma) e poi hai una IF, e un cambio di stato di un pin. Roba da molto meno di 1us.

Se poi non usi librerie o comandi Arduino è meglio, soprattutto nelle routine di interrupt. Se addirittura hai esigenze strettissime, puoi fare la ISR in assembler.

Link al commento
Condividi su altri siti

Livio Orsini
8 minuti fa, Ctec ha scritto:

Se poi non usi librerie o comandi Arduino è meglio,

 

Anche perchè i timer di ESP32 sono differenti.

In rete trovi numerosi tutorial sui timer e sugli interrupt della ESP32, studia un po', non è tempo perso.

Anche perchè se sbagli timer rischi di sballare le temporizzazioni usate per alcune librerie di gestione periferiche, come quelle I2C. Senza contare che la funzione delay usa un timer specifico.

Link al commento
Condividi su altri siti

9 minuti fa, Livio Orsini ha scritto:

 

Anche perchè i timer di ESP32 sono differenti.

In rete trovi numerosi tutorial sui timer e sugli interrupt della ESP32, studia un po', non è tempo perso.

Anche perchè se sbagli timer rischi di sballare le temporizzazioni usate per alcune librerie di gestione periferiche, come quelle I2C. Senza contare che la funzione delay usa un timer specifico.

Sisi stavo guardando esempio su ESP32 (ESP32 Timers & Timer Interrupt Tutorial (Arduino IDE) – DeepBlue (deepbluembedded.com)). Supponiamo per semplicità che debba accendere un LED (1 secondo ON e 3 secondi OFF, per semplicità). L'esempio riportato fa avvenire l'interrupt ad ogni tick specificato.

Quindi supponiamo di far avvenire tale interrupt ogni 1 ms. All'interno dell'interrupt, che avviene ogni ms, incremento un contatore: fin quando questo è sotto 1000 (quindi 1s) scrivo alto sul pin, se questo supera 1000  scrivo LOW e continuo ad incrementare il contatore, quando infine il contatore raggiunge 4000 (3000+1000) lo riazzero. Corretto?

Link al commento
Condividi su altri siti

Dai un'occhiata anche qui, descrive come usare la ticker library inclusa nel core ESP32 di Arduino. Inoltre ci sono molti tutorial interessanti proprio su ESP32.

 

Ciao, Ale.

Link al commento
Condividi su altri siti

Livio Orsini
13 ore fa, mdc93 ha scritto:

Corretto?

 

Sino a qui è corretto.

11 ore fa, ilguargua ha scritto:

Dai un'occhiata anche qui,

Link interessante.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...