Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC a 8 bit e funzioni "atomiche"

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] PIC a 8 bit e funzioni "atomiche"

Messaggioda Foto Utenteivanpascolo » 2 apr 2016, 16:21

Ho scoperto da poco il significato delle funzioni atomiche e cosa può succedere se modifico una variabile a 16/32bit durante l'interrupt (e la leggo nel main).
Da allora cerco di starci attento, ma la domanda a questo punto è: se faccio un "if (x== numero)" dove entrambi le variabili sono a 8 bit e la variabile "x" viene incrementata in interrupt rischio ugualmente il problema?
L'istruzione "if..." in assembler viene tradotta come segue

0x20: MOVF x, W
0x21: XORWF numero, W
0x22: BTFSC STATUS, 0x2

Se alla righe 0x21 arriva l'interrupt cosa succede? Se sotto interrupt modifico solo variabili a 8 bit posso stare tranquillo?

Grazie
Ivan
Avatar utente
Foto Utenteivanpascolo
20 3
New entry
New entry
 
Messaggi: 71
Iscritto il: 29 set 2014, 20:44

0
voti

[2] Re: PIC a 8 bit e funzioni "atomiche"

Messaggioda Foto Utenteluxinterior » 2 apr 2016, 18:35

Se l'interrupt scrive il valore a 8bit e il main lo utilizza o vceversa non succede nulla
Il tuo if viene tradotto in tre istruzioni se lì'interrupt capita prima del MOVF l'if userà il valore aggiornato dall'interrupt altrimenti il test viene fatto con il valore attuale. L'interrupt potrà aggiornare il valore attuale di x nel mezzo delle tre istruzioni assembler che compongono l'if ma il main se ne accorgera al "prossimo giro" quando ripeterà la sequenza delle tre istruzioni.
Se vuoi essere certo che x venga utilizzato solo dopo che l'interrupt lo ha aggiornato potresti usare uan variabile di stato o un semplice flag ceh l'interrupt mette a 1 e il main controlla e azzera nell'esecuzione dle codice condizionato
Avatar utente
Foto Utenteluxinterior
4.311 3 4 9
Master EY
Master EY
 
Messaggi: 2690
Iscritto il: 6 gen 2016, 17:48

0
voti

[3] Re: PIC a 8 bit e funzioni "atomiche"

Messaggioda Foto UtenteWALTERmwp » 2 apr 2016, 22:37

Ciao @ivanpascolo
ivanpascolo ha scritto:(...) Se sotto interrupt modifico solo variabili a 8 bit posso stare tranquillo?
non so se fai riferimento a una casistica definita ma io suggerirei di lavorare su variabili differenti recuperando poi, nel main (o sua funzione), l'informazione del transito nella irq.
Infatti, il codice scritto ad alto livello potrebbe riservarti altre sorprese, le combinazioni sono più d'una.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[4] Re: PIC a 8 bit e funzioni "atomiche"

Messaggioda Foto UtenteTardoFreak » 3 apr 2016, 1:07

Classico problema della sezione critica (se ci sono dati condivisi).
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[5] Re: PIC a 8 bit e funzioni "atomiche"

Messaggioda Foto Utenteivanpascolo » 3 apr 2016, 10:07

Diciamo che non mi interessa se l'istruzione "if" viene eseguita con il valore precedente, quindi è OK.
Se utilizzo un flag credo ci sia ancora margine di errore, ad esempio se l'interrupt arriva appena letto lo stato del flag o sbaglio?
L'unica soluzione sicura è disabilitare l'interrupt per fare un passaggio di variabile (o eseguire l'intera istruzione), soluzione che non mi piace per niente.
Avatar utente
Foto Utenteivanpascolo
20 3
New entry
New entry
 
Messaggi: 71
Iscritto il: 29 set 2014, 20:44

0
voti

[6] Re: PIC a 8 bit e funzioni "atomiche"

Messaggioda Foto UtenteWALTERmwp » 3 apr 2016, 10:28

ivanpascolo ha scritto:Se utilizzo un flag credo ci sia ancora margine di errore, ad esempio se l'interrupt arriva appena letto lo stato del flag o sbaglio?
non so, dipende sempre da come fai quello che fai.
E' solo una questione di gestione di risorse definite, come per esempio per le variabili globali.
Andare a disabilitare il controllo generale degli interrupts solo per agire in via cautelativa mi pare veramente eccessivo.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[7] Re: PIC a 8 bit e funzioni "atomiche"

Messaggioda Foto UtenteBrianz » 3 apr 2016, 11:14

Mi sembra che un problema si ponga solo se stai utilizzando una struttura logica non corretta rispetto al processo.
Se una variabile (che sia a 8 o 128 bit) viene modificata in interrupt e la analizzi al di fuori dell’interrupt è evidente che devi completare l’analisi PRIMA di un nuovo evento di interrupt, altrimenti non potrai mai avere un risultato corretto.
Avatar utente
Foto UtenteBrianz
5.828 5 10
CRU - Account cancellato su Richiesta utente
 
Messaggi: 858
Iscritto il: 24 mar 2016, 11:27

0
voti

[8] Re: PIC a 8 bit e funzioni "atomiche"

Messaggioda Foto UtenteTardoFreak » 3 apr 2016, 13:23

Nel caso evidenziato da Brianz è sufficiente sincronizzare il programma principale con la interrupt. Basta un flag per sapere se la interrupt h già svolto il suo lavoro.
Nel main
Codice: Seleziona tutto
// Variabile globale di sincronizzazione 
uint8_t flag = 0;
{
  ...
  // Aspetta la sincronizzazione
  flag = 0;
  while(!flag);
  // Sezione critica
  ...
}

Nella interrupt
Codice: Seleziona tutto
{
  // Esegue la funzione di servizio
  ...
  flag = 1;
}
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[9] Re: PIC a 8 bit e funzioni "atomiche"

Messaggioda Foto Utenteivanpascolo » 3 apr 2016, 15:21

Adesso è tutto più' chiaro, grazie mille per i vostri consigli.
Avatar utente
Foto Utenteivanpascolo
20 3
New entry
New entry
 
Messaggi: 71
Iscritto il: 29 set 2014, 20:44


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti