ΔΙΑΚΟΠΕΣ
INTERRUPTS/EXCEPTIONS

 

Αρχιτεκτονική Ι

Ανδρέας Μόσχοβος

Φθιν. 2003

 

ΣΗΜΕΙΩΣΗ: Η ΠΕΡΙΓΡΑΦΗ ΤΩΝ ΔΙΑΚΟΠΩΝ ΓΙΑ ΤΟ MIPS ΕΧΕΙ ΑΠΛΟΠΟΙΗΘΕΙ ΜΕ ΣΚΟΠΟ ΤΗΝ ΚΑΛΥΤΕΡΗ ΚΑΤΑΝΟΗΣΗ ΤΩΝ ΒΑΣΙΚΩΝ ΙΔΕΩΝ. Η ΠΕΡΙΓΡΑΦΗ ΑΥΤΗ ΕΙΝΑΙ ΑΡΚΕΤΗ ΚΑΙ ΚΑΤΑΛΛΗΛΗ ΓΙΑ ΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΜΕΣΩ ΤΟΥ ΠΡΟΣΟΜΟΙΩΤΗ SPIM.

 

ΤΙ ΜΑΣ ΧΡΕΙΑΖΟΝΤΑΙ ΤΑ INTERRUPTS;

 

1.     ΓΙΑ ΝΑ ΑΠΟΦΥΓΟΥΜΕ ΤΟ POLLING ΟΤΑΝ ΕΠΙΚΟΙΝΩΝΟΥΜΕ ΜΕ ΣΥΣΚΕΥΕΣ ΕΙΣΟΔΟΥ/ΕΞΟΔΟΥ.

a.  ΣΤΟ POLLING ΟΠΩΣ ΕΙΔΑΜΕ ΠΡΕΠΕΙ ΤΟ ΠΡΟΓΡΑΜΜΑ ΜΑΣ ΝΑ ΡΩΤΑΕΙ ΣΥΝΕΧΕΙΑ ΤΗ ΣΥΣΚΕΥΗ ΑΝ ΕΙΝΑΙ ΔΙΑΘΕΣΙΜΗ. ΜΕ INTERRUPTS Η ΣΥΣΚΕΥΗ ΘΑ ΜΑΣ ΕΙΔΟΠΟΙΕΙ ΟΤΑΝ ΕΙΝΑΙ ΕΤΟΙΜΗ ΕΝΩ ΤΟ ΠΡΟΓΡΑΜΜΑ ΜΑΣ ΘΑ ΜΠΟΡΕΙ ΝΑ ΣΥΝΕΧΙΖΕΙ ΝΑ ΚΑΝΕΙ ΚΑΤΙ ΑΛΛΟ ΣΤΟ ΕΝΔΙΑΜΕΣΟ.

2.     ΓΙΑ ΝΑ ΜΑΣ ΔΙΝΕΤΑΙ Η ΔΥΝΑΤΟΤΗΤΑ ΝΑ ΧΕΙΡΙΣΤΟΥΜΕ ΚΑΤΑΣΤΑΣΕΙΣ ΠΟΥ ΔΕΝ ΕΠΙΤΡΕΠΟΥΝ ΤΗ ΣΥΝΕΧΙΣΗ ΤΗΣ ΕΚΤΕΛΕΣΗΣ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ.

a.  ΓΙΑ ΠΑΡΑΔΕΙΓΜΑ ΑΝ ΕΚΤΕΛΕΣΟΥΜΕ ΕΝΑ LW ΑΠΟ ΔΙΕΥΘΥΝΣΗ ΠΟΥ ΔΕΝ ΕΙΝΑΙ ΔΙΑΙΡΕΣΙΜΗ ΜΕ ΤΟ 4 ΠΟΥ ΑΠΟΓΟΡΕΥΕΤΑΙ ΣΤΟ MIPS. ΣΕ ΑΥΤΗΝ ΤΗΝ ΠΕΡΙΠΤΩΣΗ ΤΟ ΠΡΟΓΡΑΜΜΑ ΜΑΣ ΠΡΕΠΕΙ ΝΑ ΤΕΡΜΑΤΙΣΤΕΙ.

b.  ΟΙ ΕΝΤΟΛΕΣ ADD KAI SUB ΕΙΝΑΙ ΣΕ ΘΕΣΗ ΝΑ ΜΑΣ ΕΝΗΜΕΡΩΣΟΥΝ ΟΤΑΝ ΤΟ ΑΠΟΤΕΛΕΣΜΑ ΔΕ ΧΩΡΑΕΙ ΜΕΣΑ ΣΤΑ 32-ΒΙΤ. ΑΥΤΟ ΤΟ ΚΑΝΟΥΝ ΕΝΕΡΓΟΠΟΙΩΝΤΑΣ ΕΝΑ INTERRUPT.

3.     O ΜΗΧΑΝΙΣΜΟΣ ΑΥΤΟΣ ΕΠΙΣΗΣ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ ΚΑΙ ΓΙΑ ΤΗΝ ΚΛΗΣΗ ΤΟΥ ΛΕΙΤΟΥΡΓΙΚΟΥ ΣΥΣΤΗΜΑΤΟΣ. ΔΕΝ ΕΧΟΥΜΕ ΑΚΟΜΑ ΚΑΛΥΨΕΙ ΑΥΤΟ ΤΟ ΘΕΜΑ ΤΟ ΟΠΟΙΟ ΘΑ ΤΟ ΚΑΛΥΨΕΤΕ ΜΕ ΛΕΠΤΟΜΕΡΕΙΑ ΣΤΟ ΜΑΘΗΜΑ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. ΕΠΙΓΡΑΜΜΑΤΙΚΑ, ΑΝΑΦΕΡΟΜΑΣΤΕ ΣΤΗΝ ΠΕΡΙΠΤΩΣΗ ΕΝΟΣ ΣΥΣΤΗΜΑΤΟΣ ΣΤΟ ΟΠΟΙΟ ΤΡΕΧΕΙ ΚΑΠΟΙΟ ΛΕΙΤΟΥΡΓΙΚΟ (ΠΧ. LINUX H WINDOWS) ΚΑΙ ΠΑΝΩ ΤΟΥ ΤΡΕΧΟΥΝ ΔΙΑΦΟΡΑ ΠΡΟΓΡΑΜΜΑΤΑ. ΤΑ ΤΕΛΕΥΤΑΙΑ ΣΥΧΝΑ ΧΡΕΙΑΖΟΝΤΑΙ ΤΗ ΒΟΗΘΕΙΑ ΤΟΥ ΛΕΙΤΟΥΓΙΚΟΥ (ΠΧ. ΓΙΑ ΝΑ ΔΙΑΒΑΣΟΥΝ ΚΑΤΙ ΑΠΟ ΤΟ ΔΙΣΚΟ Η ΝΑ ΓΡΑΨΟΥΝ ΣΤΗΝ ΟΘΟΝΗ). ΤΟ ΣΥΝΟΛΟ ΤΩΝ ΛΕΙΤΟΥΡΓΙΩΝ ΠΟΥ ΠΑΡΕΧΕΙ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΕ ΑΛΛΑ ΠΡΟΓΡΑΜΜΑΤΑ ΟΝΟΜΑΖΕΤΑΙ SYSTEM CALLS (ΚΛΗΣΕΙΣ ΛΕΙΤΟΥΡΓΙΚΟΥ). Η ΒΑΣΙΚΗ ΙΔΕΑ ΕΙΝΑΙ ΜΕ ΚΑΠΟΙΟ ΤΡΟΠΟ ΚΑΝΕΙΣ ΝΑ ΚΑΛΕΙ ΤΟΥ ΛΕΙΤΟΥΡΓΙΚΟ. ΑΝΤΙ ΓΙΑ ΤΙΣ ΑΠΛΕΣ ΕΝΤΟΛΕΣ CALL ΘΕΛΟΥΜΕ ΜΙΑ ΔΙΑΦΟΡΕΤΙΚΗ ΠΟΥ ΝΑ ΕΝΗΜΕΡΩΝΕΙ ΤΟΝ ΕΠΕΞΕΡΓΑΣΤΗ ΟΤΙ Η ΚΛΗΣΗ ΑΥΤΗ ΕΓΙΝΕ ΑΠΟ ΕΝΑ ΠΡΟΓΡΑΜΜΑ ΠΡΟΣ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΚΑΙ ΕΠΙΣΗΣ ΝΑ ΥΠΑΡΧΟΥΝ ΠΕΡΙΟΡΙΣΜΟΙ ΩΣΤΕ ΝΑ ΕΙΜΑΣΤΕ ΣΙΓΟΥΡΟΙ ΠΩΣ Ο ΚΩΔΙΚΑΣ ΠΟΥ ΕΚΤΕΛΕΙΤΑΙ ΣΤΗ ΣΥΝΕΧΕΙΑ ΑΝΗΚΕΙ ΠΡΑΓΜΑΤΙ ΣΤΟ ΛΕΙΤΟΥΡΓΙΚΟ. ΟΙ ΠΕΡΙΟΡΙΣΜΟΙ ΑΥΤΟΙ ΕΙΝΑΙ ΑΠΑΡΑΙΤΗΤΟΙ ΜΙΑ ΚΑΙ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΕΧΕΙ ΠΡΟΣΒΑΣΗ ΣΕ ΟΛΗ ΤΗ ΜΝΗΜΗ ΚΑΙ ΤΑ ΠΕΡΙΦΕΡΕΙΑΚΑ ΕΝΩ ΤΑ ΠΡΟΓΡΑΜΜΑΤΑ ΟΧΙ.

 

ΘΑ ΞΕΚΙΝΗΣΟΥΜΕ ΤΗΝ ΠΕΡΙΓΡΑΦΗ ΤΩΝ ΙΝΤΕRRUPTS ΕΞΗΓΩΝΤΑΣ ΠΩΣ ΑΥΤΑ ΧΡΗΣΙΜΟΠΟΙΟΥΝΤΑΙ ΑΠΟ ΤΟ ΤΕΡΜΑΤΙΚΟ ΣΤΟ ΠΡΟΣΟΜΟΙΩΤΗ SPIM. ΣΤΗ ΣΥΝΕΧΕΙΑ ΘΑ ΜΙΛΗΣΟΥΜΕ ΚΑΙ ΓΙΑ ΤΑ ΙΝΤΕRRUPTS ΠΟΥ ΜΠΟΡΕΙ ΝΑ ΠΡΟΚΛΗΘΟΥΝ ΑΠΟ ΛΑΘΗ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ ΜΑΣ Η ΕΣΚΕΜΜΕΝΑ (AYTA ΛΕΓΟΝΤΑΙ EXCEPTIONS ΣΤΟ MIPS ΑΝ ΚΑΙ ΟΙ ΟΡΟΙ INTERRUPTS KAI EXCEPTIONS ΧΡΗΣΙΜΟΠΟΙΟΥΝΤΑΙ ΜΕ ΔΙΑΦΟΡΕΤΙΚΟΥΣ ΤΡΟΠΟΥΣ ΑΠΟ ΔΙΑΦΟΡΕΤΙΚΕΣ ΑΡΧΙΤΕΚΤΟΝΙΚΕΣ).

 

ΠΡΟΓΡΑΜΜΑΤΙΖΟΝΤΑΣ ΤΟ ΤΕΡΜΑΤΙΚΟ ΓΙΑ ΝΑ ΖΗΤΑ ΙΝΤΕRRUPTS:

 

ΟΠΩΣ ΕΙΔΑΜΕ ΤΟ ΤΕΡΜΑΤΙΚΟ ΕΧΕΙ 4 ΚΑΤΑΧΩΡΗΤΕΣ ΤΟΥΣ TC, TD, RC, KAI RD. ΟΙ TC KAI RC ΠΕΡΑΝ ΤΩΝ READY BITS ΠΟΥ ΧΡΗΣΙΜΟΠΟΙΗΣΑΜΕ ΓΙΑ ΤΟ POLLING ΕΠΙΣΗΣ ΠΕΡΙΕΧΟΥΝ ΕΝΑ INTERRUPT ENABLE ΒΙΤ (ΒΙΤ 1) ΤΟ ΟΠΟΙΟ ΟΤΑΝ ΤΟ ΘΕΣΟΥΜΕ ΣΕ 1 ΕΝΕΡΓΟΠΟΙΕΙ ΤΗΝ ΑΙΤΗΣΗ ΓΙΑ INTERRUPT ΑΠΟ ΤΗ ΣΥΣΚΕΥΗ. Η ΣΥΣΚΕΥΗ ΛΟΙΠΟΝ ΜΕΤΑ ΘΑ ΖΗΤΑ ΙΝΤΕRRUPT ΑΠΟ ΤΟΝ ΕΠΕΞΕΡΓΑΣΤΗ ΟΤΑΝ ΑΝΤΙΣΤΟΙΧΑ ΕΧΕΙ ΣΤΕΙΛΕΙ ΤΟΝ ΤΕΛΕΥΤΑΙΟ ΧΑΡΑΚΤΗΡΑ (ΠΟΜΠΟΣ) Η ΟΤΑΝ ΕΧΕΙ ΛΑΒΕΙ ΕΝΑΝ ΝΕΟ (ΔΕΚΤΗΣ). Η ΣΥΣΚΕΥΗ ΑΠΛΑ ΕΝΗΜΕΡΩΝΕΙ ΤΟΝ ΕΠΕΞΕΡΓΑΣΤΗ ΟΤΙ ΘΕΛΕΙ INTERRUPT. Ο ΕΠΕΞΕΡΓΑΣΤΗΣ ΠΡΕΠΕΙ ΣΤΗ ΣΥΝΕΧΕΙΑ ΝΑ ΚΑΝΕΙ ΑΠΟΔΕΚΤΗ ΑΥΤΗΝ ΤΗΝ ΑΙΤΗΣΗ. ΤΟ ΠΩΣ ΚΑΙ ΠΟΤΕ ΓΙΝΕΤΑΙ ΑΥΤΟ ΘΑ ΤΟ ΔΟΥΜΕ ΣΤΗ ΣΥΝΕΧΕΙΑ.

 

ΟΙ ΚΑΤΑΧΩΡΗΤΕΣ RC KAI TC EXOYN THN ΠΑΡΑΚΑΤΩ ΜΟΡΦΗ:

 

RC OxFFFF0000

31

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IE

RDY

 

IE = 1 INTERRUPTS ENEΡΓΟΠΟΙΗΜΕΝΑ, 0 ΙΝΤΕRRUPTS MH ENEΡΓΑ

RDY = 1, ΝΕΟΣ ΧΑΡΑΚΤΗΡΑΣ ΔΙΑΘΕΣΙΜΟΣ ΠΡΟΣ ΑΝΑΓΝΩΣΗ ΑΠΟ ΤΟΝ RD, 0 ΚΑΝΕΝΑΣ ΧΑΡΑΚΤΗΡΑΣ

ΤC OxFFFF0008

31

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IE

RDY

 

IE = 1 INTERRUPTS ENEΡΓΟΠΟΙΗΜΕΝΑ, 0 ΙΝΤΕRRUPTS MH ENEΡΓΑ

RDY = 1 Ο ΠΟΜΠΟΣ ΕΙΝΑΙ ΑΠΑΣΧΟΛΗΜΕΝΟΣ ΣΤΕΛΝΟΝΤΑΣ ΤΟ ΧΑΡΑΚΤΗΡΑ ΑΠΟ ΤΟ TD, 0 ΠΟΜΠΟΣ ΔΙΑΘΕΣΙΜΟΣ

 

 

ΜΗ ΟΡΙΣΜΕΝΟ ΒΙΤ


ΟΠΟΤΕ ΓΙΑ ΝΑ ΕΝΕΡΓΟΠΟΙΗΣΟΥΜΕ
TA INTERRUPTS ΓΙΑ ΤΟ ΔΕΚΤΗ ΑΡΚΕΙ Η ΠΑΡΑΚΑΤΩ ΑΚΟΛΟΥΘΙΑ ΕΝΤΟΛΩΝ:

 

     la $t0, 0xffff0000

     li $t1, 0x2

     sw $t1, 0($t2)

 

Η ΑΚΟΛΟΥΘΙΑ ΑΥΤΗ ΘΕΤΕΙ ΤΟ ΙΕ ΒΙΤ TOY RC ΣΕ 1.

 

ΠΡΟΓΡΑΜΜΑΤΙΖΟΝΤΑΣ ΤΟΝ ΕΠΕΞΕΡΓΑΣΤΗ ΝΑ ΔΕΧΕΤΑΙ ΙΝΤΕRRUPTS – Ο ΣΥΝΕΠΕΞΕΡΓΑΣΤΗΣ 0

 

