Esempio di domanda
- Date un titolo alla domanda
- firmate
- separate le domande con una riga (----)
--
AndreaSterbini - 29 Mar 2002
Appunti
Scusate l'utilizzo di questo spazio come Bacheca ma visto l'argomento
credo si tratti dello spazio più adatto.
Purtroppo non mi è stato possibile partecipare alla lezione del 10 maggio
su interruzioni e trap.handler. e non trovo molta documentazione in proposito.
Se qualcuno fosse possesso di buoni appunti sarebbe davvero gentile se volesse
anche condividerli tramite twiki o per e-mail.
Grazie.
--
LucaFoschini - 14 Apr 2002
Clicca qui e scorri verso il basso la finestra che si apre fino ad arrivare al paragrafo Eccezioni ed Interruzioni nel MIPS.
--
AlbertoRocca - 20 May 2002
Chiarimenti
Nella documentazione di SPIM leggo che le interruzioni sono ignorate mentre le eccezioni producono la stampa di un messaggio di warning. Analizzando il trap_handler sembra però che l'unico caso in cui l'eccezione è ignorata è il caso dell'eccezione 6; mi sbaglio? Inoltre vorrei sapere se il contenuto di EPC va incrementato di 4 solo nel caso delle eccezioni o anche nel caso delle interruzioni esterne come sembra dal trap_handler.
--
StefanoPalma - 15 May 2002
Le due istruzioni che seguono (prese dal trap.handler) saltano all'uscita
ret
se si tratta di una interruzione.
sgt $v0 $k0 0x44 # ignore interrupt exceptions
bgtz $v0 ret
... sembra quindi che anche le interruzioni vengano ignorate dal trap handler di default.
Se si tratta di una interruzione
il valore preso da EPC non va incrementato di 4.
(ebbene sì, il trap.handler di default e' bacato
)
--
AndreaSterbini - 16 May 200
Status Register
Ho fatto una piccola ricerca su internet e ho trovato che i bit della Interrupt Mask delllo Status Register vanno dal bit 8 al bit 15 ed in particolare i bit dall'8 al 12 sono quelli che si riferiscono
alle interruzioni hardware, sulla documentazione che ci e' stata messa a disposizione, invece, ho trovato che questa l'Interrupt Mask comprende i bit dal 10 al 15. Quale delle due versioni e' corretta?
Inoltre, sempre nell'ambito della ricerca che ho fatto, ho trovato che il bit che abilita le interruzioni del Transmitter e' il bit 9 ( che non rientra nell'intervallo 10-15), e' corretto? Se non e' corretto, qual'e' il bit giusto? Nella documentazione fornita sul sito non mi sembra che venga specificato.
--
SabrinaDellUomo - 18 May 2002
Credo che la versione che hai trovato tu sia quella corretta (bit 9), ora guardo il codice di spim.
Immagino che ti riferisca alle pagine del corso di Architetture 1
http://www.disco.unimib.it/architettura1/arch01/arch01.html
--
AndreaSterbini - 18 May 2002
Cause Register
Se nello Status Register la Interrupt Mask comprende i bit dall'8 compreso al 15 compreso allora anche nel Cause Register i Pending Interrupt sono i bit dall'8 compreso al 15 compreso, con conseguente significato del bit 9?
Non riesco a capire se c'e' un legame tra il bit 9 del Pending Interrupt e i bit 0-5 dello Status Register: dopo aver contollato se c'e' una interruzione da servire mi devo preoccupare di gestire anche la coda delle interruzioni attraverso i bit 0-5 dello Status Register?
--
SabrinaDellUomo - 20 May 2002
Dato che devi abilitare un solo interrupt sarà difficile che te ne possa capitare un'altro mentre gestisci il primo.
Per questo esercizio non importa.
--
AndreaSterbini - 21 May 2002
Forse un bug
Durante la ricerca su internet di cui le ho detto, ho trovato il seguente appunto e vorrei sapere se e' corretto e va gestito oppure e' solo un falso allarme:
...A quanto pare lo SPIM ogni tanto spegne "per errore" il bit Interrupt Enable del Transmitter e il nostro output (gestito con le interruzioni) si ferma. Per forzare l'avanzamento occorre riabilitarlo a mano, in questo caso si provvedera' a farlo nel momento in cui una scrittura a video e' in attesa del completamento di una precedente visualizzazione...
--
SabrinaDellUomo - 20 May 2002
Non so se la versione corrente di Spim (6.4) ha corretto il bug riferito nella pagina a cui ti riferisci
(pagina che risale ad una versione un poco precedente).
Nel dubbio non fa male se gestisci il bug anche tu.
--
AndreaSterbini - 21 May 2002
Formato stringa
Se voglio mandare a video una stringa del tipo "progetto \n" la devo gestire come se fosse "progetto \n0" dove lo zero e' l'indicatore che mi permette di capire che la stringa e' finita?
--
SabrinaDellUomo - 20 May 2002
Nel buffer devi aggiungere lo zero di terminazione.
Se le stringhe sono definite in
.asciiz sono già terminate da zero
ed hanno i caratteri di controllo già convertiti dal formato '\n' al codice ascii corrispondente.
--
AndreaSterbini - 21 May 2002
Link utile
Codice di esempio per la gestione di un I/O con SPIM
http://www.disco.unimib.it/architettura1/arch01/esercitazioni/GestioneIngressoUscita2.html
--
SabrinaDellUomo - 22 May 2002
Grazie!
--
AndreaSterbini - 23 May 2002
Salvataggio e ripristino del contesto
Il trap handler contiene le seguenti istruzioni:
.set noat
# Because we are running in the kernel, we can use $k0/$k1 without
# saving their old values.
move $k1, $at # Save $at
.set at
...
.set noat
move $at, $k1 # Restore $at
.set at
il loro scopo e' quello di salvare il contesto, ossia i valori dei registri, prima di gestire l'interruzione e il ripristino dello stesso contesto quando l'interruzione e' stata gestita?
Le faccio questa domanda perche' durante il codice Kernel salto ad una procedura sporcando il contenuto del registro $ra, la soluzione per evitare il problema che ne segue e' salvarlo insieme a tutti gli altri?
--
SabrinaDellUomo - 23 May 2002
Il registro $at viene usato come registro di appoggio dalle pseudoistruzioni che SPIM traduce in 2 o più istruzioni.
Le istruzioni elencate servono a salvare e ripristinare il registro $at, dato che l'interruzione potrebbe capitare in mezzo
e si vuol essere liberi di utilizzare pseudoistruzioni nel codice del trap.handler.
--
AndreaSterbini - 23 May 2002
EPC
Ho notato che eseguire l'istruzione:
sw $t3, 0xffff0008
per lo SPIM equivale ad eseguire due istruzioni, la seconda di indirizzo immediatamente successivo alla prima.
Il segnale di interruzione viene inviato quando viene eseguita la seconda. Se gestisco l'interruzione in modo da
non incremetare l'EPC di 4 il flusso del programma torna alla seconda istruzione di cui le ho detto prima e si
genera un loop perche' viene generato un nuovo segnale di interruzione.
Se incremento di 4 procede con l'esecuzione del successivo codice utente.
--
SabrinaDellUomo - 23 May 2002
Questo è un caso abbastanza particolare ... è chiaro che se le cose funzionano correttamente solo aggiungendo 4,
allora aggiungete 4.
Inserite un commento nel codice per evidenziare cio' che fate.
--
AndreaSterbini - 23 May 2002
ktext
Il codice di abilitazione delle interruzioni va dichiarato ktext?
se si come faccio ad evitare che mi venga generato l'errore di salto ad un indirizzo troppo lontano?
--
MassimilianoMiglio
Puoi definirlo sia in .text che .ktext .
Nel secondo caso non puoi usare direttamente le istruzioni
j o
jal perche' hanno indirizzamento di 24 bit (vedi il formato dell'istruzione).
Puoi però usare
jr se metti l'indirizzo di destinazione in un registro (32 bit).
Ad esempio, puoi sostituire
j etichetta con
la $registro, etichetta
jr $registro
e
jal etichetta con
la $registro, etichetta
jalr $ra, $registro (mi pare)
--
AndreaSterbini - 23 May 2002
Una cosa strana
Come mai facendo girare i programma con il comando GO del menu simuletor il programma stama solo il prim carattere,mentre se lo eseguo passo passo stampa l'intera stringa?
C'è una bella differenza tra le due cose ma non riesco a capire il motivo.
--
MassimilianoMiglio
Non saprei ... vediamo in laboratorio mercoledì.
--
AndreaSterbini - 27 May 2002
Forse se per passo passo usi l'F10 potrebbe essere ché generi anche degli interrupt di tastiera... chissà.
--
LucaFoschini - 27 May 2002
Ho lo stesso problema: con F10 il programma gira correttamente mentre con F5 stampa solo qualche carattere della stringa.
--
SabrinaDellUomo - 27 May 2002
Massimiliano e' passato in ufficio, faceva l'errore di usare un loop in polling sul bit di ready del transmitter.
- non vi e' stato chiesto di fare un polling sul bit ready (altrimenti che razza di esercizio sulle interruzioni sarebbe?)
- il ciclo era nel bel mezzo del trap handler, e quindi tutte le interruzioni successive alla prima rimangono pending ...
Insomma:
- ricordatevi che il trap handler deve inserire nel transmitter data un solo byte e poi uscire!
- il ciclo di polling va fatto nel programma principale
- il polling dev'essere sul valore del primo carattere del buffer
- quando diventa zero si esce dal ciclo e si continua l'esecuzione del programma principale
--
AndreaSterbini - 27 May 2002
Avviso
Nella
pagina internet degli avvisi del DSI ho notato il seguente comunicato:
27/5/2002. Architettura degli Elaboratori II
LA PROVA SCRITTA PER L'ESAME DI: ARCHITETTURA DEGLI ELABORATORI II E' NECESSARIA SOLO PER GLI ISCRITTI AI CORSI DI LAUREA TRIENNALI DI: INFORMATICA E TECNOLOGIE INFORMATICHE
Cosa si intende?
--
AlbertoRocca - 04 Jun 2002
Si intende che:
- chi fa Architettura 2 per la laurea breve deve fare lo scritto di assembler.
- mentre chi e' iscritto al vecchio ordinamento e fa Laboratorio di Informatica: Architettura .... deve fare anche lui lo scritto di assembler
--
AndreaSterbini - 04 Jun 2002