summaryrefslogtreecommitdiff
path: root/realtime
diff options
context:
space:
mode:
authorJan Altenberg <jan@homerjsimpson.(none)>2009-06-20 03:38:22 +0200
committerJan Altenberg <jan@homerjsimpson.(none)>2009-06-20 03:38:22 +0200
commitb208259c74504385c2f9b90d892785c55cc9aff5 (patch)
tree6b2da1433f080913369f11ef6d2ddbaa76f38246 /realtime
parent3ed5b5306f5fa4ee95bcb5a57733bd116ce008e3 (diff)
rt-specialties chapter
Diffstat (limited to 'realtime')
-rw-r--r--realtime/rt-specialties/Makefile9
-rw-r--r--realtime/rt-specialties/handout_rt-specialties_de.tex295
-rw-r--r--realtime/rt-specialties/hints_rt-specialties_de.tex18
-rw-r--r--realtime/rt-specialties/images/g4894.pngbin0 -> 12196 bytes
-rw-r--r--realtime/rt-specialties/images/menu_rt_001.pngbin0 -> 30735 bytes
-rw-r--r--realtime/rt-specialties/images/menu_rt_002.pngbin0 -> 32309 bytes
-rw-r--r--realtime/rt-specialties/images/menu_rt_003.pngbin0 -> 32025 bytes
-rw-r--r--realtime/rt-specialties/images/menu_rt_004.pngbin0 -> 23627 bytes
-rw-r--r--realtime/rt-specialties/images/pitfall.pngbin0 -> 32291 bytes
-rw-r--r--realtime/rt-specialties/images/pitfall.svg121
-rw-r--r--realtime/rt-specialties/images/thumb.pngbin0 -> 12196 bytes
-rw-r--r--realtime/rt-specialties/images/thumb.svg86
-rw-r--r--realtime/rt-specialties/pres_rt-specialties_de.tex227
13 files changed, 732 insertions, 24 deletions
diff --git a/realtime/rt-specialties/Makefile b/realtime/rt-specialties/Makefile
new file mode 100644
index 0000000..e80961b
--- /dev/null
+++ b/realtime/rt-specialties/Makefile
@@ -0,0 +1,9 @@
+all:
+ pdflatex pres_rt-specialties_de.tex
+ pdflatex hints_rt-specialties_de.tex
+ pdflatex handout_rt-specialties_de.tex
+ pdflatex handout_rt-specialties_de.tex
+
+clean:
+ rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out
+
diff --git a/realtime/rt-specialties/handout_rt-specialties_de.tex b/realtime/rt-specialties/handout_rt-specialties_de.tex
index 4c391b2..372aa25 100644
--- a/realtime/rt-specialties/handout_rt-specialties_de.tex
+++ b/realtime/rt-specialties/handout_rt-specialties_de.tex
@@ -1,17 +1,300 @@
-\documentclass{article}
+\documentclass{lxarticle}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{lxheaders}
+\usepackage{lxextras}
\begin{document}
-\section*{Titel}
+\section*{Anwendung des Preempt RT Patches}
+\subsection*{Besorgen und Anwenden des Patches}
+Preempt RT wird als Patch gegen den Mainline Linux Kernel gepflegt.
+Unter:\newline
+http://www.kernel.org/pub/linux/kernel/projects/rt sind die aktuellsten Patche
+für Preempt RT zu finden. Im Unterverzeichnis older/ sind ältere Patche
+archiviert. Das Vorbereiten eines Kerneltrees mit Preempt RT ist denkbar
+einfach:
+\begin{lstlisting}
+# Vanilla Kernel
+wget http://www.kernel.org/pub/linux/kernel\
+/v2.6/linux-2.6.29.5.tar.bz2
-\subsection*{Abschnitt1}
+# Preempt RT Patch
+wget http://www.kernel.org/pub/linux/kernel\
+/projects/rt/patch-2.6.29.5-rt21.bz2
-Text
+# Extract the kernel tree
+tar xjvf linux-2.6.29.5.tar.bz2
+# Patch the kernel tree
+cd linux-2.6.29.5
+bzcat ../patch-2.6.29.5-rt21.bz2 | patch -p1
+\end{lstlisting}
+Mit Steven Rostedt's Version des Pythonskripts ''ketchup'' geht es sogar noch einfacher (Steven
+Rostedt's ketchup Version steht unter:\newline
+http://people.redhat.com/srostedt/rt/tools/ketchup-0.9.8-rt3 zum Download
+bereit):
+\begin{lstlisting}
+mkdir linux-2.6.29.5-rt21
+cd linux-2.6.29.5-rt21
+ketchup -f --no-gpg 2.6.29.5-rt21
+\end{lstlisting}
-\subsection*{Abschnitt2}
+\subsection*{Konfigurieren und Übersetzen eines Preempt RT Kernels}
+Die Konfiguration und das Übersetzen machen keinen Unterschied zu Linux ohne
+Preempt RT Patch:
+\begin{lstlisting}
+# external build directory
+mkdir ../build
+# base build on existing config
+cp /boot/config-x-x-x ../build/.config
+make O=../build oldconfig
+\end{lstlisting}
+Für ein Echtzeitsystem müssen verschiedene Kerneloptionen aktiviert werden:
+\begin{lstlisting}
+make O=../build menuconfig
+\end{lstlisting}
+Die wichtigsten Optionen befinden sich unter dem Menupunkt ''Kernel features''
+bzw. ''Processor type and features''.
+\begin{figure}[ht!]
+\centering
+\includegraphics[height=0.5\textwidth]{images/menu_rt_001.png}
+\end{figure}
+Dort müssen folgende Optionen aktiviert werden:
+\begin{itemize}
+\item High Resolution Timer Support
+\item Preemption Mode (Complete Preemption (Real-Time))
+\end{itemize}
+\begin{figure}[ht!]
+\centering
+\includegraphics[height=0.5\textwidth]{images/menu_rt_002.png}
+\end{figure}
+\begin{figure}[ht!]
+\centering
+\includegraphics[height=0.5\textwidth]{images/menu_rt_003.png}
+\end{figure}
+\begin{figure}[ht!]
+\centering
+\includegraphics[height=0.5\textwidth]{images/menu_rt_004.png}
+\end{figure}
+Das Übersetzen des Kernels erfolgt nun wie üblich mit
+\begin{lstlisting}
+make O=../build
+make O=../build modules
+make O=../build install
+make O=../build modules_install
+\end{lstlisting}
+\section*{Testen eines Preempt RT Systems}
+\subsection*{RT Tests}
+Die RT Tests sind eine Sammlung von Programmen, zur Validierung der
+Eigenschaften von Echtzeitsystemen. Die RT Tests umfassen folgende Tools:
+\begin{itemize}
+\item cyclictest: High Resolution Timer Testsoftware.
+\item hwlatdetect: Python Script, zur Steuerung des Kernelmoduls zur Erkennung
+von System Management Interrupts (hwlat\_detector).
+\item pi\_stress: Stresstest für Mutexe mit Priority Inheritance Attribut
+\item signaltest: Benchmark, bei dem Signale zwischen Tasks ausgetauscht werden.
+\end{itemize}
+Die Sourcen der RT Tests werden in einem GIT Tree verwaltet.
+\begin{lstlisting}
+# Checkout RT Tests
+git-clone git://git.kernel.org/pub/scm/linux/kernel\
+/git/clrkwllms/rt-tests.git
-Text
+# Compile RT Tests
+cd rt-tests
+make
+\end{lstlisting}
+\subsection*{Cyclictest}
+Cyclictest ist die wohl meistgenutzte Testsoftware auf Preempt RT Systemen. Mit
+Cyclictest kann eine bestimmte Anzahl von Timertasks mit einem definierten
+Interval aufgesetzt werden. Für diese Tasks wird kontinuierlich die Abweichung
+zum gewünschten Interval gemessen und hierfür die Maximale und Durchschnittliche
+Abweichung aufgezeichnet. Die wichtigsten Parameter für Cyclictest sind die
+Anzahl und die Priorität der gewünschten Timertasks, die Art des zu verwendenden
+Timers und das gewünschte Timerinterval:
+\begin{lstlisting}
+# 4 Timertasks (2000 , 2500, 3000, 3500us)
+# -i options tells us the interval of the first task
+# the interval of all other tasks will be increased
+# by 500us
+# The -p options tells us the priority of the first task
+# the priorities of all other tasks will be decremented by 1
+# -n = using nanosleep
+zi:~# cyclictest -p80 -n -t4 -i2000
+0.32 0.30 0.12 1/56 2124
+T: 0 ( 2121) P:80 I:2000 C: 1258 Min: 62 Act: 99 Avg: 83 Max: 161
+T: 1 ( 2122) P:79 I:2500 C: 1007 Min: 47 Act: 76 Avg: 77 Max: 130
+T: 2 ( 2123) P:78 I:3000 C: 841 Min: 54 Act: 76 Avg: 82 Max: 136
+T: 3 ( 2124) P:77 I:3500 C: 723 Min: 67 Act: 95 Avg: 96 Max: 177
+\end{lstlisting}
+\subsection*{Lastszenarien}
+Um eine Aussage über das Echtzeitverhaltens treffen zu können, interessiert in
+der Hauptsache das Verhalten in Worst-Case Szenarien (hohe CPU Laste, hohe
+Interruptlast). Ein ausgezeichnetes Werkzeug, um CPU Last zu erzeugen, ist
+''hackbench''. Hackbench wurde ursprünglich als Schedulerbenchmark entwickelt.
+Es erzeugt eine bestimme Anzahl an Prozessgruppen von Clients und Servern, die
+über Sockets miteinander kommunizieren:\newline
+http://people.redhat.com/mingo/cfs-scheduler/tools/hackbench.c
+
+Interruptlast, läßt sich hervorragend mit einem Floodping von einem entfernten
+Rechner erzeugen. Ein Floodping schickt eine große Anzahl von ICMP Paketen in
+kurzer Zeit. Dies erzeugt eine hohe Anzahl von Netzwerkinterrupts. Um Floodpings
+zu generieren muß das Programm ping mit Rootrechten und mit der Option -f
+ausgeführt werden.
+\subsection*{Pitfall}
+Ein sehr häufig gemeldetes Phänomen bei Testläufen von Cyclictest mit einem
+Floodping als Lastszenario, sind extrem große Ausreißer in der Größenordnung von
+50ms. Dies ist auf ein ''Feature'' aktueller Preempt RT Kernel zurückzuführen.
+Da Preempt RT auch auf vielen Desktops eingesetzt wird, auf denen Low Latency
+Anwendungen betrieben werden (z.B. Multimedia Anwendungen), häuften sich
+Fehlerberichte, die letztendlich nicht auf ein Kernelproblem zurückzuführen
+waren, sondern auf eine Realtime Applikation, die den Rest des Systems
+aushungerte. Daher wurde eine Option eingeführt, die die Laufzeit von Realtime
+Tasks beschränken kann. Überschreiten die Realtime Tasks dieses Zeitlimit,
+werden diese für einen bestimmten Zeitraum nicht mehr geschedult. Die
+Standardeinstellung liegt bei 950ms. Bei Überschreiten der 950ms werden die
+Echtzeittasks für 50ms suspendiert. Dieser Wert kann durch Schreiben des
+gewünschten Wertes nach /proc/sys/kernel/sched\_rt\_runtime\_us angepaßt werden.
+Zum Deaktivieren dieser Funktion muß folgendes getan werden:
+\begin{lstlisting}
+echo -1 > /proc/sys/kernel/sched_rt_runtime_us
+\end{lstlisting}
+\section*{Erstellen einer Realtime Task für Preempt RT}
+\subsection*{Schedulingklassen / Prioritäten}
+Eine Realtime Applikation auf Preempt RT ist eine POSIX Realtime Applikation.
+POSIX sieht für Echtzeitapplikationen folgende Schedulingstrategien vor:
+\begin{itemize}
+\item SCHED\_FIFO: Scheduling mit statischen Prioriäten
+\item SCHED\_RR: Round Robin mit Prioritäten
+\end{itemize}
+Echtzeitpriorität bekommt eine Applikation nur dann, wenn dies explizit
+gewünscht wird. Hierzu ist die Funktion sched\_setscheduler() vorgesehen.
+\subsection*{Beispiel einer Echtzeitapplikation}
+Das folgende Beispiel zeigt eine einfache POSIX Realtimeapplikation:
+\begin{lstlisting}
+/*
+ * POSIX Realtime Example
+ * based on the example on http://rt.wiki.kernel.org
+ /
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <sched.h>
+#include <sys/mman.h>
+#include <string.h>
+
+#define MAX_SAFE_STACK (8*1024) /* The maximum stack size which is
+ guranteed safe to access without
+ faulting */
+
+void stack_prefault(void) {
+
+ unsigned char dummy[MAX_SAFE_STACK];
+
+ memset(&dummy, 0, MAX_SAFE_STACK);
+ return;
+}
+
+int main(int argc, char* argv[])
+{
+ struct sched_param param;
+
+ /* Declare ourself as a real time task */
+ param.sched_priority = 80;
+ if(sched_setscheduler(0, SCHED_FIFO, &param) == -1) {
+ perror("sched_setscheduler failed");
+ exit(-1);
+ }
+
+ /* Lock memory !!!*/
+ if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) {
+ perror("mlockall failed");
+ exit(-2);
+ }
+
+ /* Pre-fault our stack */
+ stack_prefault();
+
+ while(1) {
+ [...]
+ }
+}
+\end{lstlisting}
+Die oben aufgelistete Applikation zeigt sehr schön, was notwendig ist, um eine
+Applikation mit deterministischem Zeitverhalten zu erzeugen:
+\begin{itemize}
+\item RT Scheduling Policy und Priorität festlegen
+\item Speicher locken, um zu vermeiden, um undeterministisches Zeitverhalten
+durch Pagefaults auszuschliessen.
+\item ''Stack Pre-Faulting'', um zu zu vermeiden, daß Stackfaults
+undeterministisches Zeitverhalten verursachen
+\end{itemize}
+Eine Ausgezeichnete Einführung zum Erstellen von Echtzeitapplikation und zur
+Verwendung von Preempt RT, findet sich unter:\newline
+http://rt.wiki.kernel.org
+\subsection*{Tracing / Latenzen aufspüren}
+\subsubsection*{FTrace}
+Ein hervorragendes Werkzeug, um kernelseitige Codepfade aufzuspüren, die lange
+Latenzzeiten verursachen, ist Ftrace. Ftrace wird über DebugFS, einem virtuellen
+Dateisystem, gesteuert und platziert dort auch seine Ausgaben. Die einfachste
+Methode, FTrace zu verwenden ist Cyclictest. Cyclictest biete bereits einige
+Optionen, um FTrace zu verwenden. Die Option -f schällt Cyclictests Ftrace
+Support an, -b <max\_latency> veranlaßt Cyclictest, bei Überschreiten einer
+maximalen Latenzzeit, abzubrechen und einen Trace zu triggern.
+\subsubsection*{Kerneloptionen für FTrace}
+Um FTrace verwenden zu können, müssen beim Konfigurieren des Kernel einige
+unter dem Menupunkt ''Kernel hacking-->Tracers'' einige Optionen aktiviert werden:
+\begin{itemize}
+\item Kernel Function Tracer
+\item Optional: Beliebige Optionen, die mit Trace beginnen (der zu verwendende
+Tracetyp kann cyclictest über die Commandline mitgegeben werden, siehe
+cyclictest -h. Default ist der
+Event Tracer)
+\end{itemize}
+\subsubsection*{Beispiel eines Traces}
+Das Erstellen eines Traces mit cyclictest läßt sich am Besten mit einem Beispiel
+erläutern:
+\begin{lstlisting}
+# mount DebugFS
+mkdir -p /mnt/debugfs
+mount -t debugs debugfs /mnt/debugfs
+
+# list available tracers
+zi:~# cat /mnt/debugfs/tracing/available_tracers
+wakeup_rt wakeup preemptoff function sched_switch nop
+
+# start trace
+cyclictest -p80 -n -f -b 100
+
+zi:~# less /mnt/debugfs/tracing/trace
+# tracer: function
+#
+# TASK-PID CPU# TIMESTAMP FUNCTION
+# | | | | |
+IRQ-129-772 [000] 4154503386.851178: __rt_mutex_adjust_prio<-t
+IRQ-129-772 [000] 4154503386.851186: __rt_mutex_adjust_prio<-t
+IRQ-129-772 [000] 4154503386.851189: task_setprio<-__rt_mutex_
+IRQ-129-772 [000] 4154503386.851192: task_rq_lock <-task_setpr
+IRQ-129-772 [000] 4154503386.851195: sched_clock <-sched_clock
+IRQ-129-772 [000] 4154503386.851199: dequeue_task <-task_setpr
+IRQ-129-772 [000] 4154503386.851202: dequeue_task_fair <-deque
+IRQ-129-772 [000] 4154503386.851206: update_curr <-dequeue_tas
+IRQ-129-772 [000] 4154503386.851217: enqueue_task_rt <-task_se
+IRQ-129-772 [000] 4154503386.851221: dequeue_rt_stack<-enqueue
+IRQ-129-772 [000] 4154503386.851226: switched_to_rt <-task_set
+IRQ-129-772 [000] 4154503386.851234: timer_interrupt<-ret_from
+[...]
+\end{lstlisting}
+
+\subsection*{Kontrollfragen}
+\begin{itemize}
+\item Welche Optionen sollten beim Übersetzen eines Preempt RT Kernels
+mindestens gesetzt sein?
+\item Wozu dient das Tool cyclictest?
+\item Welchen bekannten ''Pitfall'' gibt es bzgl. hoher Latencies mit Floodping
+als Lastszenario? Wie kann dieser behoben werden?
+\item Welche 3 Schritte sind notwendig, um das deterministische Zeitverhalten
+einer Applikation zu garantieren?
+\end{itemize}
\end{document}
diff --git a/realtime/rt-specialties/hints_rt-specialties_de.tex b/realtime/rt-specialties/hints_rt-specialties_de.tex
index b8b74bc..e07f25a 100644
--- a/realtime/rt-specialties/hints_rt-specialties_de.tex
+++ b/realtime/rt-specialties/hints_rt-specialties_de.tex
@@ -1,25 +1,27 @@
-\documentclass{article}
+\documentclass{lxarticle}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{lxheaders}
+\usepackage{lxextras}
\begin{document}
-\section*{Block \lq Realtime-Besonderheiten\rq}
+\section*{Block \lq Was ist Linux?\rq}
\subsection*{Lernziele}
\begin{itemize}
-\item Verstehen, warum Kernel-Treiber SMP-fest sein müssen
-\item Kennenlernen der Grundregeln für korrektes Locking im Kernel
-\item Kennenlernen von Möglichkeiten zum Test der RT-Funktionalität
- (lockdep, cyclictest)
+\item Beschaffen und anwenden des Preempt RT Patches
+\item Konfigurieren und Kompilieren eines Preempt RT Kernels
+\item Testen des Preempt RT Kernels
\end{itemize}
\subsection*{Unterrichts-Ablauf}
-Hinweise zur Präsentation, Zeitplanung, etc.
+Vortrag + Übungen (insgesamt 90 - 120 Minuten)
\subsection*{Übungen bei vorhandener Hardware}
-Hinweise zu Übungen, Zeitlimit dazu.
+RT Kernel für das Entwicklungssystem. Testen des RT Kernels und dessen
+Echtzeitverhaltens auf dem Entwicklungssystem.
\end{document}
diff --git a/realtime/rt-specialties/images/g4894.png b/realtime/rt-specialties/images/g4894.png
new file mode 100644
index 0000000..6b9f247
--- /dev/null
+++ b/realtime/rt-specialties/images/g4894.png
Binary files differ
diff --git a/realtime/rt-specialties/images/menu_rt_001.png b/realtime/rt-specialties/images/menu_rt_001.png
new file mode 100644
index 0000000..27f26cd
--- /dev/null
+++ b/realtime/rt-specialties/images/menu_rt_001.png
Binary files differ
diff --git a/realtime/rt-specialties/images/menu_rt_002.png b/realtime/rt-specialties/images/menu_rt_002.png
new file mode 100644
index 0000000..c4dd8dc
--- /dev/null
+++ b/realtime/rt-specialties/images/menu_rt_002.png
Binary files differ
diff --git a/realtime/rt-specialties/images/menu_rt_003.png b/realtime/rt-specialties/images/menu_rt_003.png
new file mode 100644
index 0000000..8449d80
--- /dev/null
+++ b/realtime/rt-specialties/images/menu_rt_003.png
Binary files differ
diff --git a/realtime/rt-specialties/images/menu_rt_004.png b/realtime/rt-specialties/images/menu_rt_004.png
new file mode 100644
index 0000000..21045c8
--- /dev/null
+++ b/realtime/rt-specialties/images/menu_rt_004.png
Binary files differ
diff --git a/realtime/rt-specialties/images/pitfall.png b/realtime/rt-specialties/images/pitfall.png
new file mode 100644
index 0000000..a083003
--- /dev/null
+++ b/realtime/rt-specialties/images/pitfall.png
Binary files differ
diff --git a/realtime/rt-specialties/images/pitfall.svg b/realtime/rt-specialties/images/pitfall.svg
new file mode 100644
index 0000000..bdfc4de
--- /dev/null
+++ b/realtime/rt-specialties/images/pitfall.svg
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="792pt"
+ height="612pt"
+ id="svg4691"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="pitfall.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4693">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 382.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="990 : 382.5 : 1"
+ inkscape:persp3d-origin="495 : 255 : 1"
+ id="perspective4700" />
+ <inkscape:perspective
+ id="perspective20"
+ inkscape:persp3d-origin="90 : 60 : 1"
+ inkscape:vp_z="180 : 90 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 90 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:document-units="in"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.43415836"
+ inkscape:cx="490"
+ inkscape:cy="380"
+ inkscape:current-layer="layer1"
+ id="namedview4695"
+ showgrid="false"
+ inkscape:window-width="777"
+ inkscape:window-height="694"
+ inkscape:window-x="0"
+ inkscape:window-y="0" />
+ <metadata
+ id="metadata4697">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g4755"
+ transform="matrix(2.6403336,0,0,2.4856297,25.373428,151.72498)">
+ <g
+ id="g2474"
+ transform="translate(207.14286,240)">
+ <path
+ id="path2167"
+ style="opacity:1;fill:#000000;fill-opacity:0.39215686;stroke:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(1.093023,0,0,0.842105,-449.57615,-588.31045)"
+ d="M 367.85713,604.50507 C 367.85713,612.00036 340.35462,618.0765 306.42856,618.0765 C 272.5025,618.0765 244.99999,612.00036 244.99999,604.50507 C 244.99999,597.00978 272.5025,590.93364 306.42856,590.93364 C 340.35462,590.93364 367.85713,597.00978 367.85713,604.50507 z" />
+ <path
+ id="path2169"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.49999952;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M -38.366697,-154.03579 C -38.366697,-106.45336 -78.601717,-76.585723 -120.60133,-76.585723 C -162.60093,-76.585723 -195.91902,-97.142383 -195.91902,-144.72481 C -195.91902,-192.30724 -161.83237,-230.92485 -119.83278,-230.92485 C -77.833167,-230.92485 -38.366697,-201.61822 -38.366697,-154.03579 z" />
+ <path
+ id="path2171"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.50000119;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M -92.266587,-185.80507 C -88.974947,-170.69628 -70.512827,-157.9914 -58.003827,-159.36286 C -45.494817,-160.73432 -40.031307,-172.58272 -41.584257,-185.80507 C -43.137207,-199.0274 -55.750417,-209.75858 -69.738737,-209.75858 C -83.727047,-209.75858 -95.550867,-200.88001 -92.266587,-185.80507 z" />
+ <path
+ id="path2173"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.50000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M -96.631567,-188.85315 C -99.432827,-172.07333 -118.94378,-163.19223 -133.32452,-164.71536 C -147.70527,-166.23851 -157.84425,-176.37155 -153.76668,-190.59614 C -149.84821,-204.2657 -135.34576,-213.1164 -119.22855,-214.87495 C -103.87249,-216.55048 -93.836587,-205.59541 -96.631567,-188.85315 z" />
+ <path
+ id="path2175"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M -54.955147,-120.00315 C -35.563807,-164.77146 -78.057907,-147.52991 -100.06113,-150.43917 C -129.6546,-154.35203 -147.89706,-167.90437 -156.64093,-137.64851 C -162.45911,-117.51627 -151.86379,-87.343823 -118.49223,-84.253623 C -86.109857,-81.255013 -64.429777,-98.129303 -54.955147,-120.00315 z" />
+ <path
+ id="path2182"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:2.50000095;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -92.281567,-193.24411 C -85.247077,-198.69989 -68.966957,-202.51813 -55.470537,-199.26799" />
+ <path
+ id="path2184"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:2.50000095;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -92.073437,-191.12679 C -83.780857,-185.22099 -66.976157,-181.08779 -48.678887,-180.64384" />
+ <path
+ id="path2186"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:2.50000238;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -91.561127,-192.46927 C -87.012907,-194.49878 -78.385717,-193.52634 -73.191017,-190.53255" />
+ <path
+ id="path2188"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:2.50000072;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -96.951897,-195.68429 C -104.71553,-201.14007 -122.68309,-204.95831 -137.57845,-201.70816" />
+ <path
+ id="path2190"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:2.50000095;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -97.048287,-193.26964 C -105.25822,-185.63676 -121.89541,-180.29485 -140.0103,-179.72107" />
+ <path
+ id="path2192"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:2.50000191;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -96.557957,-193.69653 C -103.49043,-194.37538 -110.15904,-194.05739 -115.47511,-192.10333" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/realtime/rt-specialties/images/thumb.png b/realtime/rt-specialties/images/thumb.png
new file mode 100644
index 0000000..6b9f247
--- /dev/null
+++ b/realtime/rt-specialties/images/thumb.png
Binary files differ
diff --git a/realtime/rt-specialties/images/thumb.svg b/realtime/rt-specialties/images/thumb.svg
new file mode 100644
index 0000000..9dd0510
--- /dev/null
+++ b/realtime/rt-specialties/images/thumb.svg
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ id="svg4789"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="thumb.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4791">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective4797" />
+ <inkscape:perspective
+ id="perspective4891"
+ inkscape:persp3d-origin="31.057341 : 38.773214 : 1"
+ inkscape:vp_z="62.114681 : 58.159821 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 58.159821 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.35"
+ inkscape:cx="350"
+ inkscape:cy="520"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="777"
+ inkscape:window-height="694"
+ inkscape:window-x="0"
+ inkscape:window-y="0" />
+ <metadata
+ id="metadata4794">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ transform="matrix(2.2879403,0,0,1.9333886,19.286101,148.62532)"
+ id="g4894"
+ inkscape:label="Ebene 1"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ inkscape:export-filename="/home/jan/work/omnicron/schulung/realtime/rt-specialties/images/thumb.png">
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
+ d="M 41.170639,110.94497 C 42.131869,113.28037 42.056699,113.0115 42.896889,114.1923 C 41.969312,115.97194 44.898116,118.97037 48.383799,119.76051 C 49.507048,120.56961 49.903311,120.30025 52.299619,121.27211 C 58.356641,122.77968 66.085401,121.9375 70.823561,121.81605 C 75.124991,121.51645 79.41525,120.17798 81.280831,119.44983 C 84.661022,118.13049 86.78171,116.82102 88.335754,114.25496 C 91.046488,109.77894 90.113227,106.17538 87.706007,104.18412 C 90.382541,101.51454 91.669184,97.152614 90.704161,93.898234 C 94.508891,91.209724 95.540465,84.271374 94.863987,78.085094 C 94.522513,74.962334 93.036658,72.780764 92.072269,71.443744 C 92.782581,65.900674 91.599915,60.272684 89.120714,56.268294 C 87.41304,53.510084 83.940323,50.110774 80.519977,50.024434 C 77.099631,49.938094 69.415201,52.354294 68.403481,47.244774 C 67.391761,42.135254 72.371751,35.082944 73.534111,27.675154 C 74.248791,23.120434 70.474441,17.739634 67.980861,14.215834 C 65.494381,10.702094 62.041921,8.7951439 57.684111,6.7658539 C 54.096361,5.0951639 48.415189,5.5675339 45.925219,9.1570439 C 43.260689,12.998194 44.090429,19.239174 45.092349,23.858744 C 45.998149,28.035154 47.695539,31.970064 48.287689,36.273354 C 48.868549,40.494514 50.164909,48.246034 49.106779,52.050464 C 45.882339,55.056064 42.600159,55.099934 38.986699,57.093044 C 35.594339,58.964204 33.823939,63.176654 34.548469,66.919794 C 35.061549,69.570474 37.958069,71.349814 35.739289,74.091144 C 33.091899,77.361994 31.481839,82.297624 34.836819,85.210614 C 38.191789,88.123604 37.687799,89.385374 38.188199,89.851284 C 38.688589,90.317194 38.787859,91.454134 37.586109,94.610074 C 35.645569,99.706164 34.969639,100.12145 38.922519,103.72618 C 40.390999,105.06533 37.396909,110.17207 41.170639,110.94497 z"
+ id="path3128"
+ sodipodi:nodetypes="cccccssccscsccsssssscsssccssc" />
+ <path
+ sodipodi:nodetypes="ccssccsccsccsccscscsccsscccssscsssssscssscsscscscsssssscsscccccccscsscccccsccssccccccsscssccccccc"
+ id="path8092"
+ d="M 70.823561,121.81605 C 66.085401,121.9375 58.356641,122.77968 52.299619,121.27211 C 55.656491,121.47531 58.548621,121.04894 60.086071,120.88674 C 63.462791,120.53055 67.192471,119.57209 69.944951,118.59737 C 73.064041,117.49283 73.672841,117.04139 75.670361,115.85783 C 75.414041,117.17356 74.791451,118.5315 73.803671,119.4424 C 77.198442,118.50835 84.499756,116.10462 86.492036,113.18378 C 88.429655,110.34307 88.601101,107.29043 85.496095,104.79093 C 84.373291,103.94306 84.024458,102.19986 85.806965,103.01437 C 86.38267,102.27147 87.779458,99.728974 88.111128,97.979504 C 88.804697,94.321204 87.263038,88.117034 84.182962,85.576144 C 86.172142,86.359534 88.959955,89.356624 90.046062,91.031534 C 92.927379,88.060044 93.779873,82.897434 93.113685,77.978004 C 92.248692,71.590494 90.014835,69.799834 84.73879,66.649764 C 87.881122,67.168244 89.359604,68.258974 90.643189,69.495754 C 91.074018,65.302684 89.530354,60.906084 87.570339,57.233014 C 86.14698,54.565644 83.449894,51.867614 80.519977,50.024434 C 83.940323,50.110774 87.41304,53.510084 89.120714,56.268294 C 91.599915,60.272684 92.782581,65.900674 92.072269,71.443744 C 93.036658,72.780764 94.522513,74.962334 94.863987,78.085094 C 95.540465,84.271374 94.508891,91.209724 90.704161,93.898234 C 91.669184,97.152614 90.382541,101.51454 87.706007,104.18412 C 90.113227,106.17538 91.046488,109.77894 88.335754,114.25496 C 86.78171,116.82102 84.661022,118.13049 81.280831,119.44983 C 79.41525,120.17798 75.124991,121.51645 70.823561,121.81605 z M 38.188199,89.851284 C 37.687799,89.385374 38.191789,88.123604 34.836819,85.210614 C 31.481839,82.297624 33.091899,77.361994 35.739289,74.091144 C 37.958069,71.349814 35.061549,69.570474 34.548469,66.919794 C 33.823939,63.176654 35.594339,58.964204 38.986699,57.093044 C 42.600159,55.099934 45.882339,55.056064 49.106779,52.050464 C 50.164909,48.246034 48.868549,40.494514 48.287689,36.273354 C 47.695539,31.970064 45.998149,28.035154 45.092349,23.858744 C 44.090429,19.239174 43.260689,12.998194 45.925219,9.1570439 C 48.415189,5.5675339 54.096361,5.0951639 57.684111,6.7658539 C 62.041921,8.7951439 65.494381,10.702094 67.980861,14.215834 C 70.474441,17.739634 74.248791,23.120434 73.534111,27.675154 C 72.371751,35.082944 67.391761,42.135254 68.403481,47.244774 C 65.966661,43.090294 71.277011,33.683014 71.741501,28.023024 C 72.173861,22.702744 68.977341,18.506994 66.513141,15.196274 C 64.930081,13.069374 61.283261,10.188154 57.806571,8.8197839 C 54.962951,7.7005739 51.113399,6.4705439 47.985389,9.9913339 C 45.137169,13.009924 46.044469,19.803564 46.974489,23.387494 C 48.263719,28.355684 49.794549,33.154204 50.510939,39.072884 C 50.972909,42.889654 51.164149,48.006724 50.773309,52.049874 C 52.388179,52.768974 57.845431,50.486174 60.978181,49.820704 C 65.238851,48.915624 70.426461,46.809454 74.687691,49.443604 C 68.527361,48.927964 63.869771,50.382564 58.460261,51.940494 C 54.426811,53.102114 50.470919,54.609784 46.497499,55.894614 C 43.451409,57.157874 39.926599,58.357294 37.782079,60.779344 C 35.855469,62.955274 35.108689,65.336334 37.645909,67.812734 C 41.030029,71.115744 37.019619,74.976584 35.034559,77.597314 C 32.367939,81.117874 36.912969,83.907404 38.798349,86.372714 C 40.857029,89.064634 39.307489,93.545424 37.961699,96.678164 C 36.567509,99.923604 38.990399,99.933374 40.975779,103.75712 C 42.120859,105.9625 39.874969,108.78161 41.170639,110.94497 C 37.396909,110.17207 40.390999,105.06533 38.922519,103.72618 C 34.969639,100.12145 35.645569,99.706164 37.586109,94.610074 C 38.787859,91.454134 38.688589,90.317194 38.188199,89.851284 z M 48.383799,119.76051 C 46.304349,119.39492 41.900229,116.74798 42.896889,114.1923 C 43.737079,115.90881 48.956979,116.80855 48.383799,119.76051 L 48.383799,119.76051 z M 61.944051,106.0826 C 60.070141,105.70878 54.915861,101.74929 57.493391,101.28654 C 61.287781,102.32686 65.469701,104.35839 69.588021,103.28335 C 73.700151,102.20991 78.712808,101.30953 82.507952,102.99747 C 78.500154,103.54114 75.762845,104.51196 71.890071,105.2329 C 68.760541,105.81549 65.209391,106.73398 61.944051,106.0826 z M 82.599485,97.052304 C 83.810322,93.992764 80.297493,88.426484 82.190947,87.490244 C 83.123059,90.474514 87.048271,93.577164 84.078499,96.254254 C 83.922706,96.653754 83.092709,98.111094 82.599485,97.052304 z M 53.449791,87.358584 C 49.500679,84.255794 50.526269,83.471524 52.869781,84.041934 C 55.361961,84.648514 61.502121,84.966554 63.285491,84.544934 C 67.279171,83.600754 75.427651,81.900984 78.752617,84.910394 C 75.257931,84.333494 68.644881,86.015124 64.289191,86.725644 C 61.857651,87.122274 55.382531,88.877134 53.449791,87.358584 z M 80.596084,81.454004 C 84.02012,79.165214 80.413178,71.584134 83.664027,70.673714 C 84.900881,74.123284 85.877771,81.264664 80.813289,81.694264 L 80.596089,81.454014 L 80.596084,81.454004 z M 51.358349,70.368364 C 47.750589,68.816654 47.835069,66.802844 52.500609,67.236454 C 58.270181,67.772684 64.357171,66.342544 69.858661,65.638074 C 73.432941,65.180374 79.606826,64.459574 82.079845,65.986084 C 77.633542,66.773784 72.981011,66.859144 68.739291,68.164734 C 63.829991,69.675814 52.107579,70.690624 51.358349,70.368364 z M 79.145086,52.109884 C 81.356839,54.214244 84.099868,57.760524 81.732109,60.849754 C 82.046922,57.455914 78.805672,55.042494 79.145086,52.109884 z M 53.232611,38.288304 C 54.787401,34.551104 61.305021,36.243034 65.150331,36.103174 C 68.229611,38.978454 62.456401,37.601404 60.762231,37.944104 C 58.493281,37.495924 54.835871,40.768974 53.232611,38.288304 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/realtime/rt-specialties/pres_rt-specialties_de.tex b/realtime/rt-specialties/pres_rt-specialties_de.tex
index 07db328..e7e3d1d 100644
--- a/realtime/rt-specialties/pres_rt-specialties_de.tex
+++ b/realtime/rt-specialties/pres_rt-specialties_de.tex
@@ -1,24 +1,231 @@
-\documentclass{article}
+\documentclass{beamer}
+\usetheme{linutronix}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{pgf}
+\usepackage{graphicx}
+\usepackage{lxextras}
+
+\title{Block \lq Anwendung des Preempt RT Patches\rq}
+\institute{Linutronix GmbH}
\begin{document}
-\section*{Block \lq Was ist Linux?\rq}
+\maketitle
+
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Besorgen und Anwenden des Preempt RT Patches}
+\begin{lstlisting}
+# Vanilla Kernel
+wget http://www.kernel.org/pub/linux/kernel\
+/v2.6/linux-2.6.29.5.tar.bz2
+
+# Preempt RT Patch
+wget http://www.kernel.org/pub/linux/kernel\
+/projects/rt/patch-2.6.29.5-rt21.bz2
+
+# Extract the kernel tree
+tar xjvf linux-2.6.29.5.tar.bz2
+# Patch the kernel tree
+cd linux-2.6.29.5
+bzcat ../patch-2.6.29.5-rt21.bz2 | patch -p1
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Besorgen und Anwenden des Preempt RT Patches}
+\begin{lstlisting}
+mkdir linux-2.6.29.5-rt21
+cd linux-2.6.29.5-rt21
+ketchup -f --no-gpg 2.6.29.5-rt21
+\end{lstlisting}
+\end{frame}
-\subsection*{Lernziele}
+\begin{frame}[fragile]
+\frametitle{Konfigurieren und Übersetzen eines Preempt RT Kernels}
+\begin{overprint}
+\onslide<1>
+\begin{lstlisting}
+# external build directory
+mkdir ../build
+# base build on existing config
+cp /boot/config-x-x-x ../build/.config
+make O=../build oldconfig
+\end{lstlisting}
+\onslide<2>
+\begin{lstlisting}
+make O=../build menuconfig
+\end{lstlisting}
+\onslide<3>
+\begin{figure}[ht!]
+\centering
+\includegraphics[height=0.5\textwidth]{images/menu_rt_001.png}
+\end{figure}
+\onslide<4>
+\begin{figure}[ht!]
+\centering
+\includegraphics[height=0.5\textwidth]{images/menu_rt_002.png}
+\end{figure}
+\onslide<5>
+\begin{figure}[ht!]
+\centering
+\includegraphics[height=0.5\textwidth]{images/menu_rt_003.png}
+\end{figure}
+\onslide<6>
+\begin{figure}[ht!]
+\centering
+\includegraphics[height=0.5\textwidth]{images/menu_rt_004.png}
+\end{figure}
+\onslide<7>
+\begin{lstlisting}
+make O=../build
+make O=../build modules
+make O=../build install
+make O=../build modules_install
+\end{lstlisting}
+\end{overprint}
+\end{frame}
+
+\begin{frame}
+\frametitle{Testen eines Preempt RT Systems}
+RT Tests:
\begin{itemize}
-\item Lernziel 1
-\item Lernziel 2
-\item Lernziel 3
+\item cyclictest
+\item hwlatdetect
+\item pi\_stress
+\item signaltest
\end{itemize}
+\end{frame}
-\subsection*{Unterrichts-Ablauf}
+\begin{frame}
+\frametitle{Cyclictest}
+\begin{itemize}
+\item Ursprünglich entwickelt von Thomas Gleixner für Preempt RT Testing
+\item High Resolution Timer Testsoftware
+\item Setzt beliebige Anzahl von Realtime Tasks mit unterschiedlicher Priorität
+und unterschiedlichen Intervallen auf
+\item Viele Debuggingmöglichkeiten
+\item Sehr Aussagekräftig, um echtzeitverhalten auf einer bestimmten Plattform
+zu beurteilen.
+\end{itemize}
+\end{frame}
-Hinweise zur Präsentation, Zeitplanung, etc.
+\begin{frame}
+\frametitle{Lastszenarien}
+Geeignete Lastszenarien, um Worst-Case Situationen nachstellen /provozieren zu
+können:
+\begin{itemize}
+\item CPU Last: ''hackbench'', ursprünglich als Scheduler Benchmark geschrieben.
+\item Interrupt Last: Floodping (''ping -F'')
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Pitfall!}
+\begin{lstlisting}
+cat /proc/sys/kernel/sched_rt_runtime_us
+\end{lstlisting}
+\begin{figure}[l!]
+\centering
+\includegraphics[height=0.4\textwidth]{images/pitfall.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Echtzeitapplikationen mit Preempt RT}
+\begin{columns}
+\column[r]{7cm}
+\begin{figure}[l!]
+\centering
+\includegraphics[height=0.4\textwidth]{images/thumb.png}
+\end{figure}
+\column[l]{8cm}
+\huge
+POSIX!
+\end{columns}
+\end{frame}
+
+\begin{frame}
+\frametitle{Schedulingstrategien}
+\begin{itemize}
+\item SCHED\_FIFO: Static priority
+\item SCHED\_RR: Round Robin mit Prioritäten
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Aufbau einer RT Applikation}
+\begin{overprint}
+\onslide<1>
+Schedulingstrategie / Priorität
+\begin{lstlisting}
+struct sched_param param;
+
+param.sched_priority = 80;
+if(sched_setscheduler(0, SCHED_FIFO, &param)
+ == -1) {
+ perror("sched_setscheduler failed");
+ exit(-1);
+}
+\end{lstlisting}
+\onslide<2>
+Lock memory:
+\begin{lstlisting}
+if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) {
+ perror("mlockall failed");
+ exit(-2);
+}
+\end{lstlisting}
+\onslide<3>
+''Stack prefaulting''
+\begin{lstlisting}
+void stack_prefault(void) {
+ unsigned char dummy[MAX_SAFE_STACK];
+ memset(&dummy, 0, MAX_SAFE_STACK);
+ return;
+}
+\end{lstlisting}
+\end{overprint}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Tracing / Latency hunting}
+\begin{itemize}
+\item FTrace
+\item Cyclictest unterstützt Traces mittels FTrace
+\item Unterschiedliche Tracer (müssen im Kernel aktiviert sein)
+\item Kommunikation mit FTrace über Debugfs
+\end{itemize}
+\end{frame}
-\subsection*{Übungen bei vorhandener Hardware}
+\begin{frame}[fragile]
+\frametitle{Cyclictest + FTrace}
+\begin{lstlisting}[basicstyle=\ttfamily\fontsize{8}{10}\selectfont]
+# mount DebugFS
+mkdir -p /mnt/debugfs
+mount -t debugs debugfs /mnt/debugfs
-Hinweise zu Übungen, Zeitlimit dazu.
+# list available tracers
+zi:~# cat /mnt/debugfs/tracing/available_tracers
+wakeup_rt wakeup preemptoff function sched_switch nop
+\end{lstlisting}
+\end{frame}
+\begin{frame}[fragile]
+\frametitle{Cyclictest + FTrace}
+\begin{lstlisting}[basicstyle=\ttfamily\fontsize{8}{10}\selectfont]
+cyclictest -p80 -n -f -b 100
+zi:~# less /mnt/debugfs/tracing/trace
+# tracer: function
+#
+# TASK-PID CPU# TIMESTAMP FUNCTION
+# | | | | |
+IRQ-129-772 [000] 4154503386.851178: __rt_mutex_adjust_prio
+IRQ-129-772 [000] 4154503386.851186: __rt_mutex_adjust_prio
+IRQ-129-772 [000] 4154503386.851189: task_setprio<-__rt_mut
+[...]
+\end{lstlisting}
+\end{frame}
\end{document}