# Mikrorechnertechnik

Dieses Buch steht im Regal EDV.

## Zusammenfassung des Projekts

„Mikrorechnertechnik“ ist nach Einschätzung seiner Autoren zu 20 % fertig
* Zielgruppe:
Studenten der Informatik und Interessierte. Vorkenntnisse im Bereich der Technischen Informatik werden vorausgesetzt.
* Buchpatenschaft / Ansprechperson: Zur Zeit niemand, das Buch darf gerne übernommen werden.
* Sind Co-Autoren gegenwärtig erwünscht? ja, sehr gerne.

# Einleitung

Dieser Artikel entsteht als Prüfungsvorbereitung zu einer Prüfung im Fach Prozessautomatisierung an der TH Karlsruhe. Er ist an die Vorlesung Mikrorechnertechnik bei den Professoren Brinkschulte und Ungerer angelehnt und kann sicherlich auch als inoffizielles Skriptum Anwendung finden. Als Quellen werden hauptsächlich die Vorlesungsfolien genutzt.
Der primäre Zweck dieses Textstückes ist es, den Stoff selbst zu verinnerlichen. Daher sind Formulierungen stellenweise unausgereift. Außerdem wird kein Anspruch auf Korrektheit oder Vollständigkeit erhoben. Hier sind andere Autoren herzlich eingeladen, den Beitrag zu verbessern.

# Grundlagen
## Grundbegriffe

Ein Mikroprozessor ist die Zentraleinheit eines Datenverarbeitungssystems. Er besteht aus den Grundkomponenten, dem Prozessorkern aus Rechenwerk und Steuerwerk, und den Schnittstellen zur Außenwelt. Zusätzlich sind oft noch Cache-Speicher und virtuelle Speicherverwaltung auf dem Chip untergebracht.
Ein System welches einen solchen Mikroprozessor enthält, nennt man Mikroprozessorsystem. Sind zusätzlich Speicher, Ein/Ausgabeeinheiten und ein Verbindungssystem vorhanden, nennt man dies Mikrorechner bzw. Mikrocomputer. Ein Mikrorechnersystem besteht aus Mikrorechner und Peripheriegeräten.
Ein Mikrocontroller ist ein Mikrorechner, der auf einem Chip untergebracht ist. Diese sind oft auf spezielle Ziele wie Steuerungs- und Kommunikationsaufgaben zugeschnitten. Da es daher sehr viele verschiedene Modelle gibt, sind die in Mikrocontrollerfamilien gegliedert, die zwar den gleichen Kern, aber unterschiedliche Ein/Ausgabeeinheiten und Speicher haben.
Wenn man dieses Konzept weiterverfolgt und möglichst alle Funktionen eines System auf einem Chip unterbringt, nennt man dies System on Chip (SoC). Diese müssen anwendungsspezifisch erstellt werden und werden daher als ASIC oder FPGA realisiert. Um die Entwicklung zu beschleunigen gibt es Hardwarebibliotheken, denen fertige Komponenten entnommen werden können. Aufgrund der begrenzten Logikdichte von FPGAs, werden oft feste Prozessorkerne und Speicher mit rekonfigurierbaren Zellen kombiniert. Neben den digitalen Schaltungen will man aber auch die analogen auf dem gleichen Chip unterbringen. Dies stellt eine Herausforderung dar.
Signalprozessoren sind spezielle Prozessorarchitekturen, welche auf die Verarbeitung analoger Signale spezialisiert sind. Sie bieten eine Hochleistungsarithmetik, welche mit Multiply-and-Accumulate-Einheiten (MAC) die Berechnung von Polynomen beschleunigt. Die Parallelität der Recheneinheiten ist vom Anwender steuerbar und es existieren Schnittstellen zur Ein- und Ausgabe von analogen Signalen.
Die verbreitetste Form von Mikrorechnern sind PC-Systeme. Sie zeichnen sich durch ein zentrales Mainboard und Erweiterbarkeit durch Steckkarten aus. Sie bestehen im Wesentlichen aus Mikroprozessor, Cache, Northbridge, Systembus, Hauptspeicher, Southbridge und Ein/Ausgabeeinheiten. Die Northbridge hat die Aufgabe, den Prozessorbus, den Systembus und spezialisierte Busse (Speicher, Grafik) zu koppeln. Die Southbridge verbindet den Systembus mit den Peripheriebussen. Die Geschwindigkeit der Busse nimmt mit der Entfernung vom Prozessor ab.

## Eingebettete Systeme

Eingebettete Systeme sind Datenverarbeitungssysteme, die in ein technisches Umfeld eingebettet sind. Ihre Aufgabe ist die Steuerung und Überwachung dieses Umfeldes. Aufgrund dieses Einsatzgebietes stellen sie gegenüber allgemeinen Rechnersystemen weitere Anforderungen. Sie benötigen mehr und vielfältigere Schnittstellen. Außerdem sind die höheren mechanischen Anforderungen aufgrund des raueren Umfeldes und vorgegebener Geometrie gegeben. Auch die elektrischen Vorgaben sind enger, insbesondere in den Punkten Energieverbrauch und Abwärme. Die spezielle Umgebung stellt oft auch Anforderungen an die Zuverlässigkeit des Systems. Zusätzlich wird in vielen Einsatzgebieten eine Ausführung in vorgegebener Zeit verlangt.
In solchen Fällen handelt es sich um Echtzeitsysteme. Diese zeichnen sich dadurch aus, dass neben der logischen Korrektheit auch die zeitliche Korrektheit gefordert wird. Man kann sie in drei Klassen einteilen: Harte, Feste und Weiche. Bei weichen Echtzeitsystemen kann ein Überschreiten von Zeitschranken in gewissem Maße toleriert werden, bei festen ist das Ergebnis nach Ablauf der Zeitschranke wertlos und bei harten Echtzeitsystemen müssen die Zeitschranken unter allen Umständen eingehalten werden. Die wesentlichen Anforderungen an ein Echtzeitsystem sind die zeitliche Vorhersagbarkeit sowie die kontinuierliche Verfügbarkeit.

## Ubiquitäre Systeme

Ubiquitär heißt allgegenwärtig. Unter ubiquitären Systemen versteht man Mikrorechner, die überall in Alltagsgegenständen verborgen sind. Sie sind eingebettete Systeme, die sich auf die Umgebung einstellen und sie komfortabler machen, ohne sie zu beherrschen. Sie stellen nach den Großrechnern und PC-Systemen die 3. Generation von Mikrorechnern dar.

## Leistungsmessung und Vergleich

Bei der Auswahl, dem Entwurf und der Konfiguration von Rechnersystemen ist es notwendig, die Leistungsfähigkeit zu bewerten. Hierzu bestehen sowohl analytische als auch experimentelle Verfahren. Die analytischen haben den Nachteil, dass sie nur theoretische Werte berechnen und nicht den kompletten Systemaufbau mit einbeziehen. Als Beispiele sind zu nennen: Maßzahlen für die Operationsgeschwindigkeit (MIPS, MFLOPS), Mixe und Kernprogramme. Bei Mixen wird für jeden Befehl die mittlere Ausführungszeit berechnet und mit seiner Auftretenswahrscheinlichkeit gewichtet. Bei Kernprogrammen wird ein typisches Anwendungsprogramm benutzt und dessen Ausführungsdauer berechnet. Die experimentelle Bestimmung der Leistungsfähigkeit erfolgt mit Benchmark-Programmen. Mit diesen wird der komplette Systemaufbau inklusive Compiler und Betriebssystem getestet. Häufig werden die SPEC- (Standard Performance Evaluation Corporation) Benchmarks eingesetzt. Hier werden mehrere Suites angeboten, die wiederum aus unterschiedlichen Benchmarks bestehen, um eine allgemeine Aussage treffen zu können. Weitere Benchmarks sind Basic-Linear-Algebra-Subprogram (BLAS), Whetstone, Drystone und Powerstone. Letzterer ist geeignet um den Energieverbrauch von Mikrocontrollern zu vergleichen und stellt auch ein Benchmark-Suite dar.

# Grundlegende Prozessortechniken
## Definitionen

Eine Prozessorarchitektur, Befehlssatz-Architektur oder Programmiermodell beschreibt den von außen sichtbaren Teil des Prozessors.
Die Mikroarchitektur bezeichnet die Implementierung der Prozessorarchitektur.
Unter Prozessortechniken versteht man sowohl Prozessorarchitektur-, als auch Mikroarchitekturtechniken. In einer Prozessorfamilie haben alle Prozessoren die gleiche Basisarchitektur. Die Prozessorarchitektur kann aber von neueren Modellen erweitert werden.

## Prozessortechniken