ΜΕΧΡΙ ΤΩΡΑ ΕΙΔΑΜΕ ΠΩΣ ΕΝΕΡΓΟΠΟΙΟΥΜΕ ΤΗΝ ΑΙΤΗΣΗ INTERRUPTS ΑΠΟ ΤΟ ΤΕΡΜΑΤΙΚΟ. ΓΙΑ ΝΑ ΓΙΝΟΥΝ ΟΜΩΣ ΑΠΟΔΕΚΤΕΣ ΑΥΤΕΣ ΟΙ ΑΙΤΗΣΕΙΣ ΠΡΕΠΕΙ ΝΑ ΕΝΕΡΓΟΠΟΙΗΣΟΥΜΕ ΚΑΙ ΤΑ INTERRUPTS ΣΤΟΝ ΕΠΕΞΕΡΓΑΣΤΗ. ΤΟΝ ΧΕΙΡΙΣΜΟ ΤΩΝ ΑΙΤΗΣΕΩΝ ΓΙΑ INTERRUPTS ΣΤΟ MIPS ANAΛΑΜΒΑΝΕΙ ΕΝΑΣ ΣΥΝΕΠΕΞΕΡΓΑΣΤΗΣ (ΟΥΣΙΑΣΤΙΚΑ ΜΙΑ ΥΠΟΜΟΝΑΔΑ ΤΟΥ ΚΥΡΙΟΥ ΕΠΕΞΕΡΓΑΣΤΗ). Ο ΣΥΝΕΠΕΞΕΡΓΑΣΤΗΣ ΑΥΤΟΣ ΟΝΟΜΑΖΕΤΑΙ COPROCESSOR 0 KAI ΔΙΑΘΕΤΕΙ ΕΝΑΝ ΑΡΙΘΜΟ ΔΙΚΩΝ ΤΟΥ ΚΑΤΑΧΩΡΗΤΩΝ (COPROCESSOR REGISTERS). ΟΙ ΚΑΤΑΧΩΡΗΤΕΣ ΑΥΤΟΙ ΧΡΗΣΙΜΟΠΟΙΟΥΝΤΑΙ ΓΙΑ ΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΤΟΥ COPROCESSOR 0 ΚΑΙ ΜΕΣΩ ΑΥΤΩΝ ΜΠΟΡΟΥΜΕ ΝΑ ΕΝΕΡΓΟΠΟΙΗΣΟΥΜΕ ΙΝΤΕRRUPTS ΓΙΑ ΔΙΑΦΟΡΕΣ ΣΥΣΚΕΥΕΣ. ΕΠΙΣΗΣ, ΟΙ ΚΑΤΑΧΩΡΗΤΕΣ ΑΥΤΟΙ ΜΑΣ ΠΑΡΕΧΟΥΝ ΤΙΣ ΚΑΤΑΛΛΗΛΕΣ ΠΛΗΡΟΦΟΡΙΕΣ ΟΥΤΩΣ ΩΣΤΕ ΟΤΑΝ ΣΥΜΒΕΙ ΕΝΑ INTERRUPT NA ΜΠΟΡΟΥΜΕ ΝΑ ΕΝΤΟΠΙΣΟΥΜΕ ΠΟΙΟ ΑΚΡΙΒΩΣ ΕΙΝΑΙ ΑΥΤΟ ΚΑΙ ΕΤΣΙ ΝΑ ΤΟ ΧΕΙΡΙΣΤΟΥΜΕ ΚΑΤΑΛΛΗΛΑ.

 

Ο ΣΥΝΕΠΕΞΕΡΓΑΣΤΗΣ ΠΕΡΙΕΧΕΙ ΛΟΙΠΟΝ ΚΑΠΟΙΟΥΣ ΚΑΤΑΧΩΡΗΤΕΣ ΠΟΥ ΕΧΟΥΝ ΚΑΙ ΑΥΤΟΙ ΤΑ ΟΝΟΜΑΤΑ $0 ΕΩΣ $16 (ΔΕΝ ΕΙΝΑΙ ΟΛΟΙ ΑΥΤΟΙ ΔΙΑΘΕΣΙΜΟΙ). ΜΠΟΡΟΥΜΕ ΜΟΝΟ ΝΑ ΤΟΥΣ ΔΙΑΒΑΖΟΥΜΕ ΚΑΙ ΝΑ ΤΟΥΣ ΓΡΑΨΟΥΜΕ ΜΕΣΩ ΤΩΝ ΠΑΡΑΚΑΤΩ ΕΝΤΟΛΩΝ:

 

1.     mtc0 src, CPdst

a.  ΟΠΟΥ src = ΕΝΑΣ ΑΠΟ ΤΟΥΣ ΚΑΤΑΧΩΡΗΤΕΣ ΤΟΥ ΕΠΕΞΕΓΑΣΤΗ (Π.Χ., %t0, $1, $a0) ΚΑΙ CPdst ENAΣ ΚΑΤΑΧΩΡΗΤΗΣ ΤΟΥ ΣΥΝΕΠΕΞΕΡΓΑΣΤΗ

b.  H ΕΝΤΟΛΗ ΑΥΤΗ ΓΡΑΦΕΙ ΤΑ ΠΕΡΙΕΧΟΜΕΝΑ ΤΟΥ ΚΑΤΑΧΩΡΗΤΗ src ΣΤΟΝ ΚΑΤΑΧΩΡΗΤΗ ΤΟΥ ΣΥΝΕΠΕΞΕΡΓΑΣΤΗ CPdst

2.     mfc0 dst, CPsrc

a.  ΟΠΟΥ dst = ΕΝΑΣ ΑΠΟ ΤΟΥΣ ΚΑΤΑΧΩΡΗΤΕΣ ΤΟΥ ΕΠΕΞΕΓΑΣΤΗ (Π.Χ., %t0, $1, $a0) ΚΑΙ CPsrc ENAΣ ΚΑΤΑΧΩΡΗΤΗΣ ΤΟΥ ΣΥΝΕΠΕΞΕΡΓΑΣΤΗ

b.  H ΕΝΤΟΛΗ ΑΥΤΗ ΓΡΑΦΕΙ ΤΑ ΠΕΡΙΕΧΟΜΕΝΑ ΤΟΥ ΚΑΤΑΧΩΡΗΤΗ ΤΟΥ ΣΥΝΕΠΕΞΕΡΓΑΣΤΗ CPsrc ΣΤΟΝ ΚΑΤΑΧΩΡΗΤΗ ΤΟΥ ΕΠΕΞΕΡΓΑΣΤΗ dst

 

OI ΚΑΤΑΧΩΡΗΤΕΣ ΤΟΥ ΣΥΝΕΠΕΞΕΡΓΑΣΤΗ 0 ΠΟΥ ΜΑΣ ΕΝΔΙΑΦΕΡΟΥΝ ΕΙΝΑΙ ΟΙ:

 

ΚΑΤΑΧΩΡΗΤΗΣ

ΟΝΟΜΑΣΙΑ

ΧΡΗΣΗ

$8

BadVAddr

ΔΙΕΥΘΥΝΣΗ ΜΝΗΜΗΣ ΟΠΟΥ ΥΠΗΡΞΕ ΠΡΟΒΛΗΜΑ (ΓΙΑ EXCEPTIONS ΠΟΥ ΕΧΟΥΝ ΣΧΕΣΗ ΜΕ ΠΡΟΒΛΗΜΑ ΚΑΤΑ ΤΗΝ ΠΡΟΣΠΕΛΑΣΗ ΜΝΗΜΗΣ)

$12

Status

ΕΝΕΡΓΟΠΟΙΗΣΗ INTERRUPTS ΚΑΙ ΚΑΤΑΣΤΑΣΗ ΛΕΙΤΟΥΡΓΙΑΣ

$13

Cause

ΤΙ ΠΡΟΚΑΛΕΣΕ ΤΟ INTERRUPT

$14

EPC

ΣΕ ΠΟΙΑ ΕΝΤΟΛΗ ΔΙΑΚΟΠΗΚΕ ΤΟ ΠΡΟΓΡΑΜΜΑ

 

ΘΑ ΠΕΡΙΓΡΑΨΟΥΜΕ ΜΕ ΛΕΠΤΟΜΕΡΕΙΑ ΕΝΑΝ-ΕΝΑΝ ΤΟΥΣ ΚΑΤΑΧΩΡΗΤΕΣ ΚΑΘΩΣ ΕΞΗΓΟΥΜΕ ΤΗ ΧΡΗΣΗ ΤΟΥΣ.

 

