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
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 alsstatic
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)
- 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
, ... stattint
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 nutztvalgrind
! - Mit
malloc
angeforderter Speicher muss mitfree
wieder freigegeben werden. perror
NUR verwenden, wenn der Fehler über eine gesetzteerrno
signalisiert wird (sieheman
-Page)- Sonstige Fehler (keine
errno
) mitfprintf
aufstderr
ausgeben.
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 mitstrtok
entsprechend zurecht basteln. - In die
struct sigaction
-Flags bitte immerSA_RESTART
schreiben. - Die
sa_mask
(auchstruct sigaction
) könnt ihr mitsigemptyset
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.
-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
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.