Bei der Pipelineverarbeitung wird die Befehlsausführung in mehrere Unteraufgaben zerlegt. Die Ausführung mehrerer Befehle geschieht überlappt. Eine einfache Pipeline ist die DLX-Pipeline. Sie besteht aus den Stufen: Instruction Fetch, Instruction Decode, Execution, Memory Access, Write Back. Bei der parallelen Ausführung können Pipeline-Konflikte auftreten. Diese sind: Datenkonflikte, die aus Datenabhängigkeiten entstehen, Struktur- (Ressourcen-)konflikte, wenn eine Ressource von mehreren Pipeline-Stufen benötigt wird und Steuerflusskonflikte, wenn der als nächstes auszuführende Befehl nicht bekannt ist. Für die Konflikte bestehen Lösungsstrategien. Da die Pipelineverarbeitung eine Mikroarchitekturtechnik ist, muss sie der Außenwelt verborgen bleiben und daher die Konflikte in Hardware gelöst werden.
Um Datenkonflikte zu lösen kann man die Pipeline sperren (interlocking) oder leerlaufen (stalling) lassen. Um keine Takte zu verschwenden kann man aber auch bereits berechnete Ergebnisse, die bisher noch nicht in die Register zurückgeschrieben wurden, als Operanden bereitstellen (forwarding). Da dies nicht alle Konflikte löst, kann man es mit der Pipeline-Sperrung kombinieren (forwarding with interlocking).
Steuerflusskonflikte werden von Sprungbefehlen, Unterprogrammaufrufen und Unterbrechungen verursacht. Um sie zu lösen, kann man den Sprung verzögern oder das Ziel in einem Sprungzieladress-Cache (Branch Target Address Cache, BTAC) speichern. Um auch bedingte Sprungbefehle ohne Verzögerung ausführen zu können, ist eine statische oder dynamische Sprungvorhersage nötig. Strukturkonflikte lassen sich durch Vervielfachung der Ressource lösen. Bei Speicher erreicht man dies durch Multiport-Speicher. Ebenso ist es möglich manche Ressourcen funktional aufzuteilen. In der DLX-Pipeline treten keine Strukturkonflikte auf.
Von Mikrocontrollern werden oft einfache Prozessorkerne genutzt. Meist sind hier RISC-artige Kerne mit einer einfachen Pipeline (z.B. DLX) zu finden. Moderne Mikroprozessoren hingegen nutzen sehr lange Pipelines um eine hohe Taktrate zu erreichen. Außerdem wird die Superskalar oder VLIW-Technik eingesetzt, um Befehlsebenenparallelität auszunutzen. Die Threadparallelität kann durch mehrfädige oder multicore Prozessoren genutzt werden.

# Mikrocontroller
## Abgrenzung zu Mikroprozessoren

