Χρήση Τρόπων Λειτουργίας Χαµηλής Κατανάλωσης σε Ενσωµατωµένους Μικροελεγκτές (MCUs) σε Υψηλό Επίπεδο / Χαµηλό Επίπεδο Στο σηµερινό κόσµο των συσκευών που λειτουργούν µε µπαταρία, η ορθή χρήση των τρόπων λειτουργίας χαµηλής κατανάλωσης που παρέχεται στους ενσωµατωµένους µικροελεγκτές (Ultra Low Power Microcontrollers - MCUs) είναι κρίσιµο στοιχείο. Την ίδια στιγµή, οι περισσότερες µαζικής κατανάλωσης εφαρµογές, όπως οικιακές συσκευές, αυτόµατοι πωλητές, ελεγκτές µε χρήση κινητήρα και ηλεκτρονικά παιχνίδια είναι οργανωµένες σαν συστήµατα προσκηνίου / υποβάθρου (συστήµατα υπερ-επαναλήψεων ή κύριου προγράµµατος + προγραµµάτων εξυπηρέτησης διακοπών). Η αρχιτεκτονική πρώτου επιπέδου / τελευταίου επιπέδου αποτελείται από δύο µέρη α) τα υψηλού επιπέδου, δηλαδή ρουτίνες εξυπηρέτησης σηµάτων διακοπής (ISRs) οι οποίες χειρίζονται εξωτερικά ασύγχρονα γεγονότα σε έγκαιρο τρόπο και β) τα χαµηλού επιπέδου που είναι µια ατέρµονη επαναληπτική διαδικασία η οποία χρησιµοποιείται σε όλους τους επεξεργαστές για να εκτελέσει την ελάχιστη κρίσιµη χρονικά διαδικασία. Το πρώτο επίπεδο τυπικά επικοινωνεί µε το τελευταίο επίπεδο µέσω διαµοιρασµένης µνήµης (shared memory). Η επανάληψη του χαµηλού επιπέδου προστατεύει αυτή τη µνήµη από πιθανή βλάβη προερχόµενη από σήµατα διακοπής όταν προσπελαύνονται οι διαµοιρασµένες µεταβλητές. Για να χρησιµοποιηθεί ένας µικροελεγκτής σε τρόπο λειτουργίας χαµηλής κατανάλωσης, η επανάληψη του χαµηλού επιπέδου πρέπει πρώτα να καθορίσει ότι όλα τα εξωτερικά και εσωτερικά γεγονότα έχουν επεξεργαστεί έτσι ώστε το ρολόι της CPU να µπορεί να σταµατήσει µέχρι το επόµενο εξωτερικό γεγονός, δηλαδή (ένα σήµα διακοπής) θα ενεργοποιήσει τη CPU. Αυτή η κατάσταση καλείται ανενεργή κατάσταση idle και παριστάνεται στο γράφηµα 1. Γράφηµα 1: Σύστηµα Υψηλού Επιπέδου / Χαµηλού Επιπέδου σε τρόπο λειτουργίας χαµηλής κατανάλωσης Επειδή για να αποφασισθεί ότι ικανοποιείται η συνθήκη της ανενεργής κατάστασης συνεπάγεται την εξέταση των διαµοιρασµένων µεταβλητών σε πρώτο επίπεδο (ISRs), η επανάληψη του χαµηλού επιπέδου πρέπει να απενεργοποιεί τα σήµατα διακοπής πριν την ανίχνευση της κατάστασης idle. Επιπλέον, η κατάσταση idle παραµένει ενεργή µόνο κατά την διάρκεια που τα σήµατα διακοπής παραµένουν απενεργοποιηµένα. Αν τα σήµατα διακοπής ήταν ενεργοποιηµένα µετά την επανάληψη του χαµηλού επιπέδου αυτό καθορίζει ότι όλες οι εργασίες του είναι ολοκληρωµένες για τώρα, αλλά πριν την ενεργοποίηση του τρόπου λειτουργίας χαµηλής κατανάλωσης, ένα σήµα διακοπής θα µπορούσε να «αποκτήσει» πρώτο την επανάληψη του χαµηλού επιπέδου εκείνη τη στιγµή και ένα ISR θα µπορούσε να «παράγει» νέα εργασία για την επανάληψη του χαµηλού επιπέδου, οδηγώντας έτσι 1
στην ενεργοποίηση της κατάστασης idle. Λόγω της υπεραπλουστευµένης φύσης της διαδικασίας υψηλού επιπέδου / χαµηλού επιπέδου, η επανάληψη χαµηλού επιπέδου πάντα ξαναρχίζει από το σηµείο όπου διακόπηκε από ένα σήµα διακοπής, έτσι η επανάληψη χαµηλού επιπέδου θα πρέπει να ενεργοποιεί το τρόπο λειτουργίας χαµηλής κατανάλωσης καθώς ο MCU θα έχει να εκτελέσει µια σηµαντική εργασία. Ο MCU θα σταµατήσει για µια µη ντετερµινιστική χρονική περίοδο µέχρι τη στιγµή που θα τον ενεργοποιήσει ένα επόµενο σήµα διακοπής. Έτσι η ενεργοποίηση σηµάτων διακοπής πριν τη µετάβαση στο τρόπο λειτουργίας χαµηλής κατανάλωσης ανοίγει ένα χρονικό παράθυρο για έναν «αγώνα» µεταξύ σηµάτων διακοπής και της µετάβασης σε τρόπο λειτουργίας χαµηλής κατανάλωσης. Μπαίνοντας σε τρόπο λειτουργίας χαµηλής κατανάλωσης καθώς τα σήµατα διακοπής είναι απενεργοποιηµένα εµφανίζεται το γνωστό πρόβληµα της κότας και του αυγού (η κότα κάνει το αυγό ή το αυγό τη κότα;) για την ενεργοποίηση του συστήµατος, γιατί µόνο ένα σήµα διακοπής µπορεί να τερµατίσει τον τρόπο λειτουργίας χαµηλής κατανάλωσης. Για να θέσουµε σε λειτουργία την αρχιτεκτονική υψηλού επιπέδου / χαµηλού επιπέδου, ο MCU πρέπει να επιτρέπει την εισαγωγή σε τρόπο λειτουργίας χαµηλής κατανάλωσης και να ενεργοποιεί σήµατα διακοπής χωρίς να δηµιουργεί συνθήκες ανταγωνισµού για το ποιο σήµα διακοπής θα εξυπηρετηθεί πρώτο. Πολλοί MCUs πράγµατι επιτρέπουν µια τέτοια ατοµική µετάβαση σε τρόπο λειτουργίας χαµηλής κατανάλωσης. Άλλοι MCUs υποστηρίζουν πολλαπλά επίπεδα απενεργοποίησης σηµάτων διακοπής και µπορούν να συµπληρώσουν µεταβάσεις σε τρόπο λειτουργίας χαµηλής κατανάλωση µε απενεργοποιηµένα σήµατα διακοπής σε ένα επίπεδο. Άλλοι πάλι MCUs δεν παρέχουν κανένα τρόπο για να εισέλθουµε σε τρόπο λειτουργίας χαµηλής κατανάλωσης µε σήµατα διακοπής απενεργοποιηµένα και απαιτούν κάποιες διαφορετικές προσεγγίσεις. HC08 O HC08 είναι MCU των 8 bits από την εταιρεία Freescale Semiconductors. Το πακέτο εντολών HC(S)08 περιλαµβάνει δύο ειδικές εντολές τη WAIT και τη STOP για τη µετάβαση σε τρόπους λειτουργίας χαµηλής κατανάλωσης wait και stop, αντιστοίχως. Η HC08 τεκµηρίωση θέτει σαφώς ότι και οι δύο εντολές WAIT και STOP αυτόµατα ενεργοποιούν σήµατα διακοπής σαν συνέπεια της εισαγωγής σε τρόπους λειτουργίας χαµηλής κατανάλωσης. Σαφώς, οι σχεδιαστές του HC08 έλαβαν υπόψη τους ότι η µετάβαση σε τρόπο λειτουργίας χαµηλής κατανάλωσης πρέπει να γίνει µε απενεργοποιηµένα σήµατα διακοπής. Το παρακάτω τµήµα κώδικα για το µοντέλο CodeWarrior HC08 C-compiler δείχνει µια επανάληψη χαµηλού επιπέδου µε ατοµική µετάβαση σε τρόπο λειτουργίας WAIT. Τµήµα κώδικα για το µοντέλο CodeWarrior HC08 C-compiler που δείχνει µια επανάληψη χαµηλού επιπέδου µε ατοµική µετάβαση σε τρόπο λειτουργίας WAIT 2
MSP430 O MSP430 είναι ένας MCU υπερ χαµηλής κατανάλωσης των 16 bits από την εταιρεία Texas Instruments. O MSP430 χρησιµοποιείται για τη αυτόµατη µετάβαση σε οποιονδήποτε από τους πέντε υποστηριζόµενους τρόπους λειτουργίας χαµηλής κατανάλωσης, γιατί τα bits που ελέγχουν τους διάφορους τοµείς του ρολογιού και το bit που ενεργοποιεί το γενικό σήµα διακοπής (General Interrupt Enable - GIE) είναι τοποθετηµένα στον ίδιο καταχωρητή κατάστασης (Status Register - SR) της CPU. Το παρακάτω τµήµα κώδικα για το µοντέλο GNU gcc MSP430 compiler δείχνει την αυτόµατη µετάβαση στο τρόπο λειτουργίας χαµηλής κατανάλωσης LPM1 και ταυτόχρονα την ενεργοποίηση σηµάτων διακοπής. Συγκεκριµένα, ο καταχωρητής _bis_sr (LPM1_bits GIE) δηµιουργεί την εντολή BIS.W #0x58,SR, η οποία θέτει ενεργοποιεί αυτόµατα τα bits 0x58 στον καταχωρητή κατάστασης. Το bit 0x10 (CPUOFF) απενεργοποιεί το ρολόι της CPU καθώς το bit 0x08 (ενεργοποίηση γενικού σήµατος διακοπής - General Interrupt Enable - GIE) ενεργοποιεί σήµατα διακοπής. Τµήµα κώδικα για το µοντέλο GNU gcc MSP430 compiler που δείχνει την αυτόµατη µετάβαση στο τρόπο λειτουργίας χαµηλής κατανάλωσης LPM1 και ταυτόχρονα την ενεργοποίηση σηµάτων διακοπής Καθώς η αυτόµατη µετάβαση σε κάθε τρόπο λειτουργίας χαµηλής κατανάλωσης είναι φυσική στον MSP430, έχουµε το αντίθετο πρόβληµα: σε κάθε ISR πρέπει να έχουµε απενεργοποιήσει τον τρόπο λειτουργίας χαµηλής κατανάλωσης στο καταχωρητή κατάστασης, µε αποτέλεσµα ο µηχανισµός να µη µπορεί να γυρίσει αυτόµατα στο τρόπο λειτουργίας χαµηλής κατανάλωσης, αλλά από την άλλη η επανάληψη χαµηλού επιπέδου µπορεί να συνεχίσει µετά την αποκατάσταση των ISRs, το SR από το σωρό (stack) σαν µέρος της επιστροφής από το σήµα διακοπής. Ευτυχώς, αυτό είναι πολύ απλό µε χρήση ουσιαστικών λειτουργιών παρεχόµενες από τους περισσότερους C compilers για τον MSP430. Το παρακάτω τµήµα κώδικα δείχνει ένα ISR παράδειγµα για τον compiler GNU gcc για MSP430. Τµήµα κώδικα που δείχνει ένα ISR παράδειγµα για τον compiler GNU gcc για MSP430 3
AVR O AVR είναι ένας RISC (Reduced Instruction Set Computing) των 8 bits. Επιπλέον, παρέχει µια µέθοδο για ατοµική µετάβαση σε τρόπο λειτουργίας χαµηλής κατανάλωσης, αλλά είναι λιγότερο προφανές σε σχέση µε τους HC08 και MSP430. Ο πυρήνας του AVR παρέχει µια εντολή SLEEP για να σταµατήσει το ρολόι της CPU, αλλά δεν ενεργοποιούνται σήµατα διακοπής και στη πραγµατικότητα ο πυρήνας του AVR πρέπει να εκτελεστεί µε σήµατα διακοπής. Αυτό θα µπορούσε να αποτελεί πρόβληµα, αν όχι για την ακόλουθη σηµείωση στο datasheet του AVR. Όταν χρησιµοποιούµε την εντολή SEI για να ενεργοποιήσουµε σήµατα διακοπής, η επόµενη εντολή που θα ακολουθήσει την εντολή SEI θα εκτελείται πριν από κάθε εκκρεµές σήµα διακοπής όπως φαίνεται στο παρακάτω παράδειγµα: SEI ; ενεργοποίηση του Global Interrupt Enable GIE SLEEP ; ενεργοποίηση τρόπου λειτουργίας χαµηλής κατανάλωσης, αναµονή ερχοµού σήµατος διακοπής ; σηµείωση: θα εισάγουµε sleep ; πριν από κάθε εκκρεµές(η) σήµα(τα) διακοπής Με άλλα λόγια, το ζευγάρι των εντολών SEI-SLEEP εγγυάται την αυτόµατη εκτέλεση, κυρίως εξαιτίας της αρχιτεκτονικής προσπέλασης του AVR. Προσοχή στη χρήση των εντολών SEI-SLEEP που συντάσσονται µαζί, ΚΑΜΙΑ εντολή δεν παρεµβάλλεται µεταξύ των εντολών SEI-SLEEP. Το παρακάτω τµήµα κώδικα είναι ένα παράδειγµα σε γλώσσα C για το µοντέλο IAR AVR compiler που δείχνει πως µπαίνουµε σε τρόπο λειτουργίας χαµηλής κατανάλωσης από την επανάληψη χαµηλού επιπέδου. Παράδειγµα σε γλώσσα C για το µοντέλο IAR AVR compiler που δείχνει πως µπαίνουµε σε τρόπο λειτουργίας χαµηλής κατανάλωσης από την επανάληψη τελευταίου επιπέδου Το ίδιο παράδειγµα για τον GNU AVR (WinAVR) compiler φαίνεται στο παρακάτω τµήµα κώδικα. Παράδειγµα σε γλώσσα C για το µοντέλο GNU AVR (WinAVR) compiler που δείχνει πως µπαίνουµε σε τρόπο λειτουργίας χαµηλής κατανάλωσης από την επανάληψη τελευταίου επιπέδου 4
ARM Οι ARM βασισµένοι στους MCUs παίρνουν µια διαφορετική προσέγγιση στην ατοµική µετάβαση σε τρόπο λειτουργίας χαµηλής κατανάλωσης. Οι εταιρίες που παράγουν ARM, όπως η Atmel, NXP (επίσηµα Philips) και η ΤΙ (Texas Instruments), δηµιουργούν σε ολοκληρωµένη µορφή τους βασικούς πυρήνες ARM7 ή ARM8 µε χρήση ιδιωτικών περιφερειακών, όπως σήµα διακοπής και ελεγκτές διαχείρισης ισχύος. Η ολοκλήρωση είναι «χαλαρή» στην οποία η εσωτερική κατάσταση του πυρήνα ARM δεν επιδρά στα περιφερειακά. Συγκεκριµένα, ο πυρήνας µπορεί να απενεργοποιήσει τα σήµατα διακοπής εσωτερικά µε το να θέτει το bit I και το bit F στο τρέχον πρόγραµµα καταχωρητή κατάστασης (Current Program Status Register - CPSR), αλλά αυτό δεν επιδρά στην εξωτερική διαχείριση ισχύος ή στον ελεγκτή σηµάτων διακοπής, που παρέχουν άλλο ένα επίπεδο για απενεργοποίηση ή ενεργοποίηση σηµάτων διακοπής. Εξαιτίας αυτού του σχεδιασµού, οι ARM βασισµένοι στους MCUs επιτρέπουν τη µετάβαση σε τρόπο λειτουργίας χαµηλού επιπέδου µε απενεργοποιηµένα σήµατα διακοπής στο επίπεδο του πυρήνα του ARM. Κατά τη διάρκεια της µετάβασης, η διαχείριση της ισχύος µέσω ελεγκτή σταµατά το ρολόι της CPU για το πυρήνα του ARM, αλλά κάθε σήµα διακοπής ενεργοποιηµένο από τον ελεγκτή επιπέδου µπορεί να ενεργοποιήσει το ρολόι της CPU. Μόλις ο πυρήνας της CPU ξεκινήσει πάλι τη λειτουργία του, µπορεί να ενεργοποιήσει σήµατα διακοπής για να πετύχει µικρό χρονικό διάστηµα εξυπηρέτησης σήµατος διακοπής. Το παρακάτω τµήµα κώδικα δείχνει τη γενική στρατηγική της µετάβασης σε τρόπο λειτουργίας χαµηλής κατανάλωσης για τον ARM βασισµένος στους MCUs (IAR ARM compiler, AT91SAM MCU). Ο ελεγκτής διαχείρισης ισχύος σταµατά το ρολόι της CPU (AT91C_BASE_PMC- >PMC_SCDR = 1) καθώς τα σήµατα διακοπής είναι απενεργοποιηµένα στο πυρήνα. Τα σήµατα διακοπής είναι ενεργοποιηµένα µόνο µετά την επανεκκίνηση της CPU και εκτελούν την ουσιαστική διαδικασία _enable_interrupt(). Μπορούµε να δούµε αυτή τη συµπεριφορά αν προσπαθήσουµε να παρατηρήσουµε την τρέχουσα εφαρµογή µε έναν JTAG-based debugger. Συνήθως, ο κώδικας θα σταµατήσει στη γραµµή _enable_interrupt(). Τµήµα κώδικα που δείχνει τη γενική στρατηγική της µετάβασης σε τρόπο λειτουργίας χαµηλής κατανάλωσης για τον ARM βασισµένος στους MCUs (IAR ARM compiler, AT91SAM MCU) Κάνοντας debugging, ο τρόπος λειτουργίας χαµηλής κατανάλωσης µπορεί να «συγκρουστεί» µε άλλους on-chip debuggers, γιατί σταµατά το ρολόι της CPU. Γι αυτό το λόγο, πρέπει να χρησιµοποιούµε συνεχή «συλλογή» για να λάβουµε υπόψη µας τη µετάβαση σε τρόπο λειτουργίας χαµηλής κατανάλωσης µόνο κατά τη διάρκεια της εγγραφής του κώδικα. 5
Cortex-M3 Ο Cortex-M3 είναι ένας ARM RISC των 32 bits σχεδιασµένος για εφαρµογές χαµηλού κόστους και για κινητές εφαρµογές χαµηλής ισχύος. Ο Cortex-M3 διαφέρει από το παραδοσιακό ARM7 ή ARM9 σε λίγα σηµεία. Η κύρια διαφορά σχετίζεται µε τη λεπτότερη ολοκλήρωση του πυρήνα του MCU µε το σύστηµα διαχείρισης ισχύος και τον ελεγκτή σήµατος διακοπής φωλιασµένου διανύσµατος (Nested Vectored Interrupt Controller - NVIC). Το σύνολο εντολών Thumb-2, χρησιµοποιούµενο αποκλειστικά στον Cortex-M3, παρέχει την ειδική εντολή WFI (Wait For Interrupt) για το σταµάτηµα του ρολογιού της CPU. υστυχώς, τα manuals ARMv7-M Reference Manual, Cortex-M3 Technical Reference, ή LM3Sxxx data sheets) δε περιγράφουν αν η εντολή WFI µπορεί να χρησιµοποιηθεί απενεργοποιηµένα σήµατα διακοπής. ίνοντας αυτές τις πληροφορίες, πειραµατίστηκα µε το Cortex-M3 MCU. Χρησιµοποιώντας το LM3S811 Cortex-M3 MCU της εταιρείας Luminary Micro, ανακάλυψα ότι η εντολή WFI µπορεί να χρησιµοποιηθεί ενώ σήµατα διακοπής είναι κλειδωµένα (θέτουµε το καταχωρητή PRIMASK στο λογικό 1 - Hi). Σαν αποτέλεσµα έχουµε, µετά την εντολή WFI το LM3S811 να σταµατά την εκτέλεση του κώδικα, αλλά κάθε σήµα διακοπής ενεργοποιείται στο NVIC και έτσι η CPU ενεργοποιείται. Το παρακάτω τµήµα κώδικα δείχνει την ατοµική µετάβαση σε τρόπο λειτουργίας χαµηλής κατανάλωσης για το Cortex-M3 (IAR ARM Compiler). Τµήµα κώδικα που δείχνει την ατοµική µετάβαση σε τρόπο λειτουργίας χαµηλής κατανάλωσης για το Cortex-M3 (IAR ARM Compiler) 8051 Ο 8051 υποστηρίζει δύο είδη τρόπων λειτουργίας χαµηλής κατανάλωσης. Οι δύο τρόποι λειτουργίας χαµηλής κατανάλωσης είναι α) idle και β) power down. Αυτοί οι τρόποι λειτουργίας ενεργοποιούνται µε το να θέσουµε τα bits IDL ή PD στο καταχωρητή ελέγχου ισχύος PCON στη διεύθυνση 0x87. Γράφοντας στο bit IDL ή στο bit PD σταµατά αµέσως η λειτουργία της CPU και ενεργοποιούνται σήµατα διακοπής, αλλιώς το 8051 «κλειδώνει». Αυτό σηµαίνει ότι είναι πιθανό να γίνει αυτόµατη µετάβαση σε έναν από τους δύο τρόπους λειτουργίας χαµηλής κατανάλωσης. Κάθε άλλο ενεργοποιηµένο σήµα διακοπής µπορεί να «αποκτήσει» πρώτο τη διαδικασία idle µετά την ενεργοποίηση των σηµάτων διακοπής, αλλά πριν την εισαγωγή του τρόπου λειτουργίας χαµηλής κατανάλωσης idle. Σαφώς, το 8051 απαιτεί µια διαφορετική τεχνική σαν αυτές που έχουν συζητηθεί µέχρι τώρα. Αυτή η άλλη τεχνική είναι να ακυρώσουµε τη µετάβαση σε τρόπο λειτουργίας χαµηλής κατανάλωσης idle σε κάθε σήµα διακοπής. Έτσι, αν ένα σήµα διακοπής «αποκτήσει» πρώτο την επανάληψη χαµηλού επιπέδου µόλις πριν τη µετάβαση σε τρόπο λειτουργίας χαµηλής κατανάλωσης idle, το ISR θα απενεργοποιήσει τη µετάβαση. Μόλις το σήµα διακοπής επιστρέψει, ο τρόπος λειτουργίας χαµηλής κατανάλωσης idle δεν εισάγεται. Ένας τρόπος της εφαρµογής αυτής της τεχνικής στον 8051 είναι να παρακολουθούµε το καταχωρητή PCON που βρίσκεται στη µνήµη διευθυνσιοδότησης των bits του 8051 (bit-addressable memory - bdata). Το παρακάτω τµήµα κώδικα δείχνει πως η επανάληψη χαµηλού επιπέδου χρησιµοποιεί τη µεταβλητή PCON_shadow, µόλις καλέσουµε τη µεταβλητή PCON_shadow. 6
Τµήµα κώδικα που δείχνει πως η επανάληψη χαµηλού επιπέδου χρησιµοποιεί τη µεταβλητή PCON_shadow, µόλις καλέσουµε τη µεταβλητή PCON_shadow Η επανάληψη χαµηλού επιπέδου θέτει το bit IDL µόνο στη µεταβλητή PCON_shadow όταν τα σήµατα διακοπής παραµένουν απενεργοποιηµένα. Τότε τα σήµατα διακοπής ενεργοποιούνται και ο καταχωρητής PCON αποθηκεύεται. Είναι σηµαντικό ότι η «αναβάθµιση» του καταχωρητή PCON πραγµατοποιείται µε µια εντολή µηχανής. Μόλις αυτό απενεργοποιηθεί, η ανατιθεµένη εργασία από τη µεταβλητή bit-addressable στον ειδικό καταχωρητή, όπως είναι ο PCON, µπορεί να πραγµατοποιηθεί µε µια εντολή MOV 87H,20H. H µεταβλητή PCON_shadow πρέπει να «αναβαθµίζεται» σε κάθε ISR το οποίο µπορεί να δίνει εργασία στην επανάληψη χαµηλού επιπέδου, όπως φαίνεται στο παρακάτω τµήµα κώδικα. Τµήµα κώδικα που δείχνει ότι η µεταβλητή PCON_shadow πρέπει να «αναβαθµίζεται» σε κάθε ISR το οποίο µπορεί να δίνει εργασία στην επανάληψη χαµηλού επιπέδου Πρέπει να σηµειώσουµε ότι το 8051 αρχικοποιεί τα bits IDL/PD στο καταχωρητή PCON πριν την εισαγωγή κάποιου σήµατος διακοπής, έτσι αυτά τα bits είναι σίγουρο ότι αρχικοποιούνται στο καταχωρητή PCON κατά τη διάρκεια των σηµάτων διακοπής. Με αυτό το σχεδιασµό, ένα σήµα διακοπής µπορεί να συµβεί σε κάθε εντολή γλώσσας µηχανής µεταξύ ενεργοποιηµένων σηµάτων διακοπής µέχρι την επανατοποθέτηση του καταχωρητή PCON από τη παρακολούθηση της µεταβλητής PCON_shadow. Κάθε άλλο τέτοιο σήµα διακοπής θα αρχικοποιήσει τα bits IDL/PD στη µεταβλητή PCON_shadow, έτσι τα bits δε θα bits δε θα συµµετέχουν σε καµιά διαδικασία όταν η επανάληψη χαµηλού επιπέδου επανατοποθετήσει το καταχωρητή PCON από τη παρακολούθηση. Έτσι, κάθε σήµα διακοπής που «αποκτά» πρώτο την επανάληψη idle απενεργοποιεί το τρόπο λειτουργίας χαµηλής κατανάλωσης idle και έτσι συµπληρώνει το σκοπό της ασφαλούς µετάβασης σε τρόπο λειτουργίας χαµηλής κατανάλωσης idle µε χρήση σηµάτων διακοπής. 7
M16C O M16C είναι ένας επεξεργαστής των 16 bits από την εταιρεία Renesas που υποστηρίζει τρόπο λειτουργίας χαµηλής κατανάλωσης αναµονής, ο οποίος µε τη σειρά του «ενεργοποιείται» µέσω της εντολής WAIT. Ωστόσο, το datasheet M16C κάνει σαφές ότι τα σήµατα διακοπής πρέπει να είναι ενεργοποιηµένα πριν την εκτέλεση της εντολής WAIT, έτσι το M16C δεν υποστηρίζει την ατοµική µετάβαση σε τρόπο λειτουργίας αναµονής. Το datasheet M16C δε περιέχει σηµειώσεις παρόµοιες µε εκείνες του AVR για τη ατοµική εκτέλεση του ζεύγους εντολών SLEEP-SEI, έτσι θεωρώ ότι η εντολή της απενεργοποίησης του σήµατος διακοπής (FCLR I) είναι αµέσως αποτελεσµατική. Όπως και µε τον 8051, η µόνη επιλογή για τον M16C είναι κάπως να απενεργοποιήσει τη µετάβαση σε τρόπο λειτουργίας αναµονής στα ISRs, για να προστατεύσει την επανάληψη χαµηλού επιπέδου από την εισαγωγή σε τρόπο λειτουργίας αναµονής µόλις µετά τη παρουσία ενός σήµατος διακοπής. Σε σύγκριση µε τον 8051, ο M16C συµπληρώνει τη µετάβαση σε τρόπο λειτουργίας χαµηλής κατανάλωσης χρησιµοποιώντας µια ειδική εντολή, όχι διαµέσου της εγγραφής σε ένα καταχωρητή, έτσι η τεχνική παρατήρησης του καταχωρητή δεν εφαρµόζεται. Η ιδέα της απενεργοποίησης της µετάβασης σε τρόπο λειτουργίας αναµονής από τα ISRs µπορεί να εφαρµοστεί στον M16C, αλλά απαιτεί την αντικατάσταση της εντολής WAIT µε κάτι άλλο (όπως τις εντολές NOP ή RTS). Ναι, µιλάω για αυτό-τροποποιηµένο κώδικα, αλλά δε ξέρω άλλες επιλογές για τον M16C. Ευτυχώς, ο M16C είναι µια αρχιτεκτονική von Neumann [John von Neumann (1903-1957). Λαµπρός επιστήµονας στους τοµείς των µαθηµατικών, φυσικής, οικονοµικών και πληροφορικής] και έτσι µπορεί να εξάγει κώδικα από τη γραµµή διευθύνσεων της µνήµης RAM (RAM Address Space). Το κοµµάτι του αυτό-τροποποιηµένου κώδικα µηχανής µπορεί να είναι πολύ µικρό. Ορίζουµε έτσι ένα πίνακα των 4 bytes στη µνήµη RAM. Ο κώδικας µηχανής αναπαριστά µια συνάρτηση σε γλώσσα C η οποία εκτελεί την εντολή WAIT και επιστρέφει στην εξαρτηµένη µεταβλητή. Όλα αυτά φαίνονται στο παρακάτω τµήµα κώδικα. Τµήµα κώδικα που δείχνει τον ορισµό ενός πίνακα των 4 bytes στη µνήµη RAM. Στη συνέχεια, κώδικας µηχανής αναπαριστά µια συνάρτηση σε γλώσσα C η οποία εκτελεί την εντολή WAIT και επιστρέφει στην εξαρτηµένη µεταβλητή Στη επανάληψη χαµηλού επιπέδου, τροποποιούµε αυτό το παραπάνω κώδικα και τον καλούµε χρησιµοποιώντας pointer-to-function. Αυτά φαίνονται στο παρακάτω τµήµα κώδικα. Τµήµα κώδικα που δείχνει τον ορισµό ενός πίνακα των 4 bytes στη µνήµη RAM. Στη συνέχεια, κώδικας µηχανής αναπαριστά µια συνάρτηση σε γλώσσα C, µε χρήση pointer-tofunction, η οποία εκτελεί την εντολή WAIT και επιστρέφει στην εξαρτηµένη µεταβλητή 8
Πρέπει να απενεργοποιήσουµε τη µετάβαση σε τρόπο λειτουργίας αναµονής σε κάθε σήµα διακοπής µε το να αντικαταστήσουµε την εντολή WAIT µε τη γραµµή Wait_code[0], όπως φαίνεται στο παρακάτω τµήµα κώδικα. Τµήµα κώδικα που δείχνει την αντικατάσταση της εντολής WAIT µε τη γραµµή Wait_code[0], για να απενεργοποιήσουµε τη µετάβαση σε τρόπο λειτουργίας αναµονής σε κάθε σήµα διακοπής Με αυτό το σχεδιασµό, ένα σήµα διακοπής µπορεί να συµβεί σε κάθε εντολή της γλώσσας µηχανής µεταξύ FSET I (ενεργοποίηση σηµάτων διακοπής) και εκτέλεσης εντολής στη γραµµή Wait_code[0]. Κάθε τέτοιο σήµα διακοπής θα επανατοποθετήσει το κώδικα σε κατάσταση Wait_code[0] µε το ζεύγος των εντολών RTS και NOP, οι οποίες επιστρέφουν στην επανάληψη χαµηλού επιπέδου, έτσι η εντολή WAIT θα αγνοείται όταν η επανάληψη χαµηλού επιπέδου επανέλθει για να εκτελέσει το κώδικα. Έτσι, κάθε σήµα διακοπής το οποίο «αποκτά» πρώτο την επανάληψη της λειτουργίας χαµηλής κατανάλωσης idle απενεργοποιεί τη κατάσταση αναµονής, η οποία εκτελεί το σκοπό της ασφαλούς µετάβασης σε τρόπο λειτουργίας χαµηλής κατανάλωσης idle. Ατοµικές Καταστάσεις Χαµηλής Κατανάλωσης Χρησιµοποιώντας τον MCU σε µέγιστη ταχύτητα όλη την ώρα δε θα καταλήξει ποτέ σε κατάσταση χαµηλής κατανάλωσης, ακόµα και αν τον τροφοδοτήσουµε µε τη µικρότερη ισχύ που χρειάζεται για να λειτουργήσει. Τα µεγαλύτερα ποσά αποθήκευσης ενέργειας είναι µόνο πιθανά από το άνοιγµακλείσιµο του MCU σε τρόπο λειτουργίας χαµηλής κατανάλωσης κάτω από τον έλεγχο ενός προγράµµατος (software control). Το απλούστερο πρόγραµµα σε υψηλό επίπεδο / χαµηλό επίπεδο απαιτεί τη µετάβαση σε τρόπο λειτουργίας χαµηλής κατανάλωσης να είναι ατοµική, ή τουλάχιστον ασφαλής από σήµατα διακοπής. Αυτή η απαίτηση δεν εφαρµόζεται όταν χρησιµοποιούµε πιο περίπλοκη αρχιτεκτονική, όπως συστήµατα µε πυρήνες προτεραιότητας ή συστήµατα πραγµατικού χρόνου. Ένα σύστηµα µε πυρήνες προτεραιότητας εκτελεί έναν εξειδικευµένο τρόπο λειτουργίας χαµηλής κατανάλωσης idle όταν καµία άλλη εργασία δεν είναι έτοιµη να εκτελεστεί εξαιτίας του ότι όλες οι εργασίες «περιµένουν» για γεγονότα. Οι περισσότεροι πυρήνες παρέχουν ένα τρόπο για να προσαρµόσουν το τρόπο λειτουργίας χαµηλής κατανάλωσης idle (χρησιµοποιώντας συναρτήσεις call-back και άλλους τρόπους), έτσι µπορούµε να κάνουνε εύκολη µετάβαση σε τρόπο λειτουργίας χαµηλής κατανάλωσης idle. Η κύρια διαφορά µεταξύ ενός πυρήνα και ενός συστήµατος υψηλού επιπέδου/χαµηλού επιπέδου είναι ότι µόλις οι εντολές είναι έτοιµες να εκτελεστούν, ο πυρήνας δεν ανοίγει-κλείνει έτσι ώστε ο πυρήνας να µπορεί να επιστρέψει σε τρόπο λειτουργίας χαµηλής κατανάλωσης idle. Συνεπώς, η µετάβαση σε τρόπο λειτουργίας χαµηλής κατανάλωσης είναι πολύ απλούστερη, γιατί δεν είναι ανάγκη να συµβεί µε απενεργοποιηµένα σήµατα διακοπής. υστυχώς, ένα RTOS (Real Time Operating System) δεν είναι πάντα µια επιλογή για έναν MCU χαµηλής κατανάλωσης, ο οποίος ίσως να µην έχει αρκετή µνήµη RAM για να υποστηρίξει έναν RTOS. 9