
Per chi scrive codice già da un po’ di tempo, sicuramente i termini interrupt (o interruzione) e polling non sono affatto nuovi; si tratta di due tecniche che possono essere utilizzate per mettere in allerta la scheda di sistema, come ad esempio un microcontrollore, quando ci si trova in presenza di un input. Ma qual è la differenza tra i due metodi? Uno è meglio dell’altro, o la loro utilità varia a seconda delle situazioni? Sia l’interrupt che il polling presentano dei vantaggi e degli svantaggi, scopriamoli insieme!
Polling: verifica ciclica di tutte le operazioni di input/output
Quando si lavora, ad esempio, su una scheda chipKIT, uno dei primi progetti che si esegue è quello di realizzare un circuito molto semplice, che prevede l’accensione di un Led alla pressione di un tasto. Per sapere quando si preme il pulsante, il programma utilizza un sistema di lettura digitale dello stato della tensione del pin connesso al tasto e, successivamente, accende o spegne il Led. Tuttavia, con la lettura digitale il microcontrollore deve monitorare di continuo lo stato della tensione su quel pin, per valutare l’azione successiva da compiere (spegnere o accendere il Led).
Questo metodo di controllo e verifica continuo è conosciuto come polling.
Lo svantaggio, però, è che esso può sfruttare in maniera intensiva il processore, poiché il microcontrollore è in continua fase di checking riguardo il cambiamento di stato della tensione; d’altro canto, questa modalità operativa rappresenta un valido strumento per assicurarsi che, non appena si verifica il cambiamento, segue immediatamente l’effetto desiderato.
Interrupt: interruzione di un processo in determinate condizioni
Un interrupt, o interruzione, è, come il polling, un metodo per rilevare se è occorso un cambiamento all’interno del sistema, ma non ha bisogno di continui controlli per saperlo. Piuttosto, un interrupt presenta delle modifiche nell’hardware e provoca il verificarsi immediato di una ISR (Interrupt Service Routine), anche se la scheda chipKIT si trova nel pieno svolgimento di una qualsiasi operazione. Di solito, una ISR prevede l’assegnazione di un flag (variabile booleana) per avvisare la scheda di sistema che si è verificato un interrupt; poi sarà la scheda di sistema ad esaminarlo in maniera più completa dopo aver controllato specificatamente lo stato di quel flag.
Ma se un interrupt si verifica immediatamente, perché non fare in modo che tutto ciò che è associato con quella interruzione venga eseguito non appena essa si verifica? In teoria, tutto può essere gestito in una ISR, ma in realtà la maggior parte delle applicazioni sono sensibili al tempo, quindi potrebbe essere controproducente far girare un gran numero di codici in un interrupt che è progettato solo per verifiche veloci.
Inoltre, le funzioni che dipendono dal tempo, come la funzione delay (), non saranno attive all’interno di una ISR; allo stesso modo, un contatore per la funzione millis() non continuerà a lavorare all’interno di un interrupt.
A causa di questo, di solito è molto più semplice lanciare un polling occasionale all’interno di un circuito da controllare, per vedere se il flag dell’interrupt è cambiato, così da mantenere la scheda di sistema in funzione senza problemi, così come è stata progettata.
Polling Vs Interrupt: differenze
Per concludere, è quindi bene analizzare le differenze, o meglio la principale differenza tra il polling e l’interrupt. Per capirlo, è possibile prendere come esempio la ricezione di messaggi di testo sul proprio telefono cellulare; se controlliamo di continuo il telefono per vedere se qualcuno ci ha scritto, siamo di fronte ad un polling. Se invece siamo occupati nello svolgimento di qualsiasi attività, e sentiamo il tono di avviso di ricezione di un messaggio, si è verificato un interrupt, un’interruzione; in questo caso, sappiamo di aver ricevuto un messaggio (flag dell’interrupt), ma possiamo decidere se controllare subito il telefono o se aspettare un momento più opportuno.
E voi, che metodo usate più frequentemente?
Article by James Colvin courtsey of blog.digilentinc.com

Salve,
ho cablato più sensori ad ultrasuoni (tipo 10) ad una scheda arduino YUN.
La gestione simultanea è impossibile, arduino non ce la fà.
Pensavo a qualcosa tipo un multiplexer, ma forse l’interrupt può essermi di aiuto ?
Grazie per una Vs risposta.
Salve Stefano,
potresti utilizzare gli external interrupt. Verifica in base all’uscita che presentano i vari sensori.
Grazie di questo articolo. Mi ha chiarificato molto i dubbi che avevo a riguardo. Sto partecipando ad un progetto su un micro arm cortex M4 e non essendo programmatore, ma solamente appassionato, ho molte lacune che un po’ alla volta si stanno colmando. Quante cose da imparare che ci sono!!
Stiamo anche discutendo se effettuare questo progetto in semplice codice sequenziale o se implementare il FreeRTOS. La scelta si sta orientando verso quest’ultimo dopo ampie ricerche e valutazioni. Di interrupt e polline se ne parla molto appunto 🙂
Buona Sera a tutti,
sono Daniele e non sono a digiuno di programmazione, anzi tutt’altro, da quello che ho capito quindi su arduino (di cui sono ancora un neofita) non vi è possibile usare Interrupt in quanto c’è il Loop che ha lo scopo di effettuare una sorta di Polling non solo degli ingressi ma anche delle varie routine.
Nel caso quindi si volesse eseguire operazioni in multitread non è quindi possibile se ho capito bene.
Grazie mille delle INFO 😉 Daniele
Ciao a tutti, avrei bisogno di un suggerimento! dovrei realizzare una sorta di gioco con domande e risposte, per rispondere bisogna premere un tasto, i tasti sono 4.
Stò utilizzando un raspberry con python2.7 e non stò utilizzando gli interrupt. Tutto funziona… ma credo che ci siano dei problemi sulla pressione simultanea dei pulsanti.
premendo il più simultaneamente possibile i pulsanti, mi sembra che abbiano sempre la precedenza quelli che nel codice vengono controllati per primi.
in questo modo statisticamente sono sempre avvantaggiati quelli che premono il pulsante su cui effettuo la verifica per primi… c’è un modo per aumentare l’imparzialità?