Mikrocontroller werden z. B. im Haushalt, im KFZ und in der Automatisierung eingesetzt. Sie zeichnen sich dadurch von den Mikroprozessoren ab, dass sie eine aufgabenspezifische Peripherie mit auf dem Chip haben. Das Ziel ist es, möglichst wenige externe Bauelemente zu benötigen.
Das Herzstück eines Mikrocontrollers ist der Prozessorkern. Dieser wird durch Schreib/Lesespeicher (RAM) und Festwertspeicher (xxROM) erweitert. Diese Basis kann durch diverse Schnittstellen und Erweiterungen zu einem Mikrocontroller ergänzt werden. Beim Prozessorkern werden oft einfache Kerne genutzt, da die Kosten eine wesentliche Rolle spielen. Neben speziell entwickelten Kernen werden auch ältere, schon als Mikroprozessoren bekannte Kerne genutzt. Diese zeichnen sich besonders durch die bewährte Technik, Kompatibilität und geringe Kosten aus. Durch Modifikationen wie Stromsparmodus und Entfernen von Cache und Speicherverwaltung werden sie dem Einsatzgebiet in Punkto Stromverbrauch und Echtzeitfähigkeit angepasst.
Der auf dem Chip integrierte Speicher nimmt sowohl Programme als auch Daten auf, wodurch sich externe Speicher oft erübrigen. Um während des Programmablaufs gewonnene Daten vor Spannungsausfall zu retten, war früher ein extern angeschlossenes, batteriegepuffertes RAM oder ein EEPROM nötig. Heutzutage (2013) dominiert bei Microcontrollern die Verwendung von Flash-Speicher als Programm- und Datenspeicher. Der Vorteil liegt unter anderem darin, dass das laufende Programm, zum Beispiel zur Sicherung von Mess- oder Konfigurationsdaten, einzelne Speicherbereiche im Flash löschen und neu beschreiben kann. Da das Neubeschreiben des Flash-Speichers im Gegensatz zum Lesen verschleißbehaftet ist, wird nur eine begrenzte Anzahl von Schreibzyklen garantiert (ca. 10 000 bis 1 Million). Trotzdem ist in den meisten Fällen durch die Wahl geeigneter Algorithmen eine zuverlässige Datensicherung möglich.
Inzwischen gibt es sogar Mikrocontroller mit internem ferroelektrischen RAM, das ähnlich dem Flash-Speicher nicht flüchtig ist, aber eine um mehrere Größenordnungen höhere Schreibzyklenzahl erlaubt. Der Nachteil ist jedoch, dass die Lesevorgänge destruktiv sind und deshalb der jeweilige Speicherinhalt nach dem Lesen wieder zurückgeschrieben werden muss, wodurch sich die Speicherzellen beim Schreiben und Lesen abnutzen. Für überwiegend ereignisgesteuerte Systeme, bei denen der Mikrocontroller sich die meiste Zeit im Ruhezustand befindet, also keinen Programmcode ausführt, kann ferroelektrisches RAM meistens ohne Einschränkung der Systemlebensdauer benutzt werden.
Die weiteren Komponenten sind sehr vielfältig. Im folgenden sollen einige aufgezählt werden:
* Serielle und parallele Ein-/Ausgabeeinheiten in allen Ausprägungen.
* AD/DA-Wandler als analoge Schnittstellen. Kritisch sind hier Auflösung und Wandlungszeit. AD-Wandler sind häufiger.
* Zähler und Zeitgeber sind insbesondere für Echtzeitanwendungen wichtig. Ihre Einsatzgebiete sind mannigfaltig, ebenso wie ihr Auftreten.
* Der Watchdog wird zur Überwachung des Systems eingesetzt und kann bei Programmabsturz das System zurücksetzen.
* Echtzeitkanäle sind eine Erweiterung der parallelen E/A-Kanäle. Durch die Kopplung des Kanals mit einem Zeitgeber lässt sich eine jitterfreie E/A erreichen.
* Unterbrechungen ermöglichen die Reaktion auf Ereignisse. Sie spielen bei Echtzeitanwendungen eine wichtige Rolle. Hier ist besonders die schnelle und vorhersagbare Reaktion nötig.
* Direct-Memory-Access (DMA)-Controller kümmern sich um den Datentransfer zwischen Peripherie und Speicher, ohne den Prozessorkern zu beanspruchen. Zudem wird durch spezielle Transferhardware eine höhere Datenrate erreicht. Man findet sie meist nur in Mikrocontrollern gehobener Leistungsklasse.
* Ein Ruhebetrieb (Standby Mode) wird eingesetzt, um den Energieverbrauch und die Wärmeemission einzuschränken. Es ist möglich, einzelne Komponenten abzuschalten bzw. den Speicher nur mit Erhaltungsspannung zu versorgen. Statische Prozessorkerne erlauben sogar eine Taktreduktion auf bis zu 0 Hz.
* Der Erweiterungsbus erlaubt es, externe Komponenten anzuschließen. Um die Anzahl der verwendeten Anschlüsse zu reduzieren wird oft Multiplexing und die stufenweise Reduktion des Adressraumes eingesetzt. Zudem werden die Anschlüsse oft mehrfach belegt. Bei Mikrocontrollern mit niedriger Anschlusszahl werden nur serielle Busse zur Verfügung gestellt, wie z. B. SPI oder USB.

## Anwendungsfelder

Mikrocontroller werden viel in der Automatisierungstechnik eingesetzt. Hier stellen sie eine lokale Intelligenz bereit und verursachen nur geringe Kosten. Ihre Hauptaufgaben sind hier die Prozesssteuerung und die Steuerung von Bedienelementen. Dazu sind große Schnittstellenvielfalt, gutes Echtzeitverhalten, hohe Zuverlässigkeit und geringer Energieverbrauch erforderlich.
Die Kerntätigkeiten der Prozessteuerung sind Messen, Stellen und Regeln. Beim Messen müssen die analogen oder digitalen Sensordaten in physikalisch aussagekräftige Werte umgewandelt werden. Dazu werden die Signale erfasst und in Bezug auf Messfehler (Nichtlinearität, Nullpunktfehler, Temperaturdrift) korrigiert. Die so gewonnenen Werte können ausgewertet und weitergeleitet werden. Das Stellen bezeichnet den umgekehrten Fall. Auch hier müssen Nichtlinearitäten etc. ausgeglichen und die Werte ausgegeben werden. Da der Wert der physikalischen Ausgangsgröße eines Aktors oft nicht nur von der Eingangsgröße abhängt, sondern auch von Störungen beeinflusst wird, ist reines Stellen oft nicht ausreichend. In einem solchen Fall muss geregelt werden. Das Regeln beschreibt einen Kreislauf aus dem Messen des Istwertes, einem Soll-/Istvergleich, dem Berechnen einer Stellgröße über einen Regelalgorithmus und dem Stellen dieser Größe. Über den Aktor und Sensor wird der Istwert beeinflusst. Damit ist der Kreis geschlossen.

