Go Down

Topic: Interrupt annidati (Read 428 times) previous topic - next topic

m_ri

Salve a tutti,
sono ai primi passi coll'arduino..

Avrei una domanda da farvi: nell'arduino posso avere interrupt annidati oppure quando sto eseguendo il codice associato a uno di essi,viene eseguita anche una noInterrupt()?
cioè, se quando sto eseguendo del codice richiamato da un timer o un piedino che ha cambiato livello, ricevo una comunicazione seriale o un altro piedino(di interrupt) varia,cosa succede?
viene ibernato il primo interrupt o viene ignorato il secondo?oppure quando ha terminato il primo viene eseguito il secondo SE e SOLO se è ancora in condizione di interrupt?

grazie per l'attenzione :)

lesto

niente interrupt annidiati, a meno che il segnale non arrivi su un altro pcint (che son 3); in quel casoviene settato un flag e quando terminerà l'interrupt corrente verrà richiamato l'altro.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

E' esattamente come dici tu. Di default gcc compila le routine di gestione degli interrupt per essere "atomiche", ossia non interrompibili da altri interrupt: mette cioè un bel cli() ad inizio routine per disattivare gli altri interrupt, e chiude la routine con un sei() per riattivarli. Quindi durante un interrupt, altri interrupt sono ignorati.
Come ha precisato lesto, esistono dei flag dei registri interni che vengono modificati da un interrupt. Se il micro sta eseguendo un interrupt PCINT (PinChangeINTerrupt) e nel contempo ne arrivano altri, viene settato il flag e memorizzato il pin, ma potrai vedere solo l'ultimo arrivato perché il registro tiene traccia di un solo pin.

uwefed

La seriale visto che é implementata in HW funziona anche durante gli interrupt.
Ciao Uwe


leo72


La seriale visto che é implementata in HW funziona anche durante gli interrupt.
Ciao Uwe



Sì, vero. Il mio ragionamento era solo riferito agli interrupt.
Cmq c'è da fare una piccola precisazione: essendo il buffer seriale gestito via software dall'Arduino, la gestione della seriale venga comunque bloccata lato sketch, ossia se un dato è già stato inviato alla periferica del micro, questo verrà spedito, ma se è ancora contenuto nel buffer rimarrà bloccato finché l'interrupt non termina. Così dovrebbe accadere anche in ricezione, vale a dire il trasferimento dalla periferica seriale al buffer software viene fatto da codice. C'è il file "HardwareSerial" del core di Arduino che fa da driver per la seriale HW.

Go Up