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:
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.
|