Funzione di callback vs ISR

  • Elia
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
2 Anni 11 Mesi fa #1 da Elia
Funzione di callback vs ISR è stato creato da Elia
Buonasera amici e amiche,

quello che vi vorrei chiedere è a proposito delle funzioni di callback.
Per inviare un byte su UART con un'architettura tipo PIC18 si può usare una funzione come la seguente (l'ho scritta io ma funziona):
Code:
void UartSendChar(char data) { while (!PIR1bits.TXIF){continue;} /*Aspetto fino a che TXREG non è vuoto*/ TXREG = data; }

Tuttavia questa funzione è bloccante, nel senso che fintanto che TXIF non va a 1, il programma è bloccato. Quindi, ad esempio, in caso di errore, senza watchdog attivo, si potrebbero avere problemi.

Per evitare ciò, vorrei usare questa fantomatica "callback" che in un certo senso, se non ho capito male a causa della mia ignoranza, dovrebbe risolvere il problema.
So che una callback è sostanzialmente un puntatore a funzione. OK, ma a chi lo devo dare questo puntatore? Ad una ISR. OK, ma come glielo passo? E qui mi casca l'asino, non so come!

Io vorrei capire come fare a passare "la callback all'ISR" e quindi come usarla.

Quello che vorrei ottenere è un codice nel quale una volta che viene invocata la
Code:
UartSendChar(char data)
non si blocca niente, anzi il programma prosegue con l'istruzione successiva e via così. Intanto, "in remoto", cioè tramite una ISR nascosta all'utente, viene inviato il mio byte. Poi alla fine dell'invio, questa callback ritorna comunicando che il byte è stato inviato o meno.

Non so se mi sono spiegato e se ho detto tutto correttamente.
In ogni caso, se non altro per aver letto tutto, vi ringrazio anticipatamente.

Elia

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
2 Anni 11 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Funzione di callback vs ISR
Salve Elia,

Il tuo problema lo si risolve in generale con un sistema operativo che gira nel microconotrollore. Passi la funzione e la gestisce, in parallelo. Parallelo significa però che il sistema operativo assegna del tempo ad ogni funzione da eseguire(task) che ha nel suo scheduler. La struttura PIC18 non è ottimale per i sistemi operativi.

In ogni modo il tuo problema si risolve semplicemente, facendo uso delle interruzioni di fine trasmissione. Crei un ISR per il controllo di fine trasmissione e svolgi il resto in parallelo.
Crei una funzione che scrive in un buffer e avvia la prima trasmissione, e la funzione ISR permette un cambio di stati (o accesso diretto al buffer).
Se no accedi al buffer, dovresti realizzare una piccola macchina a stati per inviare ogni volta il nuovo carattere.
La macchina a stati si comporta come un semplice sistema operativo che ti permette di eseguire diverse operazioni a seconda del tuo stato.

Quanto detto in due frasi non è facilissimo, ma nel complesso non sono molte righe di codice.

Saluti,

Mauro

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Elia
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
2 Anni 11 Mesi fa #3 da Elia
Risposta da Elia al topic Funzione di callback vs ISR
Grazie Mauro della risposta.

Per "interruzione di fine trasmissione" intendi l'interrupt su TX?

Se non chiedo troppo e se ne hai voglia, potresti approfondire anche il concetto della macchina a stati che mi interessa particolarmente. Sarei molto curioso di sapere come risolveresti il problema.

P.S: Io sono un ingegneretto elettronico alle prime armi senza troppa esperienza, fresco di studi ma in realtà totalmente ignorante. Scusami se ti faccio domande banali.

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
2 Anni 11 Mesi fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Funzione di callback vs ISR
Salve Elia,

Per "interruzione di fine trasmissione" intendi l'interrupt su TX?


Si, un'interruzione di fine trasmissione. In questo modo eviti il tempo di attesa che altrimenti perderesti.

Con macchine a stati ho fatto diversi esempi.

Se scarichi gli esempi del testo XC8 Step by Step

www.laurtec.it/categoria-libri/88-libri-...279-xc8-step-by-step

capitolo 16, Progetto Lettura ADC via Terminal,

Implemento una macchina a stati per la scrittura evitando di bloccare le conversioni ADC.

L'esempio non risolve alcuni problemi di accesso asincrono delle variabili, ma mostra come implementare una macchina a stati.

Saluti,

Mauro

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.