Musterklausur SS 2020 - Lösungen
Ausführliche Lösungen zur originalen Musterklausur Mikroprozessorsysteme SS 2020 (HS Darmstadt, Prof. Akelbein). Aufgabenstellung: Klausur-SS2020-Muster.pdf (Originaldatei unter Quellen).
Gesamt: 114 Punkte, 90 Minuten, 1 doppelseitig handbeschriebenes DIN-A4-Blatt, kein Taschenrechner. Format: maschinell auswertbar (Ankreuzen / Zahlen in Kästchen).
Aufgabe 1 - Mikroprozessorsysteme (18 P) [Kap. 1]
Ankreuzen, welche Aussagen richtig sind. (R = richtig/ankreuzen, F = falsch/leer)
1.1 Mikrocontroller
- R MC sind für spezifische Anwendungen zugeschnitten (im Gegensatz zum universellen MP).
- R MC besitzen eine feste, on-chip integrierte Speicherausstattung.
- R Moderne MC = SoC: alle nötigen Komponenten auf einem Chip.
1.2 Peripheriebausteine
- R Timer und serielle Schnittstellen sind on-chip-Peripherie.
- F Sensoren und Aktoren sind extern, nicht on-chip. Der MC integriert nur die Ansteuerung (ADC, PIO, …).
- R Man kann MC-Varianten mit genau der benötigten Peripherie wählen.
1.3 Hardwarenahe Programmierung
- R
volatileteilt dem Compiler mit, dass sich eine Variable durch Hardware/ISR außerhalb des Programmflusses ändern kann (kein Wegoptimieren). - R Memory-mapped Hardwareregister lassen sich als
structabbilden. - F Zeiger-Casting ist in der hardwarenahen Programmierung notwendig und üblich (Adresse → Registerzeiger), nicht zu vermeiden.
1.4 Direkter Speicherzugriff (DMA)
- F Falle: die Beschreibung ("Zugriff auf Peripherie wie auf Speicher über Adressen") ist Memory-Mapped I/O, nicht DMA.
- R DMA entlastet den Kern beim Transfer großer Datenmengen Speicher ↔ Peripherie.
- F DMA ist kein Grundprinzip jedes Von-Neumann-Rechners und steckt nicht in jedem MC (nur in leistungsstärkeren).
1.5 AD-Wandlung
- F Das ist die Beschreibung der DA-Wandlung. AD wandelt analog → digital.
- F Umgekehrt: das Wägeverfahren (sukzessive Approximation, ~N Schritte) ist schneller als das Zählverfahren (bis zu 2^N Schritte).
- R Maximaler Quantisierungsfehler = ½ LSB (Wert des halben niederwertigsten Bits).
1.6 Interrupts
- F Interrupts müssen nicht unterschiedliche Prioritäten haben. Der Controller kann gleiche Prioritäten über eine feste Quellen-Reihenfolge auflösen. (Grenzfall der Aufgabe - die Begründung "sonst kann er nicht entscheiden" ist zu absolut.)
- R Die ISR-Adresse lässt sich im Interrupt-Controller (Vektorregister) registrieren; die Routine ist frei programmierbar.
- R Der Compiler behandelt eine ISR wie eine Funktion; über ein Attribut erzeugt er den ISR-spezifischen Rahmen (Kontextsicherung, Rücksprung mit Interrupt-Freigabe).
Aufgabe 2 - Timer-Bausteine (24 P) [Kap. 5]
Gegeben (aus dem Diagramm): Periode (RC-Reset bei 10 ms), High-Anteil 3 ms. System: , 16-Bit-Zähler, Prescaler aus {2, 8, 32, 128, 1024}.
2.1 Frequenz: .
2.2 Tastverhältnis: High 3 ms von 10 ms .
2.3 Optimaler Prescaler: muss (16 Bit) und möglichst groß sein (feinste Auflösung). Presc 2 → RC = 25000 (passt). Prescaler = 2.
2.4 ns pro Zählschritt: .
2.5 RC: .
2.6 RA (30 %): TIOA wird bei RC gesetzt (High am Periodenanfang) und bei RA gelöscht → RA legt die High-Dauer fest: .
2.7 RB (50 % an TIOB): .
2.8 ACPA (RA-Effekt auf TIOA): Bei RA soll TIOA von High auf Low → clear → 1 0.
2.9 ACPC (RC-Effekt auf TIOA): Bei RC (Neustart) soll TIOA auf High → set → 0 1. (set bei RC + clear bei RA erzeugt das Signal unabhängig vom Vorzustand.)
2.10 Capture-Modus: RA und RB werden von der Hardware an den Flanken geladen (gemessen). Zur Festlegung der Messdauer (Timeout) konfiguriert man vorher nur Register C.
Aufgabe 3 - Parallele I/O mit 7-Segment (16 P) [Kap. 3]
Zwei high-aktive Ziffern. Segmente je Ziffer: a=Bit0/8, b=1/9, c=2/10, d=3/11, e=4/12, f=5/13, g=6/14. SODR setzt (Segment an), CODR löscht. Rechte Ziffer = Bits 0-6, linke Ziffer = Bits 8-14.
3.1 CODR=0x7F7F (alles aus), dann SODR=0x5B7D.
0x5B7D: rechts 0x7D→ Segmente a,c,d,e,f,g = 6; links 0x5B→ a,b,d,e,g = 2. → Anzeige 26.
3.2 SODR=0x7F7F (alles an = 88), dann CODR=0x7879.
Löscht rechts {a,d,e,f,g}→ Rest b,c = 1; links {d,e,f}→ Rest a,b,c = 7. → Anzeige 71.
3.3 CODR=0x7F7F; SODR=0x006D; SODR = *PIO_OSDR << 8 + 2;
Nach SODR=0x006D: rechte Ziffer = a,c,d,f,g = 5. Nun die Falle - Operator-Rangfolge: in C bindet + stärker als <<, also ist << 8 + 2 gleich << 10 (nicht << 8). Beabsichtigt war offenbar << 8, um die rechte Ziffer (Bits 0-6) auf die linke (Bits 8-14) zu kopieren → dann stünde 55. Durch das um 2 zu große Schieben landen die Bits verschoben (Segmente c,e,f der linken Ziffer) → linke Ziffer ist keine gültige Ziffer. Ergebnis: rechts 5, links "kaputt". → Lehrpunkt: Klammern setzen ((x << 8) + 2).
3.4 CODR=0x7F7F; SODR = ~0x3099;
~0x3099 setzt alle Bits außer {0,3,4,7,12,13}; im Segmentbereich bleiben also gerade die richtigen: rechts 0x66→ b,c,f,g = 4; links 0x4F→ a,b,c,d,g = 3. → Anzeige 34.
Aufgabe 4 - Signalverarbeitung (17 P) [Kap. 7]
Frequenz einer Komponente : . Die Amplitude liest man am jeweiligen aus dem Amplitudendiagramm ab (nicht vorhanden → 0).
| Aufg. | Komponente | Frequenz | Amplitude (Diagramm) |
|---|---|---|---|
| 4.1 | 12,5 Hz | 1,5 | |
| 4.2 | 25 Hz | 0 | |
| 4.3 | 37,5 Hz | 0 | |
| 4.4 | 50 Hz | 5 | |
| 4.5 | 75 Hz | 3 | |
| 4.6 | 100 Hz | 2 | |
| 4.7 | 125 Hz | 0 | |
| 4.8 | 150 Hz | 2,5 |
Höchste enthaltene Frequenz , zweithöchste .
4.9 Artefaktfrei abtasten (alle Komponenten): Nyquist verlangt . Aus der Liste also 350, 400, 450, 500, 550, 600, 650, 700, 750, 800 Hz (300 Hz genau an der Grenze reicht nicht).
4.10 Tiefpass-Wirkung (alle außer der höchsten): → → 250 und 300 Hz. (Genau diese Aufgabe steht hinter der Formel in Kap. 7 §3.)
4.11 Datenmenge: , 16 Bit = 2 Byte/Wert, 10 s: .
Aufgabe 5 - Cyclic Redundancy Check (12 P) [Kap. 10]
Generator .
5.1 Binärform: Bits 4, 1, 0 → 10011.
5.2 Checksumme für 00110010: Nachricht + 4 Nullen = 001100100000, Modulo-2-Division (XOR 10011 an jeder führenden 1):
Start: 0 0 1 1 0 0 1 0 0 0 0 0
XOR 10011 (Bit2): 0 0 0 1 0 1 0 0 0 0 0 0
XOR 10011 (Bit3): 0 0 0 0 0 1 1 1 0 0 0 0
XOR 10011 (Bit5): 0 0 0 0 0 0 1 1 1 1 0 0
XOR 10011 (Bit6): 0 0 0 0 0 0 0 1 1 0 1 0
XOR 10011 (Bit7): 0 0 0 0 0 0 0 0 1 0 0 1
Rest = letzte 4 Bit = 1001 (das ist die CRC-Checksumme).
5.3 Hardware: Eine CRC-Erzeugung mit festem Polynom ist ein rückgekoppeltes Schieberegister mit EXOR-Gattern (LFSR). → Schieberegister + EXOR-Gatter ankreuzen.
5.4 Gültigkeit von 11110010: Division des kompletten Codeworts durch 10011 ergibt Rest 0000 → die Nachricht ist gültig.
5.5 Iterationen: Die Polynomdivision schiebt jedes Nachrichtenbit einmal ein. Bei 8 Bit sind das 8 Iterationen.
Aufgabe 6 - Serielle Schnittstelle & Leitungscodes (15 P) [Kap. 4, Kap. 10]
Wahr/Falsch (USART-Struktur):
- 6.1 Falsch - bei asynchroner Übertragung synchronisiert das Startbit den Empfänger, also mit/nach dessen Empfang, nicht vorher.
- 6.2 Falsch - RxD empfängt die Daten; "von einem anderen Teilnehmer" ist irreführend: RxD ist die eigene Empfangsleitung.
- 6.3 Wahr - das Receive Shift Register deserialisiert, danach liest das Programm das Byte aus dem Receive Hold Register.
- 6.4 Wahr - das Transmit Hold Register schiebt die Daten bitweise ins Transmit Shift Register (Serialisierung).
- 6.5 Falsch - CTS/DCD/RTS (Handshake) werden nicht bei jeder seriellen Schnittstelle verwendet.
- 6.6 Wahr - über Mode- und Control-Register konfiguriert das Programm die Schnittstelle.
- 6.7 Falsch - die Unterbrechungslogik löst nicht zwingend bei jedem Zeichen einen CPU-Interrupt aus (z. B. Polling, DMA/PDC, FIFO).
6.8 / 6.9 Manchester-Dekodierung. Regel je Mitten-Flanke eines Bits:
- IEEE 802.3: steigende Flanke = 1, fallende = 0.
- G. E. Thomas: invertiert - steigende = 0, fallende = 1. Bitfolge (4 Bit) ablesen: pro Bitintervall die Richtung der mittigen Flanke bestimmen und gemäß der jeweiligen Konvention übersetzen. Dieselbe Signalfigur ergibt in 6.9 damit die bitweise invertierte Folge von 6.8.
Aufgabe 7 - Hardware-Interrupts (12 P) [Kap. 6, Kap. 9]
Ablauf: [A] Peripherie → Interrupt-Controller, [B] Controller → CPU, [C] CPU → Controller, [D] Controller → CPU, [E] CPU → Peripherie.
7.1 Beschreibungen zuordnen:
- Interruptanforderung einer HW-Komponente → [A]
- Unterbrechung des laufenden Assemblerbefehls → [B] (CPU wird signalisiert und unterbricht)
- CPU will den Inhalt des Interrupt-Vektor-Registers lesen → [C]
- Lädt die Adresse der ISR aus dem Vektorregister in ein CPU-Register → [D]
- Rücksprung aus ISR mittels Branch-Befehl → [E]
7.2 Angaben zuordnen:
- Besitzt eine Priorität 7…0, damit der Controller parallele Interrupts ordnen kann → [A] (die Anforderung trägt die Priorität)
- Signalisiert der CPU, dass ein Interrupt zu bearbeiten ist → [B]
- Erzeugt einen Stack für die ISR → [B] (Kontextsicherung beim Annehmen)
- Beschreibt das End-of-Interrupt-Command-Register mit beliebigem Wert → [E]
- Lässt die CPU wieder unterbrechbar / reentrant-fähig werden → [E] (Rücksprung gibt Interrupts wieder frei)
(Laut Aufgabenhinweis muss nicht jeder Schritt eine passende Zeile haben - Schritt [C]/[D] bleiben in 7.2 ohne Zuordnung.)