Milan Stephan
Fotografie & IT

SPiC Übungen - T06

Stand: 4.8.


Übungen und Codeschnipsel (i4-Seite)


Klausurvorbereitung

>> Heute, Donnerstag, 4.8. ab 20 Uhr Last-Minute Fragen im Discord-VoiceChat <<

>> FAU Informatik Discord Server << (inoffiziell und auch für andere Studiengänge): SPiC-Thread im #sp1 Channel

>> StuvePad mit Lösungsvorschlägen zu Altklausuren << (inoffiziell!)


Checkliste für Abgaben

  • Es wird auf Plagiate geprüft, das kann euch die kompletten Übungspunkte kosten.
    (Bringt auch nicht viel, wenn ihr zwar die Übungen "gut" habt, aber die Klausur nicht besteht.^^)
  • Die letzte rechtzeitige Abgabe wird gewertet, lieber einmal zu oft abgeben.
  • Gruppenabgaben sind nur innerhalb einer Übungsgruppe möglich.
  • Compilerwarnungen geben Punktabzug, bitte vorher reparieren.
  • Die Verwendung des volatile Keywords muss für jede Variable sinnvoll begründet werden.
  • Tut euch selbst den Gefallen und fangt früh genug an.
  • Dokumentation
  • Variablen so "lokal" und so privat wie möglich,
    Funktionen und globale (keine lokalen!) Variablen wenn möglich als static deklarieren.
  • Bei Funktionen mit leerer Parameterliste void reinschreiben.
  • Unnötige #include-Anweisungen vermeiden.
  • Keine Fließkommazahlen (float/double) verwenden.
  • Bitmasken nur mit ~, |, & und ^ verändern, nicht durch arithmetische Operationen.

Aufgabe 1: blink (einzeln)

Aufgabe 2: snake (Gruppe)

  • Wie groß müssen Datentypen mindestens sein? Dafür uint8_t, uint16_t, ... statt int verwenden!
  • Mit der Funktion sb_led_setMask kann man den Code viel übersichtlicher gestalten.

Aufgabe 3: led (Gruppe)

  • Internen Zustand verbergen (static).
  • Bei den Testfällen soll sowohl eine korrekte Ausführung, als auch mindestens jeder Fehlerfall provoziert werden.
  • Achtet drauf, dass ihr wirklich auch *euren Code* testet, nicht die Referenz!
  • Zeiger kommen erst nächste Woche dran, ihr könnt auch erstmal eine Funktion mit if/else bauen und danach auf Zeiger umstellen.

Aufgabe 4: spiel (Gruppe)

  • Was soll nach Level 99 passieren?
  • Interrupt-Behandlung so kurz wie möglich halten.
  • Wann ist volatile notwendig? Bitte begründen.
  • Der Funktion play könnte man das aktuelle Level übergeben.
  • Eine modullokale Variable (zur Interrupt-Signalisierung) ist ausreichend.

Aufgabe 5: ampel (Gruppe)

  • Nicht das Timer-Modul der libspicboard verwenden (außer zum Debuggen). Die Timer sollen selber konfiguriert werden.
  • Die "Zwischenzustände" (jeder einzelne Countdown-Schritt) müssen NICHT als eigene Zustände modelliert werden.
  • fCPU = 16 MHz, Interrupts bei Overflow des 8-Bit Timers, welchen Prescaler?
    -> fOVF = fCPU / (pre * 2n)
    -> Prescaler 1: fOVF = 16 MHz / (1 * 28) = 62500 Interrupts/Sek
    -> Prescaler 1024: -> fOVF = 16 MHz / (1024 * 28) = 61,03515625 Interrupts/Sek.
    Es können aber nur ganze Interrupts ankommen -> Ergebnis abrunden
    Rundungsfehler: 61,03515625 / 61 - 1 = 0,000576 = 0,0576% relativ (bzw. 576us absolut)
    Ist der Fehler für den Anwendungszweck zu groß, muss ein kleinerer Prescaler verwendet werden (was allerdings mehr Interrupts pro Zeit zur Folge hat).

