• Non ci sono risultati.

Appendice. A. Note sulla gestione degli interrupt. A.1. Introduzione

N/A
N/A
Protected

Academic year: 2022

Condividi "Appendice. A. Note sulla gestione degli interrupt. A.1. Introduzione"

Copied!
8
0
0

Testo completo

(1)

A. Note sulla gestione degli interrupt

I sistemi embedded a microcontrollore e, più in generale, i sistemi a microprocessore sfruttano una funzionalità molto importante che con- sente di gestire al meglio il servizio richiesto da periferiche a cui la CPU è interfacciata. Nelle esercitazioni di questo volume, ad esem- pio, sono state create routine apposite, o sottoprogrammi, che hanno permesso di riconoscere e gestire la richiesta di servizio di un timer, comunicata tramite generazione di un segnale di interrupt, verso il microprocessore.

Per l’importanza dell’argomento si è deciso di riportare in queste pa- gine alcune note che si spera riescano a chiarire meglio i concetti che si trovano dietro ad alcuni degli esperimenti svolti e che devono sicu- ramente costituire un bagaglio nella preparazione di ciascuno.

A.1. Introduzione

Generalità

Una CPU esegue normalmente una determinata sequenza di istruzioni.

Gli esempi mostrati nelle diverse esercitazioni presentano per lo più una sequenza di istruzioni inserite nella funzione main( ). Può comun- que capitare che un evento esterno, che interviene in modo del tutto asincrono rispetto alla normale esecuzione del programma, debba es- sere gestito dalla CPU stessa. In questo caso la CPU deve interrom-

(2)

pere la sequenza di istruzioni che sta svolgendo in quel momento ed eseguire una serie di operazioni utili a gestire l'evento. Al termine di tale gestione, la CPU deve riprendere il lavoro che aveva interrotto esattamente nel punto dove era intervenuta l'interruzione. In questi casi ci si riferisce allora alla gestione di interruzioni o interrupt.

In generale un interrupt deve essere pensato come un segnale (di natu- ra hardware o software1) che forza la CPU a eseguire una serie di istruzioni, inserite nella funzione di gestione dell'interruzione. Tali funzioni sono denominate ISR, Interrupt Service Routine, e sono asso- ciate alla particolare IRQ, Interrupt Request. Vediamo più nel detta- glio come la CPU gestisce questo tipo di eventi.

Concetto di stack

Per comprendere appieno le operazioni che la CPU deve svolgere per giungere alla gestione delle interruzioni è necessario introdurre il con- cetto di stack.

In un sistema a microprocessore, lo stack è una sezione di memoria contigua in cui le diverse locazioni sono destinate, spesso, a imma- gazzinare lo stato del processore. Il funzionamento di uno stack è particolare: lo stack deve essere immaginato come una pila di dati in cui è possibile inserire o estrarre un dato solo dalla sua cima.

L'immagine più consona di uno stack (letteralmente pila) è quello di una pila di libri: se impiliamo tra loro diversi libri, saremo in grado di recuperare un solo libro alla volta dalla cima. Per questo motivo si comprende che la gestione di uno stack si basa su una architettura di tipo LIFO, Last In First Out: l'ultimo (dato) inserito è il primo (dato) ad essere estratto.

1 Gli esempi che abbiamo esaminato fanno riferimento a segnali di interrupt generati da periferica e quindi di natura hardware. Un segnale di interruzione di tipo software viene generato con l'esecuzione di istruzioni del tipo SWI, Software Interrupt, e sono utili a far commutare la CPU in una modalità privilegiata come si deve avere, ad esempio, nell'esecuzione di istruzioni da parte del sistema operativo.

(3)

Quando la CPU riceve una richiesta di interruzione, la prima cosa che viene salvata è il contenuto del Program Counter (PC): in questo modo, recuperando successivamente dallo stack tale informazione, il processore sarà in grado di riprendere l'esecuzione del programma dal punto esatto in cui era avvenuta l'interruzione. (Si deve ricordare che il Program Counter contiene l’indirizzo dell’istruzione che dovrà es- sere eseguita.) L’operazione di ritorno, ovviamente, avverrà quando la CPU ha terminato le operazioni utili alla gestione della IRQ. Entrato nella routine di gestione dell'interruzione, oltre al contenuto del PC il processore salva il contenuto dei sui registri interni (o almeno i regi- stri principali) che verranno recuperati al termine della ISR. In questo modo, anche se certi registri sono utilizzati dalla ISR, nella ripresa del programma interrotto tutto sarà ripristinato nella condizione che si aveva al momento dell'interruzione. La sequenza operata di salvatag- gio dei dati nello stack farà si che il processore recupererà prima il contenuto dei registri e, infine, quello del PC.

