Refactor erste Kapitel
BIN
Assets/RA2_Ausführungsphase.png
Normal file
After Width: | Height: | Size: 58 KiB |
BIN
Assets/RA2_Befehlsholphase.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
Assets/RA2_Operanden.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
Assets/RA2_Speicherzugriff.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
Assets/RA2_WriteBack.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
Assets/RA2_decodierphase.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
Assets/RA2_mehrzyklenCPU.png
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
Assets/RA2_pipelineCPU.png
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
Assets/RA2_weitereSprungbefehle.png
Normal file
After Width: | Height: | Size: 37 KiB |
@ -15,32 +15,24 @@ author: Robert Jeutter
|
|||||||
- Hardware-Aufbau von Komponenten, die die Rechnerarchitektur realisieren
|
- Hardware-Aufbau von Komponenten, die die Rechnerarchitektur realisieren
|
||||||
- Speichereinheiten, Recheneinheiten, Verbindungssysteme,
|
- Speichereinheiten, Recheneinheiten, Verbindungssysteme,
|
||||||
|
|
||||||
Abstraktionsebenen eines Rechnersystems
|
|
||||||
| Anwendungsprogramm | Java, C,... |
|
|
||||||
| Assemblerprogramm | Betriebssystem-Ebene |
|
|
||||||
| Maschinenprogramm | Betriebssystem-Ebene |
|
|
||||||
| Register Transfer Verhaltensebene | Reg[2]:=Reg[3] |
|
|
||||||
| Register Transfer Strukturebene | Addierer, Multiplexer, Register |
|
|
||||||
| Gatterebene | $f=a\vee bc$ |
|
|
||||||
| Transistorebene | |
|
|
||||||
|
|
||||||
Grundarchitekturen:
|
Grundarchitekturen:
|
||||||
- Harvard (Zugriff direkt durch Prozessor)
|
- Harvard (Zugriff direkt durch Prozessor)
|
||||||
- Princton/von-Neumann (Zugriff über Systembus)
|
- Princton/von-Neumann (Zugriff über Systembus)
|
||||||
|
|
||||||
|
|||
|
||||||
|
| -- | -- |
|
||||||
| Speicher | Daten und Instruktionen speichern |
|
| Speicher | Daten und Instruktionen speichern |
|
||||||
| Steuerwerk | beinhaltet Programmzähler um Ausführung zu steuern |
|
| Steuerwerk | beinhaltet Programmzähler um Ausführung zu steuern |
|
||||||
| Rechenwerk | auch ALU (Arithmetic and Logic Unit) um Berechnung durchzuführen
|
| Rechenwerk | auch ALU (Arithmetic and Logic Unit) um Berechnung durchzuführen |
|
||||||
Üblicherweise besitzt eine Recheneinheit (CPU) Daten- oder Rechenregister (Registermaschine). Berechnungen werden ausschließlich mit den Registern vorgenommen.
|
|
||||||
|
Üblicherweise besitzt eine Recheneinheit (CPU) Daten- oder Rechenregister (Registermaschine). Berechnungen werden ausschließlich mit den Registern vorgenommen. Die Hauptaufgabe der Recheneinheit besteht darin,
|
||||||
- Daten aus Hauptspeicher in Register laden
|
- Daten aus Hauptspeicher in Register laden
|
||||||
- Berechnungsaufgaben durchführen
|
- Berechnungsaufgaben durchführen
|
||||||
- Ergebnisse in Hauptspeicher ablegen
|
- Ergebnisse in Hauptspeicher ablegen
|
||||||
|
|
||||||
Klassifikation von Befehlssatzarchitekturen
|
Klassifikation von Befehlssatzarchitekturen
|
||||||
- 0-Operand (Stack): Add
|

