Trotz des Alters des MCS-51 werden kompatible Prozessoren noch immer verbaut. Durch die hohe Vielfalt an konkreten Prozessoren k\"onnen sie in vielen Gebieten eingesetzt werden, z.B. wenn ein geringer Stromverbrauch ben\"otigt wird und 8-Bit ausreichend sind. Der von Intel im ``MCS\copyright 51 Microcontroller Family User's Manual (1994)'' angegebene Einsatzzweck sind regelungstechnische Anwendungen.
\subsection{Conditional Jumps}
-Conditional Jumps sind als Instruktionen vorhanden, jedoch in limitierten Umfang. Es sind nur (not) zero auf Bytes, Carry set auf das Statusbyte und Bit (not) set auf einige ausgew\"ahlte Bytes im RAM m\"oglich. Alle anderen Sprungtypen m\"ussen auf die vorhandenen Zur\"uckgef\"uhrt werden.
+Conditional Jumps sind als Instruktionen vorhanden, jedoch in limitierten Umfang. Es sind nur \texttt{(not) zero} auf Bytes, Carry set auf das Statusbyte und Bit \texttt{(not) set} auf einige ausgew\"ahlte Bytes im RAM m\"oglich. Alle anderen Sprungtypen m\"ussen auf die vorhandenen Zur\"uckgef\"uhrt werden.
-Latenzen werden in Hardware behandelt und sind nicht auf dem ISA Level sichtbar. Es ist jedoch anzumerken das in der MCS-51 Architektur eine Unterscheidung zwischen Clocktakt und Maschinenzyklen zu machen ist. Eine Instruktion ben\"otigt f\"ur ihre Ausf\"uhrung mindestens einen Maschinenzyklus. Ein Maschinenzyklus wird in sechs Teilbereiche unterteilt, die \"ublichen Pipelinestages \"ahnlich sind, und je 6 Clocktakte ben\"otigen. Dadurch entspricht eine Maschinenzyklus 12 Clocktakten.
+Latenzen werden in Hardware behandelt und sind nicht auf dem ISA Level sichtbar. Es ist jedoch anzumerken das in der MCS-51 Architektur eine Unterscheidung zwischen Clocktakt und Maschinenzyklen zu machen ist. Eine Instruktion ben\"otigt f\"ur ihre Ausf\"uhrung mindestens einen Maschinenzyklus. Ein Maschinenzyklus wird in sechs Teilbereiche unterteilt, die \"ublichen Pipelinestages \"ahnlich sind, und je sechs Clocktakte ben\"otigen. Dadurch entspricht eine Maschinenzyklus 12 Clocktakten.
Diese Unterscheidung muss bei modernen Designs, wie dem CPI-51, nicht mehr gemacht werden. Diese besitzen schon eine vollst\"andige Pipeline wodurch ein Maschinenzyklus einem Clocktakt entspricht.
\subsection{Ziele}
\begin{itemize}
\item Teilweise Anwendung von boolschen Operatoren auf einzelne Bits
\item In der ISR-Vector Tabelle sind 8 Bytes f\"ur jeden Interrupt vorhanden, wodurch kleine ISR's direkt in dieser platziert werden k\"onnen.
- \item Es gibt 4 Registerbanken zu je 8 Registern die \"uber das PSW \footnote{Program Status Word} ausgew\"ahlt werden k\"onnen.
+ \item Es gibt 4 Registerbanken zu je 8 Registern die \"uber das PSW\footnote{Program Status Word} ausgew\"ahlt werden k\"onnen.
\item Eine Division liefert Quotient und Rest.
- \item Die DJNZ-Operation \footnote{decrement jump not zero} ist bei Schleifen mit einem 8-Bit Counter gut einsetzbar.
+ \item Die DJNZ-Operation\footnote{\texttt{decrement jump not zero}} ist bei Schleifen mit einem 8-Bit Counter gut einsetzbar.
\end{itemize}
Als etwas gew\"ohnungsbed\"urftig kann man folgende Features bezeichnen:
\end{itemize}
\lstinputlisting[caption=MCS-51 Code]{8051.s}
-
Das Timing wurde f\"ur die Original MCS-51 Architektur ermittelt.
Es werden pro Schleifeniteration 21 Instruktionen ausgef\"uhrt. Dadurch ergibt sich eine Ausf\"uhrungszeit von 30$\mu$s (bei einer Clock von 12MHz) was 30 Maschinenzyklen beziehungsweise 360 Clocktakte entspricht. Die Codesize der Schleife ist 32 Bytes.
-Wenn man von 8-Bit Daten ausgehen w\"urde, h\"atte eine Schleifeniteration 5 Instruktionen, eine Ausf\"uhrungszeit von 8$\mu$s und eine Codesize von 6 Bytes. Es ist also sehr sch\"on zu sehen das Operationen mit 16-Bit Daten sehr teuer sind im Vergleich zu 8-Bit Daten.
+Wenn man von 8-Bit Daten ausgehen w\"urde, h\"atte eine Schleifeniteration f\"unf Instruktionen, eine Ausf\"uhrungszeit von 8$\mu$s und eine Codesize von 6 Bytes. Es ist also sehr sch\"on zu sehen das Operationen mit 16-Bit Daten sehr teuer sind im Vergleich zu 8-Bit Daten.
Die anderen Register werden verwendet um die Fehlerbehandlung zu beschleunigen. Aus diesem Grund beschreibt die ARM Architektur
eine Registermaschine mit einer RISC Architektur.
-Die Register R13, R14 und R15 finden besondere Verwendung. R13 ist der Stack-Pointer, R14 das Link Register und R15 der Program-Counter.
+Die Register \texttt{R13}, \texttt{R14} und \texttt{R15} finden besondere Verwendung. \texttt{R13} ist der Stack-Pointer, \texttt{R14} das Link Register und \texttt{R15} der Program-Counter.
Diese Register k\"onnen allerdings auch \"uber normale Instruktionen beschrieben werden. Das Link-Register beinhaltet die R\"ucksprungadresse
im Falle eines Subroutinen-Calls.
Beispielsweise ist die ARM710 Familie designed um in Hand-Helds und anderen Multimediabereichen Anwendung zu finden.
Die leistungsf\"ahigere ARM10 Familie bietet eine Vector-Floating-Point Einheit. Der Cortex A8, welcher den ARMv7 Instruktionssatz
verwendet, betreibt das IPhone 3GS, der Nintendo DS wird auch von einem ARM angetrieben. Diverse Linux-Distributionen laufen auf leistungsf\"ahigeren ARM-Prozessoren.
-Einem Bericht aus 2007 zufolge verwenden ca 98 Prozent der verkauften Mobiltelefone einen ARM Prozessor (Wikipedia).
+Einem Bericht aus 2007 zufolge verwenden zirka 98 Prozent der verkauften Mobiltelefone einen ARM Prozessor (Wikipedia).
%\subsection{Where are processors that implement the ISA deployed? In embedded systems (microcontrollers,
%communication, multimedia), in servers, in desktop computers?}
nicht am Software-Level sichtbar. Des weiteren gibt es Predicated Instructions, welche erlauben, dass die Instruktion nur
im Falle eines gesetzten Pr\"adikats ausgef\"uhrt wird. ARM verwendet f\"ur nahezu jede Instruktion 4 Bits an Pr\"adikaten. Somit
k\"onnen theoretisch 16 verschiedene Ausf\"uhrungsm\"oglichkeiten abgeleitet werden, es werden 15 gen\"utzt.
-Nach dem Testen einer Bedingung (CMP) wird dieses Ergebnis im Statusregister vermerkt (zb CMP R1, R2).
-Nun kann beispielsweise ADDEQ R0, R2, R3 und ADDNE R7, R2, R3 folgen, was folgenden Code abbildet:
-
+Nach dem Testen einer Bedingung (\texttt{CMP}) wird dieses Ergebnis im
+Statusregister vermerkt (zum Beispiel \texttt{CMP R1, R2}).
+Nun kann beispielsweise \texttt{ADDEQ R0, R2, R3} und \texttt{ADDNE R7, R2, R3} folgen, was folgenden Code abbildet:
\begin{lstlisting}[caption=Beispiel]{}
-
-if R1 = R2 then
+if R1 = R2
R0 = R2 + R3
else
R7 = R2 + R3
-end if
-
\end{lstlisting}
-
Somit k\"onnen kleine if-Bl\"ocke auf sequenzielle Statements ohne Sprung abgebildet werden.
-Sollte f\"ur eine Instruktion die Kondition nicht erf\"ullt sein wird diese einfach durch ein NOP ersetzt.
+Sollte f\"ur eine Instruktion die Kondition nicht erf\"ullt sein wird diese einfach durch ein \texttt{NOP} ersetzt.
Ein m\"ogliches Pr\"adikat ist auch Always, somit wird keine Bedingung im Statusregister gepr\"uft.
\subsection{Implementierung des Beispielcodes}
\begin{lstlisting}[caption=ARM Code]{ARM-Code}
-
; r0 = len
; r1 = ptr to arr
; wenn len=0 return 0
bne loop;
mov r0,r2
bx lr
-
\end{lstlisting}
-
Jeder Schleifendurchlauf f\"uhrt ein Load, ein Add, ein Compare und ein Branch-Equal aus.
-
-Implementiert auf einem ARM7TDMI, dieser verwendet eine 3-Stufige Pipeline, erhalten wir folgende
+Implementiert auf einem ARM7TDMI, dieser verwendet eine dreistufige Pipeline, erhalten wir folgende
Aussagen \"uber die Clockcycles:
-ldr 3, add 1, cmp 1, bne 3, was bedeutet, dass ein Schleifendurchlauf 8 Zyklen ben\"otigt (Informationen aus dem Manual des Prozessors entnommen).
+\texttt{ldr} 3, \texttt{add} 1, \texttt{cmp} 1, \texttt{bne} 3, was bedeutet, dass ein Schleifendurchlauf acht Zyklen ben\"otigt (Informationen aus dem Manual des Prozessors entnommen).
-Die Anzahl der Instruktionen in der Schleife ist 4, da auch der Sprung zum
+Die Anzahl der Instruktionen in der Schleife ist vier, da auch der Sprung zum
Schleifenbeginn mitgez\"ahlt wird. Die Codesize der Schleife betr\"agt 16 Byte,
da jede Instruktion eine L\"ange von 32 Bit hat.
Es handelt sich hierbei um eine Register basierende Maschine.
\subsection{Einsatzgebiet}
-Die 8-bit AVR ISA wird zum Beispiel in der megaAVR Serie verwendet, welche im Embedded Bereich eingesetzt wird. Sie bietet eine breite Auswahl aus Peripherie M\"oglichkeiten/Ger\"aten an. Dies macht sie verwendbar f\"ur eine breite Palette an Applicationen. Die Serie verf\"ugt unter anderem \"uber USB, LCD, CAN und LIN Interfaces, zus\"atzlich zu den Standards f\"ur SPI, UART oder I2C.
+Die 8-bit AVR ISA wird zum Beispiel in der megaAVR Serie verwendet, welche im
+Embedded Bereich eingesetzt wird. Sie bietet eine breite Auswahl aus Peripherie
+M\"oglichkeiten/Ger\"aten an. Dies macht sie verwendbar f\"ur eine breite Palette an Applikationen. Die Serie verf\"ugt unter anderem \"uber USB, LCD, CAN und LIN Interfaces, zus\"atzlich zu den Standards f\"ur SPI, UART oder I2C.
Au\ss erdem bietet es Features wie die Selbstprogrammierung des Flashes und damit sichere, g\"unstige Upgrades w\"ahrend des Betriebes an.
\subsection{Conditional Jumps}
Conditional Jumps sind bei dieser ISA immer getrennt vorhanden.
-Es gibt ein Set aus 3 Compare Instructionen, sowie eine Set f\"ur Branches.
+Es gibt ein Set aus drei Compare Instructionen, sowie eine Set f\"ur Branches.
Durch die Compares werden im Statusregister Bits gesetzt bzw. gel\"oscht, welche dann von den einzelnen Branches abgefragt werden k\"onnen.
Die Latenzzeiten die bei Jumps und Branches, sowie bei anderen Instructionen mit mehreren Zyklen, auftreten werden auf Hardwareebene behandelt und sind deshalb nicht auf dem ISA Level sichtbar.
\subsection{Ziele}
-Laut der ersten Feature Zeile in den AVR PDFs liegt das Hauptaugenmerk auf:
-
-High-performance, Low-power
-
+Laut der ersten Feature Zeile in den AVR PDFs liegt das Hauptaugenmerk auf
+High-Performance und niedrigen Energieverbrauch.
Da die Komponenten haupts\"achlich im Embedded Bereich eingesetzt werden ist klar, dass ein niedriger Energieverbrauch besonders wichtig ist.
Umgesetzt wird das ganze durch Instructionen die haupts\"achlich in einem Zyklus abgearbeitet werden.
Au\ss erdem werden bei den diversen Serien noch Sleep-Modi und andere Konzepte angeboten, die das Low-power Schema noch weiter unterst\"utzen.
\end{itemize}
Negativ auffallen ist mir:
\begin{itemize}
- \item Es gibt keinen add immediate Befehl um eine Konstante zu einem Register hinzuzuf\"ugen, jedoch um eine Konstante zu einem Word hinzuzuf\"ugen.
+ \item Es gibt keinen \texttt{add} immediate Befehl um eine Konstante zu einem Register hinzuzuf\"ugen, jedoch um eine Konstante zu einem Word hinzuzuf\"ugen.
\end{itemize}
\subsection{Listing}
Ich gehe von folgenden Vorbedingungen aus:
\begin{itemize}
- \item len in r24,r25
- \item Array liegt im Datenspeicher ab Y+0:Y+1
- \item Summe wird in r24,r25 gespeichert
+ \item \texttt{len} in \texttt{r24,r25}
+ \item das Array liegt im Datenspeicher ab \texttt{Y+0:Y+1}
+ \item Summe wird in \texttt{r24,r25} gespeichert
\end{itemize}
-
\begin{lstlisting}[caption=AVR Code]
subroutine:
-mov r28,"Adresse mit zu verwendenden Arraydaten"
-mov r29,"Adresse mit zu verwendenden Arraydaten"
-
-adiw r25:r24,1
-mov r10,r24
-mov r11,r25
-subi r29:r28,2
-ldi r1,0x01
-ldi r2,0x01
-ldi r20,0x00
-ldi r21,0x00
-cp r10,r1
-cpc r11,r2
-brlt exit
-
-ldi r1,0x00
-ldi r2,0x00
-
+ mov r28,"Adresse mit zu verwendenden Arraydaten"
+ mov r29,"Adresse mit zu verwendenden Arraydaten"
+
+ adiw r25:r24,1
+ mov r10,r24
+ mov r11,r25
+ subi r29:r28,2
+ ldi r1,0x01
+ ldi r2,0x01
+ ldi r20,0x00
+ ldi r21,0x00
+ cp r10,r1
+ cpc r11,r2
+ brlt exit
+
+ ldi r1,0x00
+ ldi r2,0x00
for:
-adiw r2:r1,1 # 2 c 2 b
-adiw r29:r28,2
+ adiw r2:r1,1 # 2 c 2 b
+ adiw r29:r28,2
-ldd r24,Y # 2 c 2 b
-ldd r25,Y+1
+ ldd r24,Y # 2 c 2 b
+ ldd r25,Y+1
-add r20,r24 # 1 c 2 b
-adc r21,r25 # 1 c 2 b
+ add r20,r24 # 1 c 2 b
+ adc r21,r25 # 1 c 2 b
-cp r1,r10 # 1 c 2 b
-cpc r2,r11 # 1 c 2 b
-brlt for # 1 c if false 2 c if true 2 b
+ cp r1,r10 # 1 c 2 b
+ cpc r2,r11 # 1 c 2 b
+ brlt for # 1 c if false 2 c if true 2 b
-mov r24,r20
-mov r25,r21
+ mov r24,r20
+ mov r25,r21
exit:
-ret
+ ret
\end{lstlisting}
-
Daraus ergibt sich:
\begin{itemize}
\item Anzahl Instructionen: 9
- \item Anzahl Zyklen: wenn Branch false 13 sonst 14
+ \item Anzahl Zyklen: wenn Branch \texttt{false} 13 sonst 14
\item Anzahl Bytes: 18
\end{itemize}
-
-
-
-
Bei Conditional Operations reicht die Anzahl und deren Umfang von sehr beschr\"ankt (MCS-51) bis zu fast alle Instruktionen (ARM).
Als Anwendungsgebiete kann man f\"ur alle Architekturen auf jedenfall Embedded Systems angeben. ARM und PowerPC sind auch im Desktop- und Serverbereich anzutreffen.
Die Instruktionsetgr\"o\ss e ist bei AVR und MCS-51, durch die 8-Bit bedingt, eher klein. SPEAR2 ist auch eher klein weil die urspr\"ungliche Architektur ebenfalls nur 8-Bit war. ARM und PowerPC haben, auch durch die 32-Bit L\"ange bedingt, ein gro\ss es Instruktionset.
+\lstinputlisting[caption=Compute Sum, language=C, label=list:sum]{sum.c}
Das Sichern der R\"ucksprungadresse wird unterschiedlich gehandhabt. AVR und MCS-51 sichern die Adresse automatisch auf den Stack. PowerPC, SPEAR2 und ARM sichern die R\"ucksprungadresse in ein Register.
Codesizes und Ausf\"uhrungszeiten des Codest\"ucks \texttt{sum} aus Listing~\ref{list:sum} sind in Tabelle~\ref{cmp_tab} ersichtlich. Es ist sofort ersichtlich das die Prozessoren mit h\"oherer Instruktionsl\"ange besser abschneiden wenn es um die Anzahl der Zyklen, und dadurch bedingt, um die Codesize geht, was aber auch nicht sehr verwunderlich ist.\\
-
-
-\lstinputlisting[caption=Compute Sum, language=C, label=list:sum]{sum.c}
-
\begin{table}[ht]
\begin{center}
\begin{tabular}{|l|c|c|c|c|c|}\hline
\tableofcontents
\newpage
-\input{arm}
-\input{avr}
-\input{8051}
-\input{ppc}
-\input{spear2}
-\input{cmp}
+\include{arm}
+\include{avr}
+\include{8051}
+\include{ppc}
+\include{spear2}
+\include{cmp}
\end{document}
\subsection{Einsatzgebiete und Ziele}
PowerPC wurde mit dem Ziel entwickelt m\"oglichst skalierbar und flexibel zu
sein, da die tats\"achlichen Anwendungsgebiete recht unterschiedlich sind.
-
Man findet diese Architektur daher in verschiedenen Bereichen:
\begin{description}
\item[Desktop] Apple verwendete PowerPC, aber mittlerweile von \texttt{x86}
Architektur weit mehr ist}
\item[Server] Vertreten durch beispielsweise POWER7 oder BlueGene
\end{description}
-
% What are the goals of the architecture? Performance, die area, energy
% efficiency, code size, . . . ?
-
% How are these goals reflected in the ISA?
-
-
Die PowerPC Architektur ist also recht vielf\"altig und es gibt daher nicht
\textit{das} Einsatzgebiet. Im Speziellen gibt es verschiedene \textit{Books}
die unterschiedliche Bereiche abdecken und je nach den Bed\"urfnissen des CPU
\subsection{Conditional Instructions und Jumps}\r
Alle Abh\"angigkeiten werden von der Hardware \"uberpr\"uft und entsprechend behandelt. D.h.\r
im ISA-Level m\"ussen keine Abh\"angigkeiten ber\"ucksichtigt werden. Im Falle von CI wird entweder\r
-ein NOP-eingef\"ugt (bzw. Ctrl-Signale deaktiviert) oder die Instruktion wird normal behandelt.\r
+ein \texttt{NOP} eingef\"ugt (bzw. Ctrl-Signale deaktiviert) oder die Instruktion wird normal behandelt.\r
Alle Conditional- und Jump Tests passiern in der Decode-Stufe und die eigentliche Ausf\"uhrung wird in der Exec-Stage\r
abgeschlossen, wobei Ctrl-Signale an die Decode-Stufe zur\"uckgef\"uhrt werden. Es wurden keine\r
Stalls oder \"ahnliches eingef\"uhrt, damit die Programm Execution einer Instruktion konstant bleibt.\r
und eine h\"ohere Taktrate erzielen als eine Hardcore-Architektur. Au\ss erdem ist SW leichter zu warten und verstehen, dies\r
wiederrum verk\"urzt die Entwicklungszeit. Dennoch wird ein Fixedfunction-Core bessere Ergebnisse erzielen, wenn sich\r
die Funktionalit\"at des Softcore-Prozessors nicht mehr von diesem unterscheidet.\r
-Da aber die ISA relativ begrenzt ist (add, sub, comp, load, store,...), wird die Programmgr\"o\ss e (fixed OP-Code) nat\"urlich\r
+Da aber die ISA relativ begrenzt ist (\texttt{add}, \texttt{sub}, \texttt{comp},\r
+\texttt{load}, \texttt{store},...), wird die Programmgr\"o\ss e (fixed OP-Code) nat\"urlich\r
bei komplexen Operationen wachsen. Dennoch ist der OP-Code mit 16-Bit relativ klein.\r
\r
Damit auf Extension-Module oder Speicher schnell zugegriffen werden kann (Stackoperation), gibt es sogenannte Framepointer.\r
w\"unschenswert gewesen, da bei verschachtelten Subroutine-Calls die Software die R\"ucksprungadresse speichern muss. F\"ur\r
einen stack\"ahnlichen Betrieb kann nat\"urlich ein Framepointer herangezogen werden. Dennoch w\"achst dadurch der Code.\r
\subsection{Listing}\r
-Register r14 wird f\"ur die R\"ucksprungadresse verwendet, r0 f\"ur den R\"uckgabewert und r1-r4 f\"ur die Argumente.\r
-r5-r8 wird f\"ur tempor\"are Register verwendet (Caller-Save).\r
+Register \texttt{r14} wird f\"ur die R\"ucksprungadresse verwendet, \texttt{r0} f\"ur den R\"uckgabewert und \texttt{r1-r4} f\"ur die Argumente.\r
+\texttt{r5-r8} wird f\"ur tempor\"are Register verwendet (Caller-Save).\r
\begin{lstlisting}[caption=Spear2 Code]{Spear2-Code}\r
-ldli r0, 0 #sum=0\r
-ldli r5,-20 #Framepointer X\r
-ldli r6, 0 #i=0\r
-stw r2, r5 #fpx -> &arr[0]\r
+ldli r0, 0 #sum=0\r
+ldli r5,-20 #Framepointer X\r
+ldli r6, 0 #i=0\r
+stw r2, r5 #fpx -> &arr[0]\r
\r
cmp_eq r1, r6 #for\r
jmpi_ct, 4 #i<len\r
\r
-ldfpx r7,0 #arr[i]\r
-add r0, r7 #sum+=arr[i]\r
-addi r6, 1 #i++\r
+ldfpx r7,0 #arr[i]\r
+add r0, r7 #sum+=arr[i]\r
+addi r6, 1 #i++\r
\r
-jmpi -5 #for end\r
+jmpi -5 #for end\r
rts\r
\end{lstlisting}\r
-Man erkennt, dass innerhalb der Schleife 6 Instruktionen ausgef\"uhrt werden (inkl. Bedingungen). Ein Jump bewirkt\r
-einen Flush in der Decode-Stufe. Also wird jump zu einem jump+nop. Solange die Schleife exekutiert wird, ergibt sich eine\r
-Laufzeit von 7 Zyklen, bei 6 Befehlen was einer Codesize des Loops von 12 Bytes entspricht.\r
+Man erkennt, dass innerhalb der Schleife sechs Instruktionen ausgef\"uhrt werden (inkl. Bedingungen). Ein Jump bewirkt\r
+einen Flush in der Decode-Stufe. Also wird \texttt{jump} zu einem\r
+\texttt{jump+nop}. Solange die Schleife exekutiert wird, ergibt sich eine\r
+Laufzeit von sieben Zyklen, bei sechs Befehlen was einer Codesize des Loops von 12 Bytes entspricht.\r