## Leistungsklassen und Familien

Die Leistungsklasse eines Mikrocontrollers wird durch den Prozessorkern bestimmt. Wesentliches Unterscheidungsmerkmal ist hier die Datenbusbreite, sie kann 8, 16 oder 32 Bit betragen. Innerhalb einer Familie ist der Prozessorkern der gleiche. Familienmitglieder unterscheiden sich aber in ihrem Speicher und der Peripherie. So kann ein optimal zur Anwendung passendes Modell gewählt werden.
Beispiele für Mikrocontrollerfamilien:
* ARM Cortex-M (verschiedene Hersteller, 16/32 Bit)
* AVR (Atmel, 8 Bit)
* C166 (Infineon, 16 Bit)
* C500 (Infineon, 8 Bit)
* K0S (NEC, 8 Bit)
* K4 (NEC, 16 Bit)
* MC68HC11 (Motorola, 8 Bit)
* MC68HC16 (Motorola, 16 Bit)
* MC683XX (Motorola, 32 Bit)
* MSC251 (Intel, 8 Bit)
* MSC296 (Intel, 16 Bit)
* MSP430 (Texas Instruments, 16 Bit)
* PXA (Intel, 32 Bit)
* TriCore (Infineon, 32 Bit)
* V850E (NEC, 32 Bit)

## Auswahlkriterien

Um einen Mikrocontroller für eine Anwendung auszuwählen muss zunächst die Aufgabenstellung geklärt werden. Diese kann z. B. messen, steuern, regeln, überwachen, etc. sein. Auf dieser Grundlage wählt man die Leistungsmerkmale des Prozessorkerns. Diese wären: CISC oder RISC Architektur, Von-Neumann oder Harvard-Architektur, die Datenbusbreite und der verfügbare Adressraum. Darauf aufbauend kann man die Architekturmerkmale des Prozessorkerns genauer spezifizieren. Speziell sollte man auf die verfügbaren Befehlsarten, Adressierungsarten und Datenformate achten. Neben dem Prozessorkern muss auch der Speicher festgelegt werden. Man achtet auf Speichergröße, Erweiterungsmöglichkeit und Speichertyp. Nun kann die nötige Peripherie aus dem umfangreichen Sortiment gewählt werden. Je nach Anwendung ist auch auf die Ereignisbehandlung zu berücksichtigen. Darunter fällt die Anzahl der Unterbrechungseingänge, die Prioritäten-Steuerung der Unterbrechungen, sowie die Reaktionszeit auf Unterbrechungen. Weitere allgemeine Merkmale eines Mikrocontrollers sind die Ausführungsdauer eines Befehls, der Energiebedarf, die Abwärme sowie die Möglichkeit zum Anschluss von langsamer Peripherie. Außerdem spielen ökonomische Kriterien eine Rolle, wie Preis, Verfügbarkeit, Produktpflege und Kundenunterstützung.

## Softwareentwicklung