|
||||||
- 1-Operand (Akkumulator): Add R1
|
|
||||||
- 2-Operand: Add R1, R3
|
|
||||||
- 3-Operand: Add R1, R2, R3
|
|
||||||
|
|
||||||
|
|
||||||
# Prozessorarchitektur
|
# Prozessorarchitektur
|
||||||
@ -50,13 +42,13 @@ Klassifikation von Befehlssätzen nach der Gestaltung/Ausprägung der vorhandene
|
|||||||
| CISC | RISC | MIPS |
|
| CISC | RISC | MIPS |
|
||||||
| -- | -- | -- |
|
| -- | -- | -- |
|
||||||
| Complex Instruction Set Computing | Reduced Instruction Set Computing | Microprocessor without interlocked pipeline stages |
|
| Complex Instruction Set Computing | Reduced Instruction Set Computing | Microprocessor without interlocked pipeline stages |
|
||||||
| Einfache und komplexe Befehle | Nur einfache Befehle | |
|
| Einfache und komplexe Befehle | wenige, einfache Befehle | 32-bit Architektur/64-bit Erweiterung|
|
||||||
| Heterogener Befehlssatz | Orthogonaler Befehlssatz | |
|
| Heterogener Befehlssatz | Orthogonaler Befehlssatz | |
|
||||||
| Verschiedene Taktzahl pro Befehl | Meist 1 Takt pro Befehl | |
|
| Verschiedene Taktzahl pro Befehl | Meist 1 Takt pro Befehl | |
|
||||||
| Viele Befehlscode-Formate mit unterschiedlicher Länge | Wenige Befehlscode-Formate mit einheitlicher Länge | |
|
| Viele Befehlscode-Formate mit unterschiedlicher Länge | Wenige Befehlscode-Formate mit einheitlicher Länge | |
|
||||||
| Mikroprogrammwerk | Direktverdrahtung | |
|
| Mikroprogrammwerk | Direktverdrahtung | |
|
||||||
| Vermischung von Verarbeitungs- und Speicherbefehlen | Trennung von Verarbeitungs- und Speicherbefehlen | |
|
| Vermischung von Verarbeitungs- und Speicherbefehlen | Trennung von Verarbeitungs- und Speicherbefehlen | |
|
||||||
| schwierig, unter CPI = 2 zu kommen | CPI möglichst nicht über 1 | |
|
| schwierig, unter CPI = 2 zu kommen | Hohe Ausführungsgeschwindigkeit $(CPI \leq 1)$ | |
|
||||||
|
|
||||||
> Unter dem CPI (cycles per instruction) -Wert einer Menge von Maschinenbefehlen versteht man die mittlere Anszahl der Taktzyklen pro Maschinenbefehl
|
> Unter dem CPI (cycles per instruction) -Wert einer Menge von Maschinenbefehlen versteht man die mittlere Anszahl der Taktzyklen pro Maschinenbefehl
|
||||||
|
|
||||||
@ -88,10 +80,38 @@ Klassifikation von Befehlssätzen nach der Gestaltung/Ausprägung der vorhandene
|
|||||||
- Erleichtert die Unterbringung kleiner Konstanten im Befehlswort
|
- Erleichtert die Unterbringung kleiner Konstanten im Befehlswort
|
||||||
- Vom Steuerwerk aus abschaltbar für „unsigned“ Befehle
|
- Vom Steuerwerk aus abschaltbar für „unsigned“ Befehle
|
||||||
|
|
||||||
|
### Decodierphase
|
||||||
|

|
||||||
|
Zwei Register lesen, eines schreibt
|
||||||
|
- Gelesene Register weiter zur ALU
|
||||||
|
- Drei Instruktionsfelder à 5 Bit
|
||||||
|
- Resultat zurück von ALU
|
||||||
|
|
||||||
|
z.B. R-Format Instruction `opcode rs rt rd shamt func`
|
||||||
|
- rt = IR[20-16] selektiert Register[rt] zur ALU
|
||||||
|
- rs = IR[25-21] selektiert Register[rs] zur ALU
|
||||||
|
- rd = IR[15-11] wählt Register[rd] für Resultat
|
||||||
|
|
||||||
|
z.B. I-Format Instruction `opcode rs rt Direktoperand`
|
||||||
|
- Ein Basis-/Indexregister: rs = IR[25-21]
|
||||||
|
- Ein Ziel-/Quellregister: rt = IR[20-16]
|
||||||
|
- Direktoperand: imm = IR[15-0]
|
||||||
|
|
||||||
|
Zeitverhalten:
|
||||||
|
- Register immer auslesen (kein Takt) und Transport zur ALU
|
||||||
|
- Schreiben des Zielregisters Register[rd] am Ende der Taktperiode
|
||||||
|
- Zeit für Speicherzugriff und für die primäre ALU muss eingeplant werden
|
||||||
|
- Ausgabe des Instruktionsspeichers wird über die ganze Dauer gehalten
|
||||||
|
|
||||||
|
Multiport-Registersatz
|
||||||
|
- Zwei gleichzeitige Lesezugriffe im selben Taktzyklus
|
||||||
|
- Kein Schreibzugriff bei Store-Operationen (Mem-Write)
|
||||||
|
- Zwei Lesebusse, ein Schreibbus zu den Registern
|
||||||
|
|
||||||
### Ausführungsphase
|
### Ausführungsphase
|
||||||
|