KERNEL/USER MODE: ΑΡΧΙΚΑ ΝΑ ΔΙΕΥΚΡΙΝΗΣΟΥΜΕ ΠΩΣ Ο ΕΠΕΞΕΡΓΑΣΤΗΣ ΜΠΟΡΕΙ ΝΑ ΕΚΤΕΛΕΙ ΕΝΤΟΛΕΣ ΣΕ ΔΥΟ ΚΑΤΑΣΤΑΣΕΙΣ USER KAI ΚΕRNEL. ΣTHN ΚΑΤΑΣΤΑΣΗ USER YΠΑΡΧΟΥΝ ΠΕΡΙΟΡΙΣΜΟΙ. ΚΑΠΟΙΕΣ ΔΙΕΥΘΥΝΣΕΙΣ ΚΑΙ ΕΝΤΟΛΕΣ ΔΕΝ ΕΙΝΑΙ ΠΡΟΣΠΕΛΑΣΙΜΕΣ Η ΔΙΑΘΕΣΙΜΕΣ ΑΝΤΙΣΤΟΙΧΑ. ΣΤΗΝ ΚΑΤΑΣΤΑΣΗ KERNEL ΔΕΝ ΥΠΑΡΧΕΙ ΚΑΝΕΝΑΣ ΠΕΡΙΟΡΙΣΜΟΣ. ΣΕ ΠΡΑΓΜΑΤΙΚΑ ΣΥΣΤΗΜΑΤΑ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΤΡΕΧΕΙ ΚΑΤΩ ΑΠΟ ΤΗΝ ΚΑΤΑΣΤΑΣΗ KERNEL ΚΑΙ ΤΑ ΠΡΟΓΡΑΜΜΑΤΑ ΤΩΝ ΧΡΗΣΤΩΝ ΚΑΤΩ ΑΠΟ ΤΗΝ ΚΑΤΑΣΤΑΣΗ USER. ΣΤΟ SPIM ΞΕΚΙΝΑΜΕ ΠΑΝΤΑ ΣΕ KERNEL ΚΑΤΑΣΤΑΣΗ.

 

O ΚΑΤΑΧΩΡΗΤΗΣ status ($12)

 

Η ΤΡΕΧΟΥΣΑ ΚΑΤΑΣΤΑΣΗ ΛΕΙΤΟΥΡΓΙΑΣ ΣΗΜΕΙΩΝΕΤΑΙ ΜΕΣΑ ΣΤΟΝ ΚΑΤΑΧΩΡΗΤΗ STATUS.

Ο ΚΑΤΑΧΩΡΗΤΗΣ ΕΧΕΙ ΤΗΝ ΠΑΡΑΚΑΤΩ ΜΟΡΦΗ:

31

 

 

 

 

 

 

 

 

 

 

 

 

 

 

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IM7

IM6

IM5

IM4

IM3

IM2

IM1

IM0

 

 

KUo

IEo

KUp

IEp

KUc

IEc

 

H ΣΗΜΑΣΙΑ ΤΩΝ ΠΕΔΙΩΝ (ΕΝΑ ΒΙΤ ΤΟ ΚΑΘΕΝΑ) ΕΙΝΑΙ:

 

KU = KERNEL Η USER MODE (0 KAI 1 ANTIΣΤΟΙΧΑ)

IE = ΙΝΤΕRRUPTS ΕΝΕΡΓΟΠΟΙΗΜΕΝΑ (1) ‘Ή ΟΧΙ (0)

ΥΠΑΡΧΟΥΝ ΤΡΙΑ ΖΕΥΓΑΓΙΑ ΚU KAI IE ΤΑ c, p, KAI o H ANTISTOIXA current (ΤΡΕΧΟΥΣΑ), previous (ΠΡΟΗΓΟΥΜΕΝΗ) KAI old (ΠΑΛΙΑ). ΤΟ ΓΙΑΤΙ ΕΙΝΑΙ ΕΤΣΙ ΔΕ ΜΑΣ ΕΝΔΙΑΦΕΡΕΙ ΙΔΙΕΤΕΡΑ ΓΙΑ ΑΥΤΟ ΤΟ ΜΑΘΗΜΑ.

ΑΡΚΕΙ ΝΑ ΓΝΩΡΙΖΕΤΕ ΠΩΣ ΟΥΣΙΑΣΤΙΚΑ ΤΑ ΤΡΙΑ ΑΥΤΑ ΖΕΥΓΑΡΙΑ Ο ΣΥΝΕΠΕΞΕΡΓΑΣΤΗΣ ΤΑ ΧΕΙΡΙΖΕΤΑΙ ΩΣ ΕΝΑ ΑΠΛΟ STACK ME ΤΡΕΙΣ ΘΕΣΕΙΣ (CURRENT ΣΤΗΝ ΚΟΡΥΦΗ). ΜΕ ΤΟ ΠΟΥ ΕΚΤΕΛΕΙΤΑΙ ΕΝΑ ΙΝΤERRUPT ΣΤΗΝ ΚΟΡΥΦΗ ΤΟΥ STACK O ΕΠΕΞΕΡΓΑΣΤΗΣ ΑΥΤΟΜΑΤΑ ΤΟΠΟΘΕΤΕΙ ΤΗΝ ΤΙΜΗ KUc=0 KAI IEc=0 (ΟΙ ΠΡΟΗΓΟΥΜΕΝΕΣ ΤΙΜΕΣ ΤΩΝ KUc KAI IEc ANTIΓΡΑΦΟΝΤΑΙ ΑΥΤΟΜΑΤΑ ΣΤΟ KUp KAI IEp KAI AYTEΣ ΑΠΟ ΤΑ KUp KAI IEp ΣΤΑ ΚUo KAI IEo) (ΑΥΤΑ ΥΛΟΠΟΙΟΥΝΤΑΙ ΩΣ ΜΙΑ ΟΛΙΣΘΗΣΗ ΠΡΟΣ ΤΑ ΑΡΙΣΤΕΡΑ). ME AYTON TO ΤΡΟΠΟ ΑΜΕΣΩΣ ΜΟΛΙΣ ΕΝΕΡΓΟΠΟΙΗΘΕΙ ΤΟ ΙΝΤΕRRUPT O ΕΠΕΞΕΡΓΑΣΤΗΣ ΠΕΡΝΑ ΑΥΤΟΜΑΤΑ ΣΕ ΚΕRNEL KAI AΠΕΝΕΡΓΟΠΟΙΕΙ ΤΑ INTERRUPTS (EΦΟΣΟΝ ΙΕc=0). ΑΥΤΟ ΓΙΝΕΤΑΙ ΩΣΤΕ ΝΑ ΑΠΟΦΕΥΧΘΕΙ ΤΟ ΣΕΝΑΡΙΟ ΟΠΟΥ ΤΟ ΕΝΑ ΙΝΤΕRRUPT EΡΧΕΤΑΙ ΚΑΙ ΠΡΙΝ ΠΡΟΛΑΒΟΥΜΕ ΝΑ ΤΟ ΧΕΙΡΙΣΤΟΥΜΕ ΕΡΧΕΤΑΙ ΑΛΛΟ ΚΑΙ ΑΛΛΟ, ΚΑΙ ΑΛΛΟ ΩΣΤΕ ΤΕΛΙΚΑ ΚΑΤΑΛΗΓΟΥΜΕ ΣΕ DEADLOCK.

 

TA ΠΕΔΙΑ ΙΜx ΧΡΗΣΙΜΟΠΟΙΟΥΝΤΑΙ ΓΙΑ ΝΑ ΕΝΕΡΓΟΠΟΙΗΣΟΥΝ ΜΙΑ ΑΠΟ ΤΑ 8 ΔΙΑΘΕΣΙΜΑ ΕΠΙΠΕΔΑ ΓΙΑ INTERRUPTS.

ΣΤΟ MIPS ΥΠΑΡΧΟΥΝ 8 ΕΠΙΠΕΔΑ ΓΙΑ ΑΙΤΗΣΕΙΣ INTERRUPTS. AYTA ΜΠΟΡΟΥΜΕ ΝΑ ΤΑ ΦΑΝΤΑΣΤΟΥΜΕ ΩΣ 8 ΚΑΛΩΔΙΑ ΠΟΥ ΧΡΗΣΙΜΟΠΟΙΟΥΝ ΟΙ ΣΥΣΚΕΥΕΣ ΓΙΑ ΝΑ ΖΗΤΗΣΟΥΝ ΙΝΤΕRRUPT (ΣΤΗΝ ΠΡΑΓΜΑΤΙΚΟΤΗΤΑ ΜΟΝΟ 6 ΑΠΟ ΑΥΤΑ ΕΙΝΑΙ ΔΙΑΘΕΣΙΜΑ ΣΕ ΣΥΣΚΕΥΕΣ). ΓΙΑ ΝΑ ΓΙΝΕΙ ΑΠΟΔΕΚΤΟ ΕΝΑ ΙΝΤΕRRUPT ΠΡΕΠΕΙ ΚΑΙ ΣΥΝΟΛΙΚΑ ΤΑ INTERRUPTS NA EINAI ENEΡΓΟΠΟΙΜΕΝΑ (IEc = 1) ΚΑΙ ΤΟ ΑΝΤΙΣΤΟΙΧΟ ΙΜ ΒΙΤ ΝΑ ΕΙΝΑΙ 1.

 

ΣΤΟ SPIM Ο ΠΟΜΠΟΣ ΤΟΥ ΤΕΡΜΑΤΙΚΟΥ ΕΙΝΑΙ ΣΥΝΔΕΔΕΜΕΝΟΣ ΜΕ ΤΟ INTERRUPT ΕΠΙΠΕΔΟ 1 ΚΑΙ Ο ΔΕΚΤΗΣ ΜΕ ΤΟ INTERRUPT EΠΙΠΕΔΟ 0.

 

ΟΠΟΤΕ ΓΙΑ ΝΑ ΕΝΕΡΓΟΠΟΙΗΣΟΥΜΕ ΤΗΝ ΑΠΟΔΟΧΗ INTERRUPTS ΑΠΟ ΤΟ ΔΕΚΤΗ (RECEIVER) ΜΠΟΡΟΥΜΕ ΝΑ ΕΚΤΕΛΕΣΟΥΜΕ ΤΗΝ ΠΑΡΑΚΑΤΩ ΑΚΟΛΟΥΘΙΑ ΕΝΤΟΛΩΝ:

 

     li $t0, 0x101

     mtc0 $t0, $12

 

Η ΟΠΟΙΑ ΘΕΤΕΙ ΤΑ ΒΙΤ 0 ΚΑΙ 8 ΤΟΥ STATUS ΚΑΤΑΧΩΡΗΤΗ ΣΕ 1 (ΙΕc KAI IM0 ANTIΣΤΟΙΧΑ).

 

 

 

ΕΣΤΩ ΛΟΙΠΟΝ ΠΩΣ ΕΝΕΡΓΟΠΟΙΗΣΑΜΕ ΤΑ INTERRUPTS ΓΙΑ ΤΟ ΔΕΚΤΗ.

ΤΙ ΣΥΜΒΑΙΝΕΙ ΟΤΑΝ ΕΧΟΥΜΕ INTERRUPT;

 

ΤΟ INTERRUPT ΜΠΟΡΟΥΜΕ ΝΑ ΤΟ ΚΑΤΑΝΟΗΣΟΥΜΕ ΣΑΝ ΜΙΑ ΚΛΗΣΗ ΡΟΥΤΙΝΑΣ Η ΟΠΟΙΑ ΟΜΩΣ ΠΡΟΚΑΛΕΙΤΑΙ ΑΥΤΟΜΑΤΑ ΑΠΟ ΤΟ HARDWARE ΚΑΙ ΟΧΙ ΑΠΟ ΤΟ ΠΡΟΓΡΑΜΜΑ ΜΑΣ. Η ΚΛΗΣΗ ΑΥΤΗ ΓΙΝΕΤΑΙ ΣΕ ΠΡΟΚΑΘΟΡΙΣΜΕΝΗ ΔΙΕΥΘΥΝΣΗ. ΣΤΟ MIPS ΑΥΤΗ ΕΙΝΑΙ Η 0x80000080.

 

AΡΑ ΟΤΑΝ Ο ΔΕΚΤΗΣ ΖΗΤΗΣΕΙ ΙΝTERRUPT, ΛΙΓΟ ΜΕΤΑ Ο ΣΥΝΕΠΕΞΕΡΓΑΣΤΗΣ 0 ΘΑ ΤΟ ΚΑΝΕΙ ΑΠΟΔΕΚΤΟ ΚΑΙ ΤΟ ΑΠΟΤΕΛΕΣΜΑ ΘΑ ΕΙΝΑΙ ΤΟ PC NA ΓΙΝΕΙ 0x80000080 (KAI O STATUS ΚΑΤΑΧΩΡΗΤΗΣ ΝΑ ΑΛΛΑΞΕΙ ΟΠΩΣ ΠΕΡΙΓΡΑΨΑΜΕ ΠΑΡΑΠΑΝΩ).

 

Ο ΚΩΔΙΚΑΣ ΠΟΥ ΠΡΕΠΕΙ ΝΑ ΒΡΙΣΚΕΤΑΙ ΣΕ ΑΥΤΗΝ ΤΗ ΔΙΕΥΘΥΝΣΗ ΠΕΡΙΕΧΕΙ ΤΟΝ INTERRUPT HANDLER. EINAI ΔΗΛΑΔΗ ΑΝΑ ΠΡΟΓΡΑΜΜΑ ΠΟΥ ΔΙΑΒΑΖΟΝΤΑΣ ΤΟΥΣ ΚΑΤΑΛΛΗΛΟΥΣ ΚΑΤΑΧΩΡΗΤΕΣ ΤΟΥ ΣΥΝΕΠΕΞΕΡΓΑΣΤΗ ΘΑ ΕΝΤΟΠΙΣΕΙ ΓΙΑΤΙ ΣΥΝΕΒΕΙ ΤΟ INTERRUPT KAI ANAΛΟΓΑ ΘΑ ΤΟ ΧΕΙΡΙΣΤΕΙ. ΘΑ ΔΩΣΟΥΜΕ ΑΡΓΟΤΕΡΑ ΕΝΑ ΠΑΡΑΔΕΙΓΜΑ ΟΠΟΥ Ο INTERRUPT HANDLER ΘΑ ΔΕΧΕΤΑΙ ΧΑΡΑΚΤΗΡΕΣ ΑΠΟ ΤΟ ΤΕΡΜΑΤΙΚΟ. ΕΦΟΣΟΝ Ο ΙΝΤΕRRUPT HANDLER TΡΕΧΕΙ ΣΕ KERNEL MODE ΜΠΟΡΕΙ ΝΑ ΧΡΗΣΙΜΟΠΟΙΗΣΕΙ ΚΑΙ ΤΟΥΣ ΚΑΤΑΧΩΡΗΤΕΣ $k1 KAI $k0. ΣΤΟ SPIM AYTOI OI KATAΧΩΡΗΤΕΣ ΕΙΝΑΙ ΔΙΑΘΕΣΙΜΟΙ ΧΩΡΙΣ ΝΑ ΧΡΕΙΑΣΤΕΙ ΝΑ ΤΟΥΣ ΣΩΣΟΥΜΕ.

 

ΠΩΣ ΘΥΜΑΤΑΙ Ο ΕΠΕΞΕΡΓΑΣΤΗΣ ΠΟΥ ΝΑ ΓΥΡΙΣΕΙ ΜΟΛΙΣ ΟΛΟΚΛΗΡΩΣΕΙ ΤΗΝ ΕΠΕΞΕΡΓΑΣΙΑ ΤΟΥ INTERRUPT;

ΠΡΕΠΕΙ ΝΑ ΕΙΜΑΣΤΕ ΣΕ ΘΕΣΗ ΝΑ ΕΠΙΣΤΡΕΨΟΥΜΕ ΣΤΗΝ ΕΝΤΟΛΗ ΠΟΥ ΔΙΑΚΟΠΗΚΕ ΟΤΑΝ ΣΥΝΕΒΕΙ ΤΟ INTERRUPT (ΑΝΤΙΣΤΟΙΧΟ ΜΕ ΤΟ RETURN ΑΠΟ ΜΙΑ ΥΠΟΡΟΥΤΙΝΑ). ΣΕ ΑΥΤΗΝ ΤΗΝ ΠΕΡΙΠΤΩΣΗ *ΔΕ* ΜΠΟΡΟΥΜΕ ΝΑ ΧΡΗΣΙΜΟΠΟΙΗΣΟΥΜΕ ΤΟ $31 ΜΙΑ ΚΑΙ ΤΟ ΠΡΟΓΡΑΜΜΑ ΠΟΥ ΔΙΑΚΟΠΤΟΥΜΕ ΜΠΟΡΕΙ ΝΑ ΤΟΝ ΧΡΗΣΙΜΟΠΟΙΕΙ. ΓΙΑ ΑΥΤΟ ΤΟ ΣΚΟΠΟ ΥΠΑΡΧΕΙ Ο ΚΑΤΑΧΩΡΗΤΗΣ EPC ($14 TOY ΣΥΝΕΠΕΞΕΡΓΑΣΤΗ $0). ΠΡΙΝ ΛΟΙΠΟΝ Ο PC AΛΛΑΞΕΙ ΣΕ 0X80000080 Ο ΣΥΝΕΠΕΞΕΡΓΑΣΤΗΣ ΣΩΝΕΙ ΤΗΝ ΤΙΜΗ ΤΟΥ PC ΣΤΟΝ ΚΑΤΑΧΩΡΗΤΗ ΕPC.

 

Ο ΠΙΟ ΑΠΛΟΣ INTERRUPT HANDLER ΛΟΙΠΟΝ ΕΙΝΑΙ Ο:

 

     .ktext    # ΩΣΤΕ Ο ΚΩΔΙΚΑΣ ΝΑ ΚΑΤΑΧΩΡΗΘΕΙ ΑΠΟ ΤΗ ΔΙΕΥΘΥΝΣΗ 0X80000080

lala:

     mfc0 $k0, $14 # ΦΕΡΕ ΤΗΝ ΤΙΜΗ ΤΟΥ EPC ΣΤΟΝ ΚΑΤΑΧΩΡΗΤΗ $k0

     rfe           # ΕΠΑΝΕΦΕΡΕ ΤΑ KERNEL/USER KAI INTERRUPT ENABLE ΒΙΤS TOY STATUS KATAΧΩΡΗΤΗ

                   # (ΟΛΙΣΘΗΣΗ ΠΡΟΣ ΤΑ ΔΕΞΙΑ)

     jr $k0        # ΕΠΕΣΤΡΕΨΕ ΣΤΗΝ ΕΝΤΟΛΗ ΠΟΥ ΕΙΧΕ ΔΙΑΚΟΠΕΙ

 

ΑΥΤΟΣ Ο ΗΑΝDLER ΔΕΝ ΚΑΝΕΙ ΑΠΟΛΥΤΩΣ ΤΙΠΟΤΕ, ΑΠΛΑ ΕΠΙΣΤΡΕΦΕΙ ΚΑΙ ΕΙΝΑΙ ΚΑΤΑΛΛΗΛΟΣ ΜΟΝΟ ΟΤΑΝ ΠΡΟΚΕΙΤΑΙ ΓΙΑ ΙΝΤΕRRUPT ΑΠΟ ΕΞΩΤΕΡΙΚΗ ΣΥΣΚΕΥΗ (ΚΑΙ ΟΧΙ ΓΙΑ EXCEPTION ΛΟΓΟ Π.Χ. ΣΦΑΛΜΑΤΟΣ).

 

 

ΠΩΣ ΜΠΟΡΟΥΜΕ ΝΑ ΕΝΤΟΠΙΣΟΥΜΕ ΓΙΑΤΙ ΣΥΝEBEI ENA ΙΝΤΕRRUPT;

 

ANEΞΑΡΤΗΤΑ ΑΠΟ ΤΟ ΠΟΙΑ ΣΥΣΚΕΥΗ ΖΗΤΗΣΕ ΕΝΑ ΙΝΤΕRRUPT, H AN TO ΙΝΤΕRRUPT ΠΡΟΚΛΗΘΗΚΕ ΑΠΟ ΤΟ ΙΔΙΟ ΤΟ ΠΡΟΓΡΑΜΜΑ Ο ΕΠΕΞΕΡΓΑΣΤΗΣ ΘΑ ΑΡΧΙΣΕΙ ΝΑ ΕΚΤΕΛΕΙ ΤΟΝ INTERRUPT HANDLER. AYΤΟΣ ΘΑ ΠΡΕΠΕΙ ΝΑ ΕΙΝΑΙ ΣΕ ΘΕΣΕΙ ΝΑ ΠΡΟΣΔΙΟΡΙΣΕΙ ΤΟ ΛΟΓΟ ΓΙΑ ΤΟΝ ΟΠΟΙΟ ΚΑΛΕΣΤΗΚΕ ΚΑΙ ΝΑ ΕΚΤΕΛΕΣΕΙ ΜΕΤΑ ΤΙΣ ΑΝΑΛΟΓΕΣ ΕΝΤΟΛΕΣ. Ο ΠΡΟΣΔΙΟΡΙΣΜΟΣ ΑΥΤΟΣ ΓΙΝΕΤΑΙ ΒΑΣΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΑΣ ΠΟΥ ΒΡΙΣΚΕΤΑΙ ΣΤΟΝ ΚΑΤΑΧΩΡΗΤΗ CAUSE.

 

O CAUSE ($13) ΕΧΕΙ ΤΗΝ ΠΑΡΑΚΑΤΩ ΜΟΡΦΗ:

31

 

 

 

 

 

 

 

 

 

 

 

 

 

 

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IP7

IP6

IP5

IP4

IP3

IP2

IP1

IP0

 

 

EXC CODE

 

 

 

TO ΠΕΔΙΟ “EXC CODE” ΠΕΡΙΕΧΕΙ ΜΙΑ ΤΙΜΗ ΠΟΥ ΠΡΟΣΔΙΟΡΙΖΕΙ ΓΙΑΤΙ ΣΥΝΕΒΕΙ ΤΟ INTERRUPT. O ΠΑΡΑΚΑΤΩ ΠΙΝΑΚΑΣ ΔΙΝΕΙ ΑΥΤΕΣ ΤΙΣ ΤΙΜΕΣ:

TIMH

ONOMΑΣΙΑ

ΠΕΡΙΓΡΑΦΗ

0

ΙΝΤ

INTERRUPT ΑΠΟ ΣΥΣΚΕΥΗ

4

ΑDDRL

LOAD ΑΠΟ ΜΗ ΠΡΟΣΠΕΛΑΣΙΜΗ ΔΙΕΥΘΥΝΣΗ

5

ADDRS

STORE ΑΠΟ ΜΗ ΠΡΟΣΠΕΛΑΣΙΜΗ ΔΙΕΥΘΥΝΣΗ

6

IBUS

UNALLIGNED INSTRUCTION

7

DBUS

UNALLIGNED DATA

8

SYSCALL

ΕΝΤΟΛΗ SYSCALL

9

BRKPT

ENTOΛΗ ΒREAK

10

RI

ΜΗ ΥΛΟΠΟΙΗΜΕΝΗ ΕΝΤΟΛΗ

12

OVF

ΥΠΕΡΧΥΛΗΣΗ

 

ΣΤΗΝ ΠΕΡΙΠΤΩΣΗ INTERRUPT TA ΒΙΤ IPx MAΣ ΕΠΙΤΡΕΠΟΥΝ ΝΑ ΕΝΤΟΠΙΣΟΥΜΕ ΤΟ ΕΠΙΠΕΔΟ ΤΗΣ ΑΙΤΗΣΗΣ (ΤΟ ΑΝΤΙΣΤΟΙΧΟ BIT ΘΑ ΕΙΝΑΙ 1). ΑΝ ΥΠΑΡΧΟΥΝ ΠΟΛΛΕΣ ΑΙΤΗΣΕΙΣ ΤΟΤΕ ΜΑΛΛΟΝ ΟΛΑ ΤΑ ΑΝΤΙΣΤΟΙΧΑ ΒΙΤ ΘΑ ΕΙΝΑΙ 1.

 

ΟΠΟΤΕ Ο ΠΟΙΟ ΑΠΛΟΣ ΙΝΤΕRRUPT HANDLER ΤΩΡΑ ΜΠΟΡΕΙ ΚΑΙ ΝΑ ΔΙΑΧΩΡΙΣΕΙ ΜΕΤΑΞΥ INTERRUPTS AΠΟ ΣΥΣΚΕΥΕΣ ΚΑΙ EXCEPTIONS (ΠΟΥ ΠΡΟΚΛΗΘΗΚΕ ΑΠΟ ΤΟ ΠΡΟΓΡΑΜΜΑ):

 

        .ktext

        .set noat

        move $k1, $at           # swse ton $at ($1) sto $k1 giati xrisimopoioyme pseutoentoles

        .set at

 

        mfc0 $k0, $13           # Apo ton Cause register

                                # apomonwse to ExcCode bits 2 ews kai 5

        andi $k0, $k0, 0x3C     # to ExcCode einai 4 bits synolika

                                # 0X3C = 00111100 ΣΤΟ ΔΥΑΔΙΚΟ

 

        beq $k0, $0, int_entry  # An einai 0 tote exoyme handware interrupt kai oxi exception

                                # to EXC CODE einai 0

 

# Edw ftanoyme an exoyme exception: diladi kati pige straba me mia entoli

# apla tin agnoyoyme kai epistrefoyme stin epomeni

#

ret:   

        mfc0 $k0, $14           # fere ton EPC sto $k0

        addiu $k0, $k0, 4       # prosthese 4 sto EPC wste na epistrepsoyme stin epomeni entoli

        .set noat

        move $at, $k1           # epanefere ton $at

        .set at

        rfe                     # epestrepse epanaferontas ton status (kernel/interrupt bits)

        jr $k0

 

int_entry:

       mfc0 $k0, $14           # EPC (return to EPC)

       .set noat

       move $at,$k1            # Restore $at

       .set at

       rfe                     # Return from exception handler

       jr $k0

 