Die Softwareentwicklung für Mikrocontrollersysteme erfolgt in der Regel über „Cross-Development“. Das heißt die Software wird auf einem PC-System entwickelt und dann auf den Mikrocontroller geladen und getestet. Dadurch ist es möglich eine ähnliche Entwicklungsumgebung wie bei der Softwareentwicklung für PC-Systeme bereitzustellen.
Da die Kerne der Mikrocontroller meist nicht besonders leistungsfähig sind und oft zeitkritische Passagen auftreten, wurde früher Assembler zur Programmierung eingesetzt. Zur Produktivitätssteigerung setzt man heute oft C ein und benutzt Assembler nur noch für die zeitkritischen Teile. Bei leistungsfähigeren Modellen wird auch C++ angewandt, allerdings benötigt dies mehr Ressourcen und erzeugt eine größere Dynamik im Speicher. Java ist in der Regel zu Ressourcen-intensiv aufgrund von „Garbage Collection“ und Interpreter. Spezielle Kerne können aber auch Java effizient ausführen. Dazu später mehr.
Ein wesentliches Kriterium bei der Programmierung von Mikrocontrollern ist der Speicherbedarf, der auf modernen PCs nur eine untergeordnete Rolle spielt. Doch bei Mikrocontrollern ist der Speicher knapp bemessen. Daher wird beim Übersetzten meist auf Speicherbedarf und nicht auf Geschwindigkeit optimiert. Hier finden oft speichersparende Algorithmen Anwendung, wie sie vor vielen Jahren für PCs entwickelt wurden.
Bei PCs ist es aufgrund von Multitasking nötig, Programme im Speicher verschieben zu können. Da alle Aufgaben eines Mikrocontrollers vorab bekannt sind, ist das hier nicht nötig. Daher werden die Speicheradressen bereits beim Binden festgelegt. Sie müssen vom „Locator“ an die „Memory Map“ angepasst werden, also das Programm in den Festwertspeicher, die Daten in den Schreiblesespeicher und Vektoren an die dafür vorgesehene Stelle.
Um das Programm zu testen, existieren mehrere Möglichkeiten:
* Simulation auf der Entwicklungsplattform
    Dies lässt sich recht schnell und einfach ausführen, stellt aber nur einen groben Test dar, da das Zeitverhalten anders ist und die Peripherie nicht vorhanden ist.
* Zielsystem mit Monitor
    Hierzu wird das Zielsystem um spezielle Hardware erweitert, welche Testinformationen an den Entwicklungsrechner sendet und es erlaubt, den Programmverlauf zu verfolgen. Dieses Verfahren ist näher am Zielsystem, aber der Monitor greift in das Zielsystem ein, so dass das Systemverhalten verändert wird.
* Zielsystem ohne Monitor
    Auf diese Weise hat man das reine Zielsystem und ein korrektes Systemverhalten, allerdings stellt sich der Test schwer dar, da keine Debuginformationen übermittelt werden und die Ladezeiten recht lang sein können.
* Zielsystem mit Emulator
    Der Emulator ersetzt während der Entwicklungsphase den im Zielsystem eingebauten Mikrocontroller und erlaubt eine vollständige Kontrolle des Programmablaufs durch das Entwicklungssystem. Der Debugger läuft auf der Entwicklungsplattform, kann aber durch Hardware- und Software-Breakpoints das Programm im Emulator und damit im Zielsystem so steuern, dass Echtzeitbetrieb möglich ist.
* Zielsystem mit On-Chip-Debugger
    In diesem Fall ist auf dem Mikrocontroller schon eine Debug-Schnittstelle integriert, die über einen, im Vergleich zum Emulator, relativ einfachen Adapter mit dem Entwicklungssystem verbunden wird. Die Arbeitsweise ist ähnlich wie bei Benutzung eines Emulators, nur sind die Anschaffungskosten der benötigten Hard- und Software wesentlich niedriger. Häufig subventionieren Hersteller von Mikrocontrollern die benötigten Hilfsmittel sogar so stark, dass selbst Studenten sich die Anschaffung eines komfortablen Entwicklungsstems für Mikrocontroller leisten können.

## Forschungstrends
### System-on-Chip

Immer feinere Strukturbreiten und gleichzeitig größere Chipflächen bevorzugen den Trend, immer mehr Komponenten auf einem Chip unterzubringen. Die konsequente Weiterführung der Mikrocontroller-Idee sind Systems-on-Chip (SoC). Das Ziel ist es hier ein komplettes System auf nur einem Chip unterzubringen.
Die dadurch entstehende Komplexität ist schwer handhabbar. Daher werden Methoden erforscht, um SoC systematisch zu entwickeln. Oft müssen sowohl analoge als auch digitale Komponenten auf einem Chip integriert werden. All diese Komponenten müssen dann entwickelt, integriert und getestet werden. Die heute vorhandenen Hardwarebeschreibungssprachen wie VHDL und Verilog arbeiten auf niedriger Ebene im Vergleich zu Software-Hochsprachen. Daher versucht man die Erkenntnisse aus der Softwareentwicklung auf die Hardwareentwicklung zu übertragen. Man führt bekannte Methoden wie Objektorientierung, Vererbung und Wiederverwendung für neue Hardware-Hochsprachen ein. Beispiele dafür sind: SystemC, SuperLog oder CynApps. Ersteres ist an C++ angelehnt und gewährleistet so eine schnelle Umstellung des Benutzers. Aber auch Software, sowohl Werkzeuge als auch Code kann leicht angepasst werden.
Eine weitere Methode um die Komplexität zu beherrschen ist die Verwendung von Hardware-Bibliotheken. Als eine solche existieren bereits einige Prozessorkerne. Diese können mit eigenen Entwicklungen kombiniert werden. Allerdings sind FPGAs gegenüber ASICs problematisch, da ihre Logikdichte oft nur ausreicht um kleine Kerne aufzunehmen.
Daher entstehen rekonfigurierbare SoC. Diese bestehen aus einem Prozessorkern, Speicher und einem FPGA. So erreicht man einen hohen Integrationsgrad für Kern und Speicher und kann im FPGA Anwendungsspezifisches unterbringen. Es gibt drei Typen von rekonfigurierbaren SoC.
* Statisch rekonfigurierbar:
    Die Rekonfiguration benötigt eine längere Zeit. Der SoC wird nur einmal konfiguriert.
