SPiC Übungen - T06
Stand: 4.8.
Übungen und Codeschnipsel (i4-Seite)
*eigentlich ist hier keine Übung geplant aber ich bin eh da
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
volatileKeywords 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 alsstaticdeklarieren. - Bei Funktionen mit leerer Parameterliste
voidreinschreiben. - 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)
- Rechtzeitig alles einrichten und ausprobieren, nicht kurz vor knapp!
- Bei Problemen hilft die Rechnerübung ("RÜ" in der Tabelle).
Aufgabe 2: snake (Gruppe)
- Wie groß müssen Datentypen mindestens sein? Dafür
uint8_t,uint16_t, ... stattintverwenden! - Mit der Funktion
sb_led_setMaskkann 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
volatilenotwendig? Bitte begründen. - Der Funktion
playkö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,strlengibt 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 -gund nutztvalgrind! - Mit
mallocangeforderter Speicher muss mitfreewieder freigegeben werden. perrorNUR verwenden, wenn der Fehler über eine gesetzteerrnosignalisiert wird (sieheman-Page)- Sonstige Fehler (keine
errno) mitfprintfaufstderrausgeben.
Aufgabe 8: mish (Gruppe)
- Verwendet die Signatur
int main(void). Das erspart euch vmtl. einige Verwirrungen.😉 - Für den
execvp-Aufruf muss daschar *const argv[]mit einemNULL-Eintrag beendet werden.
Das könnt ihr euch mitstrtokentsprechend zurecht basteln. - In die
struct sigaction-Flags bitte immerSA_RESTARTschreiben. - Die
sa_mask(auchstruct sigaction) könnt ihr mitsigemptysetleeren.
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.
-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 Nudelvalgrind 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.