A.5 La gestione degli interrupt
 

L’interrupt può essere un segnale esterno o generato internamente dal processore, via software, che ha lo scopo di far eseguire al DSP una determinata routine, interrompendo la normale esecuzione sequenziale del programma. Più specificatamente quando si riscontra un interrupt, il program counter (PC) viene caricato con l’indirizzo dell’appropriata interrupt serivice routine (ISR) e il processore ne comincia l’esecuzione, finché non incontra un return from interrupt (RETI) che rimanda alla riga di codice successiva a quella durante l’esecuzione della quale era stato rilevato l’interrupt. In questo lavoro, ad esempio, un interrupt avvia l’esecuzione della procedura dedicata all’acquisizione di due dati provenienti dai MACs.
Per l’uso di un interrupt bisogna agire sullo status register (ST), abilitandone il bit GIE (global interrupt enable) e sul registro IE (interrupt enable), scrivendo un diverso numero a seconda dell’interrupt che vogliamo usare. Il TMS320C31 possiede 4 linee di interrupt (INT0-INT4). Ad ognuna di queste è associata una locazione di memoria (fig 1) alla quale il processore salta nel momento in cui l’interrupt è attivo; generalmente in queste locazioni viene collocata un’istruzione di jump alla routine che servirà l’interrupt.  


 
Locazioni di memoria riservate agli interrupt
Fig 1 – Locazioni di memoria riservate agli interrupt.
Circuiteria dedicata alla gestione degli interrupt

Fig 2 – Circuiteria dedicata alla gestione degli interrupt.

Le 4 linee di interrupt sono caratterizzate da un certo ordine prioritario, nel senso che nel caso si presentassero più interrupt nello stesso ciclo di clock o quando due interrupt precedentemente ricevuti stanno aspettando di essere serviti, la CPU li servirà con un preciso ordine (dall’INT0 all’INT3). Gli interrupt esterni sono prioritari su quelli interni.
Nella figura 2 si riporta  lo schema circuitale di come viene processato un interrupt; H1 e H3 sono due clock che vengono generati internamente dal processore ed hanno un periodo doppio rispetto al clock esterno fondamentale. Si ricava quindi, dalla disposizione dei tre flip-flop di sinistra, che l’interrupt per essere rilevato deve avere una durata compresa tra uno e due cicli di H1 o H2, altrimenti la CPU o non lo vede affatto o lo processa più volte, dal momento che gli interrupt vengono triggerati sul livello e non sul fronte. Quando l’interrupt è attivo, verrà scritto un 1 nell’IF (Interrupt Flag Register), che congiuntamente al contenuto di GIE e dell’ IE, consentirà al processore di rilevare l’interrupt. L’utente può generare un interrupt interno scrivendo un 1 nell’IF, da software, tramite l’internal interrupt set signal.
Nel momento in cui la CPU processa un interrupt il bit GIE, dello status register, viene caricato con uno 0 e viene rimosso il contenuto dell’IF grazie all’azione dell’internal interrupt clear, per cui durante l’esecuzione di una ISR ogni interrupt viene disabilitato; tuttavia si possono presentare dei casi, come ad esempio in questo lavoro, in cui è necessario interrompere l’ISR per processare un altro interrupt. Nel caso in questione, la routine lanciata dall’interrupt interno, generato dalla seriale deve poter essere interrompibile dall’interrupt esterno, che richiama l’attenzione della CPU al caricamento dei dati provenienti dai MACs; più semplicemente, mentre il DSP sta comunicando con il computer attraverso la seriale (processo relativamente lento), deve anche essere in grado di acquisire nuovi dati dall’esterno. Per rendere una ISR interrompibile, basta porre il GIE a 1, nella sua prima istruzione. 


Home | Precedente | Successivo