|
||||||
- ALU-Registeroperationen
|
- ALU-Registeroperationen
|
||||||
- Operanden im Register oder als
|
- Operanden im Register oder als Direktoperand
|
||||||
- Direktoperand
|
|
||||||
- Üblicher Satz an ALU-Operationen
|
- Üblicher Satz an ALU-Operationen
|
||||||
- Register $0 liefert Wert 0
|
- Register $0 liefert Wert 0
|
||||||
- Adressierung von Variablen im Speicher
|
- Adressierung von Variablen im Speicher
|
||||||
@ -100,15 +120,15 @@ Klassifikation von Befehlssätzen nach der Gestaltung/Ausprägung der vorhandene
|
|||||||
- Registerinhalt lesen/schreiben
|
- Registerinhalt lesen/schreiben
|
||||||
- Load/Store-Architektur
|
- Load/Store-Architektur
|
||||||
- Speicheroperationen können keine Arithmetik
|
- Speicheroperationen können keine Arithmetik
|
||||||
- also z.B. kein inc 0xaff0($7),0x0004
|
|
||||||
- ALU schon zur Adressberechnung benötigt
|
- ALU schon zur Adressberechnung benötigt
|
||||||
- Separater Addierer zur Sprungzielberechnung
|
- Separater Addierer zur Sprungzielberechnung
|
||||||
- Prüfschaltung auf Gleichheit zweier Register in der primären ALU („eql“)
|
- Prüfschaltung auf Gleichheit zweier Register in der primären ALU ("eql")
|
||||||
- Bedingte Sprünge mit einem 16-bit Direktoperanden (beq $7,$8,loop)
|
- Bedingte Sprünge mit einem 16-bit Direktoperanden
|
||||||
- Maximal möglicher Offset von ±17 Bit nach einer 2-bit Verschiebung
|
- Maximal möglicher Offset von $\pm 17$ Bit nach einer 2-bit Verschiebung
|
||||||
- Unbedingte Sprünge mit 28-bit Adresse später
|
- Unbedingte Sprünge mit 28-bit Adresse später
|
||||||
|
|
||||||
### Speicherzugriff
|
### Speicherzugriff
|
||||||
|

|
||||||
- Getrennte Speicher für Code & Daten
|
- Getrennte Speicher für Code & Daten
|
||||||
- Aktuelle Instruktion wird bis zum Ende des Gesamtzyklus gehalten
|
- Aktuelle Instruktion wird bis zum Ende des Gesamtzyklus gehalten
|
||||||
- Kein zweiter Zugriff im gleichen Taktzyklus möglich
|
- Kein zweiter Zugriff im gleichen Taktzyklus möglich
|
||||||
@ -123,18 +143,22 @@ Klassifikation von Befehlssätzen nach der Gestaltung/Ausprägung der vorhandene
|
|||||||
- Als Datenspeicheradresse
|
- Als Datenspeicheradresse
|
||||||
- Nicht direkt speichern, wg. Load/Store-Architektur!
|
- Nicht direkt speichern, wg. Load/Store-Architektur!
|
||||||
|
|
||||||
### Register zurückschreiben
|
### Register zurückschreiben (Write Back)
|
||||||
|

