Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Interrupt: varie ed eventuali

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

1
voti

[11] Re: Interrupt: varie ed eventuali

Messaggioda Foto UtenteCandy » 18 gen 2013, 0:23

ildani ha scritto:
Candy ha scritto:E Qui si impara a programmare ed ogttimizzare il codice... Tra registri da salvare e ripristinare oltre che molte if da controllare, si rischia che ad ogni uscita sia gia' ora di rientrare...

Non ci puoi mettere queste pulci nell'orecchio e poi lasciarci a bocca asciutta senza un esempio :-)


Quando si lavora con i PIC16, (ma anche negli altri casi), se si vuole che il codice funzioni sempre bene, bisogna, sia in entrata della ISR, che prima della uscita, salvare e rinfrescare tutti i registri essenziali e quelli di appoggio, per evitare di perdere o spocare i dati. In assembler è un obbligo, altri compilatori più evoluti lo fanno da soli. Quindi la routine ISR ha una testa ed una coda lunghetta. Se in più ci aggiungi il controllo di alcuni interruot, (e c'è solo la possibilità di interrogarli uno ad uno), e poi inizi ad elaborare un programma lunghetto, quando la ISR si concluse, riattivando il bit GIE, il PIC si ritrova altre chiamate di interrupt saltando nuovamente in testa alla ISR.

Fortunatamente sono stati intelligenti nello sviluppo dell'oggetto: a livello hardware la chiamata dell'interrupt disattiva il bit GIE e l'uscita dall'ISR è possibile con l'istruzione RETFIE che, guarda caso, riattiva il GIE. Questo permette si di evitare chiamate intempestive della ISR mentre la si sta ancora elaborando, (sarebbe disastroso per il PIC16), ma, in ogni caso, una ISR troppo lunga e grassa non fa altro che portare il PIC ad un eterno loop su se stessa. (nella ipotesi ad esempio di lavorare col timer TMR0 con interrupt abilitato, od interrupt esterni veloci).

Gli interrupt sono essenziali, indubbiamente, ma attenzione...
Avatar utente
Foto UtenteCandy
32,5k 7 10 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 10123
Iscritto il: 14 giu 2010, 22:54

0
voti

[12] Re: Interrupt: varie ed eventuali

Messaggioda Foto UtenteMatteo1991 » 18 gen 2013, 2:02

Per fare due calcoli rapidi, quanti cicli di clock "consuma" l'istruzione "if(bit_di_flag)"? Dovendo ad esempio realizzare un timer con un quarzo da 32,768KHz credo che diventi notevolmente critica la tempistica.....

Supponendo inoltre di gestire due tipi di interrupt, u TMR0 overflow e un altro relativo al modulo uart (tanto per fare un esempio).
Sono attivi entrambe gli interrupt.
1)Il TMR0 inizia a contare;
2)quando è al 50% arriva il dato rs232, il buffer dell' uart risulta pieno e genera l'interrupt;
3)nell 'isr io disabilito l'interrupt relativo al TMR0 che riabilito appena ho letto il dato (per evitare che scatti mentre sto leggendo...);
4) a questo punto il timer è arrivato ad esempio al 70%;
Alla luce di quanto detto sopra, disabilitando l'interrupt del TMR0, quest'ultimo blocca la sua corsa oppure continua a girare senza eventualmente generare l'interruzione? :?:
Avatar utente
Foto UtenteMatteo1991
406 2 4 12
Frequentatore
Frequentatore
 
Messaggi: 280
Iscritto il: 28 giu 2012, 16:38

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 10 ospiti