| 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:

- Speicher --> Speicher,
- Speicher --> Schnittstelle,
- Schnittstelle --> Schnittstelle.

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:

- Startadresse eines Datenbereiches im Speicher,
- Adresse einer Schnittstelle bzw. Startadresse eines zweiten Datenbereiches im Speicher,
- Anzahl der zu übertragenden Daten,
- Richtung der Datenübertragung (Lesen/Schreiben),
- Informationen zur Steuerung der Übertragung.

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äß.)

- Beim ersten Verfahren adressiert der DMA-Baustein zunächst den Speicher und lädt das Datum in ein internes Register (Fetch Cycle, Bild 4.4-2b). Danach spricht er den Peripheriebaustein (E/A) an und überträgt ihm das Datum (Store Cycle, Bild 4.4-2c). Bei einer Speicher-Speicher-Übertragung adressiert er dazu eine bestimmte Speicherzelle im Zielbereich des Speichers. Insgesamt sind also nur zwei Buszugriffe für den Datentransfer nötig. Dieses Verfahren wird im englischen Sprachgebrauch entweder als Explicit Addressing, Flow Through oder sinnfälliger als Two Cycle Transfer bezeichnet.
  Nach jeder Übertragung dekrementiert der DMA-Baustein automatisch einen Datenzähler, in dem zu Beginn die Anzahl der zu übertragenden Daten geschrieben wurde, und stellt an ihm fest, ob weitere Daten übertragen werden müssen. Falls dies der Fall ist, wird die Adresse, die auf den Quelldatenbereich zeigt, erhöht und das Datum aus der nächsten Speicherzelle übertragen.
- Beim zweiten Verfahren, das im Bild 4.4-2d skizziert ist, wird der Umweg des Datums über das interne Pufferregister im DMA-Baustein vermieden. Der DMA-Controller legt nur die Adresse des Operanden an den Speicher. Gleichzeitig selektiert er die Schnittstelle. Das Datum kann nun direkt aus dem Speicher in die Schnittstelle gelangen. Für jeden Datentransfer ist also nur ein Buszugriff nötig. Dieses Verfahren kann jedoch nicht für einen Speicher-Speicher-Transfer benutzt werden, da nicht zwei Adressen gleichzeitig auf den Adreßbus ausgegeben werden können. Es wird im Englischen mit Implicit Addressing, Single Address Transfer oder bildhafter als Fly-by Transfer bezeichnet.
  Auch hier werden automatisch der Datenzähler und die Adresse, die auf den Datenbereich im Speicher zeigt, verändert und gegebenenfalls weitere Daten übertragen.

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:

- der HOLD-Ausgang, über den der DMA-Baustein vom µP den exklusiven Zugriff zum Systembus anfordert, sowie
- der HOLDA-Eingang (Hold Acknowledge), über den der µP dem DMA-Baustein diesen Zugriff gewährt.

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:

- REQ (DMA Request): Dies ist ein Eingang, über den ein Peripheriebaustein eine Aufforderung zum Datentransfer an den Controller stellen kann.
- ACK (DMA Acknowledge): Über diesen Ausgang wird der Peripheriebaustein darüber informiert, daß der Controller die Aufforderung zur Datenübertragung akzeptiert hat.
- INT (auch: EOP - End of Prozeß): Über diesen Ausgang wird der Peripheriebaustein oder der Prozessor darüber unterrichtet, daß das letzte Datum übertragen wurde (bzw. gerade übertragen wird). Häufig ist diese Leitung bidirektional ausgeführt. Als Eingang geschaltet, kann die Peripheriekomponente hierüber den Controller zum Abbruch der laufenden Datenübertragung zwingen.

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.

- In den Datenzähler schreibt der Prozessor die Anzahl der zu übertragenden Daten. Dieser Zähler wird nach jedem Datentransfer dekrementiert. Sobald der Zählerstand 0 erreicht ist, wird darüber das Steuerwerk des Bausteins informiert, das dann die Übertragung beendet.
- Die Breite des Datenzählers ist oft kleiner als die Breite des Adreßbusses, so daß durch eine einzige Blockübertragung lediglich ein Teil des (maximalen) physikalischen Arbeitsspeichers transferiert werden kann. Typischerweise ist der Datenzähler zwischen 16 und 24 bit breit.
- In den Adreßzähler des Quellbereiches überträgt der Prozessor die Adresse des ersten zu transferierenden Datums. Die Breite des Adreßzählers stimmt in der Regel mit der Breite des Befehlszählers oder des Adreßpufferregisters des Mikroprozessors überein, für den der DMA-Controller entwickelt wurde. Dadurch kann der DMA-Controller den gesamten Adreßraum des Prozessors ansprechen.
  - Handelt es sich bei der Quelle der Daten um den Arbeitsspeicher, so wird die Basisadresse des zu übertragenden Datenbereiches eingeschrieben. In diesem Fall wird nach jeder Übertragung eines Datums der Zähler automatisch wahlweise inkrementiert oder dekrementiert und dadurch die nächste Speicherzelle angesprochen.
  - Ist jedoch ein Peripheriebaustein die Quelle der Daten, so wird die Adresse eines seiner Datenregister in den Zähler geschrieben. Diese Adresse bleibt während der Übertragung des gesamten Datenblocks unverändert.
