Rückblick — was bisher geschah
Teil 2 baut auf den früheren Terminen auf. Klapp die Themen auf, die du auffrischen möchtest — dann geht es weiter mit den neuen Konzepten.
Teil 2 im Überblick
Vier neue Konzepte — jeweils mit ihrer nativen FreeRTOS-API und der typsicheren Pigweed-Abstraktion, die im Simulator verwendet wird.
Queues / Messaging
Sicherer Datenaustausch zwischen Tasks — ein Task legt Nachrichten ab, ein anderer liest sie aus.
Eine Queue (Warteschlange) ist ein Puffer, durch den zwei Tasks Nachrichten austauschen, ohne sich direkt zu kennen. Sie arbeitet nach dem FIFO-Prinzip: First In, First Out — was zuerst hineinkommt, geht zuerst wieder heraus.
Der Producer schreibt, der Consumer liest. Der Puffer entkoppelt beide: ist der Consumer kurz langsamer, füllt sich die Queue, statt dass Daten verloren gehen.
Ein Roboter legt Bauteile aufs Band, ein anderer nimmt sie am Ende ab. Das Band puffert, wenn der Verpacker kurz langsamer ist.
Der Code — Schritt für Schritt
Timeouts / Delay
Zeitgesteuert pausieren — und begrenzt warten: „Ich warte eine Weile, aber nicht ewig.“
Delay (sleep_for): Ein Task legt sich für eine feste Zeit schlafen und gibt die CPU frei — kein „Busy Waiting“, das Rechenzeit verschwendet.
Timeout (try_acquire_for): Ein Task wartet auf ein Signal — aber höchstens eine gewählte Zeit. Kommt es rechtzeitig → weiter. Sonst → Timeout-Reaktion (z. B. Alarm).
Ein Herzschlag-Monitor schlägt Alarm, wenn nicht rechtzeitig ein Signal kommt. Oder: die Kaffeemaschine, die nach Inaktivität in den Standby wechselt.
Der Code — Schritt für Schritt
Interrupts
Sofort auf externe Ereignisse reagieren — die Hardware unterbricht die CPU, ohne dass ständig „nachgefragt“ werden muss.
Statt in einer Schleife immer wieder zu fragen „Ist schon was passiert?“ (Polling) meldet sich die Hardware selbst. Ein Interrupt unterbricht sofort den laufenden Code und springt in eine ISR (Interrupt Service Routine).
Die goldene Regel: eine ISR muss extrem kurz sein. Sie erledigt nur das Nötigste und delegiert die eigentliche Arbeit an einen normalen Task — über eine Semaphore (…FromISR()).
Du liest ein Buch. Das Telefon klingelt — du merkst dir die Seite (Kontext sichern), gehst kurz ran (ISR), legst auf und liest weiter. Die lange Aufgabe („zurückrufen & plaudern“) machst du später in Ruhe.
Der Code — Schritt für Schritt
Software Timer
Eine Funktion (Callback) nach Ablauf einer Zeit ausführen — ohne dafür einen ganzen Task zu blockieren.
Ein Software Timer ruft nach Ablauf einer Frist automatisch einen Callback auf. Der Clou: es läuft keine eigene Warteschleife — der Timer-Dienst des Kernels verwaltet viele Timer effizient gemeinsam.
Der große Vorteil: dein Task kann in der Zwischenzeit etwas völlig anderes tun (oder schlafen) — die CPU ist frei.
Der Code — Schritt für Schritt
Tracing & Perfetto
Was passiert wirklich zur Laufzeit? Mit Tracing zeichnest du Task-Wechsel & Ereignisse auf und analysierst sie auf einer Zeitachse.
Ein tasks_trace-Demo schreibt zur Laufzeit tokenisierte Trace-Ereignisse in eine kompakte Binärdatei. Weil die Ereignisnamen nur als Zahlen (Token) gespeichert werden, ist das extrem sparsam — die Klartext-Namen stecken in der .elf-Datei und werden erst beim Dekodieren wieder zusammengeführt.
# 1) Demo bauen & laufen lassen → schreibt trace.bin
# 2) Binärdatei mit Hilfe der ELF-Symbole dekodieren
python scripts/decode_trace.py trace.bin build/tasks_trace.elf > trace.json
# 3) trace.json auf ui.perfetto.dev öffnen (per Drag & Drop)
Fachwort-Glossar
Englischer Fachbegriff, deutsche Übersetzung und eine kurze Erklärung. Durchsuch- und filterbar.
Quiz
Antwort wählen, prüfen — du bekommst sofort richtig/falsch mit Erklärung.
{{ quizAnswered }} beantwortet
Offene Fragen
Formuliere zuerst selbst eine Antwort — dann decke die Musterlösung auf und vergleiche. Ideal fürs Klausurtraining.
Übungsaufgaben
Der Übungszettel zu Teil 2 — implementiere die Konzepte selbst im RTOS-Simulator und analysiere sie mit Perfetto.