4.3 Interrupt-Controller 4.5 Zeitgeber-/Zähler-Bausteine  

4.4 Direkter Speicherzugriff

4.4.1 Einleitung

Die Operanden, die von der CPU verarbeitet werden sollen, werden in aller Regel im Arbeitsspeicher des Systems erwartet. Kapitel II.2 beschäftigt sich intensiv mit dem Aufbau und der Organisation des Speichers. In diesem Abschnitt müssen wir nun klären, wie die Operanden auf möglichst effektive Weise in den Arbeitsspeicher bzw. von dort zu den Schnittstellen und den Peripheriegeräten transportiert werden können.
Bei den ersten Mikrorechner-Systemen, aber auch bei heutigen Minimalsystemen wird der Datentransport zwischen den Ein-/Ausgabe-Schnittstellen und dem Arbeitsspeicher vom µP selbst vorgenommen. Dies ist im Bild 4.4-1 am Beispiel einer Datenübertragung aus dem Speicher zu einer Schnittstelle schematisch dargestellt.

Bild 4.4-1: Datenübertragung vom Speicher zu einer E/A-Schnittstelle


Der Übertragungsvorgang beginnt damit, daß der µP bei der Abarbeitung eines Programms den Speicher adressiert und ihm den Ladebefehl entnimmt (Bild 4.4-1a). Im Ladebefehl wird die Berechnung der effektiven Adresse des Datums spezifiziert. Diese Adreßberechnung bedingt gegebenenfalls weitere Speicherzugriffe, die der Einfachheit halber hier nicht betrachtet werden sollen. Die effektive Adresse wird dann zum Speicher ausgegeben und von dort das Datum in ein Register der CPU geladen (Bild 4.4-1b). Nun entnimmt der µP dem Speicher unter der nächsten Speicheradresse den Schreibbefehl (Bild 4.4-1c). Es folgt die Bestimmung der Schnittstellenadresse. Der nächste Systembuszugriff dient dann der Übertragung des Datums zur Schnittstelle (Bild 4.4-1d).
Der gleiche Ablauf des dargestellten Datentransfers ergibt sich natürlich, wenn man als Ziel des Transportes nicht eine Schnittstelle, sondern einen anderen Bereich des Speichers wählt. Außerdem ist als Quelle und Ziel des Datentransfers je eine Schnittstelle möglich. Insgesamt ergeben sich damit die folgenden drei Übertragungsmöglichkeiten, die jeweils in beiden Richtungen möglich sind: Man erkennt, daß bei der Datenübertragung durch die CPU wenigstens vier Speicherzugriffe nötig sind; und das sogar unter den gemachten "idealen" Voraussetzung, daß sowohl das Holen als auch die Ausführung jedes Befehls nur jeweils genau einen Speicherzugriff erfordern.
Im Bild 4.4-1 ist am linken Rand die Befehlsfolge, die die Ausführung der Datenübertragung veranlaßt, im Assemblercode notiert. Sehr häufig müssen jedoch nicht einzelne Daten, sondern große Datenblöcke zwischen dem Speicher und der Peripherie (bzw. einem anderen Speicherbereich) transportiert werden, wie das im Bild 4.4-1 durch die Programmschleife angedeutet wird. Zu den Lade- und Speicherbefehlen kommen dann noch der Befehl zum In- bzw. Dekrementieren des Schleifenzählers und zur Abfrage der Ende-Bedingung, so daß sich als Minimum sechs Speicherzugriffe für die Übertragung eines einzigen Datums ergeben. Selbst bei sehr kleinen Speicherzugriffszeiten ist die so zu erreichende Übertragungsrate für viele Anwendungen bei weitem nicht ausreichend, insbesondere nicht für die Übertragung von Daten zu schnellen Festplatten oder Anschlüssen zu lokalen Netzen.
Ein weiterer Nachteil der beschriebenen Datenübertragung ergibt sich daraus, daß während der Übertragung des Datenblockes die CPU blockiert ist. Häufig müssen jedoch Daten übertragen werden, die augenblicklich für die CPU keine Bedeutung (mehr) besitzen. Dazu zählen z.B. Rechenergebnisse, die zu einer Festplatte oder über einen Drucker ausgegeben werden sollen. In diesem Fall muß die CPU ihre eigentliche Aufgabe unterbrechen (Interrupt) und ihren augenblicklichen Zustand auf den Stack retten. Erst nach der Übertragung der Daten kann sie ihre Arbeit fortsetzen.
Dies führt insbesondere bei relativ langsamen Peripheriegeräten zu einer unvertretbar großen Verzögerung. Denn in diesem Fall muß die CPU entweder die Zeit zwischen der Übertragung zweier Daten unbeschäftigt (idle) verstreichen lassen, oder aber sie wird für jedes Datum erneut durch eine Interruptanforderung aus ihrer aktuellen Arbeit "gerissen" - verbunden mit der jeweils notwendigen Rettung bzw. Restaurierung ihres Zustandes.
Aus den eben beschriebenen Gründen wurden schon relativ früh Spezialbausteine entwickelt, die die CPU von der zeitraubenden und einfachen Aufgabe der Datenübertragung zwischen dem Speicher und den Peripheriebausteinen (bzw. dem Speicher selbst) entlasten. Diese mikroprogrammierten Bausteine führen die Datenübertragung hardwaremäßig, also ohne die sequentielle Abarbeitung eines im Arbeitsspeicher liegenden Programms und daher sehr viel schneller als der µP aus. Sie werden nach dem im folgenden beschriebenen Verfahren der Datenübertragung DMA-Controller genannt.
Im Laufe der Zeit haben die DMA-Controller dann immer komplexere Funktionen bei der Kommunikation des µPs mit der Peripherie übernommen, so daß sie heute oft in der Form eines DMA-Coprozessors mit flexibler Programmierfähigkeit realisiert werden. Eine andere Entwicklungsrichtung besteht darin, daß viele der modernen Peripheriebausteine die Fähigkeit bekommen haben, selbständig auf den Speicher zuzugreifen und sich von dort ihre Daten zu holen bzw. dort abzulegen. Aber auch in den µPs selbst - insbesondere den Mikrocontrollern und DSPs - werden heutzutage sehr häufig DMA-Schaltungen, sogenannte DMA-Kanäle, integriert.