È opportuno indicare che l'operazione di inserimento dei dati nello stack è denominata push, mentre quella di estrazione pop.

A.2. Interruzioni

Come detto, una interruzione è un segnale che comunica alla CPU il verificarsi di un evento. Come abbiamo visto con le esercitazioni de- scritte in questo testo, il tipico evento riguarda una richiesta di servi- zio da parte di una periferica. In generale, le richieste di interruzione possono essere provocate da:

dispositivi esterni che richiedono un servizio (quindi di tipo hard- ware);

dal microprocessore in seguito al verificarsi di particolari condi- zioni (in questo caso si parla di eccezioni);

dal codice che il microprocessore esegue attraverso istruzioni di tipo SWI.

(4)

Le Interruzioni provocate dall'hardware esterno possono essere fonda- mentalmente di tue tipi:

mascherabili (possono essere ignorate dalla CPU);

non mascherabili (non possono essere ignorate dalla CPU).

Le prime, con opportune istruzioni, possono quindi non provocare l’esecuzione della particolare ISR.

Quando si verifica una interruzione, la CPU interrompe il programma in esecuzione e passa invece all’esecuzione di un sottoprogramma specifico. Tali sottoprogrammi, meglio detti routine di interrupt o ISR, saranno allocati in specifici blocchi di memoria distinti ovvia- mente, da quello o quelli relativi al programma principale. Non appe- na la CPU termina l’esecuzione della routine di interrupt, essa ritorna al programma precedentemente interrotto proseguendone l'esecuzione proprio dal punto di interruzione.

Vediamo in dettaglio come si svolge il processo descritto.

Non appena il microprocessore riceve il segnale di interrupt, esso ter- mina l'esecuzione dell'istruzione corrente e salva nello stack, a livello hardware (senza cioè richiedere alcun codice), il registro di flag e l'indirizzo dell'istruzione successiva del programma corrente che viene interrotto (vedi Fig. A.1).

Fig. A.1 La CPU salva il suo stato nello stack

Status register

Program Counter stack

CPU

(5)

Successivamente, il processore riceve l’informazione relativa all’indi- rizzo della prima istruzione della routine di interrupt (per il microcon- trollore usato nelle esercitazioni questa informazione è fornita dall’NVIC). In pratica, il processore (o l’NVIC) fa semplicemente ri- ferimento a una tabella, detta vettore delle interruzioni, in cui sono effettivamente salvati gli indirizzi della prima istruzione di ciascuna ISR (in definitiva, ciascun elemento del vettore contiene una istruzio- ne di salto). L’informazione che quindi si deve semplicemente avere è l’indice al quale riferirsi per la particolare IRQ. Come mostrato in Fig A.2, ogni elemento del vettore delle interruzioni punta a un sotto- programma allocato in un determinato segmento di memoria.

Se l'interruzione è mascherabile, la CPU comunica alla periferica che la IRQ è stata accettata con reset di una opportuna flag (reset della flag dell’interruzione della periferica vista nelle varie esercitazioni).

L'abilitazione di una interruzione dipende proprio dal set o meno della flag. Si deve comunque notare che il processore resetta automatica- mente la sua flag delle interruzioni dopo l'accettazione di una interru- zione, mentre il compito di riabilitare le interruzioni spetta al pro- grammatore che dovrà inserire in un punto opportuno della sua routi- ne di interrupt l'istruzione che resetti la flag specifica della periferica.

Fig. A.2 Gli elementi del vettore delle interruzioni puntano alla prima istruzione di ciascuna ISR

Vettore delle interruzioni

ISR 1

ISR 3 ISR 2

(6)

La gestione delle interruzioni mascherabili comporta la risoluzione di due problemi fondamentali:

