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