4.4.2 Das Prinzip des direkten Speicherzugriffs

Das angesprochene Verfahren wird als direkter Speicherzugriff (Direct Memory Access - DMA) bezeichnet. Gemeint ist dabei ein Speicherzugriff einer Systemkomponente ohne Einsatz des µPs. Das Bild 4.4-2 skizziert das Prinzip des DMA-Zugriffs.
Zu Beginn einer Datenübertragung wird der DMA-Controller von der CPU mit den benötigten Informationen zur Datenübertragung versorgt (s. Bild 4.4-2a). Diese Informationsübertragung wird "Programmierung" des Controllers genannt. Dazu wird er, wie jeder andere Peripheriebaustein, über den Adreßbus unter festgelegten Adressen angesprochen. Diese Informationen bestehen aus:

Bild 4.4-2: Das Prinzip des direkten Speicherzugriffs


Die Datenübertragung selbst wird nun selbständig vom DMA-Controller vorgenommen. Während der Übertragung kann der µP intern weitere Befehle abarbeiten. Natürlich darf er nicht gleichzeitig mit dem DMA-Baustein auf den Systembus zugreifen. Der Vermeidung von Zugriffskonflikten dienen die Steuerleitungen HOLD/HOLDA, die im Abschnitt 2.1 beschrieben wurden.
Zur Übertragung durch den DMA-Controller können zwei verschiedene Verfahren angewandt werden. Diese werden nun beispielsweise für die Datenübertragung vom Speicher zu einer Schnittstelle erklärt. (Die Übertragung in die andere Richtung verläuft sinngemäß.) Neben der eben beschriebenen physischen Übertragung von Daten zwischen einer Quelle und einem Ziel ermöglichen es einige DMA-Bausteine auch, nur die Adressen einer programmierten Blockübertragung auszugeben, ohne die Daten selbst zu übertragen. Diese Betriebsart kann zur Überprüfung der programmierten Blockparameter - Adressen und Datenblock-Länge - dienen (Verify Mode).

4.4.3 Der Aufbau eines DMA-Controllers

Im Bild 4.4-3 ist der Aufbau eines DMA-Controllers skizziert. Er besteht aus dem Steuerwerk und der Ausführungseinheit.

Bild 4.4-3: Prinzipieller Aufbau eines DMA-Controllers


4.4.3.1  Das Steuerwerk

Die Steuerung kontrolliert alle Komponenten des Bausteins. Dazu erzeugt sie alle benötigten Takt- und Auswahlsignale. Sie ist über die im Abschnitt 4.1.6 beschriebenen Ein- oder Ausgangsleitungen mit dem µP verbunden. Zu ihnen kommen hier noch die im Kurs 1707 beschriebenen Signale: Zu den bisher besprochenen Steuersignalen, die hauptsächlich zur Kommunikation mit dem µP dienen, kommen noch drei weitere Leitungen, die zum Informationsaustausch mit den Peripheriebausteinen benutzt werden: Obwohl eben vereinfachend nur von Peripheriebausteinen als Anforderer (Requester) gesprochen wurde, kann natürlich auch der µP selbst über den REQ-Eingang eine Übertragungsanforderung stellen. In diesem Fall wird der -Ausgang häufig mit dem -Eingang des Prozessors verbunden, so daß dieser durch einen Interrupt über das Ende der Datenübertragung informiert werden kann. Der Vollständigkeit halber sei schon hier erwähnt, daß die Systemkomponente, mit der der Requester Daten austauschen will, im Englischen häufig Target genannt wird. (Die deutsche Übersetzung "Ziel" darf jedoch nicht zu dem Trugschluß führen, daß damit etwas über die Richtung des Datentransports ausgesagt ist.)
Zur Programmierung des DMA-Controllers und zur Überwachung seiner Arbeit durch den µP dienen drei Register des Steuerwerks, die direkt mit der Steuerung des Bausteins verbunden sind. Von ihnen werden zwei vom Prozessor beschrieben und beeinflussen die Arbeitsweise der Bausteinsteuerung: das Steuerregister und das Befehlsregister. Das Statusregister hingegen wird von der Steuerung selbst verändert und dient dazu, dem Prozessor Informationen über die ausgeführte Datenübertragung zukommen zu lassen. Die Funktion der Register werden wir erst nach der vollständigen Beschreibung des Bausteinaufbaus genauer darstellen.

4.4.3.2  Die Ausführungseinheit Die Ausführungseinheit besteht im wesentlichen aus drei Zählern, die vom µP vor dem Beginn einer Datenübertragung geladen werden. Der den Adreßzählern nachgeschaltete Multiplexer (MUX) schaltet bei einer Datenübertragung in zwei Speicherzyklen zunächst den Adreßzähler der Datenquelle auf den Adreßbus. Dabei wird durch das R/-Signal der Quelle ein Lesezyklus angezeigt. Das Datum wird dann zunächst in den Datenbuspuffer des DMA-Bausteins übertragen. Danach schaltet der Multiplexer den Adreßzähler des Zielbereiches auf den Adreßbus, wobei das R/-Signal einen Schreibzyklus anzeigt. Der Inhalt des Datenbuspuffers wird zum Ziel des Transportes ausgegeben. Bei Mikroprozessoren, die ihre Peripheriebausteine in einem besonderen I/O-Adreßraum ansprechen, wird anstelle des R/-Signals das IOR/-Signal (I/O Read - I/O Write) aktiviert, wenn ein Peripheriebaustein selektiert wird.
Bei einer Übertragung in einem Speicherzyklus (Fly-by Transfer), bei der die Aufforderung zur Datenübertragung ja stets von einer Schnittstelle (als Requester) kommt, wird durch den Multiplexer der Adreßzähler auf den Adreßbus gelegt, der dem Datenbereich im Speicher (als Target) zugeordnet ist, also je nach Übertragungsrichtung der Zähler des Quell- oder Zielbereiches. Die "Adressierung" der Schnittstelle geschieht in diesem Fall ausschließlich durch die ACK-Leitung. Das Datum wird direkt von der Quelle zum Ziel übertragen. Bei dieser Übertragungsart hat das Signal der R/-Leitung für Target und Requester eine gegensätzliche Bedeutung: Ein Lesezugriff auf den Speicher muß bei der Schnittstelle einen Schreibvorgang verursachen, ein Schreibzugriff auf den Speicher dem entsprechend einen Lesezugriff auf die Schnittstelle.

Varianten

4.4.4 Verschiedene DMA-Übertragungsarten

In der Regel kann man bei einem DMA-Baustein unter verschiedenen Übertragungsarten wählen, die sich durch die Belegung des Systembusses unterscheiden.

4.4.5 Unterschiedliche Datenbreite in Target und Requester

