Interrupt nei sistemi embedded

Interrupt Service RoutineIl programma di un controllore embedded si svolge all'interno di un loop infinito: inizia all'accensione del sistema e termina con il suo spegnimento. L'esecuzione non ha mai termine, ma  resta in attesa di segnali in ingresso (sensori) e predispone le uscite (attuatori).

Molti eventi avvengono in modo asincrono, non previsto o prevedibile da sistema. Si tratta ad, esempio, della pressione di un tasto o un di segnale da un sensore che arriva in modo non prevedibile.

Ci sono alcune tecniche per intercettare e gestire questi eventi. Una soluzione è detta di polling, un controllo periodico e ripetuto dello stato dell'ingresso per determinarne il valore. Ha un inconveniente: se l'evento è veloce e il ciclo di polling non è sufficientemente frequente, si può perdere l'evento e occorre ricorrere ad hardware più complesso con buffer o simili per far fronte  a simili situazioni.

Una soluzione migliore è il ricorso all'interrupt. Consiste nell'abbinare una funzione, detta di interrupt, all'ingresso da monitorare. All'arrivo dell'evento il processore agisce autonomamente, interrompendo il normale flusso del programma ed eseguendo la routine predisposta alla gestione dell'interrupt.

In questo modo l'ingresso è gestito direttamente dal processore e non dal programma principale e, salvo casi particolari, il segnale non può essere ignorato.

I vari processori prevedono diverse modalità di interrupt, che può scatenarsi a fronte di un cambiamento di un ingresso (hardware), ma anche da cambiamenti di stati interni (software). I vari interrupt possono agire su diversi ingressi e avere priorità: se due eventi avvengono contemporaneamente uno di questi viene gestito con priorità rispetto un altro. Occorre definire un metodo per discriminare i vari interrupt. Si ricorre  alll'uso di un interrupt vector (vettore di interrupt), che consiste in un indirizzo o comunque un numero che riconduce alla corretta routine del corrispondente evento.

La routine di interrupt deve essere breve e difficilmente gestisce l'evento nella sua completezza, ma ne  memorizza lo stato in una variabile o buffer. La variabile o il buffer sono, poi,  a disposizione del programma principale che agirà come necessario.  L'esempio è la ricezione di dati dalla linea seriale, l'arrivo del dato può generare un interrupt, la cui routine si limita a leggere il dato ed a posizionarlo in una area di memoria (buffer) a disposizione del programma principale.

La funzione di interrupt può essere disabilitata o abilitata. Si pensi ad esempio alla parte iniziale di un programma che predispone il sistema a determinate operazioni, come la definizione  di ingressi e uscite. In questa fase non è desiderabile avere interruzioni, perché il sistema non è ancora pronto per funzionare correttamente e potrebbe presentare comportamenti anomali.

 

Tags: 

Categoria: