WEBVTT

00:07.630 --> 00:13.750
So, hallo, ich begrüße euch ganz herzlich zur letzten Vorlesung in der

00:13.750 --> 00:18.530
Technischen Informatik II und freue mich, dass doch so viele Leute

00:18.530 --> 00:23.310
gekommen sind, trotz des guten Wetters und der Vorbereitungen auf die

00:23.310 --> 00:24.290
Info 4 Klausur.

00:25.210 --> 00:30.570
Wir wollen heute noch zwei wichtige Themen hier behandeln und somit

00:30.570 --> 00:33.590
den Stoff der Technischen Informatik II abschließen.

00:34.830 --> 00:38.830
Mit dem ersten Thema haben wir gestern in der Vorlesung angefangen,

00:39.010 --> 00:43.190
und zwar die Behandlung von Ausnahmesituationen in Mikroprozessen oder

00:43.190 --> 00:44.370
Mikrorechnungssystemen.

00:45.670 --> 00:51.050
Wir wissen, dass während des Betriebs im Rechnungssystem

00:51.050 --> 00:54.930
Ausnahmesituationen, sogenannte Exceptions, auftreten können.

00:55.290 --> 00:59.330
Und diese Exceptions, die könnten zu einer vorübergehenden

00:59.330 --> 01:05.130
Unterbrechung des gerade laufenden Programms oder sogar zu dem

01:05.130 --> 01:08.370
vollständigen Abbruch des laufenden Programms führen.

01:08.990 --> 01:13.730
Die Ursachen liegen, wie wir gestern gesehen haben, sowohl in Fehler

01:13.730 --> 01:18.490
im System bei der Ausführung von bestimmten Anwenderprogrammen oder

01:18.490 --> 01:27.230
Fehler durch die Hardware beziehungsweise andere Ursachen sind durch

01:27.230 --> 01:32.030
den Wunsch externer Systemkomponenten gegeben, die Aufmerksamkeit vom

01:32.030 --> 01:33.230
Prozessor zu erhalten.

01:34.310 --> 01:39.830
Das heißt, das sind zum Beispiel Peripheriegeräte, die vielleicht

01:39.830 --> 01:44.250
Daten zum Prozessor schicken wollen beziehungsweise irgendetwas

01:44.250 --> 01:46.630
empfangen möchten.

01:47.620 --> 01:52.110
Das sind zum Beispiel Tastatur- und Mausbewegungen, die halt dazu

01:52.110 --> 01:58.950
führen, dass bestimmte Ausnahmesituationen hier auftreten, die zu

01:58.950 --> 02:03.250
einer vorübergehenden Unterbrechung des laufenden Programms führen und

02:03.250 --> 02:05.930
anschließend Wiederaufnahme des Programms.

02:06.450 --> 02:10.070
Die andere Art, das sind so schwerwiegende Fehler, die dazu führen,

02:10.230 --> 02:14.650
dass jetzt das System total zusammenbricht.

02:14.650 --> 02:20.470
Das heißt, hier werden die laufenden Programme beendet beziehungsweise

02:20.470 --> 02:21.230
abgebrochen.

02:22.010 --> 02:27.790
Die Behandlung von diesen Ausnahmesituationen erfolgt durch sogenannte

02:27.790 --> 02:34.030
Ausnahmeroutinen, also im Englischen Interrupt Service Routines, die

02:34.030 --> 02:39.130
durch eine Hardwarekomponente im System, ein sogenanntes Interrupt

02:39.130 --> 02:40.570
System, aktiviert werden.

02:40.570 --> 02:46.850
Also man muss sich vorstellen, diese bekannten Ausnahmesituationen

02:46.850 --> 02:51.930
müssen ja irgendwie bereinigt werden und zu deren Reinigung existieren

02:51.930 --> 02:58.510
im System entsprechende Programme, die halt praktisch die

02:58.510 --> 03:05.930
Ausnahmesituation erledigen, also bearbeiten und anschließend eine

03:05.930 --> 03:10.030
Wiederaufnahme des normalen Betriebs des Prozessors ermöglichen.

03:10.030 --> 03:15.130
Und diese Ausnahmebehandlungsroutinen sind nichts anderes als

03:15.130 --> 03:19.130
bestimmte Programme, die irgendwo im Kern des Systems abgelegt sind.

03:19.270 --> 03:23.170
Das heißt, wenn man weiß eigentlich, welche Ausnahmesituationen

03:23.170 --> 03:29.450
auftreten und die nummeriert und weiß, welches Mikroprogramm zu

03:29.450 --> 03:34.850
welcher Ausnahmesituation gehört, dann braucht man immer, wenn eine

03:34.850 --> 03:38.850
derartige Ausnahmesituation auftritt, die Startadresse von diesem

03:38.850 --> 03:43.290
Mikroprogramm zu ermitteln und dieses Mikroprogramm sorgt dafür, die

03:43.290 --> 03:49.150
Situation, wie gesagt, zu behandeln, die Ausnahmesituation zu

03:49.150 --> 03:49.590
behandeln.

03:50.330 --> 03:54.350
Die Ausnahmeroutine, also die Ausführung von dieser Ausnahmeroutine,

03:55.210 --> 03:59.190
die Ausführung von diesem speziellen Programm, welches zuständig für

03:59.190 --> 04:03.590
die Behandlung von der Ausnahme, hat Ähnlichkeit mit dem Aufbau eines

04:03.590 --> 04:06.430
Unterprogramms, was wir ja schon kennen.

04:07.290 --> 04:14.470
Es existieren aber einige Unterschiede zwischen dem Ablauf, der

04:14.470 --> 04:18.470
Abarbeitung einer Ähnlichkeitsroutine und die eines Unterprogramms.

04:18.970 --> 04:21.090
Zum Beispiel hier die Aktivierung.

04:21.710 --> 04:26.730
Unterprogramme werden mit bestimmten Befehlen, wie JAL beispielsweise,

04:27.490 --> 04:28.930
aufgerufen.

04:29.850 --> 04:34.810
Die Aktivierung oder die Hardwareaktivierung bei Ausnahmesituationen

04:34.810 --> 04:36.790
erfolgt durch externe Signale.

04:37.750 --> 04:44.170
Die Beendigung bei Unterprogrammen muss man immer dem Befehlszähler,

04:44.190 --> 04:48.170
wie wir wissen, mit der Rücksprungadresse laden.

04:48.330 --> 04:53.210
Da ist ein spezielles Befehl da, also GRRA haben wir ja bei MIPS

04:53.210 --> 04:53.930
kennengelernt.

04:53.930 --> 04:57.450
Das heißt, das führt dazu, dass die Rücksprungadresse in das MEM

04:57.450 --> 05:03.530
-Programm in den Befehlszähler geladen wird, sodass der nächste Befehl

05:03.530 --> 05:04.750
ausgeführt werden kann.

05:05.470 --> 05:10.330
Bei Ausnahmebehandlungen existiert auch ein Befehl, Return from

05:10.330 --> 05:15.250
Exception oder Return from Interrupt, was einfach halt die

05:15.250 --> 05:18.590
Wiederaufnahme des normalen Betriebs des Prozessors erlaubt.

05:19.690 --> 05:25.070
Die Ansprungadresse ins Unterprogramm war bei uns immer im Code.

05:25.390 --> 05:29.910
Also haben wir als Programmierer im Code eingegeben, wie JAL

05:29.910 --> 05:30.590
-Unterprogramm.

05:31.490 --> 05:37.470
Also springe ich zu, was weiß ich, DIFF 2 oder Modulo 2 oder

05:37.470 --> 05:38.610
Ähnliches.

05:38.610 --> 05:48.010
Bei Ausnahmebehandlungen erfolgt die Bestimmung dieser Ansprungadresse

05:48.010 --> 05:51.630
in die Ausnahmebehandlungsroutine über eine sogenannte Interrupt

05:51.630 --> 05:52.430
-Vektortabelle.

05:53.230 --> 05:56.810
Das heißt, wie ich schon erwähnt habe, hier ist es lediglich

05:56.810 --> 06:00.950
notwendig, die Startadresse von dieser Interrupt-Serviceroutine zu

06:00.950 --> 06:01.410
bestimmen.

06:01.410 --> 06:05.990
Das heißt, es ist nicht im Programm festgegeben, sondern da ist eine

06:05.990 --> 06:10.110
Adressberechnung notwendig, auf die wir heute zu sprechen kommen

06:10.110 --> 06:10.530
werden.

06:11.690 --> 06:16.290
Bei Unterprogramm-Aufrufen kennen wir ja diese Konventionen in MIPS.

06:17.110 --> 06:21.810
Sichert man meistens nur den Befehlszähler auf dem Stack.

06:22.090 --> 06:27.510
Wir haben auch diese andere Sachen auf dem Stack sichern müssen, z.B.

06:28.230 --> 06:31.550
langlebige Register, in denen Daten enthalten sind, die nach

06:31.550 --> 06:35.710
Beendigung des Unterprogramms benötigt werden.

06:36.330 --> 06:43.530
Bei einem Ausnahmebehandlungsaufruf wird meist das gesamte

06:43.530 --> 06:46.710
Prozessorstatuswort auf dem Stack gesichert.

06:46.710 --> 06:52.230
Das heißt, sowohl das Steuerregister als auch das Statusregister, also

06:52.230 --> 06:55.690
der gesamte Prozessorzustand wird auf dem Stack gesichert.

06:58.520 --> 07:04.430
Der letzte Punkt ist, dass Unterprogramme immer durchgeführt werden.

07:05.290 --> 07:10.610
Die Ausnahmebehandlungen oder die meisten Ausnahmebehandlungen, die

07:10.610 --> 07:15.310
werden nur dann aktiviert, wenn sie erlaubt sind.

07:15.310 --> 07:23.190
Und erlaubt sind diese Ausnahmen immer dann, wenn ein sogenanntes

07:23.190 --> 07:27.430
Interrupt -Enable-Bit im Steuerregister des Prozessors gesetzt ist.

07:28.030 --> 07:32.350
Das heißt, wenn dieses Bit nicht gesetzt ist im Steuerregister des

07:32.350 --> 07:37.610
Prozessors, dann sind ja diese Arten von Unterbrechungen nicht erlaubt

07:37.610 --> 07:41.430
und somit kann ein Aufruf von einer Ausnahmebehandlung nicht aktiviert

07:41.430 --> 07:41.730
werden.

07:42.570 --> 07:48.610
Die Ursachen für Ausnahmen lassen sich unterscheiden in Prozessor

07:48.610 --> 07:51.610
-externe Ursachen und Prozessor-interne Ursachen.

07:52.770 --> 07:59.770
Die Unterschiede liegen eigentlich in dem Zeitverhalten und zwar bei

07:59.770 --> 08:01.430
den externen Ursachen.

08:02.370 --> 08:07.670
Das sind Ursachen, das sind Ereignisse, die asynchron zum

08:07.670 --> 08:11.350
Programmablauf auftreten.

08:11.830 --> 08:14.770
Das heißt, sie werden durch die Hardware erzeugt.

08:14.850 --> 08:16.410
Sie haben mit dem Programm nichts zu tun.

08:16.510 --> 08:21.330
Sie können zu jedem bestimmten Zeitpunkt im Programm auftreten.

08:22.090 --> 08:26.330
Prozessor-interne Ursachen sind synchrone Ereignisse und zwar zum

08:26.330 --> 08:27.330
Programmablauf.

08:27.330 --> 08:31.890
Das heißt, sie treten fast nur durch Software an fest vorgegebenen

08:31.890 --> 08:32.570
Stellen vor.

08:33.610 --> 08:38.090
Ja, welche Beispiele oder welche Sachen könnt ihr euch vorstellen

08:38.090 --> 08:41.670
unter Prozessor-externe Ursachen oder Prozessor-interne Ursachen?

08:44.710 --> 08:51.050
Kennt sich jemand hier ein bisschen mit dem Thema aus oder sind die

08:51.050 --> 08:52.970
Begriffe neu für alle oder bekannt?

08:52.970 --> 08:54.930
Ein bisschen bekannt schon, ja.

08:55.910 --> 08:59.250
Bis auf die Informationswerte.

08:59.470 --> 09:03.410
Also ich werde heute am Ende etwas zu der Vorlesungsbefragung sagen.

09:03.570 --> 09:06.670
Da will ich einen Punkt mit den Informationswerten klären.

09:07.430 --> 09:07.590
So,

09:11.240 --> 09:13.020
Speicherzugriff zum Beispiel.

09:13.820 --> 09:17.040
Ist das eine externe oder eine interne Ursache?

09:19.540 --> 09:21.900
Was wäre eine externe Ursache?

09:30.460 --> 09:33.980
Das ist eine externe Ausnahme.

09:35.920 --> 09:36.960
Ja?

09:37.600 --> 09:38.400
Gut.

09:39.660 --> 09:45.040
Also ich habe hier einige Beispiele aufgelistet für externe und

09:45.040 --> 09:46.160
interne Ursachen.

09:46.860 --> 09:49.180
Externe sind zum Beispiel Rezept.

09:50.500 --> 09:56.240
Das ist ein Ereignis, was asynchron zum Programmablauf ist.

09:56.440 --> 10:02.480
Das heißt, durch Drücken der Reset-Taste wird beispielsweise der

10:02.480 --> 10:07.580
Prozessor in einen wohldefinierten Anfangszustand versetzt.

10:07.980 --> 10:11.540
Beziehungsweise, wenn jetzt bestimmte Schwankungen in Betriebsspannung

10:11.540 --> 10:17.060
des Prozessors auftreten, dann wird auch so ein Reset von dem

10:17.060 --> 10:18.860
Prozessor durchgeführt.

10:19.000 --> 10:24.620
Oder wenn ein Lebenszeichen vom Prozessor sich eine Zeit lang nicht

10:24.620 --> 10:25.560
bemerkbar macht.

10:25.820 --> 10:33.840
Also das heißt, diese Überwachungsschaltungen, die den Zustand von dem

10:33.840 --> 10:34.840
Prozessor überwachen.

10:34.840 --> 10:42.020
Das heißt, da wird erwartet, dass der Prozessor ein Signal von sich

10:42.020 --> 10:44.840
abgibt in vorgegebenen Zeitabschnitten.

10:45.080 --> 10:50.000
Und wenn dieses Signal von dem Prozessor nicht kommt, dann wird hier

10:50.000 --> 10:51.820
ein Reset ausgeführt.

10:52.520 --> 10:57.520
Andere Beispiele sind hier Halt, das heißt Anhalten des Prozessors.

10:57.620 --> 11:01.920
Zum Beispiel zur Vermeidung von Zugriffskonflikten auf den Systembus

11:01.920 --> 11:03.100
bei DMA-Zugriffen.

11:03.100 --> 11:08.440
Oder wenn Paritätsfehler bei einer Busoperation auftreten.

11:10.160 --> 11:15.040
Andere Beispiele sind hier Erroraufruf einer Fehlerbehandlung, zum

11:15.040 --> 11:17.280
Beispiel bei Busfehlern.

11:19.040 --> 11:23.100
Weiterhin sind sogenannte Hardware-Interrupts.

11:24.480 --> 11:28.220
Ein Beispiel für Prozessor-externe Ursachen.

11:28.220 --> 11:32.200
Das heißt, das sind Unterbrechungsanforderungen von Eingabe-Ausgabe

11:32.200 --> 11:37.540
-Einheiten oder Geräten, um bestimmte Daten zu übertragen zum

11:37.540 --> 11:39.040
Prozessor oder zu empfangen.

11:40.300 --> 11:45.820
Und bei diesen Interrupts hier unterscheidet man zwischen sogenannten

11:45.820 --> 11:49.220
maskierbaren und nicht maskierbaren Interrupts.

11:50.700 --> 11:59.740
Nicht maskierbare Interrupts werden immer nach Beendigung des aktuell

11:59.740 --> 12:00.940
ausgeführten Befehls ausgeführt.

12:00.940 --> 12:05.520
Also die müssen unbedingt durchgeführt werden.

12:06.120 --> 12:11.260
Das heißt, diese nicht maskierbaren Interrupts, NMIs, die sind immer

12:11.260 --> 12:15.240
reserviert für sehr wichtige und vor allem sehr zeitkritische

12:15.240 --> 12:15.860
Aufgaben.

12:15.860 --> 12:21.500
Das heißt, zum Beispiel in Echtzeit-Anwendungen, da könnte man halt

12:21.500 --> 12:26.360
hier diese NMI-Eingänge des Prozessors, also nicht maskierbare

12:26.360 --> 12:28.260
Interrupts des Prozessors, ausnutzen.

12:28.860 --> 12:32.200
Andererseits auch Zusammenbruch des Betriebsspannung.

12:32.280 --> 12:38.260
Das ist klar, dass hier diese Interrupt-Routine zum Resetten des

12:38.260 --> 12:43.860
Prozessors direkt aktiviert werden muss, vielleicht nach Beendigung

12:43.860 --> 12:45.640
des gerade ausgeführten Befehls.

12:46.180 --> 12:51.500
Die maskierbaren Interrupts, die werden nur dann ausgeführt, also die

12:51.500 --> 12:58.800
sind, sagen wir mal, die Interrupts für nicht so wichtige

12:58.800 --> 13:01.120
Ausnahmesituationen.

13:01.120 --> 13:08.260
Sie werden nur dann ausgeführt, wenn das Interrupt-Enable-Flag im

13:08.260 --> 13:10.580
Steuerregister des Prozessors gesetzt ist.

13:12.240 --> 13:19.580
Prozessorinterne Ursachen, das sind für Ausnahmesituationen, da treten

13:19.580 --> 13:24.140
hier Ausnahmesituationen bei Prozessoren, die auf dem Prozessor selbst

13:24.140 --> 13:28.300
interruptfähige Komponenten haben.

13:28.300 --> 13:34.580
Zum Beispiel auf dem Prozessor schiebt selbst serielle oder parallele

13:34.580 --> 13:38.640
Schnittstellen Zeitgeber und die treten immer synchron zum

13:38.640 --> 13:39.940
Programmablauf auf.

13:40.980 --> 13:45.740
Hier unterscheidet man wiederum zwischen sogenannten Software-Traps,

13:46.080 --> 13:51.820
das heißt Software-Interrupts, die durch bestimmte Befehle im Programm

13:51.820 --> 13:59.680
ausgelöst werden können und zwischen Traps, mit denen wollen wir diese

13:59.680 --> 14:04.040
Ausnahmesituationen kennzeichnen, die als Reaktion auf

14:04.040 --> 14:06.400
Prozessorinterne Ereignisse auftreten.

14:06.520 --> 14:11.340
Das heißt, wenn jetzt hier bei einer Divisionsoperation man versucht

14:11.340 --> 14:14.680
durch Null oder der Prozessor versucht durch Null zu dividieren oder

14:14.680 --> 14:18.600
wenn eine Zellenbereich-Überschreitung erfolgt oder wenn ein Stack

14:18.600 --> 14:25.320
-Überlauf erfolgt, wenn ein gültiger Op-Code benutzt wird oder wenn

14:25.320 --> 14:30.640
ein Seitenfehler vorliegt oder wenn man auch beispielsweise zum Testen

14:30.640 --> 14:35.240
vom Programm im Debug-Modus geht und dem Programm in Einzelschritt

14:35.240 --> 14:37.280
halt durchgeht.

14:37.520 --> 14:44.600
Das sind halt diese Traces oder Einzelschritt-Unterbrechungen.

14:46.300 --> 14:53.880
Auch hier erwähnt als Beispiel für Prozessorinterne Ursachen.

14:54.760 --> 15:00.260
Ich habe es vorher erwähnt, der Aufruf von einer Interrupt-Service

15:00.260 --> 15:04.720
-Routine bedeutet nichts anderes oder die Behandlung von einer

15:04.720 --> 15:10.560
Ausnahmesituation erfolgt durch eine Interrupt-Service-Routine und

15:10.560 --> 15:14.620
diese Interrupt-Service-Routines sind nichts anderes als Programme,

15:14.720 --> 15:19.460
die irgendwo abgelegt sind, normalerweise im Hauptspeicher, an den

15:19.460 --> 15:21.760
untersten Adressen im Hauptspeicher.

15:22.600 --> 15:29.180
Und wenn jetzt eine Interrupt-Quelle einen Interrupt auslöst, dann

15:29.180 --> 15:35.960
muss ja diese Start-Adresse zur zugehörigen Interrupt-Service-Routine

15:35.960 --> 15:36.820
bestimmt werden.

15:37.740 --> 15:48.360
Das erfolgt so, indem bestimmt werden muss, das sind hier im

15:48.360 --> 15:53.720
Hauptspeicher, sind alle Start-Adressen von allen Interrupt-Service

15:53.720 --> 15:57.880
-Routinen abgelegt und jetzt haben wir hier eine Interrupt-Quelle.

15:59.220 --> 16:04.480
Diese Interrupt-Quelle, die löst einen Interrupt aus und zu diesem

16:04.480 --> 16:08.220
Interrupt müssen wir jetzt die Start-Adresse hier von dieser Interrupt

16:08.220 --> 16:10.040
-Service -Routine bestimmen.

16:11.000 --> 16:16.840
Die Start-Adresse, die ergibt sich immer aus, man muss sich

16:16.840 --> 16:22.400
vorstellen, diese Tabelle hier, die hat bestimmte Einträge 0, 1, 2,

16:22.760 --> 16:29.320
vielleicht bis 255 und jeder Eintrag gehört hier zu einer bestimmten

16:29.320 --> 16:30.100
Ausnahme.

16:30.870 --> 16:38.080
Das heißt, diese Interrupt-Quelle hier, die liefert jetzt eine Nummer

16:38.080 --> 16:40.600
eines Interrupts.

16:40.840 --> 16:48.920
Diese Nummer hier, die wird zu einem bestimmten Wert hier zu der Start

16:48.920 --> 16:54.660
-Adresse, Start-Adresse oder Basis-Adresse der Interrupt-Vektortabelle

16:54.660 --> 17:00.260
hier hinzu addiert, sodass man hier die Start-Adresse für die

17:00.260 --> 17:02.080
Interrupt -Service-Routine bestimmen kann.

17:07.780 --> 17:15.920
So, das heißt, die Interrupt-Quelle, es ist klar, wie das Ganze

17:15.920 --> 17:20.520
funktioniert, das haben wir ja gestern kennengelernt, dieser

17:20.520 --> 17:24.460
Quittierungsbetrieb, dass diese Interrupt-Quelle zunächst mal hier

17:24.460 --> 17:28.140
eine Interrupt-Anforderung stellt an den Mikroprozessor.

17:28.140 --> 17:33.680
Der Mikroprozessor, der führt zum Beispiel den aktuell ausgeführten

17:33.680 --> 17:34.640
Befehl zu Ende.

17:35.100 --> 17:39.480
Anschließend meldet er oder informiert er diese Interrupt-Quelle

17:39.480 --> 17:46.380
darüber, dass jetzt halt dieses Interrupt-Acknowledgement vorliegt.

17:46.620 --> 17:54.340
Das heißt, die Interrupt-Quelle, die kann hier die Nummer von diesem

17:54.340 --> 18:01.680
Interrupt auf den Datenbus stellen, skalieren, werden wir sehen,

18:01.840 --> 18:01.940
warum.

18:02.960 --> 18:07.420
Und diese Nummer hier wird zu der Basis-Adresse der Interrupt

18:07.420 --> 18:12.060
-Vektortabelle hinzu addiert, sodass man die Start-Adresse von der

18:12.060 --> 18:14.000
zugehörigen Interrupt-Routine bestimmt.

18:16.320 --> 18:20.200
So, warum braucht man hier diese Skalierung, diese eingezeichnete

18:20.200 --> 18:20.800
Skalierung?

18:28.010 --> 18:28.890
Weiß es jemand?

18:31.130 --> 18:33.410
Brauchen wir nicht eigentlich, dann lassen wir das.

18:35.150 --> 18:38.390
Das hängt natürlich mit der Anzahl der Einträge in dieser

18:38.390 --> 18:39.190
Vektortabelle.

18:39.370 --> 18:45.770
Das heißt, diese Nummern von den Interrupt-Vektornummern hier, die von

18:45.770 --> 18:49.230
der Interrupt-Quelle geliefert werden, die sind nicht gleich breit wie

18:49.230 --> 18:55.170
der Datenbus und deshalb muss das Ganze halt skaliert auf die Breite

18:55.170 --> 18:56.070
von dem Datenbus.

18:57.050 --> 19:01.490
So, das heißt, zusammengefasst, diese Interrupt-Vektortabelle, das ist

19:01.490 --> 19:07.870
ein Festwertspeicher, ein spezielles Speicheradressi, oft in einem der

19:07.870 --> 19:15.150
untersten Speicherseiten, enthält die Start-Adressen aller Ausnahme-

19:15.150 --> 19:16.030
und Behandlungsroutinen.

19:16.630 --> 19:19.510
Die Interrupt-Quelle liefert bei einem Interrupt eine Interrupt

19:19.510 --> 19:23.690
-Nummer, welche den Eintrag in dieser Tabelle charakterisiert.

19:24.450 --> 19:29.790
Dazu wird die Basis-Adress-Register addiert, was ja nichts anderes als

19:29.790 --> 19:31.650
die Basis-Adresse dieser Tabelle ist.

19:32.350 --> 19:38.710
Hier sieht man ein Beispiel einer solchen Vektortabelle.

19:39.930 --> 19:45.750
Man hat hier insgesamt 255 Einträge, das heißt Interrupt-Vektornummern

19:45.750 --> 19:46.810
der Breite 8 Bit.

19:47.530 --> 19:52.970
Und hier sieht man, welche Nummern zu welcher Ausnahmesituation

19:52.970 --> 19:57.410
gehören, beispielsweise die Division durch Null, Zahlenbereich

19:57.410 --> 20:04.050
-Überschreitung, Index-Bereich-Überschreitung, illegaler Op-Code und

20:04.050 --> 20:08.390
so weiter und so fort, Trace-Mode oder Einzelschritt-Modus.

20:11.330 --> 20:16.170
Anschließend kommen diese Interrupt-Vektornummern für Prozessor

20:16.170 --> 20:20.430
-externe Ereignisse, das heißt einmal dieses Reset-Bus-Error und die

20:20.430 --> 20:22.210
nicht maskierbaren Interrupts.

20:22.250 --> 20:24.910
Die sind hier in dem Bereich normalerweise in solchen Tabellen

20:24.910 --> 20:29.110
angesiedelt, im Gegensatz zu den maskierbaren Interrupts, die ganz am

20:29.110 --> 20:31.670
Ende von dieser Tabelle vorkommen.

20:32.370 --> 20:33.590
Dann geht es weiter hier.

20:34.550 --> 20:38.890
Da gibt es auch so Interrupt-Nummern oder Einträge hier für