Ο ΚΩΔΙΚΑΣ ΜΕΤΑ ΤΗΝ ΕΤΙΚΕΤΤΑ ret: ΔΕΝ ΕΠΙΣΤΡΕΦΕΙ ΣΤΟ EPC ΑΛΛΑ ΣΤΟ EPC+4 ΚΑΙ ΑΥΤΟ ΓΙΑΤΙ ΟΤΑΝ ΕΚΤΕΛΕΙΤΑΙ ΓΝΩΡΙΖΟΥΜΕ ΠΩΣ ΤΟ ΙΝΤΕRRUPTS ΠΡΟΚΛΗΘΗΚΕ ΑΠΟ ΤΟ ΠΡΟΓΡΑΜΜΑ ΚΑΙ ΟΧΙ ΑΠΟ ΕΞΩΤΕΡΙΚΗ ΣΥΣΚΕΥΣΗ. ΜΕ ΑΥΤΟΝ ΤΟ ΤΡΟΠΟ ΑΠΟΦΕΥΓΟΥΜΕ ΝΑ ΞΑΝΑΕΚΤΕΛΕΣΟΥΜΕ ΤΗΝ ΕΝΤΟΛΗ ΠΟΥ ΠΡΟΚΑΛΕΣΕ ΤΟ INTERRUPT (EXCEPTION).

 

Ο SPIM ΕΡΧΕΤΕ ΜΕ ΕΤΟΙΜΟ ΕΝΑΝ INTERRUPT ΗΑΝDLER O OΠΟΙΟΣ ΥΛΟΠΟΙΕΙ ΜΕΡΙΚΑ SYSTEM CALLS ΚΑΘΩΣ ΚΑΙ ΑΠΛΑ ΤΥΠΩΝΕΙ ΣΤΟ ΤΕΡΜΑΤΙΚΟ ΤΟ ΕΙΔΟΣ ΤΟΥ ΕXCEPTION ΓΙΑ ΟΛΕΣ ΤΙΣ ΑΛΛΕΣ ΠΕΡΙΠΤΩΣΕΙΣ. Ο INTERRUPT HANDLER AYTOΣ ΒΡΙΣΚΕΤΑΙ ΣΤΟ ΑΡΧΕΙΟ trap.handler ΣΤΟ ΟΠΟΙΟ ΠΡΕΠΕΙ ΝΑ ΔΕΙΧΝΕΙ ΚΑΙ Η ΠΑΡΑΜΕΤΡΟΣ

“SIMULATOR>SETTINGS>TRAP FILE” (AΠΟ ΤΟ ΜΕΝΟΥ).

 

Ο ΚΑΤΑΧΩΡΗΤΗΣ BadVAddr ($8)

ΣΤΗΝ ΠΕΡΙΠΤΩΣΗ ΠΟΥ ΤΟ ΙΝTERRUPT ΠΡΟΚΛΗΘΗΚΕ ΑΠΟ ΠΡΟΒΛΗΜΑ ΚΑΤΑ ΤΗΝ ΠΡΟΣΠΕΛΑΣΗ ΜΝΗΜΗΣ ΤΟΤΕ Ο ΚΑΤΑΧΩΡΗΤΗΣ BadVAddr ΠΕΡΙΕΧΕΙ ΤΗ ΔΙΕΥΘΥΝΣΗ ΤΗΝ ΟΠΟΙΑ ΠΡΟΣΠΑΘΗΣΑΜΕ ΝΑ ΠΡΟΣΠΕΛΑΣΟΥΜΕ ΚΑΙ ΑΠΟΤΥΧΑΜΕ.

 

 

ΤΩΡΑ ΕΙΜΑΣΤΕ ΣΕ ΘΕΣΗ ΝΑ ΔΟΥΜΕ ΤΗΝ ΠΛΗΡΗ ΑΚΟΛΟΥΘΙΑ ΕΝΕΡΓΟΠΟΙΗΣΗΣ INTERRUPTS ΓΙΑ ΤΟ ΔΕΚΤΗ ΤΟΥ ΤΕΡΜΑΤΙΚΟΥ:

 

        .text

main:

        li $v0, 0x00101             # energopoise ta interrupts sto Status Register

                                    # o status register (SR) anikei sto coprocessor 0

                                    # kai einai ekei o kataxwritis $12

                                    # i timi 0x00101 thetei ta bit 0 kai 8 se 1

                                    # to bit 0 einai to trexon interrupt enable

                                    # kanontas to 1 energopoioyme ta interrupts

                                    # apotelei stin oysia kati san kentriko diakopti gia

                                    # interrupts an einai 0 tote den dexomaste kanena interrupt.

                                    # sti synexeia prepei na dilwsoyme poia interrupts

                                    # akribws mas endiaferoun, ayto to kanoyme thetwntas to bit

                                    # 8, poy antistoixei

        mtc0 $v0, $12

 

        la      $a0, 0xffff0000 # basi tis syskeyis termatiko

        addi    $v1, $0, 0x2    # energopoiisi interrupts gia to dekti RC bit 1 = 1

        sw      $v1, 0($a0)

 

 

 

O ΠΑΡΑΚΑΤΩ ΚΩΔΙΚΑΣ ΧΡΗΣΙΜΟΠΟΙΕΙ ΙΝΤERRUPTS ΓΙΑ ΝΑ ΔΕΧΕΤΑΙ ΧΑΡΑΚΤΗΡΕΣ ΑΠΟ ΤΟ ΤΕΡΜΑΤΙΚΟ ΚΑΙ POLLING ΓΙΑ ΝΑ ΤΟΥΣ ΞΑΝΑΣΤΕΛΝΕΙ ΠΙΣΩ ΣΤΟ ΤΕΡΜΑΤΙΚΟ.

 

ΧΡΗΣΙΜΟΠΟΙΕΙ ΔΥΟ ΜΕΤΑΒΛΗΤΕΣ ΣΤΗ ΜΝΗΜΗ FLAG KAI INCHAR. ΟΤΑΝ ΕΝΑΣ ΧΑΡΑΚΤΗΡΑΣ ΛΗΦΘΕΙ ΑΠΟ ΤΟΝ INTERRUPT HANDLER TON ΓΡΑΦΕΙ ΣΤΗΝ INCHAR KAI ΘΕΤΕΙ ΤΟ FLAG SE 0XFF. ΤΟ ΚΥΡΙΩΣ ΠΡΟΓΡΑΜΜΑ ΔΙΑΒΑΖΕΙ ΣΥΝΕΧΕΙΑ ΤΟ FLAG ΕΦΟΣΟΝ ΑΥΤΟ ΕΧΕΙ ΤΗΝ ΤΙΜΗ 0. ΜΟΛΙΣ ΓΙΝΕΙ ΜΗ ΜΗΔΕΝΙΚΟ, ΤΟΤΕ ΔΙΑΒΑΖΕΙ ΤΟ ΧΑΡΑΚΤΗΡΑ ΑΠΟ ΤΗ ΘΕΣΗ INCHAR ΚΑΙ ΧΡΗΣΙΜΟΠΟΙΩΝΤΑΣ POLLING TON ΣΤΕΛΝΕΙ ΣΤΟ ΤΕΡΜΑΤΙΚΟ.

 

ΣΗΜΕΙΩΣΗ: ΕΠΕΙΔΗ ΧΡΗΣΙΜΟΠΟΙΟΥΜΕ ΜΟΝΟ ΜΙΑ ΘΕΣΗ ΜΝΗΜΗΣ ΓΙΑ ΤΗ ΛΗΨΗ ΧΑΡΑΚΤΗΡΩΝ ΕΙΝΑΙ ΠΙΘΑΝΟ ΤΟ ΠΡΟΓΡΑΜΜΑ ΝΑ ΧΑΣΕΙ ΚΑΠΟΙΟΥΣ ΧΑΡΑΚΤΗΡΕΣ (ΝΑ ΜΗΝ ΤΟΥΣ ΣΤΕΙΛΕΙ ΣΤΟ ΤΕΡΜΑΤΙΚΟ). ΑΥΤΟ ΘΑ ΣΥΜΒΕΙ Π.Χ. ΑΝ ΕΝΟΣΩ ΤΟ ΠΡΟΓΡΑΜΜΑ ΠΕΡΙΜΕΝΕΙ ΓΙΑ ΝΑ ΓΙΝΕΙ ΔΙΑΘΕΣΙΜΟΣ Ο ΠΟΜΠΟΣ, Ο ΔΕΚΤΗΣ ΦΕΡΕΙ ΔΥΟ ΑΚΟΜΑ ΧΑΡΑΚΤΗΡΕΣ. ΑΥΤΟ ΔΕΝ ΠΡΟΚΕΙΤΑΙ ΝΑ ΣΥΜΒΕΙ ΣΤΟΝ ΠΡΟΣΟΜΟΙΩΤΗ ΑΛΛΑ ΣΕ ΠΡΑΓΜΑΤΙΚΟ ΣΥΣΤΗΜΑ ΜΕ ΠΟΛΛΕΣ ΣΥΣΚΕΥΕΣ ΕΙΝΑΙ ΠΙΘΑΝΟ ΤΟ ΚΥΡΙΩΣ ΠΡΟΓΡΑΜΜΑ ΝΑ ΔΙΑΚΟΠΕΙ ΠΟΛΛΕΣ ΦΟΡΕΣ ΑΠΟ ΔΙΑΦΟΡΕΣ ΑΛΛΕΣ ΣΥΣΚΕΥΕΣ.

 

