diff --git a/20211118/es-20211118.pdf b/20211118/es-20211118.pdf
index ed8f44fe6771e9bf6a80213bf0e60718972b90e8..9e4dd6867c8876ea9f98e164db50e97e690a5284 100644
Binary files a/20211118/es-20211118.pdf and b/20211118/es-20211118.pdf differ
diff --git a/20211118/es-20211118.tex b/20211118/es-20211118.tex
index ff72990e907db0f055df7e469bc48d4d6efd1259..e6358d3e07ec297a7624fb5779d743fdac679cbf 100644
--- a/20211118/es-20211118.tex
+++ b/20211118/es-20211118.tex
@@ -676,6 +676,108 @@
       ansonsten zyklisch einer von bis zu 5 weiteren Tasks.
   \end{itemize}
 
+  \pause
+
+  RP6-Steuerung
+  \begin{itemize}
+    \item
+      Konfiguration durch bedingte Compilierung (Präprozessor)
+    \item
+      Lichtschranken an Encoder-Scheiben lösen bei Bewegung Interrupts aus.\\
+      Die Interrupt-Handler zählen Variable hoch.
+    \item
+      10000mal pro Sekunde: Timer-Interrupt\\
+      Durch Zähler im Interrupt-Handler: verschiedene Taktraten\\
+      1000mal pro Sekunde: Stopwatches\\
+      5mal pro Sekunde: Blinkende Power-On-LED\\
+      1000mal pro Sekunde: Bumper, ACS, PWM zur Motorsteuerung\\
+      Geschwindigkeitsmessung durch Zählen der Ticks in 0.2\,s\\
+      Anpassung der Motorkraft in $\pm$1-Schritten
+    \pause
+    \item
+      Nebenbei: \only<4->{1 }Benutzerprogramm
+  \end{itemize}
+
+\end{frame}
+
+\subsection{Multitasking}
+
+\begin{frame}
+
+  \showsubsection
+
+  \begin{itemize}
+    \item
+      \newterm{Kooperatives Multitasking}\\
+      Prozesse geben freiwillig Rechenzeit ab
+    \item
+      \newterm{Präemptives Multitasking}\\
+      Das Betriebssystem unterbricht laufende Prozesse\\
+      (englisch: \emph{to pre-empt\/} -- jemandem zuvorkommen)
+    \pause
+    \bigskip
+    \item
+      \newterm{Scheduler}\\
+      Steuerprogramm, das Prozessen Rechenzeit zuteilt
+    \item
+      \newterm{Kontextwechsel}\\
+      Umschalten zwischen zwei Prozessen
+    \item
+      \newterm{Round-Robin-Verfahren (Rundlauf)}\\
+      Zuteilung von \newterm{Zeitschlitzen\/} auf einer \newterm{Zeitscheibe} an die Prozesse
+    \bigskip
+    \pause
+    \item
+      Ausblick: Zuteilung von Rechenzeit = wichtiger Spezialfall\\
+      allgemein: Zuteilung von Ressourcen
+  \end{itemize}
+
+\end{frame}
+
+\subsectionnonumber{Beispiele für Multitasking}
+
+\begin{frame}
+
+  \showsubsectionnonumber
+
+  Quadrocopter-Steuerung \emph{MultiWii}
+  \begin{itemize}
+    \item
+      Konfiguration durch bedingte Compilierung (Präprozessor)
+    \item
+      In der Hauptschleife wird 50mal pro Sekunde der RC-Task aufgerufen,\\
+      ansonsten zyklisch einer von bis zu 5 weiteren Tasks.
+  \end{itemize}
+
+  RP6-Steuerung
+  \begin{itemize}
+    \item
+      Konfiguration durch bedingte Compilierung (Präprozessor)
+    \item
+      Lichtschranken an Encoder-Scheiben lösen bei Bewegung Interrupts aus.\\
+      Die Interrupt-Handler zählen Variable hoch.
+    \item
+      10000mal pro Sekunde: Timer-Interrupt\\
+      verschiedene Tasks werden unterschiedlich häufig aufgerufen
+    \item
+      Nebenbei: 1 Benutzerprogramm
+  \end{itemize}
+
+%  \pause
+%
+%  Linux 0.01
+%  \begin{itemize}
+%    \item
+%      Timer-Interrupt:\only<2->{ Zähler des aktuellen Tasks wird dekrementiert;}\\
+%      Task mit höchstem Zähler bekommt Rechenzeit.
+%    \item
+%      Wenn es keinen laufbereiten Task mit positivem Zähler gibt,\\
+%      bekommen alle Tasks gemäß ihrer Priorität neue Zähler zugewiesen.
+%    \item
+%      \emph{keine\/} harte Echtzeit
+%      % Aufgabe: Wo wird der Zähler heruntergezählt?
+%  \end{itemize}
+
 \end{frame}
 
 \end{document}
diff --git a/20211118/loop-time.cpp b/20211118/loop-time.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bb4fb00de597c740ab097e6eacc955d4d65da117
--- /dev/null
+++ b/20211118/loop-time.cpp
@@ -0,0 +1,33 @@
+  while(1) {
+    currentTime = micros();
+    cycleTime = currentTime - previousTime;
+    #if defined(LOOP_TIME)
+      if (cycleTime >= LOOP_TIME) break;
+    #else
+      break;  
+    #endif
+  }
+  previousTime = currentTime;
+
+
+
+  currentTime = micros();
+  #if defined(LOOP_TIME)
+    cycleTime = currentTime - previousTime;
+    while (cycleTime < LOOP_TIME)
+      {
+        currentTime = micros();
+        cycleTime = currentTime - previousTime;
+      }
+  #endif
+  previousTime = currentTime;
+
+
+
+  #if defined(LOOP_TIME)
+    while ((currentTime = micros()) - previousTime < LOOP_TIME)
+      ; /* do nothing */
+    previousTime = currentTime;
+  #else
+    currentTime = micros();
+  #endif