- Der Adreßzähler des Zielbereiches wird vom Prozessor mit der Adresse geladen, unter der das erste übertragene Datum abgespeichert werden soll. Wie eben beschrieben, wird diese Adresse natürlich nur dann nach jedem Datentransfer verändert, wenn der Zielbereich im Speicher liegt. Hingegen bleibt die Adresse eines Registers in einem Peripheriebaustein unverändert.

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

- Einfacher aufgebaute DMA-Controller lassen, wie eben beschrieben, als Requester nur Schnittstellenbausteine, als Target nur den Arbeitsspeicher zu. Bei ihnen kann deshalb einer der Adreßzähler und damit auch der nachgeschaltete Multiplexer entfallen. Im verbleibenden Adreßzähler wird stets die Basisadresse des Datenbereiches im Speicher eingetragen, unabhängig davon, ob er Quelle oder Ziel des Transfers ist. Die "Adressierung" des Schnittstellenbausteins geschieht auch hier nur durch die ACK-Leitung. Über eine zusätzliche Strobe-Leitung wird diesem Baustein von seinem angeschlossenen Gerät mitgeteilt, wann ein Datum für ihn vorliegt bzw. von ihm verlangt wird. Die Übertragung eines Datums geschieht in einem Speicherzyklus (Fly-by Transfer).
- Die beiden oben beschriebenen Adreßzähler sind nicht immer der Quelle bzw. dem Ziel des Datentransportes fest zugeordnet. Bei einer anderen Variante eines DMA-Controllers besteht diese feste Zuordnung statt dessen zwischen je einem Adreßzähler und dem Requester bzw. dem Target.
- Einige DMA-Controller besitzen zusätzlich drei Basisregister, die jeweils den Zählern vorgeschaltet sind (im Bild 4.4-3 gestrichelt gezeichnet). In diesem Fall muß der Prozessor in Anwendungen, bei denen sich die Parameter der Übertragung für jeden Datenblock nicht ändern, die Register nur ein einziges Mal vor der ersten Übertragung beschreiben. Danach wird durch die Aktivierung des REQ-Signals der Inhalt der Basisregister vor jeder Datenblock-Übertragung in die Zähler geladen.

### 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.

- Beim Einzel-Datentransfer ("transparenter" Datentransfer, Single Transfer Mode) wird jeweils genau ein Datum übertragen. Danach wird zunächst der Systembus wieder zur Nutzung durch den Prozessor freigegeben. Im Bild 4.4-4 ist das Zeitdiagramm für diesen Übertragungsmodus dargestellt. Da dem Prozessor für jeden Datentransfer während eines oder mehrerer Taktzyklen der Systembus entzogen wird, heißt diese Übertragungsart im Englischen auch Cycle Stealing. Nachdem der Prozessor die Controller-Register mit den Parametern der Übertragung geladen ("initialisiert") hat, kann zu einem beliebigen Zeitpunkt der Requester seine DMA-Anforderung über das REQ-Signal stellen. Einen Taktzyklus später informiert der Controller den µP über die HOLD-Leitung vom Vorliegen dieser Anforderung.

  Bild 4.4-4: Signalverlauf beim Einzel-Datentransfer

  Der Prozessor schaltet bei der nächst möglichen Gelegenheit, frühestens aber nach einem Zyklus, seine Systembusausgänge hochohmig und informiert darüber den Controller über das HOLDA-Signal. Dieser legt daraufhin die Adresse des zu übertragenden Datums auf den Adreßbus, aktiviert die benötigten Bussteuersignale und überträgt das Datum. Das Datum wird solange aktiv gehalten, bis von der Zielkomponente durch das -Signal eine erfolgreiche Übernahme signalisiert wird. Am Ende der Übertragung fragt der Controller den -Eingang ab und bricht, in Abhängigkeit von dessen Zustand, den Übertragungsvorgang ab oder führt ihn mit dem nächsten Datum fort. Der Requester kann zu einem beliebigen Zeitpunkt durch wiederholte Aktivierung des REQ-Eingangs die Übertragung eines weiteren Datums veranlassen. Dadurch ist die Anpassung der Übertragungsgeschwindigkeit des DMA-Bausteins an die eventuell erheblich langsamere des Schnittstellenbausteins möglich. Auch wenn der Requester seine Anforderungsleitung REQ zum DMA-Controller kontinuierlich aktiviert hat, kann der Prozessor vor dem jeweils nächsten Datentransfer auf den Systembus zugreifen. Die Übertragung wird erst nach dem Transfer des letzten Datums beendet, wenn sie nicht bereits vorher durch das Signal EOP abgebrochen wurde.