20:38.890 --> 20:44.870
Coprocessor -Fehler, beziehungsweise hier ein paar zum Beispiel für

20:44.870 --> 20:46.610
einen mathematischen Coprocessor.

20:46.830 --> 20:52.010
Bei älteren Prozessoren, das war bei den modernen, sind diese

20:52.010 --> 20:54.510
mathematischen Coprocessor auf dem Chip integriert.

20:54.930 --> 20:56.750
Deshalb fallen diese Sachen hier.

20:57.190 --> 21:00.850
Für die Speicherverwaltung irgendwelche Ausnahmebehandlungen hier bei

21:00.850 --> 21:09.010
Seitenfehler, bei Verletzung von Zugriffsschutz.

21:11.390 --> 21:18.630
Außerdem sind bestimmte Nummern hier vorgesehen für Testzwecke des

21:18.630 --> 21:25.270
Herstellers und ganz am Ende hier die vom Benutzer eigentlich oder für

21:25.270 --> 21:33.030
den Systementwickler frei verpuffbaren, maskierbaren Interrupts, mit

21:33.030 --> 21:34.870
denen man arbeiten kann.

21:34.870 --> 21:39.170
Also die kommen normalerweise am Ende dieser Vektortabelle vor.

21:39.950 --> 21:44.630
Der Ablauf einer Interrupt-Service-Routine ist wie folgt.

21:44.730 --> 21:50.910
Das heißt, nachdem der Interrupt aktiviert ist und der gerade in

21:50.910 --> 21:55.830
Ausführung befindliche Befehl beendet ist, muss man feststellen, ob

21:55.830 --> 21:59.690
jetzt Software-Interrupt oder interner, externer Hardware-Interrupt

21:59.690 --> 22:00.100
vorliegt.

22:00.100 --> 22:04.880
Anschließend muss man feststellen, ob das Interrupt-Enable-Bit im

22:04.880 --> 22:07.400
Steuerregister gesetzt ist.

22:07.580 --> 22:13.200
Das heißt, wobei es kann sein, dass es nicht gesetzt ist und trotzdem

22:13.200 --> 22:14.460
Interrupts zugelassen sind.

22:14.640 --> 22:19.380
Also je nachdem, wie diese logische Zuordnung ist von 0 und 1 zu

22:19.380 --> 22:20.780
Enabled und Nicht-Enabled.

22:21.180 --> 22:24.180
Das heißt, man muss hier letztendlich prüfen, ob Interrupts überhaupt

22:24.180 --> 22:26.600
zu dem aktuellen Zeitpunkt zugelassen sind.

22:26.600 --> 22:34.280
Falls ein Hardware-Interrupt vorliegt, muss die Quelle des Interrupts

22:34.280 --> 22:38.960
gefunden werden und natürlich ein Interrupt-Acknowledgement vom

22:38.960 --> 22:42.660
Prozessor an diese Quelle aktiviert oder geschickt werden.

22:43.840 --> 22:47.980
Prozessor-Statuswort muss auf dem Stack gesichert werden und

22:47.980 --> 22:52.660
anschließend das Interrupt-Enable-Bit zurücksetzen, damit keine

22:52.660 --> 22:56.080
weiteren Unterbrechungen hier erfolgen dürfen.

22:57.920 --> 23:01.480
Anschließend kann die Startadresse der Interrupt-Service-Routine

23:01.480 --> 23:05.480
ermittelt werden und in den Programmzähler geladen werden.

23:06.160 --> 23:09.520
Die Interrupt-Service-Routine wird anschließend ausgeführt.

23:09.660 --> 23:15.280
Das heißt, hier sind auch bestimmte Maßnahmen notwendig.

23:15.280 --> 23:21.680
Hier werden meist zuerst die benutzten Register auf den Stack

23:21.680 --> 23:26.700
gesichert und das Interrupt-Bit wird wieder gesetzt, damit neue

23:26.700 --> 23:29.640
Interrupts zugelassen werden.

23:30.340 --> 23:33.640
Und anschließend am Ende natürlich muss man hier den Rücksprung von

23:33.640 --> 23:40.340
der Interrupt-Service-Routine zum Programm machen.

23:41.660 --> 23:46.760
Und dann muss natürlich dieses Prozessor-Statuswort und Programm

23:46.760 --> 23:51.320
-Counter oder Befehlszähler wieder hergestellt werden, damit man mit

23:51.320 --> 23:53.980
dem unterbrochenen Programm fortfahren kann.

23:55.200 --> 24:00.840
So, nun wollen wir jetzt die Situation behandeln, dass wir nicht nur

24:00.840 --> 24:06.620
eine einzige Quelle haben, die einen Interrupt auslösen kann, sondern

24:06.620 --> 24:14.740
dass wir mehrere Interrupt-Quellen oder mehrere Systemkomponenten, die

24:14.740 --> 24:16.360
interruptfähig sind.

24:17.380 --> 24:21.900
Und diese Interrupt-Quellen, die werden durch Interrupt-Controller

24:21.900 --> 24:25.860
normalerweise zyklisch oder können zyklisch abgefragt werden.

24:25.860 --> 24:32.780
Das heißt, in dem Fall muss man ja nur die Komponenten, die ein

24:32.780 --> 24:40.020
gesetztes Interrupt-Flag besitzen, das heißt zum Beispiel irgendwelche

24:40.020 --> 24:46.780
Peripherie -Bausteine, die müssen ja in den Steuerregister auch

24:46.780 --> 24:47.860
Interrupt...

24:48.480 --> 24:54.440
also die haben dort in dem Steuerregister von diesem Systemsteuer

24:54.440 --> 24:59.500
-Baustein einen Interrupt-Flag und dann werden praktisch alle solche

24:59.500 --> 25:05.680
Komponenten mit einem gesetzten Interrupt-Flag abgefragt, ob dort eine

25:05.680 --> 25:09.400
Interrupt -Anforderung vorliegt.

25:10.380 --> 25:15.560
Zur Behandlung von dieser Situation, dass jetzt mehrere Interrupt

25:15.560 --> 25:19.700
-Quellen einen Interrupt auslösen, existieren zwei Alternativen.

25:19.900 --> 25:25.180
Die erste Alternative ist das Polling und zwar in der ersten Variante.

25:25.420 --> 25:31.560
Das heißt, hier werden alle Komponenten abgefragt, zyklisch abgefragt,

25:31.780 --> 25:36.060
ob sie einen Interrupt-Wunsch sozusagen haben oder nicht oder ob sie

25:36.060 --> 25:37.980
einen Interrupt ausgelöst haben oder nicht.

25:38.980 --> 25:43.900
Und bei dieser Variante wird mit der Komponente, also es wird hier zum

25:43.900 --> 25:48.920
Beispiel abgefragt, jetzt wird hier die Interrupt-Anforderung von der

25:48.920 --> 25:52.460
Komponente oder von der Interrupt-Quelle 4 bearbeitet.

25:53.500 --> 26:00.260
Während der Bearbeitung dieser Interrupt-Anforderungen liegen weitere

26:00.260 --> 26:06.100
Interrupt -Anforderungen von den Komponenten 2 und 7 und bei dieser

26:06.100 --> 26:10.680
Variante hier wird diese zyklische Abfrage immer mit der Komponente

26:10.680 --> 26:19.080
fortgesetzt, die in einer vorgegebenen Reihenfolge der zuletzt

26:19.080 --> 26:20.580
bedienten Komponente folgt.

26:20.740 --> 26:27.120
Das heißt, hier 4 wird zunächst mal gerade bearbeitet, die zyklische

26:27.120 --> 26:33.200
Abfrage, die geht dann weiter von 4 auf 5, 6, es liegt keine vor, 7,

26:33.380 --> 26:36.740
aha, dann wird im nächsten Schritt die Interrupt-Anforderung von 7

26:36.740 --> 26:42.640
hier erledigt und nachdem das fertig ist, wird weiterhin zyklisch

26:42.640 --> 26:47.480
abgefragt in der Reihenfolge, das heißt 8, 1 und dann kommt 2 dran.

26:48.260 --> 26:51.680
Und deshalb, wie man sieht hier, alle Komponenten haben immer die

26:51.680 --> 26:55.020
gleiche Chance bedient zu werden und deshalb spricht man hier bei

26:55.020 --> 26:59.320
dieser Variante von Polling von einer fairen Prozessorzuteilung.

27:00.660 --> 27:05.460
Bei der anderen Variante von Polling beginnt diese zyklische Abfrage

27:05.460 --> 27:13.220
immer bei einer ersten Komponente, die festgelegt ist, zum Beispiel

27:13.220 --> 27:18.020
hier bei der Nummer 1, das heißt, die gleiche Situation, hier wird

27:18.020 --> 27:24.200
eine Interrupt-Anforderung von der Quelle 4 behandelt, nachdem das

27:24.200 --> 27:32.220
fertig ist, es liegen ja die Interrupt-Anforderungen von 3 und 7, das

27:32.220 --> 27:36.640
heißt, nachdem die Abarbeitung von 4 fertig ist, fängt die Abfrage

27:36.640 --> 27:42.420
wiederum hier bei 1 an, sodass zunächst mal 3 hier an der Reihe kommt.

27:42.420 --> 27:49.300
Das heißt, man sieht hier, dass diese Komponenten hier, diese Quellen,

27:49.760 --> 27:54.840
die haben unterschiedliche Prioritäten, wie ihre Interrupts

27:54.840 --> 27:56.520
abgearbeitet werden sollen.

27:57.080 --> 28:03.420
Und dass die Quelle oder die Komponente, die näher ist an dem ersten

28:03.420 --> 28:09.140
Glied in dieser Kette, die höchste Priorität hat.

28:09.140 --> 28:14.940
Wenn immer die Komponente 1 eine Anforderung stellt, dann wird immer

28:14.940 --> 28:20.280
diese Komponente praktisch die Zuteilung bekommen und die anderen

28:20.280 --> 28:21.520
kommen gar nicht dran.

28:21.720 --> 28:24.820
Das heißt, erst wenn die erste oder erst wenn die zweite hier

28:24.820 --> 28:29.140
überhaupt keine Anforderung hat, können die drei drankommen.

28:29.280 --> 28:34.260
Und deshalb ist das hier eine relativ unfaire Prozessor-Zuteilung

28:34.260 --> 28:40.840
beziehungsweise eine Priorisierung der Zuteilung der Bearbeitung von

28:40.840 --> 28:42.380
Interruptanforderungen.

28:43.800 --> 28:51.500
So, der Nachteil von diesem Polling-Verfahren ist die relativ lange

28:51.500 --> 28:55.980
beziehungsweise unvertretbar lange Zeit, die man braucht für die

28:55.980 --> 29:00.580
Identifikation von den Interruptquellen und für diesen

29:00.580 --> 29:02.560
Priorisierungsvorgang.

29:02.560 --> 29:07.460
Das heißt, diese zyklische Abfrage, die erfolgt oder die muss ja per

29:07.460 --> 29:15.400
Software erfolgen und das ist eigentlich ein Zeitaufwand, was in

29:15.400 --> 29:18.660
diesem Zusammenhang nicht vertretbar ist.

29:19.420 --> 29:27.400
Um diesen Nachteil hier zu beheben, gibt es die Möglichkeit, diese

29:27.400 --> 29:31.540
Priorisierung und Identifizierung der Interruptquellen durch eine

29:31.540 --> 29:32.920
Zusatz -Hardware durchzuführen.

29:33.480 --> 29:38.220
Das heißt, nicht durch Software und zyklische Abfrage, sondern durch

29:38.220 --> 29:42.600
eine Zusatz-Hardware, bei der man diese unterschiedlichen Quellen

29:42.600 --> 29:47.940
hintereinander oder zusammenschaltet in einer Kette, in einer

29:47.940 --> 29:55.460
sogenannten Prioritätskette und in dieser Kette hat jede

29:55.460 --> 30:01.980
Interruptquelle eine Priorisierungsschaltung drauf.

30:02.100 --> 30:06.580
Das heißt, man spricht deshalb von einer dezentralen Priorisierung,

30:07.340 --> 30:15.000
die dann mit der des Vorgängers und Nachfolgers mit Signalleitungen

30:15.000 --> 30:15.760
verbunden ist.

30:15.760 --> 30:20.240
Die erste Quelle der Kette hat die höchste Priorität und die

30:20.240 --> 30:24.200
Prioritäten der anderen Quellen, die nehmen natürlich mit jedem Glied

30:24.200 --> 30:25.820
in der Kette um eine Stufe ab.

30:27.540 --> 30:32.500
Wie das Ganze hier aussieht, man könnte sich das so vorstellen, dass

30:32.500 --> 30:37.320
man hier mehrere Interruptquellen hat, beispielsweise 0 und 1 und so

30:37.320 --> 30:38.140
weiter und so fort.

30:38.140 --> 30:45.160
Das heißt, jede Interruptquelle hat natürlich in einem Steuerregister

30:45.160 --> 30:50.800
hier ein Interrupt-Enable-Bit oder Flag und außerdem hat jede

30:50.800 --> 30:58.460
Interruptquelle ein Register, in dem die Nummer der Interrupt-Routine

30:58.460 --> 31:03.520
steht, also von der Interruptquelle 1, von der Interruptquelle 2.

31:04.320 --> 31:10.140
Alle Requests, alle Interrupt-Anfragen, die an den Prozessor geleitet

31:10.140 --> 31:15.740
werden müssen, die kommen hier von diesen Interruptquellen, die werden

31:15.740 --> 31:20.740
zusammengeschaltet über ein Oder, das ist dieser rote Kreis hier, und

31:20.740 --> 31:28.600
an den Interrupt-Request-Eingang vom Prozessor hier geführt.

31:29.560 --> 31:35.060
So, der Prozessor, wenn diese Interrupt-Anforderung bearbeitet werden

31:35.060 --> 31:40.820
kann vom Prozessor, das heißt, der aktuell ausgeführte Befehl ist

31:40.820 --> 31:46.020
beendet, dann erteilt der Prozessor ein Interrupt-Acknowledgement.

31:46.780 --> 31:51.740
Dieses Interrupt-Acknowledgement-Signal, die wird zunächst mal allen

31:51.740 --> 31:57.480
Priorisierungsschaltungen dieser Interruptquellen zugeführt.

31:58.620 --> 31:59.200
Warum?

32:05.070 --> 32:07.230
Versteht mich jemand überhaupt hier?

32:10.670 --> 32:17.770
So, also dieses Interrupt-Acknowledgement, die wird zunächst mal hier

32:17.770 --> 32:22.690
allen Komponenten zugeführt und der ersten Komponente hier.

32:24.090 --> 32:29.590
Allen Komponenten deshalb, weil wenn mehrere Interruptquellen jetzt

32:29.590 --> 32:32.750
eine Interrupt-Anforderung ausgelöst haben, dann muss ja ein

32:32.750 --> 32:37.830
Priorisierungsvorgang erfolgen und anschließend ermittelt werden,

32:37.970 --> 32:41.010
welche Quelle jetzt dran ist.

32:41.990 --> 32:46.190
Und dieses Signal hier sorgt zunächst mal dafür, dass bei dem

32:46.190 --> 32:51.710
aktuellen Priorisierungsvorgang keine neuen Interrupt-Anforderungen

32:51.710 --> 32:52.730
berücksichtigt werden.

32:53.870 --> 33:01.830
So, das eigentliche Acknowledgement oder Quittierung geht ja zuerst an

33:01.830 --> 33:05.670
die Interruptquelle in der Kette und erst dann, wenn diese

33:05.670 --> 33:10.290
Interruptquelle kein Interrupt vorliegen hat, keine Interrupt

33:10.290 --> 33:15.110
-Anforderung vorliegen hat, kann sie hier weiterleiten an die zweite.

33:15.110 --> 33:17.790
Und wenn die zweite keine Interrupt-Anforderung hat, dann an die

33:17.790 --> 33:19.330
dritte und so weiter und so fort.

33:20.350 --> 33:28.170
Also eine der möglichen Realisierungen hier für die dezentrale

33:28.170 --> 33:33.770
Priorisierung von Interrupt mithilfe von desischen Verfahren.

33:34.650 --> 33:39.750
Die Erklärung hier zu dem Ganzen könnt ihr hier auf der Folie lesen.

33:39.750 --> 33:43.870
Nun können wir oder wollen wir jetzt kurz mal sehen, wie das

33:43.870 --> 33:46.610
Mikroprozessor -System eigentlich aussieht.

33:47.210 --> 33:51.130
Das heißt, ein Mikroprozessor-System mit einem Interrupt-Controller.

33:52.010 --> 33:56.230
Dieser Interrupt-Controller, der muss ja diese ganzen Geschichten hier

33:56.230 --> 34:00.610
erledigen, was wir jetzt vorher besprochen haben an Polling, an

34:00.610 --> 34:05.310
dezentrale Priorisierung oder Identifizierung von Interrupt-Quellen.

34:05.310 --> 34:08.050
Hier haben wir ja unterschiedliche Komponenten.

34:08.450 --> 34:13.110
Jede Komponente hat einen Interrupt-Request-Ausgang.

34:13.710 --> 34:18.150
Diese Interrupt-Requests von den Komponenten, die gehen alle hier an

34:18.150 --> 34:21.570
die entsprechenden Interrupt-Request-Eingänge von dem Interrupt

34:21.570 --> 34:22.050
-Controller.

34:23.270 --> 34:27.650
Das heißt, die Komponenten teilen dem Interrupt-Controller mit, dass

34:27.650 --> 34:30.450
sie jetzt einen Unterbrechungswunsch haben.

34:30.450 --> 34:34.370
Der Controller muss jetzt entscheiden, welche dieser Interrupt

34:34.370 --> 34:38.830
-Anforderungen die höchste Priorität hat und muss eine Interrupt

34:38.830 --> 34:40.910
-Anforderung an den Prozessor hier schicken.

34:41.970 --> 34:47.710
Der Prozessor, wenn es ihm passt, schickt ein Interrupt

34:47.710 --> 34:57.410
-Acknowledgement zurück an den Interrupt-Controller, sodass praktisch

34:57.410 --> 35:01.910
anschließend der Interrupt-Controller der jeweiligen Komponente hier

35:01.910 --> 35:04.250
die Zuteilung gibt.

35:05.430 --> 35:07.670
Wie sieht so ein Interrupt-Controller aus?

35:07.750 --> 35:10.230
Wie ist so ein Interrupt-Controller aufgebaut?

35:13.950 --> 35:15.650
Das ist eigentlich nichts anderes.

35:16.050 --> 35:19.630
Das ist ein kleiner Prozessor für sich eigentlich.

35:19.630 --> 35:23.070
Das heißt, der Interrupt-Controller muss ja diese Identifizierung

35:23.070 --> 35:28.870
machen, der muss diese Priorisierungsaufgaben machen, der muss halt

35:28.870 --> 35:36.370
bestimmte Flag-Bits mal prüfen und das heißt, der Aufbau von diesem

35:36.370 --> 35:40.090
Interrupt -Controller könnte wie folgt aussehen.

35:40.090 --> 35:44.810
Der besitzt hier so ein Steuerwerk oder eine Steuerung.

35:46.490 --> 35:51.210
In diesem Steuerwerk gibt es hier ein Statusregister, ein

35:51.210 --> 35:53.450
Steuerregister und ein Befehlsregister.

35:54.170 --> 35:57.230
Die sind natürlich notwendig für die Ausführung von der Interrupt

35:57.230 --> 36:01.250
-Service -Routine und eine Ausführungseinheit.

36:01.250 --> 36:10.790
Diese Ausführungseinheit macht nichts anderes als zunächst mal diese

36:10.790 --> 36:15.010
Interrupt -Anforderungen zum Beispiel von der Peripherie, also von den

36:15.010 --> 36:19.910
Interrupt -Quellen aufzunehmen, in einem Interrupt-Request-Register

36:19.910 --> 36:21.690
abzulegen.

36:22.010 --> 36:26.090
Das heißt, welche Komponenten haben jetzt eine Interrupt-Anforderung

36:26.090 --> 36:26.610
gestellt.

36:26.610 --> 36:34.950
Diese Interrupt-Anforderungen hier, die müssen nachher einem

36:34.950 --> 36:37.290
Prioritäts -Decoder zugeführt werden.

36:38.210 --> 36:46.210
Und bevor das gemacht wird, werden diese Interrupt-Anforderungen mit

36:46.210 --> 36:47.970
einer Maske verglichen.

36:47.970 --> 36:56.270
In dieser Maske werden die Interrupt-Bits für diese einzelnen

36:56.270 --> 36:59.970
Interrupt -Quellen maskiert oder nicht maskiert.

37:00.050 --> 37:04.710
Das heißt eigentlich, die Priorisierung muss nicht über alle Interrupt

37:04.710 --> 37:07.930
-Quellen erfolgen, sondern nur über welche, die eine Interrupt

37:07.930 --> 37:09.330
-Anforderung gestellt haben.

37:09.510 --> 37:12.910
Und die, die eine Interrupt-Anforderung gestellt haben, die werden zum

37:12.910 --> 37:16.850
Beispiel hier eine 1, beispielsweise 1 und 6.

37:17.390 --> 37:22.090
Und nur die hier müssen ja berücksichtigt werden hier von diesem

37:22.090 --> 37:23.190
Prioritäts -Decoder.

37:24.310 --> 37:31.630
Gut, der Prioritäts-Decoder, wenn das soweit ist, würde dann hier

37:31.630 --> 37:38.090
praktisch an die Interrupt-Steuerung ein Signal generieren.

37:38.090 --> 37:42.110
Die Interrupt-Steuerung muss diese Interrupt-Anforderung an den

37:42.110 --> 37:43.070
Prozessor stellen.

37:43.770 --> 37:47.830
Und der Prozessor muss natürlich hier diese Interrupt-Acknowledgement

37:47.830 --> 37:52.910
-Signal, was wir ja gesehen haben, auch dem Interrupt-Controller hier

37:52.910 --> 37:53.450
mitteilen.

37:55.110 --> 37:59.650
Okay, also im Prinzip, das ist ein Steuerwerk mit speziellen Register,

37:59.930 --> 38:03.370
auf deren Funktion wir hier nicht eingehen wollen, und eine

38:03.370 --> 38:08.470
Ausführungseinheit, die hauptsächlich aus einem Anforderungsregister,

38:08.590 --> 38:12.350
Interrupt -Request-Register und einem Maskenregister sowie einem

38:12.350 --> 38:13.810
Prioritäts -Decoder besteht.

38:16.900 --> 38:21.640
Die Frage ist, die meisten Interrupt-Controller, als man jetzt ganz zu

38:21.640 --> 38:25.200
Beginn Mikroprozessoren entwickelt hat, hat man nicht gedacht, dass

38:25.200 --> 38:28.940
man so viele Geräte haben wird, die interruptfähig sind.

38:28.940 --> 38:34.420
Und das Ganze ist historisch bedingt, dass hier diese Interrupt

38:34.420 --> 38:37.780
-Controller nicht mehr als einer bestimmten Anzahl von Interrupt

38:37.780 --> 38:40.080
-Quellen direkt anschließen können.

38:40.680 --> 38:46.840
Das heißt, bei heutigen Ansätzen sind meistens mehr als acht Interrupt

38:46.840 --> 38:51.780
-Quellen vorhanden und all diese Interrupt-Quellen müssen ja irgendwie

38:51.780 --> 38:54.060
vom System erfasst werden.

38:54.060 --> 38:59.500
Das heißt, alle interruptfähigen Geräte oder Bausteine müssen ja

38:59.500 --> 39:03.620
irgendwie auf den Interrupt-Anforderungseingang des Prozessors

39:03.620 --> 39:04.540
abgebildet werden.

39:04.640 --> 39:09.400
Und man kann ja nicht für jedes Gerät ein Signal an den Prozessor

39:09.400 --> 39:14.000
einbauen, sodass die direkt dort angeschlossen werden, sondern es gibt

39:14.000 --> 39:18.940
ja eine begrenzte Anzahl von Prozessoreingängen, für die sie

39:18.940 --> 39:19.480
interrupt.

39:19.480 --> 39:25.680
Deshalb hier eine Möglichkeit, wie man dieses Desistraining aus

39:25.680 --> 39:27.440
Interrupt -Controllern machen kann.

39:28.340 --> 39:33.880
Das heißt, hier kann man so acht Interrupt-Controller kaskadieren

39:33.880 --> 39:34.720
hintereinander.

39:37.440 --> 39:41.720
Die Interrupt-Anforderungssignale, die müssen natürlich hier von allen

39:41.720 --> 39:45.020
Mikrocontrollern geholt werden, zusammengeführt werden und an den

39:45.020 --> 39:46.240
Prozessor geschickt werden.

39:46.240 --> 39:51.020
Die Interrupt-Acknowledgement muss allen auch wiederum zugeteilt

39:51.020 --> 39:51.420
werden.

39:52.160 --> 39:57.940
Wie man sieht hier, diese beiden Signale, die man hier an den Eingang

39:57.940 --> 40:02.020
und Ausgang sieht, das ist ein Enable Input und Enable Output.

40:02.020 --> 40:09.160
Das heißt eigentlich, dieser Interrupt-Controller, der wird nur dann

40:09.160 --> 40:15.420
enabled oder kann überhaupt jetzt seine Interrupt-Anforderungen oder

40:15.420 --> 40:19.400
eine Zuteilung, eine Equitierung, dass er jetzt die Aufgabe erledigen

40:19.400 --> 40:23.180
soll, wenn der hier die Zuteilung von diesem Interrupt-Controller

40:23.180 --> 40:25.660
bekommt und der hier auch von dem.

40:25.660 --> 40:29.300
Das heißt, wenn man das Ganze hier in diesem Schema realisiert, dann

40:29.300 --> 40:34.680
hat man ja eine steigende Priorität von 0 bis 63.

40:35.020 --> 40:39.480
Und damit kann man hier bis zu 64 interruptfähige Komponenten

40:39.480 --> 40:40.700
anschließen.

40:42.520 --> 40:49.240
Eine andere Möglichkeit, die man hier hat, um jetzt schneller eine

40:49.240 --> 40:53.100
Auswahl der Interrupt-Quellen mit höchster Priorität zu ermitteln, ist

40:53.100 --> 40:55.640
die Kaskadierung von Interrupt-Controllern.

40:57.040 --> 41:03.860
Das heißt, man kann eigentlich so einen Interrupt-Controller als

41:03.860 --> 41:09.040
Master vorsehen, der weiterhin über acht Interrupt-Eingänge verfügt,

41:09.140 --> 41:10.340
also von 0 bis 7.

41:11.320 --> 41:17.540
An diesen einzelnen Eingängen kann man jetzt entweder direkt Interrupt

41:17.540 --> 41:21.460
-Quellen anschließen, dann hat man ja maximal acht Interrupt-Quellen,

41:21.580 --> 41:27.760
oder man kann weitere acht Slave-Interrupt-Controller anschließen.

41:28.660 --> 41:35.420
Also nehmen wir mal an, wir hätten jetzt hier weitere acht Interrupt

41:35.420 --> 41:40.240
-Controller angeschlossen und hier an deren Eingängen können wir dann

41:40.240 --> 41:44.980
Interrupt -Quellen direkt anbinden, sodass wir hier diese Möglichkeit

41:44.980 --> 41:47.560
haben von 64 Interrupt-Eingängen.

41:47.560 --> 41:50.380
Ja, wie funktioniert das Ganze?

41:51.540 --> 41:56.560
Das Ganze funktioniert so, dass dieser Master hier eigentlich die

41:56.560 --> 42:02.080
Priorisierung übernehmen muss und anschließend diese Interrupt

42:02.080 --> 42:05.020
-Anforderung an den Prozessor schicken muss.

42:05.780 --> 42:10.120
Das Interrupt-Acknowledgement-Signal kommt hier, wird dem Master und

42:10.120 --> 42:14.580
allen anderen Slaves hier zugeführt.

42:14.580 --> 42:19.400
Die Slaves, also die Interrupt-Anforderung von den einzelnen Slaves,

42:19.520 --> 42:23.920
die kommen ja hier an den Master, wie man sieht, beispielsweise hier

42:23.920 --> 42:30.420
auch, die werden hier priorisiert, zusammengefasst und so weiter und

42:30.420 --> 42:35.920
so fort und daraus eine einzige Anforderung an den Mikroprozessor

42:35.920 --> 42:36.320
geschickt.

42:36.480 --> 42:40.480
Das heißt, hier ist die Sache schon erledigt, wer jetzt überhaupt

42:40.480 --> 42:41.440
drankommt.

42:41.440 --> 42:45.740
Das heißt, wenn dieses Acknowledgement kommt, dann weiß jetzt die

42:45.740 --> 42:48.860
jeweilige Quelle, dass sie drin ist und deshalb muss dieses Interrupt

42:48.860 --> 42:52.980
-Acknowledgement -Signal gleichzeitig an allen, sowohl an den Master

42:52.980 --> 42:56.660
als auch an allen Slaves, geschaltet werden.

42:57.200 --> 43:03.620
Ja, die Auswahl unter diesen Slaves erfolgt hier über spezielle

43:03.620 --> 43:09.020
Signale, also diese drei Signale hier, Cas2 bis Cas0, die praktisch

43:09.020 --> 43:14.580
eins von diesen Slaves auswählen, je nachdem welche Entscheidung bei

43:14.580 --> 43:16.660
diesem Priorisierungsvorgang erfolgt.

43:17.640 --> 43:21.120
Hier ist ein Beispiel, wie das Ganze im PC aussieht.

43:21.720 --> 43:30.420
Das heißt, man hat hier zwei Interrupt-Controller, das sind die 8529

43:30.420 --> 43:39.600
von Entel und man hat hier die Möglichkeit, bis zu 15 Interrupt-fähige

43:39.600 --> 43:40.740
Geräte anzuschließen.

43:41.160 --> 43:47.340
Man sieht hier, dass bei dem Master die IRQ 0 und 1 für

43:47.340 --> 43:50.620
Systemzeitgeber und Tastatur belegt sind.

43:50.620 --> 43:57.920
Die IRQ 2 ist für den Slave hier reserviert und die restlichen drei,

43:58.180 --> 44:05.220
vier für COM2, also Serielle Schnittstellen, LBT und Floppy und LBT2

44:05.220 --> 44:06.280
und LBT1.

44:07.120 --> 44:11.820
Und hier natürlich die entsprechenden Sachen, die man an den Slave

44:11.820 --> 44:13.860
hier anschließen kann.

44:15.300 --> 44:18.840
Man sieht hier beispielsweise, es ist ganz interessant, das war hier

44:18.840 --> 44:23.300
so ein Interrupt-Eingang, was für den Co-Prozessor vorgesehen war.

44:24.040 --> 44:28.760
Zur Zeit wird das hier schwer wegen Systemfehler, glaube ich, bei

44:28.760 --> 44:31.740
Speicherverwaltung oder so benutzt.

44:32.160 --> 44:36.900
Aber mithilfe von dieser Kaskadierung, die man hier hat, das ist

44:36.900 --> 44:39.400
natürlich die gleiche Situation wie vorher.

44:39.720 --> 44:44.280
Ein Signal kommt nur von dem Master zu dem hier, ein Signal vom Slave

44:44.280 --> 44:50.080
an die IRQ 2 vom Master und das erkennt man sowohl am Master als auch

44:50.080 --> 44:54.860
an den Slave hier, und zwar über die speziellen INET-A-Eingänge.

44:56.620 --> 45:01.480
Und mit dieser Konfiguration, die man hat, hat man ja auch eine

45:01.480 --> 45:03.200
gewisse Priorisierung realisiert.

45:03.340 --> 45:10.240
Das heißt hier, die Priorität, das ist praktisch IRQ 0 und 1, also

45:10.240 --> 45:17.820
jetzt mit steigender Priorität, anschließend kommt das, was an IRQ 2

45:17.820 --> 45:22.140
angeschlossen ist, das heißt 8, 9, 10, 11 bis 15 und dann kommt die

45:22.140 --> 45:23.700
IRQ 3 dran.

45:24.420 --> 45:29.740
Das heißt, hier hat man die Priorität 0, 1, 8 bis 15 und dann 3 bis 7.

45:32.710 --> 45:38.570
Okay, das Ganze ist hier erklärt und die einzelnen Abkürzungen, was

45:38.570 --> 45:42.610
COM bedeutet und was LBT für die Leute, die das nicht wissen.

45:43.970 --> 45:46.390
Okay, so viel zu dem Thema, gibt es Fragen?

45:52.230 --> 45:58.330
Dann wollen wir noch schnell ein letztes Thema heute behandeln, und

45:58.330 --> 46:00.390
zwar der direkte Speicherzugriff.

46:00.390 --> 46:07.950
Wir haben oft den Begriff DMA und DMA-Controller erwähnt und bisher

46:07.950 --> 46:12.410
haben wir Datentransferaufgaben zwischen Prozessor und Speicher bzw.

46:12.770 --> 46:14.550
Prozessor und Peripherie betrachtet.

46:15.270 --> 46:20.090
Es ist klar, dass es oft notwendig ist, Daten zu transportieren

46:20.090 --> 46:24.970
zwischen Speicher und Peripherie, ohne den Umweg über den Prozessor

46:24.970 --> 46:32.310
zum Beispiel, oder Daten innerhalb des Speichers von einem Quellort zu

46:32.310 --> 46:37.370
einem Zielort zu kopieren oder auch direkt von einem Peripheriegerät

46:37.370 --> 46:38.910
zu einem anderen Peripheriegerät.

46:39.910 --> 46:44.170
Bei älteren und kleineren Systemen war das immer dem Prozessor

46:44.170 --> 46:44.730
überlassen.

46:45.770 --> 46:50.230
Bei modernen Prozessoren wird das Ganze mit Hilfe von sogenannten DMA

46:50.230 --> 46:52.490
-Controller erledigt.

46:52.490 --> 46:57.290
Das heißt, es sind Komponenten, die diese Datentransportaufgaben ohne

46:57.290 --> 47:02.610
Mitwirkung des Prozessors erledigen können und somit eine Entlastung

47:02.610 --> 47:03.990
für den Prozessor darstellen.

47:04.710 --> 47:07.690
Wir wollen das Ganze mal ein bisschen betrachten, und zwar anhand von

47:07.690 --> 47:12.270
einem einfachen Beispiel zur Datenübertragung zwischen Speicher und

47:12.270 --> 47:14.770
Peripherie mithilfe des Prozessors.

47:14.770 --> 47:18.830
Also zunächst mal ohne jetzt diese neue Maßnahme oder diese neue

47:18.830 --> 47:22.490
Hardware -Komponente, die diese Aufgabe schneller und

47:22.490 --> 47:25.790
prozessorfreundlicher erledigen kann.

47:27.310 --> 47:31.510
Das heißt, die Aufgabe wäre, bestimmte Daten hier von den Speichern zu

47:31.510 --> 47:36.670
dieser Eingabe-Ausgabe-Einheit, das könnte auch natürlich Speicher

47:36.670 --> 47:42.790
sein, das Ganze fängt damit an, dass jetzt der Prozessor irgendwo im

47:42.790 --> 47:44.850
Speicher ein Datum adressieren muss.

47:46.270 --> 47:50.330
Wenn der Prozessor das Datum im Speicher adressiert, dann wird das

47:50.330 --> 47:52.470
Datum ja in den Speicher geladen.

47:52.710 --> 47:58.370
Das kann nicht anders sein, da müssen halt die Daten irgendwie aus dem

47:58.370 --> 48:00.330
Speicher in den Prozessor geladen werden.

48:00.330 --> 48:06.050
Dazu ist hier ein LOAD-Befehl notwendig, also LADI des Register R mit

48:06.050 --> 48:09.250
dem Datum so und so aus dem Speicher.

48:11.190 --> 48:15.730
Anschließend, wenn das Datum hier im Mikroprozessor vorhanden ist,

48:15.830 --> 48:19.230
muss ja der Mikroprozessor...

48:23.710 --> 48:27.010
Entschuldigung, wir waren noch nicht beim Datum, sondern wir mussten

48:27.010 --> 48:29.150
ja zunächst mal den Befehl holen.

48:29.150 --> 48:34.770
Das heißt, der durch den Befehlszähler adressierte Befehl im Speicher

48:34.770 --> 48:39.350
muss zunächst mal hier geholt werden, beispielsweise LADI-Datum so und

48:39.350 --> 48:40.470
so in das Register R.

48:41.050 --> 48:45.730
Somit haben wir den Befehl geholt und jetzt im Befehl müssen wir das

48:45.730 --> 48:47.950
Datum hier aus dem Speicher holen.

48:48.090 --> 48:52.190
Das heißt, hier muss das Datum nochmal adressiert werden und das Datum

48:52.190 --> 48:55.190
in ein internes Register des Mikroprozessors geladen werden.

48:56.290 --> 49:04.290
Im nächsten Schritt müssen wir jetzt dieses Datum von einem internen

49:04.290 --> 49:09.730
Register des Prozessors irgendwo zur Peripherieeinheit beziehungsweise

49:09.730 --> 49:12.490
zu einem anderen Ort im Speicher transportieren.

49:12.590 --> 49:14.450
Das machen wir mit einem Store-Befehl.

49:14.450 --> 49:20.350
Das heißt, speichere ich den Inhalt vom Register R in einem

49:20.350 --> 49:27.210
Datenregister von einem Peripheriebaustein oder an einem anderen Ort

49:27.210 --> 49:27.830
im Speicher.

49:28.490 --> 49:30.390
Ja, was muss hier erfolgen?

49:31.410 --> 49:35.250
Muss natürlich hier in dem Fall zunächst mal der Befehl auch

49:35.250 --> 49:38.490
adressiert werden und aus dem Speicher geholt werden, also der

49:38.490 --> 49:40.710
Schreibbefehl oder der Store-Befehl.

49:40.710 --> 49:47.090
Und wenn das geschehen ist, dann weiß der Prozessor anhand von dem

49:47.090 --> 49:49.410
Schreibbefehl, wo was zu speichern ist.

49:49.590 --> 49:54.970
Das heißt, hier muss dieses Eingabe-Ausgabe-Gerät adressiert werden,

49:55.130 --> 49:58.110
also ein Datenregister, wo die Sachen abgelegt werden müssen,

49:58.830 --> 50:02.550
adressiert werden, was normalerweise durch die Adressdekodierung von

50:02.550 --> 50:06.210
diesen Peripherieeinheiten vorgegeben ist.

50:06.210 --> 50:12.970
Und dann kann ja das Datum vom internen Register des Prozessors zu

50:12.970 --> 50:16.450
diesem Zielort transportiert werden.

50:17.510 --> 50:22.410
Es ist klar, dass man jetzt nicht nur ein einziges Datum vielleicht

50:22.410 --> 50:25.910
hier transportieren will, sondern ein Datenblock.

50:26.030 --> 50:29.970
Das heißt, das Ganze realisiert man hier, indem man irgendwelche

50:29.970 --> 50:38.390
Zähler hat und wo man bestimmte Bedienungen hier für diese Schleife

50:38.390 --> 50:38.710
hat.

50:39.170 --> 50:43.650
Das heißt, da wird immer geguckt, wie viel wurde jetzt transportiert

50:43.650 --> 50:49.510
und wenn der ganze Block, also wenn dieser Zähler nachher auf Null

50:49.510 --> 50:52.130
ist, dann bedeutet der ganze Block wurde transformiert.

50:52.590 --> 50:56.230
Das heißt, wenn wir diese kleine Aufgabe betrachten, dass wir jetzt

50:56.230 --> 51:01.250
einen Block von Daten zwischen Speicher und Peripherie übertragen

51:01.250 --> 51:05.450
wollen, mithilfe von dem Prozessor, dann brauchen wir wie viele

51:05.450 --> 51:11.650
Speicherzugriffe, abgesehen von diesen Dekrementierungsbefehlen und

51:11.650 --> 51:15.070
von diesem Befehl für Schleifenabbruchbedienung.

51:15.470 --> 51:19.330
Da brauchen wir ja eigentlich mindestens hier die vier Befehle, um

51:19.330 --> 51:25.150
jetzt den Ladebefehl, Schreibbefehl zu holen, mindestens vier

51:25.150 --> 51:29.650
Speicherzugriffe, um den Ladebefehl, Schreibbefehl zu holen und

51:29.650 --> 51:33.390
anschließend die Daten zu lesen und wieder dorthin zu schreiben.

51:34.210 --> 51:38.770
So, das ist der Fall, wenn das Ganze über den Prozessor erfolgen soll.

51:39.370 --> 51:46.870
Das ist natürlich eine große Belastung für den Prozessor und auch eine

51:46.870 --> 51:53.290
große Belastung, nicht weil das viel Arbeit ist, sondern weil das

51:53.290 --> 51:56.890
viele Operationen sind, die über den Bus gehen und der Prozessor

51:56.890 --> 52:01.490
eigentlich so lange warten muss, bis diese Busoperation, ein Buszyklus

52:01.490 --> 52:02.950
oder so abgeschlossen ist.

52:03.090 --> 52:07.850
Das heißt, eigentlich könnte der Prozessor in der Zwischenzeit, wo er

52:07.850 --> 52:13.250
jetzt hier die Adresse ermittelt hat, wo das Datum hingeschrieben

52:13.250 --> 52:17.250
werden muss, könnte die Daten irgendwo ablegen, andere Sachen machen,

52:17.450 --> 52:22.650
die vielleicht nicht den Bus brauchen, und diese Aufgabe des

52:22.650 --> 52:24.830
Transports anderen Komponenten überlassen.

52:24.970 --> 52:27.670
Das ist genau, was bei DMA passiert.

52:28.790 --> 52:33.530
Also Nachteil, mindestens vier Speicherzugriffe, Abhilfe direkter

52:33.530 --> 52:37.630
Speicherzugriff, das heißt der Datentransfer ohne Beteiligung des

52:37.630 --> 52:42.110
Prozessors direkt zwischen den beteiligten Komponenten, also direkt

52:42.110 --> 52:45.590
zwischen Speicher und Speicher, beziehungsweise Speicher und

52:45.590 --> 52:46.130
Peripherie.

52:46.510 --> 52:52.430
Gucken wir uns das Ganze an, wie das vorher gemacht wurde, wer

52:52.430 --> 52:57.650
erledigt das, diese direkte Speicherzugriff, das erledigt ein

52:57.650 --> 53:06.170
ausgeprägter Systembaustein, das ist ein DMA-Controller, der diese

53:06.170 --> 53:11.710
Koordinationsaufgaben bei Datentransfers übernimmt.

53:12.530 --> 53:17.110
So, die Vorteile, die hier man hat, diese Speicherzugriffe für das

53:17.110 --> 53:21.390
Holen der Lade- und Speicherbefehle und Schleifenbefehle entfallen, da

53:21.390 --> 53:27.350
die Datenübertragungen jetzt nicht nur durch ein Softwareprogramm

53:27.350 --> 53:31.950
erledigt werden, sondern durch die Hardware, also durch den DMA

53:31.950 --> 53:32.530
-Controller.

53:32.830 --> 53:37.750
Der Prozessor wird in dem Fall entlastet und kann derweil andere Dinge

53:37.750 --> 53:41.410
tun, sofern diese Dinge den Systembus nicht benötigen.

53:42.490 --> 53:47.370
Gucken wir uns das Ganze an, wie das funktionieren könnte, wenn wir so

53:47.370 --> 53:51.110
einen DMA-Controller haben, der diese Transportaufgaben übernimmt.

53:51.670 --> 53:52.550
Was passiert da?

53:52.650 --> 53:56.450
Das heißt, wir haben einen Mikroprozessor, Speicher und Eingabe

53:56.450 --> 53:57.330
-Ausgabegerät.

53:57.330 --> 54:00.970
Wir wollen die gleiche Aufgabe wie vorher betrachten, wir wollen etwas

54:00.970 --> 54:08.750
vom Speicher, also hier ist die Quelle und hier ist unser Ziel, da

54:08.750 --> 54:10.770
wollen wir etwas hier transferieren.

54:11.810 --> 54:17.070
So, das heißt, hier im ersten Schritt, was der Prozessor eigentlich

54:17.070 --> 54:23.410
dem DMA-Controller mitteilen muss, der Prozessor, der muss ja dem DMA

54:23.410 --> 54:25.070
-Controller irgendetwas mitteilen.

54:25.170 --> 54:29.310
Der muss ihm mitteilen, dass Daten von dort nach da transportiert

54:29.310 --> 54:30.270
werden müssen.

54:30.770 --> 54:34.570
Er muss ihm mitteilen, wie viele Daten transportiert werden müssen und

54:34.570 --> 54:37.930
er muss ihm vielleicht mitteilen, in welche Richtung, vielleicht

54:37.930 --> 54:41.950
sollen die Daten ja doch andersrum transportiert werden.

54:42.930 --> 54:46.490
Deshalb muss zunächst mal der Prozessor den DMA-Controller

54:46.490 --> 54:46.810
adressieren.

54:46.810 --> 54:51.770
Das ist natürlich ein Baustein, was unter einer bestimmten Adresse

54:51.770 --> 54:53.110
angesprochen werden kann.

54:53.550 --> 54:57.850
Das heißt, hier die Adresse wird auf den Adressbus abgelegt, der DMA

54:57.850 --> 55:03.490
-Controller wird hier adressiert und anschließend muss der DMA

55:03.490 --> 55:05.330
-Controller einprogrammiert werden.

55:05.450 --> 55:09.030
Das heißt, diese ganzen Informationen, die zur Ausführung des

55:09.030 --> 55:13.070
Datentransfers notwendig sind, müssen vom Prozessor übermittelt werden

55:13.070 --> 55:17.010
und in internen Register von diesem DMA-Controller übernommen werden.

55:17.130 --> 55:22.830
Das heißt, wie gesagt, Startadresse des Datentransfers, Zieladresse,

55:23.050 --> 55:28.330
wie groß sind die Daten, in welche Richtung müssen die Daten

55:28.330 --> 55:30.590
transportiert werden und so weiter und so fort.

55:32.770 --> 55:38.050
Wenn der DMA-Controller das alles hat, dann ist die Aufgabe für den

55:38.050 --> 55:39.070
Prozessor erledigt.

55:39.910 --> 55:43.670
Dann muss der Prozessor eigentlich diesem DMA-Controller nur eine

55:43.670 --> 55:47.450
Buszuteilung machen, wenn der DMA-Controller die Anforderung gestellt

55:47.450 --> 55:47.790
hat.

55:48.230 --> 55:51.950
Und wenn der DMA-Controller die Buszuteilung bekommt, dann kann er

55:51.950 --> 55:56.170
diese Transferoperationen hier erledigen, ohne überhaupt den Prozessor

55:56.170 --> 56:00.490
hier zu ärgern.

56:01.390 --> 56:06.870
So, das heißt, der DMA-Controller hat anhand von diesen Informationen

56:06.870 --> 56:13.030
hier, also nicht nur Startadresse und ein Zähler, das ist klar, also

56:13.030 --> 56:16.710
Zähler, das heißt, wenn man die Startadresse hat und einen Zähler, der

56:16.710 --> 56:20.270
immer inkrementiert wird, dann weiß man, wie viele Daten überhaupt

56:20.270 --> 56:21.470
transportiert werden müssen.

56:21.950 --> 56:25.810
Das heißt, der DMA-Controller, der kann hier den Speicher adressieren,

56:25.810 --> 56:30.270
der kann beispielsweise die Daten aus dem Speicher holen in ein

56:30.270 --> 56:31.270
internes Register.

56:31.530 --> 56:34.130
Das ist so ein kleiner Mikroprozessor, das heißt, er hat so einen

56:34.130 --> 56:35.650
internen Datenregister.

56:36.410 --> 56:39.850
Der holt die Daten aus dem Speicher, schreibt die Daten drin in diesem

56:39.850 --> 56:40.730
internen Register.

56:41.670 --> 56:48.970
Anschließend wird hier das Eingabe-Ausgabe-Gerät oder auch der

56:48.970 --> 56:53.590
Speicher adressiert über eine Adresse beziehungsweise Auswahlsignale.

56:53.590 --> 57:00.130
Und nun kann er das Datum hier von diesem internen Register des DMA

57:00.130 --> 57:04.390
-Controller zu dem Eingabe-Ausgabe-Gerät oder, wie gesagt, halt zum

57:04.390 --> 57:06.450
Speicher übertragen werden.

57:07.550 --> 57:13.150
Das ist klar, wenn mehr als ein einziges Datum hier übertragen werden

57:13.150 --> 57:17.050
muss, denken wir an unsere Schleife, die wir hatten am Anfang, dann

57:17.050 --> 57:20.570
brauchen wir nichts anderes, als diesen Zähler hier zu inkrementieren

57:20.570 --> 57:25.410
oder dekrementieren, sodass halt der DMA-Controller weiß, jetzt sind

57:25.410 --> 57:28.550
alle Daten übertragen, jetzt wurden alle Daten übertragen.

57:29.410 --> 57:35.110
Diese Vorgehensweise hier, das heißt, nachdem der DMA-Controller alle

57:35.110 --> 57:39.910
notwendigen Informationen bekommen hat, dass er zunächst mal die Daten

57:39.910 --> 57:44.030
in ein internes Register holt und anschließend von dort aus zu dem

57:44.030 --> 57:49.370
Speicher transferiert, das ist eine Vorgehensweise, die als Two-Cycle

57:49.370 --> 57:51.830
-Transfer bezeichnet wird.

57:51.950 --> 57:57.170
Das heißt, einmal im ersten Zyklus werden die Daten geholt in den DMA

57:57.170 --> 58:01.450
-Controller, im zweiten vom DMA-Controller zum Eingabe-Ausgabe-Gerät.

58:01.950 --> 58:05.970
Es gibt aber eine andere Variante, bei der der DMA-Controller den

58:05.970 --> 58:10.130
Speicher hier adressiert, genauso wie vorher, das heißt, er weiß

58:10.130 --> 58:18.550
jetzt, welche Daten im Speicher angesprochen sind.

58:19.210 --> 58:26.750
Er weiß zum Beispiel, wie viele Daten transferiert werden müssen und

58:26.750 --> 58:27.270
wohin.

58:27.850 --> 58:33.130
Das heißt, was er macht, er adressiert jetzt den Zielbereich, also zum

58:33.130 --> 58:38.770
Beispiel diesen Eingabe-Ausgabe-Gerät und kann anschließend die Daten

58:38.770 --> 58:42.530
direkt vom Speicher zu diesem Gerät hier übertragen.

58:43.810 --> 58:50.010
Diese Vorgehensweise nennt man Fly-By-Transfer, das heißt, ohne den

58:50.010 --> 58:54.730
Umweg des Kopierens der Daten aus dem Speicher in ein internes

58:54.730 --> 58:56.950
Register des DMA-Controllers.

58:56.950 --> 59:04.030
Beide Varianten sind hier beschrieben, kann man, wenn man Lust hat

59:04.030 --> 59:08.330
oder wenn man das hier nicht verstanden hat, nachlesen.

59:08.970 --> 59:13.650
Wollen wir mal kurz sehen, wie ein DMA-Controller aufgebaut ist.

59:15.710 --> 59:19.230
Vielleicht habt ihr euch das bemerkt, vielleicht auch nicht, aber

59:19.230 --> 59:24.990
spitzens an der Stelle hier, DMA-Controller, Interrupt-Controller und

59:24.990 --> 59:27.270
was haben wir noch für einen Controller kennengelernt?

59:32.290 --> 59:36.350
So ein paar Vorlesungen, vielleicht sieben Vorlesungen.

59:39.350 --> 59:41.330
Die sehen fast alle gleich aus.

59:41.590 --> 59:45.210
Also wenn wir das Ganze hier betrachten und vergleichen mit dem, was

59:45.210 --> 59:47.330
wir heute gesehen haben, Interrupt-Controller.

59:47.330 --> 59:51.970
Das war ja nichts anderes als ein Steuerwerk, hat Statusregister,

59:52.130 --> 59:56.230
Steuerregister, ein Befehlsregister und eine Ausführungseinheit mit

59:56.230 --> 59:59.210
diesem Interrupt-Request-Register und einem Maskenregister,

59:59.430 --> 01:00:00.970
Prioritätsdecoder usw.

01:00:01.970 --> 01:00:05.630
Hier haben wir wiederum eine solche Ausführungseinheit, die immer

01:00:05.630 --> 01:00:09.270
zugeschnitten ist auf die Aufgabe des Controllers und eine

01:00:09.270 --> 01:00:12.770
Steuerungseinheit, die nichts anderes als eine Steuerung heißt und

01:00:12.770 --> 01:00:16.030
einen Status-, Befehls- und Steuerregister besitzt.

01:00:17.730 --> 01:00:21.370
Der dritte Typ von denen hier, was wir vor sieben oder acht

01:00:21.370 --> 01:00:25.250
Vorlesungen kennengelernt haben, war der DRAM-Controller.

01:00:27.230 --> 01:00:30.030
Also die sehen alle im Prinzip so aus.

01:00:30.490 --> 01:00:33.070
Gut, gucken wir uns das Ganze mal ein bisschen an.

01:00:34.490 --> 01:00:38.210
Mit welchem Signal oder mit welcher Bezeichnung können wir hier nichts

01:00:38.210 --> 01:00:38.770
anfangen?

01:00:39.350 --> 01:00:43.050
Also wenn wir jetzt die Funktionalität oder das Prinzip von DMA