* Semi-statisch rekonfigurierbar:
    Die Rekonfiguration ist im Millisekundenbereich durchführbar. Dadurch ist es möglich den SoC zur Laufzeit zu rekonfigurieren und den FPGA so für unterschiedliche Zwecke einzusetzen. Rekonfiguration erfolgt während der Bearbeitung einer Aufgabe in Software.
* Dynamisch rekonfigurierbar:
    Die Rekonfiguration ist im Mikrosekundenbereich durchführbar. So kann der SoC sehr feinkörnig während der Ausführung von Kerninstruktionen rekonfiguriert werden.
Eine weitere Möglichkeit, die verfügbaren Transistoren zu nutzen, ist die Integration von heterogenen Prozessorkernen auf einem Chip. Der TriCore von Infineon bildet einen ersten Schritt in diese Richtung. Er integriert eine MAC Einheit mit einem Mikrocontroller. Die Kombination eines vollständigen Signalprozessors mit einem Mikrocontroller stellt aber eine Herausforderung dar, da die Prozessorarchitektur stark voneinander abweicht.

### Energiespar-Techniken

Der Energieverbrauch von Mikrocontrollern wird reduziert, um die Versorgung über eine Batterie zu ermöglichen und die Wärmeabgabe zu verringern. Dies kann durch verschiedene Ansätze erreicht werden:
* Verringerung der Taktfrequenz
    Bei den häufig eingesetzten CMOS Schaltungen ist der Energieverbrauch proportional zur Taktfrequenz. Allerdings wird mit geringerer Taktrate auch die Verarbeitungsgeschwindigkeit reduziert.
* Verringerung der Versorgungsspannung
    Der Energieverbrauch ist nach dem ohmschen Gesetz proportional zum Quadrat der Spannung. Dies birgt ein großes Einsparpotenzial. Die Versorgungsspannung kann aber nicht beliebig verringert werden, weil die Schaltung dann nicht mehr schnell genug ist.
* Gleichzeitige Verringerung der Taktfrequenz und Versorgungsspannung
    Frequenz und Mindestspannung verhalten sich proportional. Daraus ergibt sich die Kubus-Regel:
    $E\propto f*V^{2}\propto f^{3}\propto V^{3}$
    Die Forschung bemüht sich Methoden zu finden um die Taktfrequenz an die Anwendung anzupassen. Bei Echtzeitsystemen kann etwa die verfügbare Laxheit (Laxity) zur Optimierung genutzt werden.
* Optimierung der Mikroarchitektur
    Es werden aber auch Ansätze gesucht, die die Geschwindigkeit des Systems nicht beeinflussen. Hierzu sind Optimierungen in der Mikroarchitektur geeignet. Man erreicht eine Reduktion der externen Busaktivitäten durch Verwendung einer Load/Store-Architektur und durch Unterstützung schmaler Datentypen. Außerdem kann ein statisches Power Management eingeführt werden. Durch spezielle Instruktionen können dann gerade nicht genutzte Komponenten abgeschaltet bzw. in einen Schlafzustand versetzt werden. Mit einem rein statischen Prozessorkern ist eine Reduktion des Taktes bis auf 0Hz möglich. Bei dynamischem Power Management werden nicht benötigte Komponenten automatisch abgeschaltet. Dies zielt vor allem auf kleinere Granulatität wie Pipelinestufen oder Teile der ALU. Ebenso ist eine Erhöhung der Code-Dichte möglich, so wird Speicher und Buszyklen gespart.
Da die Zusammenhänge zwischen Architektur und Energiebedarf sehr komplex sind, ist es wünschenswert, frühestmöglich in der Entwicklung eine Energieabschätzung vornehmen zu können. Heute wird dies auf Grundlage der Register-Transfer- und der Gatter-Ebene vorgenommen. Zukünftig sollen aber auch Abschätzungen auf der Mikroarchitekturebene möglich sein. Dies könnte durch die Kombination von Mikroarchitektursimulatoren mit Energiemodellen verwirklicht werden.