- Die zweite Übertragungsart ist der Blocktransfer (Block Transfer Mode, Burst Mode). Im Bild 4.4-5 ist das Zeitdiagramm dieser Übertragungsart skizziert.

  Bild 4.4-5: Zeitdiagramm des Blocktransfers

  In diesem Fall überträgt der Controller ohne zwischenzeitliche Freigabe des Systembusses alle Daten des Blockes, sobald er den Zugriff zum Systembus eingeräumt bekommen hat. Das Anforderungssignal REQ muß nur vor und während der Übertragung des ersten Bytes aktiviert sein. Die normale Übertragung wird durch den Eintritt des Nullzustandes im Datenzähler des Controllers beendet. Jedoch kann sie wiederum jederzeit über die-Leitung abgebrochen werden, die vom Steuerwerk nach jedem durchgeführten Datentransfer abgefragt wird.
  Um einen Informationsverlust im dynamischen RAM-Speicher zu verhindern, kann diese Form der DMA-Übertragung durch den DRAM-Controller zum Auffrischen des Speichers unterbrochen werden.
- Die dritte Übertragungsart ist der Transfer auf Anforderung (Demand Transfer Mode, s. Bild 4.4-6).

  Bild 4.4-6: Zeitdiagramm der Übertragung auf Anforderung

  Sie nimmt eine Mittelstellung zwischen den bisher beschriebenen Arten dadurch ein, daß bei ihr die Datenübertragung solange ohne Unterbrechung durch µP-Buszyklen ausgeführt wird, wie dies der Requester wünscht. Diese Art des Transfers wird bevorzugt bei Peripheriegeräten eingesetzt, die ihre Daten in Schüben (Bursts) liefern bzw. verlangen, zwischen denen aber mehr oder weniger lange Pausen liegen. Den Übertragungswunsch teilt der Requester dem Controller durch das REQ-Signal mit. Mit jeder erneuten Aktivierung dieses Signals wird die Übertragung bis zur nächsten Unterbrechung, d.h. der Deaktivierung des REQ-Signals, fortgesetzt. Die Beendigung der Übertragung wird wiederum durch den Datenzähler im Controller oder das externe -Signal veranlaßt.

### 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:

- Die Adreßzähler im Baustein müssen nach jedem Transfer um 1, 2, 4 oder sogar 8 erhöht werden, je nachdem, ob ein Byte, ein Wort, ein Doppelwort oder ein Quadword übertragen wurde.
- Ist die Datenbreite des Quellbereiches größer als die des Zielbereiches, so muß der Baustein das eingelesene Datum vor dem Weitertransport zerlegen (Byte Disassembly) und in mehreren Zyklen weiterreichen. Im entgegengesetzten Fall muß er zunächst mehrere Daten der Quelle im Datenbuspuffer sammeln (Byte Assembly), bevor er sie als ein einziges Datum an das Ziel weiterreicht.
- Der Controller muß das Vorliegen der Adresse eines Non-aligned-Datums erkennen, selbständig die erforderlichen Speicherzugriffe durchführen, die gelesenen Datenbytes im Datenbuspuffer sammeln (Byte Assembly) und in einem Zyklus zum Ziel übertragen. Umgekehrt müssen gelesene Aligned-Daten zerlegt (Byte Disassembly) und in mehreren Zyklen zu einer Non-aligned-Zieladresse übertragen werden.

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:

- T1, T0: Festlegung des Typs der Übertragung
  Durch diese Bits wird festgelegt, ob der Requester Daten ausgeben, empfangen oder nur die Adreßausgabe überprüfen (Verify) will.
- AI: Automatische Initialisierung
  Dieses Bit bestimmt, ob die Adreß- und Datenzähler des Controllers nach der Beendigung einer Blockübertragung zur Vorbereitung der nächsten Übertragung (mit unveränderten Parametern) automatisch aus ihren Basisregistern geladen werden sollen (vgl. Bild 4.4-3).
- M1, M0: Übertragungsmodus
  Diese Bits legen eine der beschriebenen Übertragungsarten fest: Einzel-Datentransfer, Blocktransfer oder Transfer auf Anforderung.
- C: Transferzyklen
  Durch dieses Bit wird bestimmt, ob die Übertragung in einem Zyklus (Fly-by Transfer) oder zwei Zyklen (Two-Cycle Transfer) stattfinden soll.

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.

- *T: Typ der Komponente
  Durch dieses Bit wird unterschieden, ob die Komponente R/T der Arbeitsspeicher oder ein Peripheriebaustein ist. Dieses Bit hat direkten Einfluß auf die alternative Benutzung des R/-Signals oder des IOR/-Signals zur Steuerung der Übertragungsrichtung.
- *A1, *A0: Aktion des Komponenten-Adreßzählers
  Durch diese Bits wird festgelegt, ob der Adreßzähler der Komponente R/T nach jedem Datentransfer inkrementiert, dekrementiert oder unverändert gelassen (hold) wird.
- *B1, *B0: Busbreite
  Durch diese beiden Bits wird für die Komponente R/T eine der Busbreiten 8, 16, 32 oder 64 bit festgelegt.

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