Bisher haben wir sehr vage von der Übertragung eines Datums gesprochen. Sie wissen aber schon, daß ein Datum in einem Mikrorechner-System eine sehr unterschiedliche Länge haben kann. So sind die zwischen Hauptspeicher und Prozessor übertragenen Daten moderner Mikrorechner-Systeme in der Regel 16, 32 oder 64 bit breit (im Extremfall sogar 128 bit). Aber auch in diesen Systemen sind die Daten, die von bzw. zu den Schnittstellen geliefert werden, häufig nur 8 bit breit. Insbesondere alle zeichenorientierten Peripheriegeräte, wie Drucker, Bildschirme, Scanner etc. benutzen meist diese byte-orientierten Schnittstellen. Ein weiteres Problem tritt auf, wenn die Adresse eines Datums nicht mit einer Wortgrenze im Speicher übereinstimmt, so daß zum Lesen des Datums mehrere Speicherzugriffe nötig werden (non-aligned Data). Den unterschiedlichen Datenwortbreiten muß die Arbeit des DMA-Controllers durch verschiedene Maßnahmen angepaßt werden. Dazu gehören: Im Fly-by-Betrieb müssen Requester und Target natürlich die gleiche Datenbusbreite besitzen, da hier eine Anpassung im Datenbuspuffer des DMA-Bausteins nicht durchgeführt werden kann.

4.4.5.1  Erweiterung des Grundmodells eines DMA-Bausteins

Heutige DMA-Controller enthalten auf dem Baustein in der Regel nicht nur einen, sondern 2 bis 8 DMA-Kanäle. Jeder Kanal kann unabhängig von den anderen einem Requester zugeordnet werden, mit dem er über eigene Leitungen (REQi, ACKi, ) kommuniziert. Durch eine spezielle Prioritätsschaltung (Channel Priority Arbitration) wird entschieden, welcher Kanal augenblicklich den Zugriff zum Systembus zugeteilt bekommt. Das ist dann wichtig, wenn entweder zwei oder mehr Kanäle gleichzeitig mit der Datenübertragung beginnen wollen oder aber während der laufenden Übertragung eines Kanals ein zweiter damit beginnen will. Wir wollen auf diese Prioritätenvergabe nicht näher eingehen.

4.4.6 Die Register des Steuerwerks

Zum Abschluß dieses Abschnittes wollen wir nun kurz die Register im Steuerwerk des DMA-Bausteins beschreiben. Dabei können wir nur auf die wichtigsten Register eingehen. Moderne DMA-Controller besitzen darüber hinaus eine große Anzahl weiterer spezieller Register. Wir legen beispielhaft einen Controller mit vier DMA-Kanälen zugrunde. Im Bild 4.4-7 ist ein möglicher Aufbau der drei Registertypen dargestellt. Bei diesem Baustein sind die Adreßzähler fest den Kommunikationspartnern Target und Requester zugeordnet. Für andere Bausteine müssen im folgenden diese Begriffe sinngemäß durch die Begriffe Ziel- bzw. Quellbereich der Datenübertragung ersetzt werden.

Bild 4.4-7: Die Register des DMA-Steuerwerks


Das Statusregister
Das Statusregister zeigt für jeden Kanal durch ein Bitpaar an, ob für diesen Kanal eine Übertragungsanforderung vorliegt (Bit Ri - Request) bzw. ob der Datenzähler des Kanals den Endwert 0 erreicht hat (Bit TCi Terminal Count).

Das Befehlsregister
Das Befehlsregister enthält alle Bits, durch die die Arbeitsweise des Bausteins für jede Blockübertragung bestimmt wird. Dazu gehören die gezielte Aktivierung bzw. Deaktivierung jedes einzelnen der Kanäle (Bit Ei - Enable) sowie die Festlegung der Prioritäten zwischen den Kanälen (Bits Pj...P0- Priority). Durch das Setzen der Bits SRi (Software Request) kann der Prozessor softwaremäßig für jeden einzelnen Kanal eine DMA-Übertragung anfordern - als Alternative zur DMA-Auslösung über die REQ-Leitung. Über die Bits IEi (Interrupt Enable) kann für jeden Kanal festgelegt werden, ob seine Unterbrechungsanforderung zum Prozessor weitergereicht werden soll oder nicht.

Das Steuerregister
Für jeden Kanal ist ein eigenes Steuerregister vorhanden, das die Betriebsart des Kanals bestimmt (Channel Control Register). Die Bits des Registers haben die folgende Funktion: Die restlichen Bits unterscheiden sich im ersten Buchstaben ihrer Bezeichnung. T steht darin für den Target, R für den Requester. Sie werden hier gemeinsam für beide Komponenten R/T erklärt, wobei im folgenden für das Zeichen '*' einer der Buchstaben R bzw. T einzusetzen ist.
  4.3 Interrupt-Controller 4.5 Zeitgeber-/Zähler-Bausteine