|
||||||
- Nummer des Zielregisters (Zielregisterselektor)
|
- Nummer des Zielregisters (Zielregisterselektor)
|
||||||
- Stammt aus IR[15-11] oder IR[20-16], 5-bit Bereich für Werte 0-31
|
- Stammt aus IR[15-11] oder IR[20-16], 5-bit Bereich für Werte 0-31
|
||||||
- Steuersignal
|
- Steuersignal
|
||||||
- Zielregister zum Ende des Instruktionszyklus schreiben
|
- Zielregister zum Ende des Instruktionszyklus schreiben
|
||||||
- Schreibsignal an Registersatz, falls nötig
|
- Schreibsignal an Registersatz, falls nötig
|
||||||
|
|
||||||
|
### weitere Sprungbefehle
|
||||||
|

|
||||||
- Pseudorelative Sprünge (jump xLabel)
|
- Pseudorelative Sprünge (jump xLabel)
|
||||||
- Kein separater Addierer erforderlich, nur ein zusätzlicher MUX-Eingang
|
- Kein separater Addierer erforderlich, nur ein zusätzlicher MUX-Eingang
|
||||||
- Oberste 4 Bits unverändert, untere 28 Bits werden ersetzt (4, 26, 2)
|
- Oberste 4 Bits unverändert, untere 28 Bits werden ersetzt (4, 26, 2)
|
||||||
- Jump-and-Link (jal) sichert alten Programmzähler in $31 (Subroutine)
|
- Jump-and-Link (jal) sichert alten Programmzähler in $31 (Subroutine)
|
||||||
|
|
||||||
### erforderliche Steuerleitung
|
erforderliche Steuerleitung
|
||||||
- Für Speicher
|
- Für Speicher
|
||||||
- 2-bit Steuersignal: 0/8/16/32 Bit zum Datenspeicher schreiben
|
- 2-bit Steuersignal: 0/8/16/32 Bit zum Datenspeicher schreiben
|
||||||
- Instruktionsspeicher liest immer
|
- Instruktionsspeicher liest immer
|
||||||
@ -148,12 +172,14 @@ Klassifikation von Befehlssätzen nach der Gestaltung/Ausprägung der vorhandene
|
|||||||
- Für Arithmetik
|
- Für Arithmetik
|
||||||
- 1-bit Steuersignal: Vorzeichenerweiterung ja/nein
|
- 1-bit Steuersignal: Vorzeichenerweiterung ja/nein
|
||||||
- 6-bit Steuersignal: ALU-Operation
|
- 6-bit Steuersignal: ALU-Operation
|
||||||
|
- Ca. 20 Steuersignale sind erforderlich: Mittelgroßes PLA auf Chip
|
||||||
|
|
||||||
Einzyklusmaschine ist unwirtschaftlich
|
Einzyklusmaschine ist unwirtschaftlich
|
||||||
- Komponenten arbeiten jeweils nur einen kleinen Teil der Gesamtzeit
|
- Komponenten arbeiten jeweils nur einen kleinen Teil der Gesamtzeit
|
||||||
- Zeitverlust bei potentiell kurzen Instruktionen
|
- Zeitverlust bei potentiell kurzen Instruktionen
|
||||||
|
|
||||||
## Mehrzyklen CPU
|
## Mehrzyklen CPU
|
||||||
|

