Dipl.-Ing. Martin Weitzel, 64380 Roßdorf bei Darmstadt

balluff2019-09ch

Dienstag 2019-09-10

Mittwoch 2019-09-11

Donnerstag 2019-09-12

Freitag 2019-09-13

Abschluss-Übung:

  • Nehmen Sie die notwendigen Ergänzungen vor (an der Exercise_Template_5 oder dem letzten Stand Ihrer bisherigen Lösung) um den Timer-Interrupt an die `update`-Funkion der `Clock_Application` zu knüpfen
  • ODER gehen Sie direkt in die Musterlösung und beantworten Sie unter Zuhilfenahme der Aufgabenbeschreibung die folgenden Fragen:
    •  Welche Klasse implementiert das Callback-Interface, über das der Sekundentakt an die beiden Clocks weitergereicht wird (unter Nutzung von deren Interface `I_Clock`)?
    • Welche Struktur (in welchem Header-File) beschreibt das Register-Layout, das zur Konfiguration des Timers (Faktor für den Frequenzteiler festlegen) sowie den Start und Stopp dieses Timers dient?
    • An welcher Hardware-Adresse sind die Register des verwendeten Timers abgebildet?
    • Wo wird diese Adresse zunächst als Hexadezimal-Wert vorliegenden per Cast-Operation zu einem Zeiger gemacht?
    • Durch Setzen oder Löschen welcher Bits an welcher Adresse wird
      • der Timer gestartet?
      • der Timer gestoppt?
  • Welche Funktion wird direkt vom Interrupt-Controller jede Sekunde aufgerufen?
    Hinweis: Sie sehen im Projekt nur deren Definition(!) und NICHT deren Aufruf, da letzterer per Hardware und NICHT aus dem Programm heraus erfolgt.
    • Warum ist diese Funktion in C implementiert?
    • Könnte man sie auch als Member-Funktion eine Klasse implementieren?
      • Wenn ja, wie und warum?
      • Wenn nein, warum nicht?
  • Wie geht es nach Aufruf dieser ersten Funktion (direkt durch die Hardware) weiter, bis diese schließlich nach Update aller Zähler in den beiden Clocks inkl. der eventuellen Ausgabe eines Alarms wieder zurückkehrt und die Interrupt-Bearbeitung endgültig abgeschlossen ist?
  • Fortgeschrittene Frage - nur für diejenigen Teilnehmer, welche den gesamten Vorgang der Interrupt-Behandlung auch HARDWARE-nah nachvollziehen wollen, (z.B. um den Overhead gegenüber einer extrem "sparsamen" Lösung abzuschätzen, bei welcher der Interrupt-Handler direkt einen Zähler in einer globalen Variablen inkrementiert):
    • Wie oft muss der Maschinen-Code einen Zeiger im Speicher auslesen um weiter zu kommen bis zu der Stelle, an der schließlich der Sekundenzähler einer Uhr hochgezählt wird?
    • Wer sehr fleißig sein will und noch viel Zeit zur Verfügung hat, kann dazu ggf. auch eine Handskizze dazu anfertigen. Berücksichtigen Sie dabei
      • dass ein Zeiger auf ein Interface immer auf ein real vorhandenes Objekt einer Klasse zeigt, welches dieses Interface implemeniert;
      • dass eine Klasse, die virtuelle Member-Funktionen hat, einen Zeiger enthält, welcher auf eine Einsprung-Tabelle (VMT) zeigt;
      • dass die VMT wiederum (nur) die Adressen im Maschinen-Code enthält, auf die der Program-Counter zu Beginn dieser Funktion zeigen muss. (Zuvor müssen noch wichtigeCPU-Register gesichert werden, wozu neber dem vorherigen Wert des Program-Counters auch der aktuelle Stack-Pointer gehört, damit bei Rückkehr aus der Funktion hinter deren Aufruf fortgesetzt werden kann.)

ENDE der Übung.

Weiterhin noch etwas "auf Vorrat" vorbereiteter aber bislang nicht besprochener Stoff:


ARBEITSBEREICH

(Coliru-Links die nicht verloren gehen sollen, falls der Browser versehentlch geschlossen wird)

http://coliru.stacked-crooked.com/a/c76dcd2c247a19db

http://coliru.stacked-crooked.com/a/7017b90de792c8ae

Beispiele zum "weg-casten" von `const`

http://coliru.stacked-crooked.com/a/5e265a9014b22f59

http://coliru.stacked-crooked.com/a/184decb988d58b3b

http://coliru.stacked-crooked.com/a/d69f3a58cd9c5999

http://coliru.stacked-crooked.com/a/2beaeeb6c2230932