01:00:43.050 --> 01:00:47.910
verstanden haben, dann können wir eigentlich mit jedem Wort hier etwas

01:00:47.910 --> 01:00:50.370
anfangen und wissen, wozu das notwendig ist.

01:00:53.410 --> 01:00:56.350
Okay, Reset und Takt, klar.

01:00:57.330 --> 01:00:59.950
Warum müssen wir was resetten hier?

01:01:06.410 --> 01:01:06.970
Vorschläge?

01:01:11.630 --> 01:01:14.690
Es ist das Reset-Signal vom System eigentlich.

01:01:14.870 --> 01:01:18.390
Warum muss das Signal auch dem DMA-Controller zugeführt werden?

01:01:20.170 --> 01:01:21.530
Ist doch klar, oder?

01:01:22.470 --> 01:01:26.310
Wenn das System resetet wird, muss ja auch der DMA-Controller resettet

01:01:26.310 --> 01:01:26.550
werden.

01:01:30.490 --> 01:01:35.830
Takt, irgendwelche Adressen, also die Anfangsadressen, also die

01:01:35.830 --> 01:01:41.470
niederwertigen Bits der Adressen A0 bis A1, wozu eigentlich?

01:01:45.850 --> 01:01:49.650
Was haben Adressleitungen hier zu suchen an dem DMA-Controller?

01:01:50.750 --> 01:01:52.490
Und zwar als Eingang.

01:01:54.110 --> 01:01:56.190
Der DMA-Controller muss adressiert werden, oder?

01:01:59.010 --> 01:01:59.370
Gut.

01:02:02.530 --> 01:02:05.310
CS, was ist das?

01:02:13.120 --> 01:02:14.040
Neben Markus?

01:02:17.100 --> 01:02:17.380
Ja?

01:02:18.200 --> 01:02:20.200
Chip Select, okay, was macht das?

01:02:24.230 --> 01:02:24.690
Lauter?

01:02:27.770 --> 01:02:31.410
Also da wird der Baustein ausgewählt, also selektiert, der DMA

01:02:31.410 --> 01:02:31.870
-Controller.

01:02:32.410 --> 01:02:33.530
So, dann gehen wir weiter.

01:02:33.810 --> 01:02:35.590
Ready, Hold und Hold A.

01:02:41.080 --> 01:02:45.680
Ready, das ist das gleiche Ready-Signal von der gestrigen Vorlesung.

01:02:47.540 --> 01:02:51.480
Also mit diesem Ready-Signal konnte man festlegen, oder hat man dem

01:02:51.480 --> 01:02:55.140
Prozessor gesagt, ob er jetzt irgendwelche Wartezyklen einlegen muss

01:02:55.140 --> 01:02:55.780
oder nicht.

01:02:57.660 --> 01:02:59.620
Hold und Hold A.

01:03:01.860 --> 01:03:08.360
Über das Hold, das Ausgangssignal Hold, wird eine DMA, eine

01:03:08.360 --> 01:03:13.060
Anforderung an den Prozessor gestellt, dass der DMA-Controller den Bus

01:03:13.060 --> 01:03:15.280
braucht eigentlich für eine Transferoperation.

01:03:16.240 --> 01:03:21.260
Und über Hold A wird dieses Acknowledgement für diese Anforderung an

01:03:21.260 --> 01:03:22.820
den Controller geleitet.

01:03:23.660 --> 01:03:28.580
So, das heißt, somit haben wir eigentlich hier die Schnittstelle zum

01:03:28.580 --> 01:03:29.820
Mikroprozessor.

01:03:31.360 --> 01:03:36.100
Hier haben wir die Schnittstelle zu Peripheriegeräten.

01:03:39.710 --> 01:03:46.050
Es ist klar, ein Peripheriegerät muss ein Request hier an den DMA

01:03:46.050 --> 01:03:50.610
-Controller stellen, ein Acknowledgement von dem DMA-Controller dann

01:03:50.610 --> 01:03:56.230
an dieses entsprechende Gerät, und dann gibt es hier ein Signal, was

01:03:56.230 --> 01:04:00.910
ja das Endi der Übertragung einer bestimmten Operation signalisiert,

01:04:01.050 --> 01:04:01.770
also End.

01:04:04.190 --> 01:04:07.890
Okay, Befehlsregister, Steuerregister und Statusregister, die haben

01:04:07.890 --> 01:04:12.570
unterschiedliche Flags oder Bits drin, mit unterschiedlichen

01:04:12.570 --> 01:04:17.210
Funktionalitäten, da wollen wir darauf hier heute oder hier in der

01:04:17.210 --> 01:04:18.750
Vorlesung überhaupt nicht mehr eingehen.

01:04:18.750 --> 01:04:24.990
Ausführungseinheit, was sind die Sachen, die hier relevant sind?

01:04:25.510 --> 01:04:31.970
Wir haben hier ein Adresszähler, Zielbereich, Adresszähler,

01:04:32.510 --> 01:04:40.830
Quellbereich, ein Datenzähler mit automatischer Dekrementierung, ein

01:04:40.830 --> 01:04:41.950
Datenbus -Buffer.

01:04:43.690 --> 01:04:52.610
Zu jedem dieser Zähler hier haben wir ein Basisregister für die

01:04:52.610 --> 01:05:00.530
Weitanzahl, die man übertragen will, hier ein Basisadressregister des

01:05:00.530 --> 01:05:04.990
Quellbereiches und hier ein Basisadressregister des Zielbereiches.

01:05:06.050 --> 01:05:07.910
Gut, das heißt,

01:05:11.510 --> 01:05:17.990
wenn man jetzt etwas, nehmen wir mal an, wir wollen etwas vom Speicher

01:05:17.990 --> 01:05:24.830
zu einem Peripheriegerät übertragen, dann heißt das, dass die Adresse

01:05:24.830 --> 01:05:30.050
des Zieles fest ist und immer durch das Datenregister von diesem

01:05:30.050 --> 01:05:31.770
Peripheriegerät vorgegeben ist.

01:05:31.770 --> 01:05:36.030
Diese Adresse, die wird aber in diesem Zielbereich hier, also

01:05:36.030 --> 01:05:38.530
Adressregister hier, abgelegt.

01:05:38.930 --> 01:05:42.670
Die Adresse vom Speicher ab dem, was kopiert werden muss oder

01:05:42.670 --> 01:05:47.130
übertragen werden muss zum Peripheriegerät, die kommt hier.

01:05:51.210 --> 01:05:54.650
Was für Unterschiede gibt es jetzt, wenn diese Transferoperation

01:05:54.650 --> 01:05:59.050
zwischen Speicher und Speicher ist und nicht zwischen Speicher und

01:05:59.050 --> 01:06:00.030
Peripheriegerät?

01:06:01.870 --> 01:06:02.830
Weiß es jemand?

01:06:05.110 --> 01:06:12.150
Also es ist klar, wenn wir eine Transferoperation, ein Block aus dem

01:06:12.150 --> 01:06:18.070
Speicher zu einem Peripheriegerät, dann erfolgt das Ganze ja so, dass

01:06:18.070 --> 01:06:23.490
wir hier vielleicht das erste Wort nehmen, das zweite, das dritte, das

01:06:23.490 --> 01:06:26.930
erste Wort oder das erste Byte.

01:06:29.390 --> 01:06:31.530
Nehmen wir mal an, das ist eine Tastatur.

01:06:33.530 --> 01:06:35.750
Wir wollen was hier rüberschreiben.

01:06:38.870 --> 01:06:42.430
Dann haben wir eigentlich meist hier bei diesen Peripheriegeräten, die

01:06:42.430 --> 01:06:47.850
sind alle so byte-orientiert, also 8-Bit-Datenregister hier in der

01:06:47.850 --> 01:06:49.810
Schnittstellung, die sie besitzen.

01:06:49.810 --> 01:06:51.790
Gut, aber egal jetzt.

01:06:51.910 --> 01:06:56.170
Wir wollen hier ein Bereich dorthin kopieren.

01:06:56.290 --> 01:07:00.310
Dann ist die Adresse von diesem Zielregister fest und die

01:07:00.310 --> 01:07:04.950
Anfangsadresse von dem Bereich hier, was wir kopieren wollen, haben

01:07:04.950 --> 01:07:09.010
wir ja als eine Basisadressregister des Quellbereiches, die wird hier

01:07:09.010 --> 01:07:09.670
abgelegt.

01:07:10.670 --> 01:07:14.110
Wir haben hier einen Adresszähler, der praktisch so lange

01:07:14.110 --> 01:07:17.970
inkrementiert wird, bis die gesamte zu übertragende Menge an Daten

01:07:17.970 --> 01:07:21.470
übertragen wird.

01:07:22.290 --> 01:07:26.410
Und ansonsten bei dem Zielbereich hier haben wir eine feste Adresse,

01:07:26.710 --> 01:07:30.010
es sei denn, wir wollen ja die Übertragung zwischen Speicher und

01:07:30.010 --> 01:07:30.590
Speicher.

01:07:32.270 --> 01:07:35.690
Dann ist es klar, dass die Adresse hier nicht mehr fest ist, sondern

01:07:35.690 --> 01:07:40.010
dass wir hier die Anfangsadresse eingeben müssen, und zwar die

01:07:40.010 --> 01:07:44.210
Basisadressregister hier vom Zielbereich und anschließend über einen

01:07:44.210 --> 01:07:48.830
Adresszähler die Menge der zu übertragenden Daten vorgeben können.

01:07:54.910 --> 01:07:57.290
Wie kann das Ganze jetzt hier erfolgen?

01:07:57.430 --> 01:08:00.410
Das heißt, wir haben alle Adressen, die wir brauchen für diese

01:08:00.410 --> 01:08:03.790
Transferoperation und was müssen wir machen?

01:08:06.030 --> 01:08:15.990
Also, betrachten wir die Situation Speicher, Eingabe, Ausgabegerät,

01:08:17.850 --> 01:08:22.330
dann ist es klar, dass wir zunächst mal den Speicher adressieren

01:08:22.330 --> 01:08:25.750
müssen, das heißt die Adresse hier vom Anfangsbereich müssen wir

01:08:25.750 --> 01:08:30.970
irgendwie auf den Adressbus legen, irgendetwas aus dem Speicher holen,

01:08:31.090 --> 01:08:36.070
das heißt das Read-Signal müssen wir hier auf Read setzen und nicht

01:08:36.070 --> 01:08:36.690
auf Write.

01:08:40.330 --> 01:08:43.870
Anschließend werden die Daten aus dem Speicher geholt, in diesem

01:08:43.870 --> 01:08:46.350
Datenbus -Buffer abgelegt.

01:08:48.190 --> 01:08:52.510
Im nächsten Zyklus muss natürlich die Adresse vom Zielbereich hier auf

01:08:52.510 --> 01:08:55.430
den Adressbus gelegt werden.

01:08:56.230 --> 01:09:00.530
Wir wollen ja etwas irgendwo schreiben, vielleicht im Speicher oder

01:09:00.530 --> 01:09:06.270
vielleicht auch im I.O.-Bereich, das wird gekennzeichnet hier durch

01:09:06.270 --> 01:09:11.530
dieses IOR und IOW, also wenn das der Fall ist, dann heißt dieses

01:09:11.530 --> 01:09:12.210
Signal so.

01:09:12.930 --> 01:09:16.410
Das heißt, das ist jetzt eine Schreibeoperation eigentlich, das legt

01:09:16.410 --> 01:09:20.570
man fest hier mithilfe von diesem Signal, die Adresse liegt hier an,

01:09:21.090 --> 01:09:24.670
kommt von da, machen wir eine andere Farbe, wir haben ja so viele,

01:09:26.370 --> 01:09:31.450
kommt von hier da jetzt, wird auf den Adressbus und gibt das Ziel an

01:09:31.450 --> 01:09:37.090
und anschließend können die Daten hier auf den Datenbus abgelegt

01:09:37.090 --> 01:09:41.290
werden, sodass sie dorthin übertragen werden können.

01:09:43.310 --> 01:09:49.890
Jetzt die Frage ist, funktioniert das Ganze eigentlich bei einem Flyby

01:09:49.890 --> 01:09:50.510
-Transfer?

01:10:00.820 --> 01:10:01.900
Warum nicht?

01:10:05.280 --> 01:10:07.860
Ja, du hast Nein gesagt und deshalb frage ich.

01:10:21.520 --> 01:10:27.360
Was war bei dem... Entschuldigung, meine Frage ist falsch.

01:10:28.280 --> 01:10:33.160
Funktioniert das Ganze beim Transfer vom Speicher zum Speicher im

01:10:33.160 --> 01:10:35.220
Flyby -Transfer-Modus?

01:10:41.310 --> 01:10:42.450
Warum nicht?

01:10:45.130 --> 01:10:50.010
Ganz genau, weil wir nicht gleich zwei Adressen praktisch auf dem Bus

01:10:50.010 --> 01:10:51.570
legen können.

01:10:52.890 --> 01:10:55.750
Also deshalb funktioniert das in diesem Modus nicht.

01:10:56.790 --> 01:11:01.210
Okay, das heißt, der Aufbau, wie man hier sieht, ist relativ einfach,

01:11:01.310 --> 01:11:07.730
wenn man das Ganze verstanden hat, was getan werden muss und welche

01:11:07.730 --> 01:11:10.870
Aufgabe überhaupt diese DMA-Kontrolle hat.

01:11:11.350 --> 01:11:15.790
Hier ist nochmal das Ganze zusammengefasst, also einmal diese drei