|
||||||
- Gesamtzyklus der bisherigen MIPS
|
- Gesamtzyklus der bisherigen MIPS
|
||||||
- Dauer des Instruktionszyklus ist die Summe der Einzelverzögerungen
|
- Dauer des Instruktionszyklus ist die Summe der Einzelverzögerungen
|
||||||
- Unteraktivitäten müssen abwarten, bis die Parameter sicher vorliegen
|
- Unteraktivitäten müssen abwarten, bis die Parameter sicher vorliegen
|
||||||
@ -164,25 +190,28 @@ Einzyklusmaschine ist unwirtschaftlich
|
|||||||
- Einfügen von Registern für in den Stufen entstandene Zwischenresultate
|
- Einfügen von Registern für in den Stufen entstandene Zwischenresultate
|
||||||
- Noch immer nur eine Instruktion zu einem Zeitpunkt in Ausführung
|
- Noch immer nur eine Instruktion zu einem Zeitpunkt in Ausführung
|
||||||
- CPU-Zustand bezieht sich auf eine einzelne aktuelle Instruktion
|
- CPU-Zustand bezieht sich auf eine einzelne aktuelle Instruktion
|
||||||
- Pipelined CPU – mit Fließbandprinzip
|
- Pipelined CPU - mit Fließbandprinzip
|
||||||
- In jedem Taktzyklus beginnt eine neue Maschineninstruktion
|
- In jedem Taktzyklus beginnt eine neue Maschineninstruktion
|
||||||
- Mehrere Instruktionen gleichzeitig in Ausführung
|
- Mehrere Instruktionen gleichzeitig in Ausführung
|
||||||
- Aber unterschiedlicher Fertigstellungsgrad
|
- Aber unterschiedlicher Fertigstellungsgrad
|
||||||
- Bessere Auslastung der Hardware
|
- Bessere Auslastung der Hardware
|
||||||
- Höherer Durchsatz
|
- Höherer Durchsatz
|
||||||
- Große Pipeline-Tiefe:
|
- Große Pipeline-Tiefe:
|
||||||
- Zusätzliche Ressourcen, höherer Energieaufwand (Taktfrequenz!)
|
- Zusätzliche Ressourcen, höherer Energieaufwand (Taktfrequenz!)
|
||||||
- Längere Instruktionssequenzen für gleichen oder besseren Speedup (→ Registeroverhead!)
|
- Längere Instruktionssequenzen für gleichen oder besseren Speedup (→ Registeroverhead!)
|
||||||
- Bei unterschiedlichen Stufenverzögerungen bestimmt die langsamste Stufe die Taktfrequenz
|
- Bei unterschiedlichen Stufenverzögerungen bestimmt die langsamste Stufe die Taktfrequenz
|
||||||
- Lange Instruktionssequenzen:
|
- Lange Instruktionssequenzen:
|
||||||
- Meist wegen Daten- und Kontrollabhängigkeiten nicht machbar
|
- Meist wegen Daten- und Kontrollabhängigkeiten nicht machbar
|
||||||
- Hohe Latenz – Füllen und Leeren der Pipeline!
|
- Hohe Latenz – Füllen und Leeren der Pipeline!
|
||||||
- Warum geht die Anzahl der Pipeline-Stufen zurück?
|
- Warum geht die Anzahl der Pipeline-Stufen zurück?
|
||||||
- hoher Energieverbrauch
|
- hoher Energieverbrauch
|
||||||
- hohe Leistungseinbußen durch Kontroll- und Datenabhängigkeiten (Füllen/Leeren der Pipeline)
|
- hohe Leistungseinbußen durch Kontroll- und Datenabhängigkeiten (Füllen/Leeren der Pipeline)
|
||||||
- mehr Parallelität in den einzelnen Pipeline-Stufen → superskalare Prozessoren
|
- mehr Parallelität in den einzelnen Pipeline-Stufen → superskalare Prozessoren
|
||||||
- mehr Prozessorkerne mit geringerer Leistungsaufnahme pro Kern
|
- mehr Prozessorkerne mit geringerer Leistungsaufnahme pro Kern
|
||||||
- Fließband-Architektur (engl. pipeline architecture): Bearbeitung mehrerer Befehle gleichzeitig, analog zu Fertigungsfließbändern.
|
- Fließband-Architektur (engl. pipeline architecture): Bearbeitung mehrerer Befehle gleichzeitig, analog zu Fertigungsfließbändern.
|
||||||
|
- Aufteilung des Rechenwerks in Fließbandstufen, Trennung durch Pufferregister (IF/ID,ID/EX,EX/MEM, MEM/WB)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
Aufgaben der einzelnen Phasen
|
Aufgaben der einzelnen Phasen
|
||||||
- Befehlsholphase
|
- Befehlsholphase
|
||||||
@ -196,32 +225,26 @@ Aufgaben der einzelnen Phasen
|
|||||||
- Abspeicherungsphase
|
- Abspeicherungsphase
|
||||||
- Speichern in Register, bei Speicherbefehlen nicht benötigt
|
- Speichern in Register, bei Speicherbefehlen nicht benötigt
|
||||||
|
|
||||||
Pipeline-Hazards
|
## Pipeline-Hazards
|
||||||
> Structural Hazards (deutsch: strukturelle Abhängigkeiten oder Gefährdungen): Verschiedene Fließbandstufen müssen auf dieselbe Hardware-Komponente zugreifen, weil diese nur sehr aufwändig oder überhaupt nicht zu duplizieren ist.
|
> Structural Hazards ("strukturelle Abhängigkeiten oder Gefährdungen"): Verschiedene Fließbandstufen müssen auf dieselbe Hardware-Komponente zugreifen, weil diese nur sehr aufwändig oder überhaupt nicht zu duplizieren ist.
|
||||||
|
|
||||||
> Definition: Ein Befehl i heißt von einem nachfolgenden Befehl j antidatenabhängig, falls j eine Speicherzelle beschreibt, die von i noch gelesen werden müsste.
|
- resource hazards
|
||||||
|
- data hazards: Datenabhängigkeiten
|
||||||
|
- **Antidatenabhängig**: falls Befehl j eine Speicherzelle beschreibt, die von i noch gelesen werden müsste.
|
||||||
|
- WAR (write after read) Abhängigkeit
|
||||||
|
- **Ausgabeabhängig**: falls Befehle i und j die selbe Speicherzelle beschreiben
|
||||||
|
- WAW (write after write) Abhängigkeit
|
||||||
|
- **Datenabhängigkeit**: Operation hängt von der vorhergehenden Operation ab
|
||||||
|
- RAW (read after write) Abhängigkeit
|
||||||
|
- control hazards: Kontrollabhängigkeiten
|
||||||
|
- Gleichheit der Register wird schon in der instruction decode-Stufe geprüft
|
||||||
|
- Sprungziel wird in separatem Adressaddierer ebenfalls bereits in der instruction decode-Stufe berechnet
|
||||||
|
|
||||||
> Definition: Zwei Befehle i und j heißen voneinander Ausgabeabhängig, falls i und j die selbe Speicherzelle beschreiben.
|
Gegenmaßnahmen
|
||||||
|
- pipeline stall (Anhalten des Fließbandes, NOOPS(s) einfügen)
|
||||||
- Gleichheit der Register wird schon in der instruction decode-Stufe geprüft
|
|
||||||
- Sprungziel wird in separatem Adressaddierer ebenfalls bereits in der instruction decode-Stufe berechnet
|
|
||||||
- Sofern weiterhin noch Verzögerungen auftreten:
|
|
||||||
- nächsten Befehl einfach ausführen (delayed branch)
|
|
||||||
- oder weiterhin NOOP(s) einfügen (stall)
|
|
||||||
|
|
||||||
### Pipelining – Zusammenfassung
|
|
||||||
- Die Fließbandverarbeitung (engl. pipelining) ermöglicht es, in jedem Takt die Bearbeitung eines Befehls abzuschließen, selbst wenn die Bearbeitung eines Befehls ≥ 1 Takte dauert
|
|
||||||
- Mehrere Pipelines -> pro Takt können mehrere Befehle beendet
|
|
||||||
werden
|
|
||||||
- 3 Typen von Gefährdungen des Fließbandbetriebs:
|
|
||||||
- resource hazards
|
|
||||||
- control hazards
|
|
||||||
- data hazards (RAW, WAR, WAW)
|
|
||||||
- Gegenmaßnahmen
|
|
||||||
- pipeline stall
|
|
||||||
- branch prediction
|
- branch prediction
|
||||||
- forwarding / bypassing
|
- forwarding / bypassing
|
||||||
- delayed branches
|
- delayed branches (nächsten Befehl einfach ausführen)
|
||||||
- out-of-order execution
|
- out-of-order execution
|
||||||
- dynamic sched
|
- dynamic sched
|
||||||
|
|
||||||
@ -362,7 +385,7 @@ Allgemeines Ziel: Vorhersage indirekter Sprünge (d.h. bzgl. Basisadresse in Reg
|
|||||||
- Vorhersagequalität „perfekt“, wenn Stack-Puffer größer als maximale Aufruftiefe
|
- Vorhersagequalität „perfekt“, wenn Stack-Puffer größer als maximale Aufruftiefe
|
||||||
|
|
||||||
|
|
||||||
# Speicherarchitektur
|
# Multiple-Issue-Architekturen
|
||||||
|
|
||||||
|
|
||||||
# Microcontroller und Digitale Signalprozessoren
|
# Microcontroller und Digitale Signalprozessoren
|
||||||
|