Dubbio ISR

Buongiorno ragazzi. Sto lavorando ad un progetto che richiede l'uso di interrupt. Praticamente altro non è che un timer che alla ricezione di un segnale sul pin di interrupt (è un segnale che arriva da fuori, da un altro micro, non viene dato da un eventuale pulsante). Tutto funziona correttamente. Con un altro arduino ho simulato un impulso ogni tot secondi e il sistema funziona. Cercando il maggior numero di info in rete leggevo che la ISR deve essere il più compatta possibile, il mio dubbio è "Quella che ho scritto lo è abbastanza???"

ISR(INT0_vect){
  tempoCiclo = speedMeasure;
  TCNT2 = 6;
  msCounter = 0;
  speedMeasure = 0;
  count=true;
}

O ci sono troppe istruzioni??? Nel dire che deve essere compatta non specificano il numero di istruzioni che essa deve contenere. Essendo che uso il TIMER 2 per contare i secondi, e da quel che ho letto una volta dentro l'ISR vengono bloccati tutti gli altri interrupt non vorrei perdere del tempo per strada.

Ne approfitto per chiedervi un'altra cosa. Prima di fare così avevo inglobato tutto, compreso il conteggio in una funzione che veniva chiamata dentro l'ISR, nella convinzione che una volta chiamata la funzione lui esce dall'ISR e poi prosegue dentro la funzione. Invece da quello che ho visto (o magari ho sbagliato qualcosa) lui chiama la funzione, ma l'ISR la considera conclusa solamente al termine della funzione. È così??? Vi ringrazio delle risposte. Saluti, Lorenzo.

Per compatta si intende il più veloce possibile, perché quando sei dentro l'ISR, come hai indicato tu, gli interrupt vengono disabilitati, quindi un eventuale altro segnale d'interrupt verrebbe perso (in realtà c'è un buffer e uno non lo perdi ma dal secondo in poi si se non ricordo male ma è comunque da evitare), tu fai quattro assegnamenti, se non mi sbaglio ogni assegnamento richiede due cicli per byte (se sono int quindi 8 cicli) ogniistruzione a 16MHz impiega circa 62 nS per essere eseguita. Con questi dati dovresti riuscire ricavare il tempo che la tua ISR impiegerà ad essere eseguita totalmente e a tornare il controllo al flusso standard. Se l'intervallo con cui arrivano gli interrupt è più piccolo della durata dell'ISR sei nei guai e devi ridurla ulteriormente, altrimenti se il tempo tra un impulso e il successivo è più lungo della durata dell'ISR puoi lasciarla così comè. Discorso funzione, quando richiami una funzione, essendo Arduino single core single thread non può far altro che saltare dal punto che sta eseguendo alla funzione, eseguirla interamente, tornare al punto precedente e continuare l'esecuzione. Nel tuo caso l'ISR parte, fa qualcosa, chiama la funzione, questa viene eseguita, torna all'ISR dubito dopo la chiamata alla funzione, finisce di eseguire il codice dell'ISR e esce tornando al flusso standard. Le chiamate alla funzioni pongono in essere alcune operazioni sui registri della CPU sia in fase di chiamata che di uscita dalla funzione stessa, questa hanno un costo in termini di tempo. Anche qui solitamente si sconsiglia di fare chiamate a funzioni nelle ISR ma di demandare il tutto al loop principale settango uno o più flag nell'ISR e verificandoli nel loop, ma se la funzione non usa cose disabilitate nella gestione dell'interrupt e il tempo di esecuzione ISR+funzione non è superiore alla frequenza degli impulsi allora potresti anche richiamarla

Grazie mille, sei stato veramente esaustivo.
Il tempo tra un interrupt INT1 e l’altro minimo è di 12 secondi. Mentre il TIMER 2 richiama la ISR TIMER2_OVF_vect ogni millisecondo. Visto che si parla di nanosecondi dovrei starci dentro.

fabpolli: Per compatta si intende il più veloce possibile...

+1 Grazie, in poche righe ho capito come gestire al meglio eventuali interrupt.

Federico