01:11:15.790 --> 01:11:19.450
Register, die in der Ausführungseinheit oder hier Operationswerk

01:11:19.450 --> 01:11:25.470
genannt, Datenzähler, Adresszähler 1, Adresszähler 2 und die

01:11:25.470 --> 01:11:29.790
Basisregister für die drei Zähler, wie gesagt, die speichern immer die

01:11:29.790 --> 01:11:30.710
Anfangswerte.

01:11:32.010 --> 01:11:39.070
Und ansonsten will ich hier zuletzt auf die DMA-Übertragungsarten

01:11:39.070 --> 01:11:46.170
eingehen und diese drei Varianten von Einzeltransfer, Blocktransfer

01:11:46.170 --> 01:11:50.230
und Transfer auf Anforderung kurz erklären und die Unterschiede.

01:11:54.670 --> 01:11:58.630
Diese Übertragungsarten, die kann man ja festlegen, das heißt, bei den

01:11:58.630 --> 01:12:04.390
DMA -Kontrollen, die kann man ja unter unterschiedlichen Modi oder

01:12:04.390 --> 01:12:08.570
zwischen unterschiedlichen Übertragungsarten wählen.

01:12:09.290 --> 01:12:11.710
Und bei dem ersten, das ist Einzeltransfer.

01:12:12.750 --> 01:12:18.750
Einzeltransfer bedeutet, es wird genau ein Datum übertragen, ein Datum

01:12:18.750 --> 01:12:22.290
übertragen bedeutet, dass der DMA-Kontroller den vollen Zugriff auf

01:12:22.290 --> 01:12:23.490
den Systembus hat.

01:12:24.150 --> 01:12:28.310
Danach wird der Systembus für den Mikroprozessor freigegeben.

01:12:30.110 --> 01:12:33.990
So, wie funktioniert das Ganze, sieht man anhand von diesem einfachen

01:12:33.990 --> 01:12:35.290
Zeitdiagramm.

01:12:35.290 --> 01:12:42.690
Wir haben hier ein Takt-Signal, wir haben hier ein Request, also von

01:12:42.690 --> 01:12:48.510
einer Einheit, die jetzt irgendetwas transportieren will.

01:12:51.450 --> 01:12:55.250
Wenn dieses Request-Signal, das war ein Eingangssignal zum Steuerwerk

01:12:55.250 --> 01:13:02.270
des DMA-Kontrollers, wenn dieses Signal hier aktiviert wird, dann wird

01:13:02.270 --> 01:13:09.310
eine Anforderung an den Prozessor gestellt.

01:13:09.890 --> 01:13:12.650
Der DMA-Kontroller fordert den Systembus an.

01:13:14.950 --> 01:13:19.690
Frühestens nach einem Taktzyklus kommt eine Zuteilung von dem

01:13:19.690 --> 01:13:25.330
Prozessor, das heißt, du DMA-Kontroller kannst jetzt mal den Bus

01:13:25.330 --> 01:13:29.870
übernehmen, oder du kannst Busmaster werden.

01:13:30.750 --> 01:13:35.210
So, wenn das der Fall ist, dann muss was jetzt passieren, dann muss

01:13:35.210 --> 01:13:42.590
der DMA-Kontroller mit der eigentlichen Übertragungsaufgabe beginnen.

01:13:42.590 --> 01:13:50.350
Dazu kann der DMA-Kontroller jetzt die Adressen, die er braucht, auf

01:13:50.350 --> 01:13:58.930
dem Adressbus legen und anschließend die Daten auf dem Datenbus.

01:14:00.410 --> 01:14:01.610
So,

01:14:07.470 --> 01:14:17.470
über dieses Ready-Signal hier weiß der Mikroprozessor, das war ja ein

01:14:17.470 --> 01:14:25.970
Eingangssignal, dass die Übertragung der Operation hier abgeschlossen

01:14:25.970 --> 01:14:30.730
ist und dass keine weiteren Wartezyklen hier eingefügt werden und über

01:14:30.730 --> 01:14:39.450
dieses End-of-Operation-Prozess kann man halt hier entweder die

01:14:39.450 --> 01:14:43.490
Übertragung fortsetzen, wenn das noch nicht beendet ist, oder

01:14:43.490 --> 01:14:45.150
abbrechen zu diesem Zeitpunkt.

01:14:47.910 --> 01:14:51.010
So, warum heißt das eigentlich Einzeltransfer?

01:14:51.910 --> 01:14:57.610
Das heißt Einzeltransfer, weil nach der Übertragung von diesem Datum

01:14:57.610 --> 01:15:04.370
hier die Kontrolle über den Systembus an den Prozessor wieder

01:15:04.370 --> 01:15:06.090
übergeben wird.

01:15:06.410 --> 01:15:11.390
Das heißt, der DMA-Kontroller, der muss in dem Fall nach der

01:15:11.390 --> 01:15:19.110
Übertragung hier, also wenn jetzt hier dieses Request-Signal noch mal

01:15:19.110 --> 01:15:23.610
oder weiterhin aktiv bleibt und der DMA-Kontroller noch etwas

01:15:23.610 --> 01:15:27.950
übertragen will, der würde in diesem Modus das nicht schaffen, weil er

01:15:27.950 --> 01:15:32.750
nach der Übertragung des ersten Datums hier praktisch den Systembus

01:15:32.750 --> 01:15:37.450
abgeben muss und der Prozessor erneut entscheiden muss, ob der DMA

01:15:37.450 --> 01:15:40.370
-Kontroller die erneute Zuteilung bekommt oder nicht.

01:15:41.330 --> 01:15:47.270
Die andere oder die zweite Variante ist dieser Block-Transfer.

01:15:47.470 --> 01:15:51.790
Das heißt, dass der DMA-Kontroller wirklich alle Daten eines Blocks

01:15:51.790 --> 01:15:57.070
auf einmal überträgt, ohne zwischenzeitliche Busfreigabe.

01:15:57.790 --> 01:16:01.190
Das heißt, sobald er den Systembus einmal bekommen hat, überträgt er

01:16:01.190 --> 01:16:08.730
die ganzen Daten eines Blocks und zwar auch, wenn dieses Request

01:16:08.730 --> 01:16:11.570
-Signal hier nicht mehr aktiv ist, wie man hier sieht.

01:16:11.750 --> 01:16:15.790
Das heißt, danach interessiert das nicht hier, ob jetzt dieses Request

01:16:15.790 --> 01:16:19.290
-Signal anliegt oder nicht, sondern es werden die ganzen Daten von

01:16:19.290 --> 01:16:20.450
diesem Block übertragen.

01:16:21.010 --> 01:16:26.850
Das Ganze erfolgt wie vorher, ein Request nach einem Tagzyklus, eine

01:16:26.850 --> 01:16:31.830
Anforderung an den Prozessor für Zuteilung des Systembusses, die

01:16:31.830 --> 01:16:34.510
Quittierung oder ein Acknowledgement vom Prozessor.

01:16:35.010 --> 01:16:39.570
Das heißt, ab dem Zeitpunkt hier übernimmt der DMA-Kontroller die

01:16:39.570 --> 01:16:49.070
Macht über den Systembus, also Adressbus und Datenbus, legt die

01:16:49.070 --> 01:16:57.610
Adressen an den Adressbus die Daten hier und kann schon das erste

01:16:57.610 --> 01:16:58.670
Datum übertragen.

01:16:59.410 --> 01:17:04.130
Ready und Weiterfortsetzung, wenn diese beiden Signale in der

01:17:04.130 --> 01:17:09.630
Konfiguration hier stehen, dann kann hier die zweite Adresse, also die

01:17:09.630 --> 01:17:14.710
nächste Adresse eigentlich an den Adressbus eingelegt werden.

01:17:14.810 --> 01:17:18.910
Das wird ja durch diesen Adresszähler inkrementiert und somit ist ja

01:17:18.910 --> 01:17:20.670
die nächste Adresse auf den Adressbus.

01:17:20.670 --> 01:17:24.290
Dann kommt ja das nächste Datum hier und so weiter, bis der ganze

01:17:24.290 --> 01:17:28.830
Block hier übertragen wird.

01:17:29.470 --> 01:17:35.530
Anschließend wird hier, wenn jetzt diese Anforderung zurückgeht, also

01:17:35.530 --> 01:17:41.290
wenn der DMA-Kontroller seine Anforderung zurücknimmt, hat der

01:17:41.290 --> 01:17:45.170
Prozessor die Möglichkeit auf den Bus zuzugreifen.

01:17:47.610 --> 01:17:50.310
Das heißt, wir haben hier zwei Varianten.

01:17:50.530 --> 01:17:56.990
Einmal dieses Minimum, nur ein Datum übertragen und dann Systembus an

01:17:56.990 --> 01:18:02.030
den Prozessor zurückgeben und einmal einen ganzen Block übertragen,

01:18:02.170 --> 01:18:08.630
sobald der DMA-Kontroller den Systembus, sobald er den Systembus

01:18:08.630 --> 01:18:11.610
erhalten hat, einen ganzen Block übertragen und erst dann den

01:18:11.610 --> 01:18:12.750
Systembus freigeben.

01:18:12.750 --> 01:18:16.590
Es gibt eine dritte Variante und zwar, das ist eine Mittelstellung

01:18:16.590 --> 01:18:18.550
zwischen den beiden.

01:18:19.150 --> 01:18:27.210
Das heißt, hier wird eine Datenübertragung so lange ohne Unterbrechung

01:18:27.210 --> 01:18:30.750
durchgeführt, solange dieses Request-Signal anliegt.

01:18:32.030 --> 01:18:35.910
Das heißt, eigentlich in diesem Bereich hier, für das erste Request,

01:18:35.910 --> 01:18:41.490
haben wir nichts anderes als eine Block-Übertragung.

01:18:41.830 --> 01:18:46.410
Aber mit dem Unterschied jetzt, wenn hier dieses Request-Signal nicht

01:18:46.410 --> 01:18:50.030
mehr anliegt, übernimmt der Mikroprozessor hier die Kontrolle über den

01:18:50.030 --> 01:18:55.930
Bus und diese Kontrolle kann der DMA-Kontroller erst dann wieder

01:18:55.930 --> 01:19:02.290
gewinnen, wenn eine erneute Anforderung an den DMA-Kontroller auch von

01:19:02.290 --> 01:19:04.370
der gleichen Komponente erfolgt.

01:19:05.190 --> 01:19:11.290
So, das heißt, hier erfolgt ein Datentransfer in Schuppen, häufig von

01:19:11.290 --> 01:19:16.230
Peripheriegeräten benutzt, und zwar aus dem einfachen Grund, weil

01:19:16.230 --> 01:19:21.110
diese Peripheriegeräte, wie gesagt, weit orientiert sind und diese

01:19:21.110 --> 01:19:29.550
unterschiedlichen Datenbussbreiten, also zwischen 8-Bit und 32-Bit des

01:19:29.550 --> 01:19:31.690
Datenbusses.

01:19:32.430 --> 01:19:37.830
Okay, besonders zu beachten sind, wie gesagt, einmal diese

01:19:37.830 --> 01:19:41.990
unterschiedlichen Breiten von Quelle und Ziel, das heißt, Übertragung

01:19:41.990 --> 01:19:47.330
von einem 8-Bit-breiten Peripheriegerät in den 32-Bit-breiten

01:19:47.330 --> 01:19:48.170
Hauptspeicher.

01:19:48.750 --> 01:19:53.590
Das sind Aufgaben, die auch der DMA-Kontroller hier übernimmt, indem

01:19:53.590 --> 01:20:01.290
beispielsweise in die eine Richtung, also von Peripherie zum Speicher,

01:20:01.390 --> 01:20:05.870
die Daten gesammelt werden, also zum Beispiel 4-Bytes und dann erst

01:20:05.870 --> 01:20:09.270
dann in den Speicher übertragen werden oder in die andere Richtung vom

01:20:09.270 --> 01:20:13.610
Speicher zur Peripherie, dass die Daten zerlegt werden in die

01:20:13.610 --> 01:20:17.130
entsprechenden Breiten, die die Peripherieeinheiten benötigen.

01:20:17.130 --> 01:20:21.830
Das zweite Problem ist diese Übertragung von Daten an nicht

01:20:21.830 --> 01:20:24.250
ausgerichteten Adressen.

01:20:24.890 --> 01:20:29.050
Das heißt, mehrere Speicherzugriffe zum Lesen und Schreiben eines

01:20:29.050 --> 01:20:33.930
Datums sind hier notwendig und wie gesagt, die DMA-Kontroller, die

01:20:33.930 --> 01:20:38.950
erledigen das oder die lösen diese Probleme mithilfe von

01:20:38.950 --> 01:20:40.250
unterschiedlichen Maßnahmen.

01:20:40.250 --> 01:20:45.330
Einmal diese Inkrementierung, die wir ja auch gesehen haben, also

01:20:45.330 --> 01:20:50.090
diese Skalierung bei der Inkrementierung von den Adresszählern, einmal

01:20:50.090 --> 01:20:56.670
die Zerlegung und das Sammeln von Daten vor dem Weitertransport und

01:20:56.670 --> 01:21:02.350
einmal diese automatische Erkennung von Zugriffen auf nicht

01:21:02.350 --> 01:21:05.390
ausgerichtete Daten im Speicher.

01:21:05.990 --> 01:21:13.370
Gut, ich glaube, ich will das Thema hiermit abschließen und für die

01:21:13.370 --> 01:21:18.410
Aufmerksamkeit bedanken und somit...