Aufgabe 6: concat (einzeln)

  • Vergesst nicht das \0-Byte am Ende, strlen gibt die Länge ohne Nullbyte zurück.
  • Vergleicht die Funktionalität eurer Stringfunktionen mit denen aus der libc (also die "ganz normalen").
  • Kompiliert (auch) mit -Og -g und nutzt valgrind!
  • Mit malloc angeforderter Speicher muss mit free wieder freigegeben werden.
  • perror NUR verwenden, wenn der Fehler über eine gesetzte errno signalisiert wird (siehe man-Page)
  • Sonstige Fehler (keine errno) mit fprintf auf stderr ausgeben.

Aufgabe 8: mish (Gruppe)

  • Verwendet die Signatur int main(void). Das erspart euch vmtl. einige Verwirrungen.😉
  • Für den execvp-Aufruf muss das char *const argv[] mit einem NULL-Eintrag beendet werden.
    Das könnt ihr euch mit strtok entsprechend zurecht basteln.
  • In die struct sigaction-Flags bitte immer SA_RESTART schreiben.
  • Die sa_mask (auch struct sigaction) könnt ihr mit sigemptyset leeren.

Linux-Teil: Zusätzliche Compilerflags

Warum noch mehr Compilerflags? Wenn euch der Compiler durch genauere Prüfung schon vor Fehlern warnt, gebt ihr sie nicht mit ab. 😉

>> Wichtig: Der Code muss mit den "offiziellen" Flags kompilieren! <<

Vorschlag: -std=c11 -D_XOPEN_SOURCE=700 -O3 -pedantic -Werror -Wall -Og -g -Wextra -Wconversion -Wshadow -Wformat=2 -Wno-unused

Erklärung:

-Og: Deaktiviert Compileroptimierungen, die Debug-Daten verfälschen können, hebt vorheriges -O3 auf.

-g: Ermöglicht besseres Debugging mit valgrind oder gdb.

-Wextra: Schaltet noch mehr Checks an

-Wconversion: Weist auf implizite Casts hin, bei denen man Wertebereiche prüfen und ggf. abbrechen sollte

-Wshadow: Warnt bei überschriebenen Variablen (in Schleifen z.B.)

-Wformat=2: Erkennt kaputte/fehlende Format-Strings bei printf etc.

-Wno-unused: Fehler bei unbenutzten Funktionen/Variablen/… ignorieren

Legende:

  • Immer anschalten
  • (Erstmal) weglassen, wenn ihr unverständliche Fehlermeldungen bekommt
  • Code muss auch ohne dieses Flag kompilieren und funktionieren, vor Abgabe sicherstellen!

Erkennen von Speicherlecks, Zugriffsfehlern usw.

Das Compilerflag -g verwenden, um Debug-Informationen mit ins fertige Programm zu schreiben. Nur so bekommt ihr Zeilennummern bei den Fehlerausgaben.
valgrind --leak-check=full --show-reachable=yes --track-origins=yes ./concat Hallo Nudel
Wenn valgrind etwas zu bemängeln hat, gibt's noch was zu tun. 😉

Kontakt und Sonstiges

Bei Fragen könnt ihr mich gerne kontaktieren, bevorzugt Discord - geht schneller. :P

Mail: milan.stephan@fau.de

Discord: nud3ls4l4t

Meine Rechnerübung: Do 10-12 Uhr (also vor dieser Tafelübung)

Es können und sollen auch andere RÜs besucht werden. :)

>> FAU Informatik Discord Server << (inoffiziell und auch für andere Studiengänge): SPiC-Thread im #sp1 Channel

Falls ihr noch andere Discord-Server habt, in denen über SPiC geredet wird, könnt ihr mir die gerne schicken, dann liste ich die hier mit auf.