Calcolatori Elettronici II

  

Università degli Studi di Cassino

Corso di Laurea Magistrale in
Ingegneria delle Telecomunicazioni

   prof. Francesco Tortorella  (mail)

     Anno Accademico 2005/2006

     terzo quadrimestre

 


 

 

Esercitazione del 9/6/2006

 

Implementazione di una ISR

 

L'obiettivo dell'esercitazione è quello di realizzare, in ambiente MipsIt, una ISR che, in corrispondenza di un'interruzione, verifichi se è verificata sulla linea 3 (interfaccia di I/O con due pulsanti e timer regolabile) e, in tal caso, stampi un messaggio che specifichi quale dei tre dispositivi ha generato l'interruzione.

 

 

NOTE

 

Device di I/O

Il sistema simulato da MipsIt prevede un device con tre dispositivi:

  • un tasto K1

  • un tasto K2

  • un timer a frequenza regolabile

Nel caso sia stato premuto uno dei tasti o il timer abbia generato un tick, viene generata un'interruzione sulla linea 3. Il device ha un registro di stato da un byte mappato in memoria all'indirizzo 0xBFA00000 che va consultato per comprendere quale dei tre dispositivi sia la causa dell'interruzione. 

Il registro è organizzato come segue:

 

Bit:
0 – K2 (input only)
1 – K1 (input only)
2 – Timer (input only)
3 – N/A (undefined value)
4 – K2 latched
5 – K1 latched
6 – Timer latched
7 – N/A (undefined value)

 

In particolare, l'attivazione di uno dei dispositivi causa la scrittura di un 1 in entrambi i bit assegnati al dispositivo (es.: se si preme il tasto K1 si troveranno a 1 i bit 1 e 5). Nella ISR si dovrà quindi leggere il byte all'indirizzo 0xBFA00000 e controllarne i bit per individuare il dispositivo attivato. IMPORTANTE: si tenga presente che si dovrà successivamente effettuare una scrittura (a vuoto) di un byte al medesimo indirizzo per azzerare il registro (INT Acknowledge).

Affinché funzioni nel modo descritto sarà necessario configurare il device  tramite la scrittura della halfword di configurazione OxBFFF all'indirizzo 0xFFFFEA2A e  fare un INT Acknowledge iniziale, come di seguito mostrato:

 

lh   a0,  0xffffea2a   # Abilita la generazione degli interrupt dal device
andi a0,  0xbfff
sh   a0,  0xffffea2a
sb   zero,0xbfa00000   # INT Acknowledge (azzera il registro)

 

Programma e funzioni predefinite in MipsIt

Il programma da scrivere deve quindi contenere:

  • una routine che contiene l'ISR

  • una routine stub (vd. dopo)

  • un main che contiene l'inizializzazione sopra descritta ed un ciclo infinito in cui si attendono le interruzioni

Per installare la routine scritta come ISR, è opportuno scrivere un'ulteriore routine (routine stub) che esegue semplicemente un salto alla ISR vera e propria; sarà la routine stub ad essere allocata in memoria all'indirizzo cui si salta dopo un'interruzione. Per questo scopo, si utilizzi la funzione predefinita install_normal_int.

Per le esigenze di stampa, si usi la funzione predefinita printf.

 
 

CODICE DA INSERIRE E COMPLETARE

Creare un project e inserire un file main.s contenente il codice disponibile qui:

 
     

 

 


© 2005 Francesco Tortorella.
Ultimo aggiornamento: 09/06/06.