Rechnerarchitektur und Betriebssysteme (CS201): Peripheriebausteine, IO, Interrupts und Timer 8. Oktober 2013 Prof. Dr. Christian Tschudin Departement Mathematik und Informatik, Universität Basel Wiederholung / Diskussion 1. Was sind memory-mapped registers? 2. Was ist ein frame pointer? 3. Was macht ein call, was ein ret? 4. Muss ein von Neumann-Rechner ein Stackpointer-Register haben? Exkurs: Google-Papier zur Häufigkeit von DRAM-Fehler c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 2/39
Uebersicht 2013-10-08 Bus und Peripheriegeräte, Beispiele IO-Befehle des AVR-Chips Programmierung von Gerätetreibern Interrupts Interrupt-Vektor, -Tabelle, -Priorität, -Maske Timer c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 3/39 Peripherie-Bausteine Bisher gesehen: CPU Cache Daten- und Adress-Bus (externer) Speicher Wie wird eine CPU mit der externen Welt verbunden? Maus, Tastatur, Bidlschirm Hard Disk Netzwerk Ein-/Ausgabegeräte (I/O devices, IO=input/output) c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 4/39
Ein-Ausgabegeräte Ein-Ausgabegeräte brauchen Daten-, Adress- und Kontrollleitungen Adresse: selektiert das Gerät, welche Datenbereiche Daten: Ein-/Ausgabe von Daten zum Prozessor/zum Speicher Kontrolle: um den Datenaustausch zu steuern (Zeitpunkt, Handshake) c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 5/39 Peripherie-Elektronik Peripherie umfasst: Bus adapter: verbindet ein Gerät mit dem/einem Computer-Bus erkennt CPU-Befehle puffert Daten Gerätespezifische Elektronik Sensoren, Aktuatoren elektrische Signalübersetzung/anpassung ev auch komplexe Kontrolleinheit (eigene µc für HD) c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 6/39
Kommunikation zwischen CPU und Peripherie Direct (programmed) I/O (programmierte Ein-/Ausgabe) CPU legt spezielle Befehle auf den Bus read/write für Ports ein Port selektiert das I/O-Geräte Port-Befehle werden von der Geräte-Elektronik erkannt, diese wird dann antworten (statt zb der Speicher-Chip) Beispiele: Lese ein Byte von I/O-Port 0x2f8 Schreibe ein 32-Bit-Wort an Port 0x400 c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 7/39 Kommunikation zwischen CPU und Peripherie (II) Memory mapped I/O: Bus-Adapter des Geräts sieht wie Speicher aus CPU setzt gewöhnliche Lese/Schreib-Operationen ein (Speicher-) Adresse selektiert das Gerät I/O read/write-befehle sind auf Speicheroperationen abgebildet Beispiel: schreibe 2 KB in den Videospeicher neuer Bildschirminhalt c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 8/39
Kommunikation zwischen CPU und Peripherie (III) Direct memory access (DMA) : CPU initialisiert den Transfer nur: Daten gehen direkt vom Speicher zur Peripherie, DMA generiert Adressen DMA wickelt Transfer ab, CPU arbeitet parallel weiter. DMA ist eine Art Co-Prozessor für Speicherkopieren. addr bus CPU init DMA IO device memory data bus c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 9/39 Versch. Bus-Architekturen c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 10/39
Verschiedene Bus-Architekturen (II) Memory Processor Bus: schnell kurz ev CPU-spezifisch Backplane Bus: erweiterbar für ein oder mehrere Peripheriegeräte standardisiertes elektrisches Interface standardisiertes Datenaustausch-Protokoll c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 11/39 Beispiel eines I/O-Gerätes: Serieller Port UART = universal asynchronous receiver/transmitter CPU schreibt ein Byte (liegt parallel an), serieller Port muss es Bit für Bit aussenden Zu bestimmende Parameter: Bit-Geschwindigkeit Kodierung Kontrolleitungen (Modem ready, clear-to-send etc) UART empfängt auch die Bits: muss ein Bit nach dem anderen speichern und als ein komplettes Byte der CPU anbieten c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 12/39
Serieller Port (Forts.) c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 13/39 2tes Beispiel eines IO-Gerätes: Hard Drive Mögliche Harddrive-Befehle: Lese+Schreibarm auf spezifischem Zylinder positionieren Abfrage der aktuellen Arm-Position Lesen und Schreiben von Datensektoren Abfragen der physikalischen Charakteristiken # Tracks, Modellname, Hersteller, etc. Low-level-Test starten c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 14/39
I/O beim AVR Chip I/O-Bausteine auf dem µc-chip integriert! Total 53 I/O-Leitungen, mit zum Teil mehrfachen Funktionen (entweder Digital-Port, Analog-Port, Daten- oder Adressleitung etc) PORTA bis PORTF: sechs 8-Bit Ports jeweils 3 Register pro Port A F: DDRA..DDRF (Data Direction Register): Ein- oder Ausgang? PORTA..PORTF (Port Data): Output PINA..PINF (Port Input) c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 15/39 I/O beim AVR Chip: Memory Mapped Ports + Register Die meisten Ports sind auch via Register/Memory zugreifbar, und umgekehrt sind spezielle Register via Ports veränderbar. port mem name... $3E ($5E) SPH (stack pointer high) $3D ($5D) SPL (stack pointer low)... $03 ($23) PORTE $02 ($22) DDRE $01 ($21) PINE Deshalb: Stack-Pointer lesen mit in r28, 0x3d in r29, 0x3e c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 16/39
Speicheradressen des Datensegments (Memory Map) 0x0100 0x10ff Stack 4096 Hauptspeicher Zellen (SRAM) 0x0060 0x00ff 0x0020 0x005f 0x0000 0x001f 8 Bits 160 "extended IO" Registers 64 "Input/Output" Register 32 "general purpose" Register c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 17/39 I/O beim AVR Chip: LEDs der Berkeley Motes (MicaZ) Auschnitt aus dem MicaZ Schaltplan: Ports des ATmega128L: LED-Anschlüsse (Ausschnitt): c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 18/39
I/O beim AVR Chip: LEDs der Berkeley Mote (Forts) Port-Befehle: in, out, sbi, cbi Initialisieren des (roten) LED-Ports: sbi DDRA, 2 ; setzt Port A, 2tes Bit, als Output-Linie Rote LED einschalten: sbi PORTA, 2 ; (set bit immediate) Output-Bit A2 Rote LED ausschalten: cbi PORTA, 2 ; (clear bit immediate) LED-Status lesen: in r24, PINA ; liest ganzes Byte ein, Maske nötig: 0x03 c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 19/39 Programmierung von Geräte-Treibern Drei verschiedene Ansätze für die Daten Ein-/Ausgabe: Programmierte E/A: CPU holt/setzt Daten vom Port (siehe LED-Beispiel oben) ev. muss die CPU Warteschleifen einlegen, Polling Direct memory access spezieller Chip/Logik bewerkstelligt den Datentransfer, warten Interrupt getriebene Ein-/Ausgabe CPU erhält ein Signal, wenn etwas anliegt c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 20/39
Programmierte Ein-/Ausgabe Typisches Code-Fragment eines Gerätetreibers: for (;;) { do { flag = read_device_memory(flag_address); } until (flag == 1); data = read_device_memory(data_address); if (all_data_read) break; } Dieses Verfahren heisst Polling (permanente Abfrage) c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 21/39 Interrupts Polling sollte vermieden werden (falls CPU besseres zu tun hat): Erwarte Hardware-Signal, wenn das nächste Datum bereit ist Unterbrechung der CPU (Interrupt) via Spezial-Kontrollleitung CPU speichert aktuellen Zustand Forcierter Sprung an vordefinierte Adresse CPU arbeitet die Unterbrechung-Subroutine dort ab (interrupt handler) CPU-Zustand wieder herstellen und am alten Ort weitermachen c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 22/39
Verschiedene Kontrollflüsse Sequentiel Schleife Subroutine Interrupt c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 23/39 Interrupt getriebene Ein-/Ausgabe Typisches Code-Fragment eines Gerätetreibers: /*... während der Initialisierung: */ catch_interrupt(my_interrupt_handler); /*... weitere Initialisierungen, dann Start der Hauptroutine */ void my_interrupt_handler(void) { *data = read_device_memory(status_address); data++; if (all_data_read()) disable_this_interrupt(); } c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 24/39
Interrupt vs Polling Vorteile des Interrupt-Modus: SW-Architektur: Keine Haupt-Schleife nötig, um mehrere Geräte zu verwalten: verschiedene Handler für Uhr, Tastatur, Harddisk etc Nach der Initialisierung kann die CPU andere Aufgaben abarbeiten Nachteil: ev zu langsame Reaktion, dann ist (hardwarenahes) Polling OK Bemerkung: Applikationen sollten NIE Polling machen. c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 25/39 Geräte-Treiber und Interrupt-Handler Ein einfacher Lesebefehl wird von versch SW-Schichten bearbeitet: c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 26/39
Interrupt Vektor Wo findet die CPU bei einem Interrupt die entspr. Subroutine? Interrupt-Vektor definiert die Sprungadresse Die Hardware kann mehrere verschiedene Interrupts erzeugen Jeder Interrupt soll durch eine andere Routine abgearbeitet Definiere einen Interrupt-Vektor für jeden Interrupt: Tabelle c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 27/39 Vektorisierte und nicht-vektorisierte Interrupts Verschiedene Behandlungsarten Vektorisierte Interrupt-Behandlung: entweder mehrere Interrupt-Leitungen oder das auslösende Gerät gibt die Interrupt-ID auf den Bus Tabelle, um aus verschiedenen Vektoren auszuwählen Nicht-vektorisierte Interrupts: nur eine Interrupt-Leitung CPU muss alle Geräte abfragen, wer/warum Interrupt auslöste c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 28/39
Interrupt Tabelle Jedes Geräte hat seinen eigenen Interrupt (und -Vektor). zb im PC: c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 29/39 Interrupt Prioritäten Was passiert, falls ein zweiter Interrupt während dem Abarbeiten eines Interrupts auftritt? verschachtelte Interrupts! Der erste Handler wird unterbrochen wie jedes anderes Programm: der zweite Handler wird ausgeführt der erste Handler nimmt Abarbeitung wieder auf und gibt Kontrolle schliesslich ans Hauptprogramm zurück Einige Interrupts sind wichtiger als andere: Prioritäten geben an, wer wen unterbrechen darf (bedingt zusätzliche HW) c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 30/39
Interrupt Prioritäten, Beispiel ISR = Interrupt Service Routine (Handler) c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 31/39 Interrupt Maske Wie kann ein Interrupt in kritischen Situationen verhindert werden? CPU kann Interrupts maskieren : temporäres Unterbinden von Interrupts z.b. beim Setzen des Stackpointers sobald die Maske aufgehoben wird, werden hängige Interrupts ausgeführt Nonmaskable Interrupt (NMI), z.b. Intel für Interrupts, die nie ignoriert werden sollen Beispiel 1: Hardware-Fehler im Hauptspeicher Beispiel 2: Breakpoint im Debugger c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 32/39
Interrupts beim AVR Chip 35 mögliche Interrupts! Davon 8 externe Interrupt-Leitungen (andere: Timer, UART, Reset, EEPROM ready) Priorität: je niedriger die Nummer, desto höhere Priorität RESET (1. Interrupt) hat höchste Priorität Sprungadressen (Vektor-Tabelle) ab Adresse 0x0000, d.h. CPU started nach einem Reset bei Adresse 0 Address Code Comments $0000 jmp RESET ; Reset Handler $0002 jmp EXT_INT0 ; IRQ0 Handler $0004 jmp EXT_INT1 ; IRQ1 Handler... $0012 jmp TIM2_COMP ; Timer2 Compare Handler c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 33/39 Interrupts beim AVR Chip: Abarbeitung Interrupt Handling: The AVR provides several different interrupt sources. These interrupts and the separate reset vector each have a separate program vector in the program memory space. All interrupts are assigned individual enable bits which must be written logic one together with the Global Interrupt Enable bit in the Status Register in order to enable the interrupt.... When an interrupt occurs, the Global Interrupt Enable I-bit is cleared and all interrupts are disabled. The user software can write logic one to the I-bit to enable nested interrupts. All enabled interrupts can then interrupt the current interrupt routine. The I-bit is automatically set when a Return from Interrupt instruction RETI is executed.... Note that the Status Register is not automatically stored when entering an interrupt routine, nor restored when returning from an interrupt routine. This must be handled by software. c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 34/39
Interrupts beim AVR Chip: Abarbeitung (II) Erläuterungen, Ergänzungen: Global Interrupt Enable -Bit: globale Maske (I-Flag) im Status-Wort (SREG), um Interrupts zu erlauben (oder nicht) RETI: wie RET, aber die Interrupts werden wieder zugelassen cli clear global interrupt flag sei set global interrupt flag Beispiel: sei sleep ; erlaubt Interrupts (z.b. Timer) ; versetzt CPU in Schlafmodus, wird ; durch Interrupt abgebrochen c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 35/39 Rekapitulation Prolog für C, Stack Manipulation test: /* prologue: frame size=1 */ push r28 push r29 in r28, SP_L in r29, SP_H sbiw r28,1 in tmp_reg, SREG cli out SP_H,r29 out SREG, tmp_reg out SP_L,r28 /* prologue end (size=10) */... Kritischer Moment: Manipulation des Stackpointers (SP) Lesen des Stackpointers kein Problem: in r28, SP L (Q: warum ist das so?) Schreiben: zuerst Interrupts blockieren (cli), (Q: wo ist sti?) c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 36/39
Timer Clock-Device (ev mit Stützbatterie) Oszillator + Prescaler + Zähler Interaktion: Setzen/Abfrage des Zählers Mögl. Aktionen bei Erreichen einer Limite (Intervall): Zähler neu setzen Zählrichtung ändern Interrupt bei Erreichen einer Limite, etc Grundlage von Multitasking: Timer-Interrupt löst Task -Wechsel aus c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 37/39 Timer: Prescaler Falls Systemtakt verwendet wird: Zähler läuft schnell über. Prescaler: Frequenzteiler d.h. Interrupt-Frequenz von Zähler und Teiler abhängig. c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 38/39
Was kann mit einem Timer gemacht werden? Interrupt-Handler für Timer: zum Beispiel alle 10 millisec aufrufen lassen Nach jedem Interval einen anderen Prozess abarbeiten Aufteilen der CPU auf mehrere Programme. Eckwerte: erster PC: 1/18 sec Linux auf Pentium: 1/1000 sec c Christian Tschudin CS201 Rechnerarchitektur und Betriebssysteme 2013-10-08, 39/39