### Java für eingebettete Systeme

Java bietet viele Vorteile, die auch für eingebettete Systeme wichtig sind:
* Einfache Programmierung
* Wiederverwendbarkeit
* Robustheit
* Umfangreiche Standard-Bibliothek
* Portabler Bytecode
* Kompakter Bytecode
* Sicherer Bytecode
Daher existieren bereits Pakete um Java für den Betrieb in eingebetteten Systemen zu erleichtern. Problematisch stellt sich die Verwendung von Java aber in Echtzeitsystemen dar. Java ist nicht dafür ausgelegt und enthält daher keinerlei Echtzeit-Elemente. Zusätzlich wirft die Garbage Collection Probleme auf, da sie unvorhersagbare Verzögerungen verursacht.
Um die Probleme zu umgehen kann man Hybride Systeme einsetzten. Diese sind eine Kombination eines Echtzeitsystems mit Java. Dabei wird Java nur für nicht-Echtzeit Aufgaben eingesetzt. Will man Java auch für den Echtzeitteil verwenden, so muss die Sprache um Fähigkeiten wie Echtzeit-Threads, Synchronisationsmechanismen und Speicherbereinigungstechniken erweitert werden. Um das Programm auszuführen hat man die Wahl zwischen:
* echtzeitähige VM
    interpretiert Bytecode und bietet zusätzliche Funktionen für Echtzeitsysteme wie etwa garantierte Ausführungszeiten. Die Ausführungsgeschwindigkeit ist aber vergleichsweise gering aufgrund der Interpretation.
* nativer Compiler
    Durch das Übersetzen des Bytecodes in Maschinencode kann die Geschwindigkeit erhöht werden, allerdings gehen die Vorteile des Bytecode, wie Portabilität und Sicherheit verloren. Das dynamische Laden von Klassen ist nicht mehr möglich.
* JIT- oder Flash-Compiler
    Hier wird der Code auf der Zielplattform übersetzt, so dass der Speicherbedarf enorm wächst. Außerdem erzeugt der JIT-Compiler ein schlechtes Verhältnis von Best- zu Worstcase Ausführungszeiten.
* Java Prozessor
    führen Bytecode direkt in Hardware aus. Die Mikroarchitektur ist optimiert auf spezielle Java-Eigenschaften wie Stackbasiertheit und Garbage Collection. So wird eine hohe Verarbeitungsgeschwindigkeit erreicht.

# Beispiele verschiedener Mikrocontroller
## Atmel AVR

Atmel hat eine Reihe von Mikrocontrollern in seiner Produktpalette. Besonders interessant sind die 8 Bit Prozessoren der AVR Familie. Unter diesen befinden sich kleinst Mikrocontroller wie der ATTiny2313 aber auch Mikrocontroller für etwas größere Aufgabenstellungen wie der ATMega64 oder der ATMega128. Mit dem kostenlosen AVR Studio bietet Atmel eine Programmierumgebung die den Einstieg in die Entwicklung auch für nicht zahlungskräftige Personen gestattet. Hierbei ist besonders zu hervorzuheben, dass sich der unter der GNU Lizenz freigegebene C-Compiler AVRGCC in die IDE von AVR Studio einbinden lässt. Dies gestattet die Softwareentwicklung in C und sogar das debuggen des Quelltextes direkt aus dem AVR Studio heraus.

# Superskalartechnik

Superskalarität ist eine Form der Parallelisierung der Befehlsausführung. Superskalare Prozessoren erweitern das Pipelining-Konzept durch den Einsatz mehrerer Ausführungseinheiten oder ALUs. Dabei findet eine dynamische Zuteilung der Ressourcen durch den sogenannten Dispatcher und nicht durch den Compiler statt. Dieser muss alle Datenabhängigkeiten berücksichtigen und ist dementsprechend komplex, besonders wenn die Anzahl der Ausführungseinheiten steigt.
Der Vorteil einer solchen Architektur besteht in einer verbesserten Befehlsausführungsrate bei gleichbleibendem Befehlssatz.
In der Praxis verhindern jedoch oft Datenabhängigkeiten oder Ressourcenabhängigkeiten eine gute Ausnutzung der Hardware, was ein prozessorspezifischer optimierender Compiler verhindern oder zumindest eindämmen kann.
Superskalartechnik kommt bei vielen modernen CPUs zum Einsatz.