# Basismeno sto:

# SPIM S20 MIPS simulator.

# The default trap handler for spim.

#

# Copyright (C) 1990-2003 James Larus, larus@cs.wisc.edu.

# ALL RIGHTS RESERVED.

# Define the exception handling code.  This must go first!

 

        .kdata

int_s1: .word 0 # gia na swsoyme ton $v0

int_s2: .word 0 # gia na swsoyme ton $a0

                # prosoxi de mporoyme na xrisimopoiisoyme to stack

                # kai ayto giati stin pragmatiki mixani mporei o logos

                # gia ton opoio synebei to interrupt na eixe na kanei

                # me to stack (p.x., an to stack den einai word-aligned)

 

# epeidi o interrupt handler trexei se kernel mporoyme na xrisimopoiisoyme

# apeytheias toys $k1 kai $k0

 

        .ktext 0x80000080

        .set noat

        move $k1, $at           # swse ton $at ($1) sto $k1

        .set at

        sw $v0, int_s1          # Not re-entrent and we can't trust $sp

        sw $a0, int_s2          # But, we need to use these registers

 

        mfc0 $k0, $13           # Apo ton Cause register

        srl $a0, $k0, 2         # apomonwse to ExcCode bits 2 ews kai 6

        andi $a0, $a0, 0xf      # to ExcCode einai 4 bits synolika

 

        beq $a0, $0, int_entry  # An einai 0 tote exoyme handware interrupt kai oxi exception

 

# Edw ftanoyme an exoyme exception: diladi kati pige straba me mia entoli

# apla tin agnoyoyme kai epistrefoyme stin epomeni

#

ret:    lw $v0, int_s1          # epanefere toys $v0 kai $a0

        lw $a0, int_s2

        mfc0 $k0, $14           # fere ton EPC sto $k0

        addiu $k0, $k0, 4       # prosthese 4 sto EPC wste na epistrepsoyme stin epomeni entoli

        .set noat

        move $at, $k1           # epanefere ton $at

        .set at

        rfe                     # epestrepse epanaferontas ton status (kernel/interrupt bits)

        jr $k0

      nop

 

# edw ftanoyme an to termatiko zitise interrupt

int_entry:

 

        li      $a0, 0xffff0000

        # den xreiazetai na koitaksoyme to ready bit efoson mono o receiver dinei interrupts se ayto to paradeigma

        lw      $v0, 4($a0)     # diabase to xaraktira kai grapse to sto inchar kai these to flag se 0xff

        sw      $v0, inchar

        addi    $v0, $0, 0xff

        sw      $v0, flag

 

 

# epestrepse stin entoli poy diakopike (opws prin xwris na allaksoyme to EPC)

int_ret:

        lw $v0, int_s1          # Restore regs

        lw $a0, int_s2

        mfc0 $k0, $14           # EPC (return to EPC)

        .set noat

        move $at,$k1            # Restore $at

        .set at

        rfe                     # Return from exception handler

        jr $k0

      nop

 

        .text

main:

        li $v0, 0x00101     # energopoise ta interrupts sto Status Register

                                    # o status register (SR) anikei sto coprocessor 0

                                    # kai einai ekei o kataxwritis $12

                                    # i timi 0x00101 thetei ta bit 0 kai 8 se 1

                                    # to bit 0 einai to trexon interrupt enable

                                    # kanontas to 1 energopoioyme ta interrupts

                                    # apotelei stin oysia kati san kentriko diakopti gia

                                    # interrupts an einai 0 tote den dexomaste kanena interrupt.

                                    # sti synexeia prepei na dilwsoyme poia interrupts

                                    # akribws mas endiaferoun, ayto to kanoyme thetwntas to bit

                                    # 8, poy antistoixei

        mtc0 $v0, $12

 

        la      $a0, 0xffff0000 # basi tis syskeyis termatiko

        addi    $v1, $0, 0x2    # energopoiisi interrupts gia to dekti RC bit 1 = 1

        sw      $v1, 0($a0)

 

 

loop:                               # perimene ews otoy i metabliti flag ginei mi mideniki

        lw $v1, flag        # ti metabliti flag tin thetei o interrupt handler

        beq     $v1, $0, loop   # amesws molis diabasei enan xaraktira

 

        lw      $v1, inchar     # fortwse ton xaraktira poy diabase o interrupt handler

        sw      $0, flag            # kane to flag miden wste na kseroyme oti ton pirame

 

putc:                               # steile to xaraktrira sto pompo xrisimopoiwntas polling

        lw      $v0, 8($a0)

        andi    $v0, $v0, 0x1

        beq     $v0, $0, putc

        sw      $v1, 0xc($a0)

        j       loop

 

 

 

        jr      $ra

 

                .data

flag:           .word 0x0               # 1 an neos xaraktiras einai diathesimos (to thetei o

                                        # interrupt handler)

inchar: .word 0x0               # o teleytaios xaraktiras poy elifthei (to thetei o

                                        # interrupt handler)

 

 

VECTORED INTERRUPTS:

 

ΟΠΩΣ ΕΙΔΑΜΕ ΣΤΟ MIPS ΟΛΑ ΤΑ ΙΝΤΕRRUPTS ΜΕΤΑΒAIΝΟΥΝ ΣΤΗ ΔΙΕΥΘΥΝΣΗ 0X80000080. ΣΕ ΑΛΛΕΣ ΑΡΧΙΤΕΚΤΟΝΙΚΕΣ ΤΟ ΕΠΙΠΕΔΟ ΤΗΣ ΑΙΤΗΣΗΣ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ ΣΑΝ ΔΕΙΚΤΗΣ ΣΕ ΕΝΑΝ ΠΙΝΑΚΑ ΣΤΗ ΜΝΗΜΗ ΠΟΥ ΠΕΡΙΕΧΕΙ ΤΗΝ ΑΡΧΙΚΗ ΔΙΕΥΘΥΝΣΗ ΓΙΑ ΤΟΝ ΑΝΤΙΣΤΟΙΧΟ INTERRUPT HANDLER. Π.Χ. AN EXOYME 8 ΕΠΙΠΕΔΑ ΙΝΤΕRRUPTS ΘΑ ΜΠΟΡΟΥΣΑΜΕ ΝΑ ΕΧΟΥΜΕ ΕΝΑΝ ΠΙΝΑΚΑ ΣΤΗ ΜΝΗΜΗ ΠΟΥ ΞΕΚΙΝΑ ΑΠΟ ΓΝΩΣΤΗ ΔΙΕΥΘΥΝΣΗ Π.Χ. 0 ΤΑ ΣΤΟΙΧΕΙΑ ΤΟΥ ΟΠΟΙΟΥ ΕΙΝΑΙ ΔΙΕΥΘΥΝΣΕΙΣ. ΤΟ ΗΑRDWARE OTAN ΣΥΜΒΕΙ ΙΝTERRUPT ΔΙΑΒΑΖΕΙ ΤΟ ΣΤΟΙΧΕΙΟ ΤΟΥ ΠΙΝΑΚΑ ΠΟΥ ΑΝΤΙΣΤΟΙΧΕΙ ΣΤΟ ΕΠΙΠΕΔΟ ΤΟΥ INTERRUPT, ΕΡΜΗΝΕΥΕΙ ΑΥΤΗΝ ΤΗΝ ΤΙΜΗ ΩΣ ΔΙΕΥΘΥΝΣΗ ΚΑΙ ΜΕΤΑΒΑΙΝΕΙ ΕΚΕΙ. ΜΕ ΑΥΤΟΝ ΤΟ ΤΡΟΠΟ ΑΠΛΟΠΟΙΕΙΤΑΙ Ο ΚΩΔΙΚΑΣ ΤΟΥ INTERRUPT HANDLER ΕΦΟΣΟΝ ΤΩΡΑ ΥΠΑΡΧΕΙ ΕΝΑΣ ΔΙΑΦΟΡΕΤΙΚΟΣ ΓΙΑ ΚΑΘΕ ΠΕΡΙΠΤΩΣΗ. ΟΜΩΣ ΤΟ HARDWARE EINAI ΠΙΟ ΠΟΛΥΠΛΟΚΟ ΚΑΙ ΑΥΤΟ ΔΕΝ ΕΙΝΑΙ ΣΥΝΗΘΩΣ ΕΠΙΘΥΜΗΤΟ.

 

ΑΥΤΟΣ Ο ΤΡΟΠΟΣ ΥΠΟΛΟΓΙΣΜΟΥ ΤΗΣ ΔΙΕΥΘΥΝΣΗΣ ΤΟΥ INTERRUPT HANDLER ΟΝΟΜΑΖΕΤΑΙ “VECTORED INTERRUPTS”.