Progetti

   

Tutorial

   

Servizi

   

Sponsor PCBway

   
Benvenuto, Ospite
Nome utente: Password: Ricordami

ARGOMENTO: Funzione di callback vs ISR

Funzione di callback vs ISR 4 Mesi 2 Settimane fa #1

  • Elia
  • Avatar di Elia
  • Offline
  • Junior Boarder
  • Messaggi: 23
  • Karma: 0
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):
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
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
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Funzione di callback vs ISR 4 Mesi 1 Settimana fa #2

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Offline
  • Moderatore
  • Messaggi: 4692
  • Ringraziamenti ricevuti 563
  • Karma: 52
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
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Funzione di callback vs ISR 4 Mesi 6 Giorni fa #3

  • Elia
  • Avatar di Elia
  • Offline
  • Junior Boarder
  • Messaggi: 23
  • Karma: 0
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.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Funzione di callback vs ISR 3 Mesi 3 Settimane fa #4

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Offline
  • Moderatore
  • Messaggi: 4692
  • Ringraziamenti ricevuti 563
  • Karma: 52
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
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Powered by Forum Kunena
   
© LaurTec 2006-2022