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
PIC a 8 bit e funzioni "atomiche"
Moderatore:
Paolino
9 messaggi
• Pagina 1 di 1
0
voti
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
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
-

luxinterior
4.311 3 4 9 - Master EY

- Messaggi: 2690
- Iscritto il: 6 gen 2016, 17:48
0
voti
Ciao @ivanpascolo
Infatti, il codice scritto ad alto livello potrebbe riservarti altre sorprese, le combinazioni sono più d'una.
Saluti
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.ivanpascolo ha scritto:(...) Se sotto interrupt modifico solo variabili a 8 bit posso stare tranquillo?
Infatti, il codice scritto ad alto livello potrebbe riservarti altre sorprese, le combinazioni sono più d'una.
Saluti
W - U.H.F.
-

WALTERmwp
30,2k 4 8 13 - G.Master EY

- Messaggi: 8985
- Iscritto il: 17 lug 2010, 18:42
- Località: le 4 del mattino
0
voti
Classico problema della sezione critica (se ci sono dati condivisi).
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
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.
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.
-

ivanpascolo
20 3 - New entry

- Messaggi: 71
- Iscritto il: 29 set 2014, 20:44
0
voti
non so, dipende sempre da come fai quello che fai.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?
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.
-

WALTERmwp
30,2k 4 8 13 - G.Master EY

- Messaggi: 8985
- Iscritto il: 17 lug 2010, 18:42
- Località: le 4 del mattino
0
voti
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.
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.
-

Brianz
5.828 5 10 - CRU - Account cancellato su Richiesta utente
- Messaggi: 858
- Iscritto il: 24 mar 2016, 11:27
0
voti
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
Nella interrupt
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;
}
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
Adesso è tutto più' chiaro, grazie mille per i vostri consigli.
-

ivanpascolo
20 3 - New entry

- Messaggi: 71
- Iscritto il: 29 set 2014, 20:44
9 messaggi
• Pagina 1 di 1
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 6 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)