in generale si ha la necessità di collegare più periferiche alla singolo linea di ingresso di interrupt della CPU;

la CPU deve essere in grado di riconoscere quale sia la periferi- ca che ha effettivamente richiesto l'interruzione.

Come detto, entrambi i problemi sono, per i Cortex-M, risolti con il dispositivo NVIC, Nested Vectored Interrupt Controller, praticamente interposto fra le periferiche e il microprocessore.

L’NVIC integrato nell’LPC845 è parte integrante del processore ARM Cortex-M0+. Esso gestisce fino a 32 interrupt vettorizzati: possiede quindi 32 ingressi collegati alle linee di richiesta d'interruzione prove- nienti dalle singole periferiche. La sua uscita è collegata all’ingresso INT del processore. Come accennato in precedenza, per il riconosci- mento della ISR a seconda della periferica, l’NVIC invia al processore anche l’informazione relativa all’indice del vettore delle interruzioni.

In questo modo la CPU potrà puntare alla prima istruzione della ISR specifica.

Per ogni richiesta di interruzione è definibile anche una priorità: se durante la ISR di una interruzione arriva un’altra IRQ a priorità mag- giore, il processore deve poter passare alla routine di gestione di que- sta. Per questo motivo il dispositivo è denominato come Nested, cioè è in grado di gestire l’annidamento delle interruzioni. A tale proposito vediamo come sia possibile gestire anche interruzioni multiple.

Se si attivano contemporaneamente due linee IRQ, l’NVIC invierà alla CPU la richiesta della periferica a più alta priorità. Se hanno la stessa priorità, invia la richiesta di quella che si trova in posizione mi- nore nel vettore delle interruzioni. La seconda richiesta viene invece tenuta "in sospeso" e si parla di interrupt pending. Quando la ISR

(7)

della prima termina, l’NVIC invierà al processore la richiesta della se- conda periferica.

Come accennato, se durante l’esecuzione di una ISR di IRQ avente una certa priorità giunge la richiesta da parte di una periferica a priori- tà maggiore, l’NVIC invia la richiesta di servizio per questa seconda.

La CPU interrompe l’esecuzione della ISR che sta svolgendo e, con lo stesso meccanismo citato prima, salta alla ISR della nuova IRQ a più alta priorità. Si ha allora annidamento tra queste due richieste: il pro- cessore interrompendo la ISR della prima passa all’esecuzione della ISR della seconda. Terminata l’esecuzione di questa seconda ISR, la CPU tornerà a quella della prima. Terminata questa si potrà tornare al proseguimento del programma principale interrotto.

Bisogna aggiungere che è compito del programmatore far comprende- re al processore che si è giunti al termine di una ISR, così che questo possa tornare al lavoro che aveva interrotto recuperando i contenti sia del registro di stato sia del Program Counter. In realtà questo proble- ma specifico viene tipicamente risolto dal compilatore che inserirà una istruzione del tipo End Of Interrupt come ultima istruzione della ISR specifica.

(8)

Note

Riferimenti

Documenti correlati

Quello che si vuole analizzare con questo lavoro è proprio quest’ultimo aspetto, ovvero il fatto che si è osservato come in realtà il livello di alfabetizzazione ed

This Protocol, which develops and supplements Article 3 common to the Geneva Conventions of 12 August 1949 without modifying its existing conditions of application, shall

Tuttavia, in questi due casi si è verificato il passaggio da case editrici “di nicchia”, legate esclusivamente al Giappone – Kodansha International è il ramo statunitense

Nella parte finale della ricerca di mercato si è cercato di individuare i motivi della sottoscrizione alla carta fedeltà e i possibili miglioramenti per quanto

Che dico sempre: "È inutile che giudichi perché non sai chi sono - cioè, chi sono e cosa faccio realmente" D: E quindi comunque rientra probabilmente anche nel fatto che

Investigating this matter is of relevance for two reasons: firstly, to delineate the stance of international economic law in respect of clearinghouses and the clearing of

Individual stances: If society is liberal, types close to the norm speak their minds (s (t) = t) while types further away have inner solutions; if society is strict, types close to

Nel corso del primo capitolo si discuterà delle operazioni di Turnaround, le quali sono legate a crisi aziendali dove non solo c’è bisogno di nuovo capitale, ma