ΗΜΥ 213 Εργαστήριο Οργάνωσης Η.Y. και Μικροεπεξεργαστών week 5 Διδάσκων: Δρ. Γιώργος Ζάγγουλος Email: zaggoulos.george@ucy.ac.cy www.ece.ucy.ac.cy/courses/ece213
Περίληψη Κλήση Συνάρτησης και επιστροφή στη main Χρησιμοποίηση του μετρητή χρόνου Ενεργοποίηση και Διαχείριση σημάτων διακοπής Συνεπεξεργαστής 0 και αρχείο exceptions.s 2
Κλήση Συνάρτησης και επιστροφή στη main Κλήση Συνάρτησης (jal read_input, jr $ra) Κλήση (2ης) συνάρτησης μέσα από άλλη (1η) συνάρτηση. Απαιτείται αποθήκευση του $ra πριν από την κλήση της 2ης συνάρτησης για σωστή λειτουργία του προγράμματος. Αναδρομικές Κλήσεις (κλήση συνάρτησης μέσα από την ίδια τη συνάρτηση) 3
Interrupt Service Routine Όταν προκληθεί Exception τότε το σύστημα μεταφέρει τη λειτουργία σε άλλο μονοπάτι. Στο SPIM καθορίζουμε μια συνάρτηση η οποία ονομάζεται Interrupt Service Routine και «τοποθετείται» στην διεύθυνση 0x80000180. Δηλαδή κάθε φορά που προκαλείται interrupt το σύστημα ξεκινάει από τη διεύθυνση 0x80000180 και εκτελεί εντολές (ISR) Το σημερινό παράδειγμα αφορά σε δύο ειδών interrupts Timer I/O 4
Καταχωρητές 8 BadAddr memory address at which an offending memory reference occurred 9 Counter timer 11 Compare value compared against timer that causes interrupt when they match 12 Status interrupt mask and enable bits 13 Cause exception type and pending interrupt bits 14 EPC address of instruction that caused exception 16 Config configuration of machine 5
Timer Interrupts Χρησιμοποιούνται για τη δημιουργία TIMEOUTS Κάθε ένα χρονικό κβάντο (για το SPIM είναι 10 msec) αυξάνεται ένας μετρητής αντίστοιχα ($9). Πότε προκαλείται interrupt? Το σύστημα προκαλεί interrupt όταν ο $9 γίνει ίσος με τον $11 (καταχωρητής με τον οποίο ελέγχουμε το TIMEOUT). 6
Καταχωρητές Status ($12), Cause ($13) και Exception Programme Counter ($14) mfc0 $t5, $13 # Copy Cause register value to $t5 mtc0 $v0, $12 # Copy $v0's value to Status register 7
Ειδικοί καταχωρητές (θέσεις μνήμης) που χρησιμοποιούνται για Interrupts 8
Ενεργοποίηση Interrupts - Register ($12) 1.Το bit στη θέση 0 ενεργοποιεί τα σήματα διακοπής (global on/off control bit for all interrupts). 2.Αναλόγως των σημάτων διακοπής που επιθυμείτε να επιτρέψετε, θέστε σε λογικό 1 τα bitς 11 και 15 του καταχωρητή Status τα οποία επιτρέπουν στην CPU να ανταποκρίνεται στα σήματα διακοπής από το πληκτρολόγιο και το ρολόι αντίστοιχα. 3.Θέστε σε λογικό 1 το Interrupt Enable bit στον καταχωρητή Receiver Control Register (0xFFFF0000). Αυτό το bit επιτρέπει την δημιουργία σημάτων διακοπής από το πληκτρολόγιο όταν ο χρήστης πληκτρολογήσει οτιδήποτε. 9
Διαχείριση ενός Interrupt Όταν δημιουργηθεί κάποιο σήμα διακοπής, τα επόμενα βήματα εκτελούνται αυτόματα από το υλικό του μικρό-επεξεργαστή: 1. Το Exception Level bit (bit 1) στον καταχωρητή Status γίνεται 1. Όταν αυτό το bit έχει τιμή 1, δεν μπορούν να δημιουργηθούν άλλα σήματα διακοπής. Αυτό συμβαίνει γιατί δεν μπορεί ο μικροεπεξεργαστής να διακόψει την λειτουργία εξυπηρέτησης κάποιας διακοπής για να εξυπηρετήσει μια 2 η διακοπή. 2. Ο καταχωρητής Cause παίρνει την ανάλογη τιμή από την οποία μπορούμε ως προγραμματιστές να δούμε τί προκάλεσε τη διακοπή (το ρολόι ή το πληκτρολόγιο). 3. Ο καταχωρητής EPC παίρνει την τιμή που έχει αυτή την στιγμή ο Program Counter για να μπορεί μετά από την εξυπηρέτηση του interrupt να επιστρέψει στο σημείο από το οποίο πρέπει να συνεχίσει. 10
Timer and Keyboard Interrupts Καλείστε να συμπληρώσετε τα δύο αρχεία (week5.s και excep_week5.s) αυτής της εβδομάδας, έτσι ώστε να λειτουργεί ορθά η υπολογιστική μηχανή (+, -, *, / και χ^y). Ο χρήστης, αρχικά με 2 κλήσεις συστήματος (5) εισάγει τους δύο αριθμούς (χ και y). Στη συνέχεια με keyboard interrupt, ο χρήστης θα επιλέγει την πράξη που επιθυμεί να εκτελέσει. Αν ο χρήστης δώσει αριθμούς και δεν επιλέξει την προς εκτέλεση πράξη, τότε με timing interrupt το πρόγραμμα θα τερματίζει (στα 10 δευτερόλεπτα)! 11
Αλλαγές στο week5.s Το αρχείο week5.s σας δίνεται σχεδόν έτοιμο. Απομένει εσείς να: 1. Ενεργοποιήσετε το ρολόι και τα σήματα διακοπής που χρειάζεστε. 2. Ελέγξετε το ρολόι και το πλήκτρο που επέλεξε ο χρήστης και να στείλετε το πρόγραμμα να εκτελέσει το αντίστοιχο μέρος του κώδικα. 12
Αλλαγές στο excep_week5.s Το αρχείο excep_week5.s θα αντικαταστήσει το exceptions.s έτσι ώστε να κάνει αυτά που επιθυμείτε και τα οποία περιγράφονται πιο κάτω: Είναι και αυτό έτοιμο! Aπομένει εσείς να: 1. Ελέγξετε το λόγο που προκλήθηκε το σήμα διακοπής (ρολόι, πληκτρολόγιο, ή κάτι άλλο) 2. Γράψετε τον κώδικα που θέλετε να εκτελείται από το QtSpim αναλόγως του interrupt. 3. Προσαρμόσετε τον κώδικα σας για να αδρανοποιεί τα πλήκτρα που δεν χρησιμοποιούνται στην επιλογή πράξης. 13
Προσοχή στο τρέξιμο του Κώδικα!!! Επιλέξτε στο QtSpim: Simulator/Settings/MIPS και στη συνέχεια επιλέξτε την επιλογή Mapped I/O και Load Exception Handler. (Αφήστε επιλεγμένη και την επιλογή Accept Pseudo Instructions Επιλέξτε το αρχείο isr.s που επιθυμείτε! Αν το αρχείο isr.s μετακινηθεί ΔΕΝ θα μπορεί να λειτουργήσει ξανά το QtSpim 14
Μαθησιακοί Στόχοι Εργαστήριο 5 1. Κλήσεις Συναρτήσεων (jal / jsr) 2. Χρησιμοποίηση του μετρητή χρόνου 3. Ενεργοποίηση και Διαχείριση σημάτων διακοπής 4. Συνεπεξεργαστής 0 και αρχείο exceptions.s 15