diff --git a/Praktikum Rechnerarchitekturen 2.pdf b/Praktikum Rechnerarchitekturen 2.pdf index 5c1a3c8..e94c6e3 100644 Binary files a/Praktikum Rechnerarchitekturen 2.pdf and b/Praktikum Rechnerarchitekturen 2.pdf differ diff --git a/Praktikum Rechnerarchitekturen 2.tex b/Praktikum Rechnerarchitekturen 2.tex index a64d6f4..cddd0ec 100644 --- a/Praktikum Rechnerarchitekturen 2.tex +++ b/Praktikum Rechnerarchitekturen 2.tex @@ -58,7 +58,7 @@ Simulative Untersuchung der Ausführung von Maschinenbefehlen in unterschiedlichen Pipeline-Architekturen \subsection*{Aufgabe 1} -Untersuche die vorbereitete Befehlsfolge mit den drei vorgegebenen Grundstrukturen Standard-Pipeline, Superskalar-in-Order und Superskalar-out-of-Order. Beobachte den Programmablauf und machen dich mit der Bedienung vertraut! Schauen vor dem Simulationsstart auch die Parametereinstellungen für Sprungvorhersage und Result Forwarding an (hier können auch Änderungen vorgenommen werden) und interpretiere das Verhalten während der Simulation. +Untersuche die vorbereitete Befehlsfolge mit den drei vorgegebenen Grundstrukturen Standard-Pipeline, Superskalar-in-Order und Superskalar-out-of-Order. Beobachte den Programmablauf und machen dich mit der Bedienung vertraut! Schauen vor dem Simulationsstart auch die Parametereinstellungen für Sprungvorhersage und Result Forwarding an und interpretiere das Verhalten während der Simulation. Code A1b \begin{lstlisting}[basicstyle=\tiny] @@ -94,6 +94,7 @@ Alle Strukturen mit Result-Forwarding und 2-Bit Vorhersage. \end{itemize*} \end{itemize*} +\newpage \subsection*{Aufgabe 2} Untersuche die Befehlsfolgen A4 und B2 mit mindestens je drei unterschiedlichen Simulationsläufen! Wähle die benutzten Pipelinestrukturen und Parametereinstellungen selbst aus. Vergleiche die Ergebnisse mit den Lösungen aus der Übung und suche Erklärungen für eventuelle Unterschiede! @@ -216,7 +217,7 @@ Superskalar In-Order Pipeline ohne Result Forwarding (4 EX Einheiten) \item \includegraphics[width=.4\linewidth]{Assets/RA2-73350.jpg} \end{itemize*} - +\newpage \subsection*{Aufgabe 3} Änderne nun eine der vorgegebenen Pipelinestrukturen ab, z.B. die Anzahl der parallelen Pipelines verändern. Orientiere dich zuvor über den Inhalt des ,,Baukastens''. Untersuche mit den oben verwendeten Befehlsfolgen die Auswirkungen auf die Simulationsergebnisse! Variiere dabei die Parameter und interpretiere die Ergebnisse! @@ -255,6 +256,7 @@ Superskalar In-Order Pipeline ohne Result Forwarding (4 EX Einheiten) \end{itemize*} \end{itemize*} +\newpage \subsection*{Zusatzaufgaben} \subsubsection*{Z1} Untersuche weitere Befehlsfolgen, z.B. aus A5, A6, A7, B1 oder nach eigenen Entwürfen! @@ -331,7 +333,7 @@ Gebe das folgende Programm ein. Es soll die vorhandenen Befehle ersetzen. .INCLUDE "tn25def.inc" // Einfügen von Symbolen, u.a. für I/O-Register .DEVICE ATtiny25 // Festlegen des Controllertyps anf: - ldir 16,0x07 + ldi r16,0x07 out DDRB,r16 // Port B: Richtungseinstellung ldi r16,0x18 out PORTB,r16 // Port B: Pull-up für Taster-Eingänge aktivieren @@ -349,18 +351,24 @@ Das Programm soll jetzt so erweitert werden, dass die LED mit den beiden Tastern .INCLUDE "tn25def.inc" // Einfügen von Symbolen, u.a. für I/O-Register .DEVICE ATtiny25 // Festlegen des Controllertyps anf: - ldir 16,0x07 + ldi r16,0x07 out DDRB,r16 // Port B: Richtungseinstellung ldi r16,0x18 out PORTB,r16 // Port B: Pull-up für Taster-Eingänge aktivieren lo1: sbis PINB,PB4 // Abfrage TASTER1, Skip Folgebefehl wenn nicht gedrückt - sbi PORTB,0 // Einschalten der LED (blau) + jmp blue sbis PINB,PB3 // Abfrage TASTER2, Skip Folgebefehl wenn nicht gedrückt - cbi PORTB,0 // Ausschalten der LED (blau) + jmp green rjmp lo1 // Sprung zum Schleifenbeginn - - ... +blue: + sbi PORTB,0 // Einschalten der LED (blau) + cbi PORTB,1 // Ausschalten der LED (grün) + rjmp lo1 +green: + cbi PORTB,0 // Ausschalten der LED (blau) + sbi PORTB,1 // Einschalten der LED (grün) + rjmp lo1 \end{lstlisting} Verändere das Programm nun so, dass durch abwechselndes Drücken der beiden Taster eine Sequenz von mindestens sechs unterschiedlichen Leuchtvarianten der LED durchgeschaltet werden kann. @@ -368,25 +376,75 @@ Verändere das Programm nun so, dass durch abwechselndes Drücken der beiden Tas .INCLUDE "tn25def.inc" // Einfügen von Symbolen, u.a. für I/O-Register .DEVICE ATtiny25 // Festlegen des Controllertyps anf: - ldir 16,0x07 + ldi r16,0x07 out DDRB,r16 // Port B: Richtungseinstellung ldi r16,0x18 out PORTB,r16 // Port B: Pull-up für Taster-Eingänge aktivieren + ldi r17,0x01 // Zähler lo1: sbis PINB,PB4 // Abfrage TASTER1, Skip Folgebefehl wenn nicht gedrückt - sbi PORTB,0 // Einschalten der LED (blau) + rjmp up sbis PINB,PB3 // Abfrage TASTER2, Skip Folgebefehl wenn nicht gedrückt - cbi PORTB,0 // Ausschalten der LED (blau) + rjmp down rjmp lo1 // Sprung zum Schleifenbeginn - - .... +up: + inc r17 + cmp r17, 0x07 + jnz blue + ldi r17, 0x00 + rjmp blue +down: + dec r17 + cmp r17, 0x00 + jnz blue + ldi r17, 0x06 +blue: + cmp r17, 0x01 + jnz cyan + sbi PORTB,0 // Einschalten der LED (blau) + cbi PORTB,1 // Ausschalten der LED (grün) + cbi PORTB,2 // Ausschalten der LED (rot) + rjmp lo1 +cyan: + cmp r17, 0x02 + jnz green + sbi PORTB,0 // Einschalten der LED (blau) + sbi PORTB,1 // Einschalten der LED (grün) + cbi PORTB,2 // Ausschalten der LED (rot) + rjmp lo1 +green: + cmp r17, 0x03 + jnz yellow + cbi PORTB,0 // Ausschalten der LED (blau) + sbi PORTB,1 // Einschalten der LED (grün) + cbi PORTB,2 // Ausschalten der LED (rot) + rjmp lo1 +yellow: + cmp r17, 0x04 + jnz red + cbi PORTB,0 // Ausschalten der LED (blau) + sbi PORTB,1 // Einschalten der LED (grün) + sbi PORTB,2 // Einschalten der LED (rot) + rjmp lo1 +red: + cmp r17, 0x05 + jnz violett + cbi PORTB,0 // Ausschalten der LED (blau) + cbi PORTB,1 // Ausschalten der LED (grün) + sbi PORTB,2 // Einschalten der LED (rot) + rjmp lo1 +violett: + sbi PORTB,0 // Einschalten der LED (blau) + cbi PORTB,1 // Ausschalten der LED (grün) + sbi PORTB,2 // Einschalten der LED (rot) + rjmp lo1 \end{lstlisting} \subsection*{Aufgabe 2: Blinken der LED} Das Programm soll die LED fortlaufend blinken lassen. Diese Funktion wird mit einem Zähler/Zeitgeber-Interrupt realisiert. \subsubsection*{Schritt a: Einfaches Blinken} -Die Aufgabe besteht nun darin, die LED periodisch ein- und auszuschalten, so dass sich eine Frequenz von etwa 2 Hz ergibt. Das Umschalten der LED soll in der Interruptserviceroutine eines Zähler/Zeitgeber-Interrupts erfolgen. Dafür soll Timer/Counter 0 so initialisiert werden, dass er Interrupts mit einer Folgefrequenz von etwa 4 Hz auslöst. Stütze dich dazu auf das folgende Programmfragment: +Die Aufgabe besteht nun darin, die LED periodisch ein- und auszuschalten, so dass sich eine Frequenz von etwa 2 Hz ergibt. Das Umschalten der LED soll in der Interruptserviceroutine eines Zähler/Zeitgeber-Interrupts erfolgen. Dafür soll Timer/Counter 0 so initialisiert werden, dass er Interrupts mit einer Folgefrequenz von etwa 4 Hz auslöst. \begin{lstlisting}[basicstyle=\tiny] // Interrupttabelle (muss vor dem ersten ausführbaren Befehl stehen): tab: rjmp anf // Programmstart nach Reset ("Interrupt" 1) @@ -422,11 +480,9 @@ i_11: in r25,SREG // Flags retten (weitere Rettungen nach Bedarf) \end{lstlisting} Die Hintergrundschleife bleibt zunächst leer. Entwickle und teste das Programm für diese Aufgabe. - \begin{lstlisting}[basicstyle=\tiny] .INCLUDE "tn25def.inc" // Einfügen von Symbolen, u.a. für I/O-Register .DEVICE ATtiny25 // Festlegen des Controllertyps - // Interrupttabelle (muss vor dem ersten ausführbaren Befehl stehen): tab: rjmp anf // Programmstart nach Reset ("Interrupt" 1) reti @@ -438,60 +494,307 @@ tab: rjmp anf // Programmstart nach Reset ("Interrupt" 1) reti reti reti - rjmp i_11 // Timer 0 Compare A Interrupt (Interrupt 11) + rjmp timer_compare // Timer 0 Compare A Interrupt (Interrupt 11) reti reti reti reti // Tabellenende (Interrupt 15) + + // Initialisierungsteil und Hintergrundprogramm: +anf: [...] // Weitere Initialisierungen + // Initialisierung von Timer/Counter 0 + ldi r16, high( 40000 - 1 ) + out OCR1AH, r16 + ldi r16, low( 40000 - 1 ) + out OCR1AL, r16 + // CTC Modus einschalten, Vorteiler auf 1 + ldi r16, ( 1 << WGM12 ) | ( 1 << CS10 ) + out TCCR1B, r16 + // OCIE1A: Interrupt bei Timer Compare + ldi r16, 1 << OCIE1A + out TIMSK, r16 + + sei // Globale Interruptfreigabe + //ldi r16,0x10 + //out TIMSK,r16 // Freigabe von Interrupt 11 (Timer 0 Compare A) -// Initialisierungsteil und Hintergrundprogramm: -anf: - ldir 16,0x07 - out DDRB,r16 // Port B: Richtungseinstellung + ldi r16,0x07 + out DDRB,r16 // Port B: Richtungseinstellung ldi r16,0x18 out PORTB,r16 // Port B: Pull-up für Taster-Eingänge aktivieren - [...] // Weitere Initialisierungen - [...] // Initialisierung von Timer/Counter 0 (Empfehlung: - // Betriebsart CTC, Vergleichsregister A nutzen) - sei // Globale Interruptfreigabe - ldi r16,0x10 - out TIMSK,r16 // Freigabe von Interrupt 11 (Timer 0 Compare A) -lo1: - sbis PINB,PB4 // Abfrage TASTER1, Skip Folgebefehl wenn nicht gedrückt - sbi PORTB,0 // Einschalten der LED (blau) - sbis PINB,PB3 // Abfrage TASTER2, Skip Folgebefehl wenn nicht gedrückt - cbi PORTB,0 // Ausschalten der LED (blau) - rjmp lo1 // Sprung zum Schleifenbeginn -lo2: rjmp lo2 // Leere Hintergrundschleife -// Interruptserviceroutine: -i_11: in r25,SREG // Flags retten (weitere Rettungen nach Bedarf) - [...] // Inhalt der Routine + ldi r17, 0x00 // Zähler +lo2: + rjmp lo2 // Leere Hintergrundschleife + + // Interruptserviceroutine: +timer_compare: + in r25,SREG // Flags retten (weitere Rettungen nach Bedarf) + inc r17 + cmp r17, 0x02 + jnz on +off: + ldi r17, 0x00 + cbi PORTB,0 // Ausschalten der LED (blau) + rjmp close +on: + sbi PORTB,0 // Einschalten der LED (blau) +close: out SREG,r25 // Flags restaurieren reti // Routine beenden \end{lstlisting} +Alternativ +\begin{lstlisting}[basicstyle=\tiny] +init: + ; Modus 14: + ldi r17, 1<