summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Traut <manut@linutronix.de>2009-06-22 15:47:30 +0200
committerManuel Traut <manut@linutronix.de>2009-06-22 15:47:30 +0200
commit9cbb0a699f398daffa8c1808d02bf447ebf0c1f0 (patch)
treeea3f4d4081b0648e1da7b1e1d8d3dabe12705a0a
parent9e0bab8ec70646ed9c51d5c7d272da4b51698c6c (diff)
parent719085c3dc98ab3df272476e16e983e4a16fe14b (diff)
Merge branch 'master' of ssh://tglx.de/home/linutronix/git/schulung
-rw-r--r--Makefile9
-rw-r--r--application-devel/Makefile6
-rw-r--r--application-devel/embedded-devel/Makefile8
-rw-r--r--kernel-devel/Makefile6
-rw-r--r--kernel-devel/kernel-basics/Makefile9
-rw-r--r--kernel-devel/kernel-basics/handout_kernel-basics_de.tex137
-rw-r--r--kernel-devel/kernel-basics/pres_kernel-basics_de.tex99
-rw-r--r--kernel-devel/kernel-build/Makefile9
-rw-r--r--kernel-devel/kernel-build/handout_kernel-build_de.tex225
-rw-r--r--kernel-devel/kernel-build/images/menu_rt_001.pngbin0 -> 30735 bytes
-rw-r--r--kernel-devel/kernel-build/pres_kernel-build_de.tex27
-rw-r--r--kernel-devel/uio-driver/Makefile10
-rw-r--r--kernel-devel/uio-driver/images/greg-all-hardware.jpgbin0 -> 76025 bytes
-rw-r--r--kernel-devel/uio-driver/images/greg-kernel-org.jpgbin0 -> 75068 bytes
-rw-r--r--kernel-devel/uio-driver/images/hjk-desperate.jpgbin0 -> 122993 bytes
-rw-r--r--kernel-devel/uio-driver/images/ioctl-vs-uio.pngbin0 -> 106503 bytes
-rw-r--r--kernel-devel/uio-driver/images/konventioneller-treiber.pngbin0 -> 104184 bytes
-rw-r--r--kernel-devel/uio-driver/images/uio-treiber.pngbin0 -> 126807 bytes
-rw-r--r--kernel-devel/uio-driver/pres_uio-driver_en.tex302
-rw-r--r--linux-basics/Makefile6
-rw-r--r--linux-basics/boot-process/handout_boot-process_de.tex150
-rw-r--r--linux-basics/sh-programming/Makefile9
-rw-r--r--linux-basics/sh-programming/handout_sh-programming_de.tex207
-rw-r--r--linux-basics/sh-programming/pres_sh-programming_de.tex247
-rw-r--r--linux-basics/what-is-linux/pres_what-is-linux_de.tex13
-rw-r--r--realtime/Makefile7
-rw-r--r--realtime/rt-basics/handout_rt-basics_de.tex168
-rw-r--r--realtime/rt-basics/hints_rt-basics_de.tex13
-rw-r--r--realtime/rt-basics/images/dual_kernel.pngbin0 -> 43070 bytes
-rw-r--r--realtime/rt-basics/images/dual_kernel.svg251
-rw-r--r--realtime/rt-basics/images/gpos_vs_rt.pngbin0 -> 124609 bytes
-rw-r--r--realtime/rt-basics/images/gpos_vs_rt.svg134
-rw-r--r--realtime/rt-basics/images/ipipe.pngbin0 -> 18012 bytes
-rw-r--r--realtime/rt-basics/images/ipipe.svg185
-rw-r--r--realtime/rt-basics/images/mar01.pngbin0 -> 43535 bytes
-rw-r--r--realtime/rt-basics/images/mar01.svg122
-rw-r--r--realtime/rt-basics/images/mar02.pngbin0 -> 72568 bytes
-rw-r--r--realtime/rt-basics/images/mar02.svg158
-rw-r--r--realtime/rt-basics/images/mar03.pngbin0 -> 74787 bytes
-rw-r--r--realtime/rt-basics/images/mar03.svg163
-rw-r--r--realtime/rt-basics/images/nuclear.pngbin0 -> 1134159 bytes
-rw-r--r--realtime/rt-basics/images/preempt_rt.pngbin0 -> 26716 bytes
-rw-r--r--realtime/rt-basics/images/preempt_rt.svg254
-rw-r--r--realtime/rt-basics/images/prio_inv.pngbin0 -> 23132 bytes
-rw-r--r--realtime/rt-basics/images/prio_inv.svg207
-rw-r--r--realtime/rt-basics/images/rtai.diabin0 -> 634 bytes
-rw-r--r--realtime/rt-basics/images/rtai.dia~bin0 -> 801 bytes
-rw-r--r--realtime/rt-basics/images/rtai.pngbin0 -> 33749 bytes
-rw-r--r--realtime/rt-basics/images/rtai.svg273
-rw-r--r--realtime/rt-basics/images/single_kernel.pngbin0 -> 34007 bytes
-rw-r--r--realtime/rt-basics/images/single_kernel.svg234
-rw-r--r--realtime/rt-basics/images/xenomai.pngbin0 -> 34356 bytes
-rw-r--r--realtime/rt-basics/images/xenomai.svg274
-rw-r--r--realtime/rt-basics/pres_rt-basics_de.tex210
-rw-r--r--realtime/rt-specialties/Makefile9
-rw-r--r--realtime/rt-specialties/handout_rt-specialties_de.tex300
-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
67 files changed, 4789 insertions, 104 deletions
diff --git a/Makefile b/Makefile
index 4929de1..36e06c2 100644
--- a/Makefile
+++ b/Makefile
@@ -1,3 +1,8 @@
+SUBDIRS = kernel-devel linux-basics realtime application-devel
+
+default:
+ make all
+
latex-install:
mkdir -p /usr/share/texmf-texlive/tex/latex/linutronix
cp latex/lxarticle/lxarticle.cls /usr/share/texmf-texlive/tex/latex/linutronix/
@@ -10,3 +15,7 @@ latex-install:
cp latex/latex-beamer/*vf /usr/share/texmf/fonts/vf/linutronix
texhash
+all clean::
+ for dir in $(SUBDIRS) ; do \
+ (cd $$dir && make $@); \
+ done
diff --git a/application-devel/Makefile b/application-devel/Makefile
new file mode 100644
index 0000000..d62fe78
--- /dev/null
+++ b/application-devel/Makefile
@@ -0,0 +1,6 @@
+SUBDIRS = app-debugging compile-tools devel-best-practices devel-environment embedded-devel
+
+all clean::
+ for dir in $(SUBDIRS) ; do \
+ (cd $$dir && make $@); \
+ done
diff --git a/application-devel/embedded-devel/Makefile b/application-devel/embedded-devel/Makefile
new file mode 100644
index 0000000..22cf5f3
--- /dev/null
+++ b/application-devel/embedded-devel/Makefile
@@ -0,0 +1,8 @@
+all:
+ pdflatex handout_embedded-devel_de.tex
+ pdflatex pres_embedded-devel_de.tex
+ pdflatex hints_embedded-devel_de.tex
+
+clean:
+ rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out
+
diff --git a/kernel-devel/Makefile b/kernel-devel/Makefile
new file mode 100644
index 0000000..f325edd
--- /dev/null
+++ b/kernel-devel/Makefile
@@ -0,0 +1,6 @@
+SUBDIRS = char-device driver-basics kernel-basics kernel-best-practices kernel-build uio-driver
+
+all clean:
+ for dir in $(SUBDIRS) ; do \
+ (cd $$dir && make $@); \
+ done
diff --git a/kernel-devel/kernel-basics/Makefile b/kernel-devel/kernel-basics/Makefile
new file mode 100644
index 0000000..aad5bb5
--- /dev/null
+++ b/kernel-devel/kernel-basics/Makefile
@@ -0,0 +1,9 @@
+all:
+ pdflatex pres_kernel-basics_de.tex
+ pdflatex hints_kernel-basics_de.tex
+ pdflatex handout_kernel-basics_de.tex
+ pdflatex handout_kernel-basics_de.tex
+
+clean:
+ rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out
+
diff --git a/kernel-devel/kernel-basics/handout_kernel-basics_de.tex b/kernel-devel/kernel-basics/handout_kernel-basics_de.tex
index 4c391b2..057f4bc 100644
--- a/kernel-devel/kernel-basics/handout_kernel-basics_de.tex
+++ b/kernel-devel/kernel-basics/handout_kernel-basics_de.tex
@@ -1,17 +1,142 @@
-\documentclass{article}
+\documentclass{lxarticle}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{lxheaders}
+\usepackage{lxextras}
\begin{document}
-\section*{Titel}
+\section*{Kernel-Grundlagen}
-\subsection*{Abschnitt1}
+Der Linux-Kernel ist moderner Betriebssystemkern, der sich unter anderem
+durch folgende Eigenschaften auszeichnet:
-Text
+\begin{itemize}
+\item Freie Software (GPL Version 2)
+\item Auf vielen Plattformen lauffähig
+\item Hohe Skalierbarkeit vom Handy bis zum Supercomputer
+\item Große Anzahl integrierter Treiber
+\item Einfache Entwicklung eigener Treiber
+\item Codequalität auf hohem Niveau
+\item Qualitätssicherung durch Code-Review unabhängiger Personen
+\item ca. 10 Millionen Codezeilen (ca. 80\% davon Treiber)
+\item hohes Entwicklungstempo
+\item hervorragende Netzwerk-Fähigkeiten
+\item Echtzeit-Fähigkeit leicht und sauber erreichbar
+\end{itemize}
-\subsection*{Abschnitt2}
+Diese Eigenschaften haben dazu geführt, dass im Embedded-Bereich heute die
+große Mehrzahl der neu begonnenen Projekte mit Linux realisiert werden. Aber
+auch in vielen anderen Bereichen wie dem Cluster-Computing (Google, Rendern
+von Spielfilm-Effekten in Hollywood) werden die Aufgaben heute fast
+ausschließlich mit Linux gelöst.
-Text
+\subsection*{Aufbau des Kernels}
+
+Der Sourcecode des Kernels ist recht übersichtlich in Subsysteme gegliedert.
+Die Grenzen der einzelnen Subsysteme sind keinesfalls scharf definiert, aber
+trotz einzelner Überlappungen und gegenseitigen Abhängigkeiten ist doch ein
+hohes Mass an Unabhängigkeit erreicht worden. Dies trägt entscheidend zur
+Qualität bei, da Änderungen in einem Bereich andere Subsysteme meist nur
+wenig beeinflussen.
+
+\begin{figure}[h]
+\centering
+\includegraphics[width=0.8\textwidth]{images/Subsystems.png}
+\caption{Kernel-Aufbau aus Subsystemen}
+\label{img:subsystems}
+\end{figure}
+
+Abbildung \ref{img:subsystems} zeigt schematisch diesen Aufbau. Man
+unterscheidet zunächst zwischen Subsystemen des \emph{Kernel-Core} und
+Treiber-Subsystemen. Zum Kernel-Core rechnet man Subsysteme wie den für die
+Prozessumschaltung verantwortlichen Scheduler, Memory-Management, Timer und
+ähnliche Einheiten, die zur grundsätzlichen Funktionalität des Kernel gehören
+und auf allen Plattformen vorhanden sein müssen.
+
+Der weitaus größte Teil des Kernels besteht aus Treibern. Hier kann man
+wiederum unterscheiden zwischen Treibern für Hostcontroller von
+Schnittstellen wie PCI, USB oder I2C und den Treibern für Geräte, die diese
+Schnittstellen benutzen. Abbildung \ref{img:subsystems} deutet an, dass es
+zwischen diesen Treibern durchaus Querverbindungen geben kann. Eine PCI-Karte
+kann ja durchaus einen USB- oder I2C-Hostcontroller enthalten, und ein
+bestimmter Sound-Chip könnte wahlweise per USB oder per PCI angeschlossen
+sein.
+
+Unabhängig von der Art der Schnittstellen gibt es ein Repertoire an
+Funktionen, die alle Treiber benötigen. Dazu gehört etwa die Funktionalität,
+Treiber und Geräte einander zuzuordnen. Auch die Darstellung des
+Treiber-Baums im \cmd{sysfs} kommt automatisch allen Treibern zugute.
+Diese übergeordneten Treiberfunktionen werden als \emph{Driver Core}
+bezeichnet.
+
+\subsection*{Kernel Maintainer}
+
+Jedes Subsystem wird normalerweise von einem, manchmal auch mehreren
+Programmierern betreut. Diese Betreuer bezeichnet man als \emph{Maintainer}.
+Ihre Aufgabe besteht darin, den Code selbst weiter zu entwickeln, und vor
+allem die Erweiterungsvorschläge anderer Entwickler zu prüfen. Sie haben als
+Spezialisten für ein bestimmtes Sachgebiet eine wichtige Aufgabe bei der
+Weiterentwicklung und Qualitätssicherung des Kernels.
+
+Da der Kernel von einer freien Entwicklergemeinde entwickelt wird, haben
+Maintainer natürlich keine Weisungsbefugnisse gegenüber anderen
+Programmierern. Dennoch ist es kaum möglich, eine Änderung, die der
+zuständige Maintainer ablehnt, in den offiziellen Kernel zu bringen. Die
+Programmierer, die sich vor allem mit der Integration der vielen
+Änderungsvorschläge befassen (an der Spitze Linus Torvalds), respektieren
+üblicherweise die Entscheidung der zuständigen Maintainer.
+
+Die Kernel-Maintainer sind in der Datei \cmd{MAINTAINERS} im Hauptverzeichnis
+der Kernelquellen aufgelistet. Dort findet man auch die für das jeweilige
+Thema zuständige Mailingliste. Fragen oder Änderungsvorschläge sollte man
+\emph{immer} an die Mailingliste senden und nicht persönlich an den
+Maintainer!
+
+\subsection*{Entwicklungsprozess}
+
+Änderungen am Linux-Kernel erfolgen ausschließlich durch \emph{Patche}. Ein
+Patch ist eine durch das Programm \cmd{diff} Textdatei, die die Änderungen
+durch Angabe der entfernten beziehungsweise hinzugefügten Zeilen beschreibt.
+Das verwendete Textformat ist sehr gut lesbar und ermöglicht ein schnelles
+Erkennen der vorgenommenen Änderungen.
+
+Wer eine Änderung in den offiziellen Kernel bringen möchte, generiert
+zunächst einen solchen Patch. Dann sendet er den Patch in einer Mail an die
+zuständige Mailingliste und nimmt dabei den oder die zuständigen Maintainer
+in Cc:, zusätzlich eventuell weitere Autoren von betroffenem Quellcode. Meist
+erhält er dann innerhalb kurzer Zeit Antworten mit Reviews seines Patch. Je
+nachdem, wie diese ausfallen, wird er seine Änderungen noch einmal
+überarbeiten und erneut einsenden.
+
+Für Änderungen am Kernel-Code gelten sehr strenge Richtlinien für den
+\emph{Coding Style}, das Erzeugen und Versenden des Patch sowie das
+Verhalten auf Mailinglisten. Grundsätzlich sollte der Anbieter eines Patch
+in der Lage sein, mit rein technischen Argumenten zu erläutern, warum es eine
+Verbesserung darstellt, den Patch aufzunehmen.
+
+Informationen dazu findet man in den Kernelquellen unter
+
+\cmd{Documentation/CodingStyle}
+
+\cmd{Documentation/SubmittingPatches}
+
+\subsection*{Kernel-Konfiguration}
+
+Der Kernel ist durch eine Vielzahl an Optionen (mehrere 1000) in weiten
+Bereichen konfigurierbar. Die Konfiguration wird im Hauptverzeichnis der
+Kernelquellen in der versteckten Datei \cmd{.config} gespeichert. Diese Datei
+wird normalerweise nicht von Hand editiert, sondern menügesteuert mit Hilfe
+eines integrierten Konfigurationstools, das man mit \cmd{make menuconfig}
+aufruft.
+
+Diese Tool bezieht seine Informationen aus Dateien mit dem Namen
+\cmd{Kconfig}, die sich in jedem Unterverzeichnis des Quellcodebaums befinden.
+Diese Dateien enthalten die Bezeichnung der Option und die zugehörigen
+Abhängigkeiten und Hilfetexte.
+
+Das Kernel-Buildsystem stellt ein eigenes Subsystem dar und hat einen eigenen
+Maintainer. Es handhabt den kompletten Build-Prozess des Kernels und
+unterstützt dabei auch explizit Cross-Compiling.
\end{document}
diff --git a/kernel-devel/kernel-basics/pres_kernel-basics_de.tex b/kernel-devel/kernel-basics/pres_kernel-basics_de.tex
index 07db328..8b6161e 100644
--- a/kernel-devel/kernel-basics/pres_kernel-basics_de.tex
+++ b/kernel-devel/kernel-basics/pres_kernel-basics_de.tex
@@ -1,24 +1,103 @@
-\documentclass{article}
+\documentclass{beamer}
+\usetheme{linutronix}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{pgf}
+\usepackage{graphicx}
+\usepackage{lxextras}
+
+\title{Kernel-Grundlagen}
+\institute{Linutronix GmbH}
\begin{document}
-\section*{Block \lq Was ist Linux?\rq}
+\maketitle
+
-\subsection*{Lernziele}
+% ----- Slide ------------------
+\begin{frame}
+\frametitle{Kernel-Eigenschaften}
\begin{itemize}
-\item Lernziel 1
-\item Lernziel 2
-\item Lernziel 3
+\item Freie Software (GPL Version 2)
+\pause
+\item Auf vielen Plattformen lauffähig
+\pause
+\item Hohe Skalierbarkeit vom Handy bis zum Supercomputer
+\pause
+\item Große Anzahl integrierter Treiber
+\pause
+\item Einfache Entwicklung eigener Treiber
+\pause
+\item Codequalität auf hohem Niveau
+\pause
+\item Qualitätssicherung durch Code-Review unabhängiger Personen
+\pause
+\item ca. 10 Millionen Codezeilen (ca. 80\% davon Treiber)
+\pause
+\item hohes Entwicklungstempo
+\pause
+\item hervorragende Netzwerk-Fähigkeiten
+\pause
+\item Echtzeit-Fähigkeit leicht und sauber erreichbar
\end{itemize}
+\end{frame}
-\subsection*{Unterrichts-Ablauf}
+% ----- Slide ------------------
+\begin{frame}
+\frametitle{Aufbau des Kernels}
+\centering
+\includegraphics[width=0.8\textwidth]{images/Subsystems.png}
+\end{frame}
-Hinweise zur Präsentation, Zeitplanung, etc.
+% ----- Slide ------------------
+\begin{frame}
+\frametitle{Kernel Maintainer}
+\begin{itemize}
+\item Betreuer eines Subsystems oder Treibers
+\pause
+\item Verantwortlich für Weiterentwicklung
+\pause
+\item Review von Änderungsvorschlägen
+\pause
+\item Annehmen/Ablehnen von Änderungsvorschlägen
+\pause
+\item Weitergabe/Verwaltung angenommener Änderungen
+\end{itemize}
+\end{frame}
-\subsection*{Übungen bei vorhandener Hardware}
+% ----- Slide ------------------
+\begin{frame}
+\frametitle{Entwicklungsprozess}
+\begin{itemize}
+\item Änderungsvorschläge in Form von Patchen
+\pause
+\item Review und Diskussion auf Mailinglisten
+\pause
+\item strenge Richtlinien für Coding Style
+\pause
+\item strenge Richtlinien für Form und Weitergabe von Patchen
+\pause
+\item Nur technische Argumente zählen!
+\end{itemize}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}
+\frametitle{Kernel-Konfiguration}
+\begin{itemize}
+\item Grosse Zahl von Konfigurations-Optionen
+\pause
+\item Speicherung in \cmd{.config}
+\pause
+\item Ändern der Konfiguration: \cmd{make menuconfig}
+\pause
+\item Informationen über Optionen in \cmd{Kconfig}-Dateien
+\pause
+\item Kernel-Buildsystem: Eigenes Subsystem mit eigenem Maintainer
+\pause
+\item Unterstützt explizit auch Cross-Compiling
+\end{itemize}
+\end{frame}
-Hinweise zu Übungen, Zeitlimit dazu.
\end{document}
diff --git a/kernel-devel/kernel-build/Makefile b/kernel-devel/kernel-build/Makefile
new file mode 100644
index 0000000..d221473
--- /dev/null
+++ b/kernel-devel/kernel-build/Makefile
@@ -0,0 +1,9 @@
+all:
+ pdflatex pres_kernel-build_de.tex
+ pdflatex hints_kernel-build_de.tex
+ pdflatex handout_kernel-build_de.tex
+ pdflatex handout_kernel-build_de.tex
+
+clean:
+ rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out
+
diff --git a/kernel-devel/kernel-build/handout_kernel-build_de.tex b/kernel-devel/kernel-build/handout_kernel-build_de.tex
index 4c391b2..f0e5fae 100644
--- a/kernel-devel/kernel-build/handout_kernel-build_de.tex
+++ b/kernel-devel/kernel-build/handout_kernel-build_de.tex
@@ -1,17 +1,230 @@
-\documentclass{article}
+\documentclass{lxarticle}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{lxheaders}
+\usepackage{lxextras}
\begin{document}
-\section*{Titel}
+\section*{Kernel konfigurieren und kompilieren}
-\subsection*{Abschnitt1}
+\subsection*{Vorarbeiten}
-Text
+Bevor man einen Kernel konfigurieren kann, sollte man wissen, was man will.
+Das hört sich zunächst nach einer trivialen Binsenweisheit an, kann aber
+manchmal tatsächlich nicht ganz einfach sein.
-\subsection*{Abschnitt2}
+Zunächst sollte man möglichst viele Informationen über die fragliche Hardware
+sammeln. Dazu gehört die genaue Prozessorversion sowie Typen und Versionen
+der angeschlossenen Chips. Insbesondere die Chips, die bereits beim Booten
+benötigt werden, sollten klar sein. Dazu gehören auf üblichen PCs der,
+Chipsatz mit ATA/SATA-Controller oder, je nach gewünschter Bootquelle auch
+der USB- oder Netzwerk-Chip.
+
+Bei Embedded Devices kommen oft noch NAND-Controller hinzu. In diesem Fall
+sollte man auch über die genauen Daten der angeschlossenen NAND-Chips
+informiert sein.
+
+Weiterhin muss man sich überlegen, von welchen Dateisystemen man booten
+möchte. Gängige Varianten sind ext2, ext3, NFS, oder NAND-Dateisysteme wie
+jffs2 oder ubifs. FAT eignet sich nicht für ein Linux-Rootfilesystem, da es
+beispielsweise keine Gerätedateien unterstützt. Will man Linux von einem
+USB-Stick booten, so wird man diesen dazu beispielsweise mit einem
+ext2-Dateisystem versehen.
+
+ \subsection*{Kernel-Konfiguration}
+
+Mit diesen Informationen versehen, kann man jetzt die Konfiguration beginnen.
+Dies erfolgt durch Eingabe von
+
+\cmd{make menuconfig}
+
+Abbildung \ref{img:menuconfig} zeigt die oberste Ebene des Menüs, das dann erscheint.
+
+
+\begin{figure}[h]
+\centering
+\includegraphics[width=0.8\textwidth]{images/menu_rt_001.png}
+\caption{Menü zur Kernel-Konfiguration}
+\label{img:menuconfig}
+\end{figure}
+
+Am oberen Rand gibt das Menü eine stichwortartige Erklärung zur Bedienung.
+Man sollte bei der Konfiguration zuerst grundlegende Dinge wie den
+Prozessortyp angeben, da untergeordnete Eigenschaften oder Treiber davon
+abhängig sein können.
+
+\subsection*{Module, ja oder nein?}
+Bei üblichen Kerneln für Desktop-Systeme wird man immer einen Großteil der
+Treiber als Module kompilieren. Solche Rechner besitzen viele Schnittstellen,
+über die man später die Hardware erweitern kann, und kann den Kernel bereits
+mit den möglicherweise vorkommenden Treiber-Modulen ausstatten. Diese werden
+dann nur bei Bedarf nachgeladen.
+
+Bei Embedded Systems ist die Situation anders. Hier ist die Hardware meist
+fest vorgegeben, so dass man schon beim Kompilieren genau weiss, welche Treiber
+benötigt werden. Ausserdem ist der im Rootfs zur Verfügung stehende Platz oft
+beschränkt, man wird hier ungern Speicher für unnötige Treiber-Module
+verschwenden.
+
+Andererseits ist es manchmal praktisch, einen Treiber als Modul vorliegen
+zu haben. Speziell während der Entwicklung eines eigenen Treibers ist es
+vorteilhaft, dass man einfach durch Austausch des Moduls eine neue Version
+ausprobieren kann. Unter Linux muss man dabei nicht einmal neu booten,
+sondern kann einen Treiber mit
+
+\cmd{modprobe mein\_modul} installieren und mit
+
+\cmd{rmmod mein\_modul} wieder deinstallieren.
+
+Die Entscheidung, ob man einen Kernel ganz ohne Module baut, hängt vom
+Einzelfall ab. Bei Embedded Systems kommt dies aber durchaus öfter vor.
+
+Aus verständlichen Gründen dürfen Treiber, die zum Booten und Mounten des
+Rootfs benötigt werden, niemals als Module gebaut werden!
+
+\subsection*{initrd}
+
+Die Kernel von Distributionen haben das Problem, dass sie auf möglichst vielen
+unterschiedlichen Rechnern booten müssen. Würde man die Treiber für alle
+denkbaren Kombinationen fest in den Kernel einkompilieren, so hätte man einen
+riesigen Kernel, von dem der Großteil des Codes niemals benutzt würde.
+
+Die statt dessen verwendete Lösung besteht in einem Verfahren, bei dem der
+Kernel beim Booten eine RAM-Disk anlegt und diese mit einem vorbereiteten
+Image füllt. Das Image enthält sämtliche in Frage kommenden Treiber als Module.
+Nach dem Booten und dem Mounten des Root-Filesystems kann die RAM-Disk wieder
+aus dem Speicher entfernt werden. Dieses Verfahren nennt man \emph{initrd}
+(von \emph{Initial RAM Disk}).
+
+Wenn man einen Kernel für ein bestimmtes Board selbst kompiliert, braucht man
+nie eine initrd, da man ja genau die richtigen Treiber fest einkompilieren kann.
+
+\subsection*{initramfs}
+
+Ein anderes Verfahren, bei dem der Kernel zunächst eine RAM-Disk anlegt, ist
+\emph{initramfs}. Im Unterschied zu initrd wird diese aber nicht aus einem
+externen Image geladen, sondern das Image wird bereits beim Kompilieren zum
+Kernel dazugelinkt. Auch hier wird der von der RAM-Disk belegte Speicher am
+Ende wieder freigegeben.
+
+Das initramfs wird vom Kernel wie ein normales Root-Filesystem gemountet.
+Üblicherweise verwendet man ein minimales System, etwa basierend auf uclibc
+und einer busybox. Man kann in den Startskripten dieses Minimalsystems jetzt
+Aktionen ausführen, bevor das eigentliche Rootfs gemountet wird.
+
+Eine Anwendung dieses Verfahrens ist ein kleiner Bootkernel, der von einem
+IPL gestartet wird. In seinem initramfs befinden sich Startskripte, die den
+eigentlichen Produktiv-Kernel aus einer beliebigen Quelle nachladen und dann
+per \cmd{kexec} starten. Der Vorteil bei diesem Verfahren ist, dass der
+Bootkernel bereits jeden beliebigen Treiber (beispielsweise einen kompletten
+USB-Stack) enthalten kann, während Bootloader meist nur unvollständig mit
+den gängigsten Treibern versehen sind.
+
+Eine weitere Anwendung sind Firmware-Updates. So könnten die Startskripte
+des initramfs beispielsweise auf einem Server nachschauen, ob Updates
+vorhanden sind, und diese dann anwenden.
+
+\subsection*{Kernel kompilieren}
+
+Nach abgeschlossener Kernel-Konfiguration kompiliert man den Kernel einfach
+durch Eingabe von
+
+\begin{lstlisting}
+make
+\end{lstlisting}
+
+Falls der zum Kompilieren verwendete Rechner mehrere CPUs besitzt, kann man
+den Vorgang beschleunigen, indem man \cmd{make} anweist, mehrere Jobs
+gleichzeitig zu starten. Für die Zahl der Jobs ist eine häufig genannte
+Empfehlung die doppelte Anzahl der CPUs plus eins. Auf einem Dual-Core würde
+man also folgenden Befehl verwenden:
+
+\begin{lstlisting}
+make -j3
+\end{lstlisting}
+
+Will man den Kernel für eine andere Architektur als die des Compile-Rechners
+crosskompilieren, so muss man \cmd{make} mitteilen, mit welcher Toolchain und
+für welche Architektur gebaut werden soll. Damit man die doch etwas länglichen
+Optionen nicht immer wieder von Hand eintippen muss, schreibt man sie am Besten
+in ein kleines Skript, das man dann anstelle von \cmd{make} aufruft. Ein Skript
+für die ARM-Architektur unter Verwendung der Codesourcery-Toolchain 2007q3
+könnte etwa so aussehen:
+
+\begin{lstlisting}
+#!/bin/sh
+
+ARCH="arm"
+CROSS="/opt/arm-2007q3/bin/arm-none-linux-gnueabi-"
+export INSTALL_MOD_PATH="/rfs"
+
+make ARCH=$ARCH CROSS_COMPILE=$CROSS $@
+\end{lstlisting}
+
+Speichert man dies beispielsweise unter dem Namen \cmd{makearm} im
+Hauptverzeichnis der Kernelquellen, so ergibt sich folgender Aufruf:
+\begin{lstlisting}
+./makearm -j3
+\end{lstlisting}
+
+\subsection*{Kernel installieren}
+
+Einen Kernel für den lokalen Rechner (also den, auf dem man auch kompiliert
+hat) installiert man einfach durch Eingabe von
+
+\begin{lstlisting}
+make install
+\end{lstlisting}
+
+Dies führt folgende Aktionen durch (Beispiel für einen Kernel 2.6.30):
+\begin{itemize}
+\item Falls es im Verzeichnis \cmd{/boot} bereits ein \cmd{vmlinuz-2.6.30}
+ gibt, wird es in \cmd{vmlinuz-2.6.30.old} umbenannt
+\item Kopieren von \cmd{arch/<Architektur-Name>/boot/zImage} nach
+ \cmd{/boot/vmlinuz-2.6.30}
+\item Anlegen eines symbolischen Link \cmd{vmlinuz -> vmlinuz-2.6.30} in
+ \cmd{/boot}
+\end{itemize}
+
+Anschliessend darf man nicht vergessen, auch die Module des neuen Kernels
+zu installieren:
+
+\begin{lstlisting}
+make modules_install
+\end{lstlisting}
+
+Dabei werden alle Module (Dateien mit der Endung \cmd{*.ko} in Verzeichnisse
+unter \cmd{/lib/modules/2.6.30/...} kopiert. Ausserdem werden dort
+Zusatzinformationen zu den Modulen und ihren Abhängigkeiten generiert.
+
+\emph{VORSICHT!} Wenn man einen Kernel für eine andere Architektur
+crosskompiliert hat, darf man \emph{NIEMALS} leichtfertig
+\cmd{make modules\_install} aufrufen, da dies ohne weitere Warnung die
+eigenen Module mit den natürlich nicht verwendbaren Modulen der fremden
+Architektur überschreiben würde!
+
+Das oben aufgeführte Skript zeigt die korrekte Vorgehensweise. In der Variablen
+\cmd{INSTALL\_MOD\_PATH} kann man ein anderes Root-Filesystem angeben, in das
+die Module installiert werden sollen. Im Beispiel oben würde der Befehl
+
+\begin{lstlisting}
+./makearm modules_install
+\end{lstlisting}
+
+die Module nach \cmd{/rfs/lib/modules/2.6.30/...} installieren. Hat man sein
+Root-Filesystem per NFS aus diesem Verzeichnis gemountet, so stehen die Module
+sofort und ohne Reboot zur Verfügung. Diese Vorgehensweise hat sich bei der
+Entwicklung von Treibern für Embedded Systems sehr bewährt.
+
+\subsection*{Kontrollfragen}
+
+\begin{enumerate}
+\item Beschreiben Sie Unterschiede zwischen initrd und initramfs.
+\item Warum braucht man bei selbst kompilierten Kerneln in der Regel keine
+ initrd?
+\item Nennen Sie eine Anwendung von initramfs.
+\end{enumerate}
-Text
\end{document}
diff --git a/kernel-devel/kernel-build/images/menu_rt_001.png b/kernel-devel/kernel-build/images/menu_rt_001.png
new file mode 100644
index 0000000..27f26cd
--- /dev/null
+++ b/kernel-devel/kernel-build/images/menu_rt_001.png
Binary files differ
diff --git a/kernel-devel/kernel-build/pres_kernel-build_de.tex b/kernel-devel/kernel-build/pres_kernel-build_de.tex
index 07db328..1489f12 100644
--- a/kernel-devel/kernel-build/pres_kernel-build_de.tex
+++ b/kernel-devel/kernel-build/pres_kernel-build_de.tex
@@ -1,24 +1,23 @@
-\documentclass{article}
+\documentclass{beamer}
+\usetheme{linutronix}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{pgf}
+\usepackage{graphicx}
+\usepackage{lxextras}
-\begin{document}
-
-\section*{Block \lq Was ist Linux?\rq}
+\title{Linux-Kernel konfigurieren und kompilieren}
+\institute{Linutronix GmbH}
-\subsection*{Lernziele}
-\begin{itemize}
-\item Lernziel 1
-\item Lernziel 2
-\item Lernziel 3
-\end{itemize}
+\begin{document}
-\subsection*{Unterrichts-Ablauf}
+\maketitle
-Hinweise zur Präsentation, Zeitplanung, etc.
-\subsection*{Übungen bei vorhandener Hardware}
+% ----- Slide ------------------
+\begin{frame}
+\frametitle{Hallo}
+\end{frame}
-Hinweise zu Übungen, Zeitlimit dazu.
\end{document}
diff --git a/kernel-devel/uio-driver/Makefile b/kernel-devel/uio-driver/Makefile
new file mode 100644
index 0000000..d212291
--- /dev/null
+++ b/kernel-devel/uio-driver/Makefile
@@ -0,0 +1,10 @@
+all:
+ pdflatex pres_uio-driver_de.tex
+ pdflatex pres_uio-driver_en.tex
+ pdflatex hints_uio-driver_de.tex
+ pdflatex handout_uio-driver_de.tex
+ pdflatex handout_uio-driver_de.tex
+
+clean:
+ rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out
+
diff --git a/kernel-devel/uio-driver/images/greg-all-hardware.jpg b/kernel-devel/uio-driver/images/greg-all-hardware.jpg
new file mode 100644
index 0000000..f7ab989
--- /dev/null
+++ b/kernel-devel/uio-driver/images/greg-all-hardware.jpg
Binary files differ
diff --git a/kernel-devel/uio-driver/images/greg-kernel-org.jpg b/kernel-devel/uio-driver/images/greg-kernel-org.jpg
new file mode 100644
index 0000000..dbfb915
--- /dev/null
+++ b/kernel-devel/uio-driver/images/greg-kernel-org.jpg
Binary files differ
diff --git a/kernel-devel/uio-driver/images/hjk-desperate.jpg b/kernel-devel/uio-driver/images/hjk-desperate.jpg
new file mode 100644
index 0000000..740f574
--- /dev/null
+++ b/kernel-devel/uio-driver/images/hjk-desperate.jpg
Binary files differ
diff --git a/kernel-devel/uio-driver/images/ioctl-vs-uio.png b/kernel-devel/uio-driver/images/ioctl-vs-uio.png
new file mode 100644
index 0000000..8536934
--- /dev/null
+++ b/kernel-devel/uio-driver/images/ioctl-vs-uio.png
Binary files differ
diff --git a/kernel-devel/uio-driver/images/konventioneller-treiber.png b/kernel-devel/uio-driver/images/konventioneller-treiber.png
new file mode 100644
index 0000000..bea54da
--- /dev/null
+++ b/kernel-devel/uio-driver/images/konventioneller-treiber.png
Binary files differ
diff --git a/kernel-devel/uio-driver/images/uio-treiber.png b/kernel-devel/uio-driver/images/uio-treiber.png
new file mode 100644
index 0000000..caa2152
--- /dev/null
+++ b/kernel-devel/uio-driver/images/uio-treiber.png
Binary files differ
diff --git a/kernel-devel/uio-driver/pres_uio-driver_en.tex b/kernel-devel/uio-driver/pres_uio-driver_en.tex
new file mode 100644
index 0000000..8468894
--- /dev/null
+++ b/kernel-devel/uio-driver/pres_uio-driver_en.tex
@@ -0,0 +1,302 @@
+\documentclass{beamer}
+\usetheme{linutronix}
+\usepackage{german}
+\usepackage[utf8]{inputenc}
+\usepackage{pgf}
+\usepackage{graphicx}
+
+\title{The Userspace I/O Framework (UIO)}
+\author{Hans-Jürgen Koch}
+\institute{Linutronix GmbH}
+
+\begin{document}
+
+\maketitle
+
+% ----- Slide "Desperate programmer" ------------------
+\begin{frame}
+\includegraphics[width=11cm]{images/hjk-desperate.jpg}
+\end{frame}
+
+% ----- Slide "Linux device drivers" ------------------
+\begin{frame}
+\frametitle{Linux device drivers}
+\pause
+\begin{itemize}
+\item Standard devices
+\pause
+\item Non-standard devices
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Standard devices" -----------------------
+\begin{frame}
+\frametitle{Standard devices}
+\pause
+\begin{itemize}
+\item Handled by a kernel subsystem (USB, networking...)
+\pause
+\item Hardware specific part relatively small
+\pause
+\item Examples of similar drivers available
+\pause
+\item Can probably be included in mainline kernel
+\pause
+\begin{block}{Standard devices should not be handled by UIO !}
+\end{block}
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Problematic devices" -------------------
+\begin{frame}
+\frametitle{Problematic devices}
+\pause
+\begin{itemize}
+\item Doesn't fit into a standard kernel subsystem
+\pause
+\item Almost everything is hardware specific
+\pause
+\item Driver becomes large, no similar example drivers
+\pause
+\item Driver often invents its own ioctl based API
+\pause
+\item Will probably not be included in mainline kernel
+\pause
+\begin{block}{Drivers for such devices are often buggy and hard to maintain !}
+\end{block}
+\end{itemize}
+\end{frame}
+
+% ----- Slide "In-kernel driver" ------------------
+\begin{frame}
+\includegraphics[width=11cm]{images/konventioneller-treiber.png}
+\end{frame}
+
+% ----- Slide "UIO driver" ------------------
+\begin{frame}
+\includegraphics[width=11cm]{images/uio-treiber.png}
+\end{frame}
+
+% ----- Slide "How UIO works" --------------------------
+\begin{frame}
+\frametitle{How UIO works}
+\pause
+\begin{itemize}
+\item Device memory can be mapped to userspace
+\pause
+\item All data exchange is done through this memory
+\pause
+\item All device control is done through this memory
+\pause
+\item Interrupts are acknowledged in the kernel...
+\pause
+\item ...and then handled in userspace
+\pause
+\begin{block}{A small kernel module is still needed}
+\end{block}
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Kernel: interrupt handler" --------------------------
+\begin{frame}[fragile]
+\frametitle{Kernel: interrupt handler}
+\begin{verbatim}
+irqreturn_t my_handler(int irq, struct uio_info *dev_info)
+{
+ if (IRQ is not caused by my hardware)
+ return IRQ_NONE;
+
+ /* Disable interrupt */
+ (Perform some register access to silence the IRQ line)
+
+ return IRQ_HANDLED;
+}
+\end{verbatim}
+\end{frame}
+
+% ----- Slide "Kernel: probe() function" --------------------------
+\begin{frame}[fragile]
+\frametitle{Kernel: probe() function}
+\begin{verbatim}
+int pci_probe(struct pci_dev *dev,
+ const struct pci_device_id *id)
+{
+ ...
+ allocate and fill struct uio_info
+ ...
+ call uio_register_device()
+}
+\end{verbatim}
+\end{frame}
+
+% ----- Slide "Kernel: struct uio_info" --------------------------
+\begin{frame}[fragile]
+\frametitle{Kernel: struct uio\_info}
+\begin{verbatim}
+struct uio_info {
+ struct uio_device *uio_dev;
+ char *name;
+ char *version;
+ struct uio_mem mem[MAX_UIO_MAPS];
+ long irq;
+ unsigned long irq_flags;
+ void *priv;
+ irqreturn_t (*handler)(int irq, struct uio_info *dev_info);
+ int (*mmap)(struct uio_info *info, struct vm_area_struct *vma);
+ int (*open)(struct uio_info *info, struct inode *inode);
+ int (*release)(struct uio_info *info, struct inode *inode);
+};
+\end{verbatim}
+\end{frame}
+
+% ----- Slide "Kernel: struct uio_mem" --------------------------
+\begin{frame}[fragile]
+\frametitle{Kernel: struct uio\_mem}
+\begin{verbatim}
+struct uio_mem {
+ unsigned long addr;
+ unsigned long size;
+ int memtype;
+ void __iomem *internal_addr;
+ struct uio_map *map;
+};
+\end{verbatim}
+\end{frame}
+
+% ----- Slide "Userspace part of driver" --------------
+\begin{frame}
+\frametitle{Userspace: Overview}
+\pause
+\begin{itemize}
+\item Find device in sysfs (/sys/class/uio/...)
+\pause
+\item Get device information from sysfs
+\pause
+\item Open /dev/uioX
+\pause
+\item Use mmap() to get a pointer to the devices's memory
+\pause
+\item Initialize device, enable interrupt generation
+\pause
+\item Perform a blocking read() to wait for interrupts
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Hello UIO world" --------------
+\begin{frame}[fragile]
+\frametitle{Hello UIO world}
+\pause
+\begin{verbatim}
+int32_t irq_cnt;
+int fd = open("/dev/uio0", O_RDWR);
+u16 *mem = mmap(..., n*getpagesize());
+mem[...] = ...
+while (read(fd, &irq_cnt, 4)) {
+ printf("irq count = %d\n", irq_cnt);
+}
+\end{verbatim}
+\end{frame}
+
+% ----- Slide "Performance considerations" --------------
+\begin{frame}
+\frametitle{Performance considerations}
+\pause
+\begin{itemize}
+\item Interrupt latency
+\pause
+\item Memory/register access
+\end{itemize}
+\end{frame}
+
+% ----- Slide "ioctl vs. UIO" ------------------
+\begin{frame}
+\includegraphics[width=10cm]{images/ioctl-vs-uio.png}
+\end{frame}
+
+% ----- Slide "Publish your driver!" --------------
+\begin{frame}
+\frametitle{Publish your driver!}
+\pause
+\begin{itemize}
+\item Get rid of maintenance work!
+\pause
+\item Send your patch to the UIO maintainers
+\pause
+\item Cc: linux-kernel@vger.kernel.org
+\pause
+\item Publish your userspace code, if possible
+\pause
+\item Make it LGPL, if possible
+\pause
+\item An open driver helps selling your hardware!
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Greg: Support all hardware on earth" ---
+\begin{frame}
+\includegraphics[width=11cm]{images/greg-all-hardware.jpg}
+\end{frame}
+
+% ----- Slide "Greg: All drivers in kernel.org tree" --
+\begin{frame}
+\includegraphics[width=11cm]{images/greg-kernel-org.jpg}
+\end{frame}
+
+% ----- Slide "Legal issues" --------------------------
+\begin{frame}
+\frametitle{Legal issues}
+\pause
+\begin{itemize}
+\item Userspace code can be under any licence
+\pause
+\item Kernel module MUST be GPL
+\pause
+\item Avoid trickery and gray areas
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Tools" --------------------------
+\begin{frame}
+\frametitle{Tools}
+\pause
+\begin{itemize}
+\item lsuio
+\pause
+\item TODO: libuio (nearly ready)
+\end{itemize}
+\end{frame}
+
+% ----- Slide "OSADL" --------------------------
+\begin{frame}
+\frametitle{OSADL}
+\pause
+\begin{itemize}
+\item Open Source Automation Development Lab
+\pause
+\item http://www.osadl.org
+\pause
+\item Hosts some UIO code
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Future" --------------------------
+\begin{frame}
+\frametitle{Future}
+\pause
+\begin{itemize}
+\item DMA support
+\pause
+\item get UIO tools and libuio into Linux Distributions
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Thanks for listening!" ----------
+\begin{frame}
+\frametitle{Thanks for listening!}
+\pause
+\begin{itemize}
+\item Questions ?
+\end{itemize}
+\end{frame}
+
+\end{document}
diff --git a/linux-basics/Makefile b/linux-basics/Makefile
new file mode 100644
index 0000000..ab3b327
--- /dev/null
+++ b/linux-basics/Makefile
@@ -0,0 +1,6 @@
+SUBDIRS = boot-process filesystem-structure important-tools linux-processes sh-programming what-is-linux
+
+all clean::
+ for dir in $(SUBDIRS) ; do \
+ (cd $$dir && make $@); \
+ done
diff --git a/linux-basics/boot-process/handout_boot-process_de.tex b/linux-basics/boot-process/handout_boot-process_de.tex
index 4c391b2..7f39dc7 100644
--- a/linux-basics/boot-process/handout_boot-process_de.tex
+++ b/linux-basics/boot-process/handout_boot-process_de.tex
@@ -1,17 +1,155 @@
-\documentclass{article}
+\documentclass{lxarticle}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{lxheaders}
+\usepackage{lxextras}
\begin{document}
-\section*{Titel}
+\section*{Der Linux-Boot-Prozess}
-\subsection*{Abschnitt1}
+\subsection*{Aufgaben des Bootloaders}
-Text
+Hauptaufgabe des Bootloaders ist die rudimentäre Initialisierung der
+Hardware, so dass mindestens das RAM benutzt werden kann. Dazu ist auf den
+meisten Boards die Initialisierung eines (S)DRAM-Controllers erforderlich.
-\subsection*{Abschnitt2}
+Soll das Board aus einem NAND-Flash booten können, so muss auch dessen
+Controller initialisiert werden.
-Text
+Viele Prozessoren beinhalten PLLs, die aus dem Prozessortakt andere Clocks
+für verschiedene Peripherie-Einheiten generieren. Auch diese müssen
+initialisiert werden.
+
+Anschließend müssen die Peripherie-Einheiten initialisiert werden, die
+der Bootloader benötigt, um den Kernel laden zu können. Für TFTP-Boot wäre
+dies beispielsweise der Netzwerk-Chip.
+
+Meist ist es auch erwünscht, dass der Bootloader eine serielle Schnittstelle
+initialisiert. Dies ermöglicht nicht nur hilfreiche Meldungen aus dem
+Bootloader, es ermöglicht auch dem Kernel bereits im frühen Stadium des
+Bootvorgangs die Ausgabe von Meldungen (und nicht erst nach dem Laden seines
+UART-Treibers und der Konsole). Viele Bootloader bieten ausserdem eine Art
+Monitorprogramm, mit dem man mit Hilfe eines Terminalprogramms interaktiv
+Einstellungen ändern oder Speicher lesen und schreiben kann.
+
+Nach erfolgreicher Initialisierung lädt der Bootloader von der gewählten
+Quelle das komprimierte Kernel-Image ins RAM. Am Anfang eines komprimierten
+zImage steht (natürlich unkomprimiert) der Dekompressor-Code. Der Bootloader
+springt diese Adresse an und hat damit seine Arbeit beendet. Alles weitere
+läuft im Kernel ab.
+
+\subsection*{Gängige Bootloader}
+
+Die Wahl des Bootloaders ist weitgehend eine Geschmacksfrage. Die
+verbreiteten Bootloader U-Boot und Redboot bieten im Wesentlichen die gleiche
+Funktionalität. Die Bedienung unterscheidet sich zwar deutlich, aber der
+ohnehin nötige Einarbeitungsaufwand dürfte bei beiden etwa gleich sein.
+
+Auch beim Kompilieren dieser Bootloader sind die Unterschiede nicht gross.
+Beide zeichnen sich durch schwer durchschaubaren Sourcecode und ein
+eigenwilliges Buildsystem aus.
+
+Es gibt aber auch die Möglichkeit, ganz auf einen derartigen Bootloader zu
+verzichten. Statt dessen verwendet man einen minimalen \emph{Initial Program
+Loader (IPL)}, der lediglich die rudimentären Initialisierungsaufgaben
+erfüllt und danach einen minimalen Bootkernel lädt und ausführt. Dieser
+lädt wiederum den eigentlichen Produktiv-Kernel nach.
+
+Vorteile der letztgenannten Vorgehensweise sind hohe Flexibilität und die
+Tatsache, dass man im Bootkernel schon nach wenigen hundert Millisekunden
+jeden gewünschten Treiber zur Verfügung hat. Dadurch können in elegante
+Weise Anforderungen wie das Anzeigen eines Bildes auf einem TFT (500
+Millisekunden nach dem Einschalten) gelöst werden. Wollte man dies mit
+einem der oben erwähnten Bootloader erreichen, müsste man zunächst die
+für das TFT benötigten Treiber vom Kernel in den Bootloader portieren und
+dort zum Laufen bringen. Ähnliches gilt für andere gängige Forderungen,
+wie das Booten von einem USB-Stick.
+
+Es erscheint als überflüssige Mühe, einen im Kernel bereits
+funktionierenden Treiber in den Bootloader portieren zu müssen. Mit IPL und
+Bootkernel sind ausserdem komplexe Aufgaben während des Bootvorgangs,
+beispielsweise automatisierte und sichere Firmware-Updates leicht
+realisierbar.
+
+\subsection*{Bootprobleme: Im Bootloader}
+
+Während der Entwicklungsphase sind Probleme im Bootloader besonders
+unangenehm. Falls dieser bereits abstürzt, ehe er die serielle Schnittstelle
+initialisieren konnte, so sieht man schlichtweg gar nichts. Aber auch bei
+späteren Fehlern ist der Entwicklungszyklus mühsam, da man den Bootloader
+meist erst mit einem JTAG-Adapter oder ähnlichen Werkzeugen ins Flash des
+Boards befördern muss, bevor man den nächsten Versuch machen kann. Bei
+Änderungen am Bootloader-Code ist daher große Sorgfalt geboten. Wenn möglich,
+sollte man zu zweit an solchem Code arbeiten und sich ständig gegenseitig
+kontrollieren.
+
+Häufige Problemquellen im Bootloader sind beispielsweise:
+
+\begin{itemize}
+\item Der Bootloader wurde nicht korrekt ins Flash geschrieben. In einem Fall
+ passierte dies beispielsweise, wenn der Compiler ein Binary mit
+ ungerader Länge erzeugte. Aber auch falsche Konfiguration des JTAGer
+ kann zu solchen Problemen führen.
+\item Im Bootloader wurden die Timings für Bus-Schnittstellen wie RAM oder
+ Flash nicht korrekt eingestellt. Gerade wenn die Timings nicht ganz
+ falsch, sondern nur grenzwertig sind, kann es zu schwer
+ reproduzierbaren Bootproblemen kommen.
+\item Die Ladeadresse für den Kernel ist nicht korrekt. Bei manchen
+ Bootloadern kann es leicht zu Verwechslungen zwischen physikalischen
+ und virtuellen Adressen kommen. Weder U-Boot noch Redboot melden
+ einen Fehler, wenn man den Kernel an eine Adresse lädt, an der
+ sich überhaupt kein RAM befindet...
+\item Beim Laden des Kernels per TFTP kann es zusätzlich weitere Probleme
+ geben, die mit dem Netzwerk zusammenhängen. Diese reichen von falsch
+ aufgesetzten TFTP-Servern über falsch konfigurierte DHCP-Server oder
+ falschen IP-Adressen bis hin zu Treiber- oder Hardware-Problemen.
+\end{itemize}
+
+\subsection*{Bootprobleme: Im Kernel}
+
+Bootprobleme im Kernel sind vergleichsweise einfach zu finden, sobald man
+eine Konsole auf der seriellen Schnittstelle hat. Der Kernel gibt meist recht
+aussagekräftige Fehlermeldungen und bietet viele zusätzliche Debug-Funktionen,
+die man in der Kernel-Konfiguration aktivieren kann. Falls sich der Kernel
+bereits früher aufhängt, so dass man nach der Meldung
+
+\cmd{Uncompressing Linux.....}
+
+überhaupt nichts mehr sieht, dann wird es schwieriger. Man sollte zunächst
+überprüfen, ob die im Bootloader vorgegebene Commandline für den Kernel
+korrekt ist, insbesondere die Einstellung der für die Konsole verwendeten
+seriellen Schnittstelle (\cmd{console=tty...}).
+
+Ein weiteres gängiges Problem ist, dass der Kernel am Ende des Bootvorgangs
+kein Root-Filesystem mounten kann. Dies kann daran liegen, dass man bei der
+Kernelkonfiguration vergessen hat, dass \emph{alle} für das Rootfs nötigen
+Hardware- und Dateisystem-Treiber in den Kernel einkompiliert sein müssen
+und nicht etwa als Module gebaut wurden. Bei Medien, die erst detektiert
+werden müssen (z.B. SD-Karten) kann es passieren, dass das Medium noch nicht
+bereit ist, wenn der Kernel es mounten will. In diesem Fall hilft der
+Parameter \cmd{rootwait}.
+
+Falls der Kernel zwar das Rootfs mounten kann, aber danach mit einer
+Fehlermeldung hängen bleibt, anstatt \cmd{/sbin/init} zu starten, dann
+liegt dies oft an fehlenden Device-Nodes im Verzeichnis \cmd{/dev}.
+Überprüfen Sie dies.
+
+\subsection*{Bootprobleme: In den Startskripten}
+
+Wenn der Kernel erfolgreich das Rootfs mounten und \cmd{/sbin/init} starten
+konnte, wird letzteres versuchen, die in \cmd{/etc/inittab} angegebenen
+Anweisungen auszuführen. Dies ist normalerweise zunächst der Aufruf eines
+Startskripts, das in der Regel weitere Skripte und Programme aufruft. Je
+nach Art der aufgerufenen Programme kann es hier zu weiteren Problemen
+kommen. Dazu gehören etwa fehlerhafte Konfigurationsdateien, fehlende
+Device-Nodes oder Ähnliches.
+
+Ausserdem kommt es bei Startskripten vor, dass diese nicht auf jede Situation
+sauber und fehlertolerant reagieren. Man sollte vermeiden, dass sich das
+Skript zur Konfiguration des Netzwerks aufhängt, wenn kein DHCP-Server
+gefunden wurde oder kein Netzwerkkabel eingesteckt ist. Des weiteren sollte
+das Skript selber erkennen, wenn über die Netzwerkschnittstelle das Rootfs
+per NFS gemountet wurde, und dann eine Neukonfiguration tunlichst unterlassen.
\end{document}
diff --git a/linux-basics/sh-programming/Makefile b/linux-basics/sh-programming/Makefile
new file mode 100644
index 0000000..325aad0
--- /dev/null
+++ b/linux-basics/sh-programming/Makefile
@@ -0,0 +1,9 @@
+all:
+ pdflatex pres_sh-programming_de.tex
+ pdflatex hints_sh-programming_de.tex
+ pdflatex handout_sh-programming_de.tex
+ pdflatex handout_sh-programming_de.tex
+
+clean:
+ rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out
+
diff --git a/linux-basics/sh-programming/handout_sh-programming_de.tex b/linux-basics/sh-programming/handout_sh-programming_de.tex
index 4c391b2..f27f70e 100644
--- a/linux-basics/sh-programming/handout_sh-programming_de.tex
+++ b/linux-basics/sh-programming/handout_sh-programming_de.tex
@@ -1,17 +1,212 @@
-\documentclass{article}
+\documentclass{lxarticle}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{lxheaders}
+\usepackage{lxextras}
\begin{document}
-\section*{Titel}
+\section*{Einführung in die Shell-Programmierung}
-\subsection*{Abschnitt1}
+\subsection*{Aufbau von Shell-Skripten}
-Text
+\begin{itemize}
+\item Syntax: \cmd{\#!/ein/interpreter}
+\item Beliebiges Programm als Interpreter möglich
+\item Beispiele hier: \cmd{\#!/bin/sh}
+\item Danach beliebige Shell-Befehle möglich
+\end{itemize}
-\subsection*{Abschnitt2}
+Das übliche \cmd{Hello World} sieht als Shell-Skript etwa so aus:
-Text
+\begin{lstlisting}
+#!/bin/sh
+echo Hello World
+\end{lstlisting}
+
+\subsection*{Variablen und Parameter}
+
+\begin{lstlisting}
+#!/bin/sh
+
+MY_VAR=17
+PAR_1=$1
+datum=`date`
+
+echo variable is $(MYVAR), parameter is $(PAR_1)
+\end{lstlisting}
+
+Variablen können einfach in der Form \cmd{Name=Wert} geschrieben werden. Sie
+haben in Shell-Skripten keinen Typ und werden bei der ersten Verwendung
+automatisch angelegt.
+
+\subsection*{Ausgabe-Umleitung}
+
+\begin{lstlisting}
+#!/bin/sh
+
+# How many lines in addr.txt contain "Jones" ?
+# Store the result in "jones_count"
+grep Jones addr.txt | wc -l > jones_count
+
+# Append a message to a log file
+echo "My message" >> log_file
+
+exit 0
+\end{lstlisting}
+
+
+\subsection*{Bedingte Verzweigungen}
+
+Allgemeine Form:
+
+\begin{lstlisting}
+#!/bin/sh
+
+if [ bedingung ]
+ then
+ ...
+ else
+ ...
+fi
+
+# in one line:
+
+if [ bedingung ] ; then ... ; fi
+\end{lstlisting}
+
+Zahlentests:
+
+\begin{lstlisting}
+#!/bin/sh
+
+# Zahlentests: -eq -ne -lt -gt -le -ge
+zahl=15
+if [ $zahl -lt 20 ] ; then ...
+
+# String-Tests: = != < > -n -z
+string="Hallo"
+if [ $string != "hello" ] ; then ...
+\end{lstlisting}
+
+Dateitests:
+
+\begin{lstlisting}
+#!/bin/sh
+# Dateitests, z.B. if [ -f $datei ] ; then ...
+# Auswahl:
+# -f ist eine normale Datei
+# -d ist ein Verzeichnis
+# -e existiert
+# -s existiert und ist nicht leer
+# -r ist lesbar
+# -w ist schreibbar
+# -x ist ausfuehrbar
+# -b ist ein Block Device
+# -c ist ein Character Device
+\end{lstlisting}
+
+Test des Rückgabewerts von Programmen:
+
+\begin{lstlisting}
+#!/bin/sh
+
+# Does addr.txt contain "Jones" ?
+if grep Jones addr.txt ; then ...
+
+# Return value 0 means OK
+exit 0
+
+\end{lstlisting}
+
+Short circuit tests:
+
+\begin{lstlisting}
+#!/bin/sh
+
+# Short circuit tests:
+
+make && make install
+
+grep Jones addr.txt || echo "No Jones found!"
+\end{lstlisting}
+
+
+\subsection*{Schleifen}
+
+For-Schleife:
+
+\begin{lstlisting}
+#!/bin/sh
+
+for datei in datei1 datei2 datei3
+do
+ cp $datei $datei.bak
+done
+
+for datei in *
+do
+ ...
+done
+\end{lstlisting}
+
+While-Schleife:
+
+\begin{lstlisting}
+#!/bin/sh
+
+while [ bedingung ]
+do
+ ...
+done
+
+while [ bedingung ] ; do ... ; done
+
+# bedingung wie bei if
+\end{lstlisting}
+
+\subsection*{Funktionen}
+
+\begin{lstlisting}
+#!/bin/sh
+
+error_log() {
+ echo "Fehler: $1" >> my_log_file
+}
+
+...
+
+error_log "Datei nicht gefunden."
+\end{lstlisting}
+
+\subsection*{Einbinden anderer Skripte}
+
+\begin{lstlisting}
+#!/bin/sh
+
+# Include an external script:
+. my_other_script
+
+# run another script/command in the background:
+my_other_script&
+
+\end{lstlisting}
+
+\subsection*{Zugriff auf Dateien}
+
+\begin{lstlisting}
+#!/bin/sh
+
+ls -1 > dateiliste.txt
+
+while read dateiname
+do
+ if [ -d $dateiname ]
+ then
+ echo "$dateiname ist ein Verzeichnis"
+ fi
+done < dateiliste.txt
+
+\end{lstlisting}
\end{document}
diff --git a/linux-basics/sh-programming/pres_sh-programming_de.tex b/linux-basics/sh-programming/pres_sh-programming_de.tex
index 07db328..dbecb3d 100644
--- a/linux-basics/sh-programming/pres_sh-programming_de.tex
+++ b/linux-basics/sh-programming/pres_sh-programming_de.tex
@@ -1,24 +1,251 @@
-\documentclass{article}
+\documentclass{beamer}
+\usetheme{linutronix}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{pgf}
+\usepackage{graphicx}
+\usepackage{lxextras}
+
+\title{Einführung in die Shell-Programmierung}
+\institute{Linutronix GmbH}
\begin{document}
-\section*{Block \lq Was ist Linux?\rq}
+\maketitle
-\subsection*{Lernziele}
+% ----- Slide ------------------
+\begin{frame}
+\frametitle{Aufbau von Shell-Skripten}
\begin{itemize}
-\item Lernziel 1
-\item Lernziel 2
-\item Lernziel 3
+\item Syntax: \cmd{\#!/ein/interpreter}
+\pause
+\item Beliebiges Programm als Interpreter möglich
+\pause
+\item Beispiele hier: \cmd{\#!/bin/sh}
+\pause
+\item Danach beliebige Shell-Befehle möglich
\end{itemize}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Hello World als Shell-Script}
+\begin{lstlisting}
+#!/bin/sh
+echo Hello World
+\end{lstlisting}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Variablen und Parameter}
+\begin{lstlisting}
+#!/bin/sh
+
+MY_VAR=17
+PAR_1=$1
+datum=`date`
+
+echo variable is $(MYVAR), parameter is $(PAR_1)
+\end{lstlisting}
+
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Ausgabe-Umleitung}
+\begin{lstlisting}
+#!/bin/sh
+
+# How many lines in addr.txt contain "Jones" ?
+# Store the result in "jones_count"
+grep Jones addr.txt | wc -l > jones_count
+
+# Append a message to a log file
+echo "My message" >> log_file
+
+exit 0
+
+\end{lstlisting}
+
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Bedingte Verzweigungen}
+\begin{lstlisting}
+#!/bin/sh
+
+if [ bedingung ]
+ then
+ ...
+ else
+ ...
+fi
+
+# in one line:
+
+if [ bedingung ] ; then ... ; fi
+
+\end{lstlisting}
+
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Bedingte Verzweigungen}
+\begin{lstlisting}
+#!/bin/sh
+
+# Zahlentests: -eq -ne -lt -gt -le -ge
+zahl=15
+if [ $zahl -lt 20 ] ; then ...
+
+# String-Tests: = != < > -n -z
+string="Hallo"
+if [ $string != "hello" ] ; then ...
+
+\end{lstlisting}
+
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Bedingte Verzweigungen}
+\begin{lstlisting}
+#!/bin/sh
+# Dateitests, z.B. if [ -f $datei ] ; then ...
+# Auswahl:
+# -f ist eine normale Datei
+# -d ist ein Verzeichnis
+# -e existiert
+# -s existiert und ist nicht leer
+# -r ist lesbar
+# -w ist schreibbar
+# -x ist ausfuehrbar
+# -b ist ein Block Device
+# -c ist ein Character Device
+\end{lstlisting}
+
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Bedingte Verzweigungen}
+\begin{lstlisting}
+#!/bin/sh
+
+# Does addr.txt contain "Jones" ?
+if grep Jones addr.txt ; then ...
+
+# Return value 0 means OK
+exit 0
+
+\end{lstlisting}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Bedingte Verzweigungen}
+\begin{lstlisting}
+#!/bin/sh
+
+# Short circuit tests:
+
+make && make install
+
+grep Jones addr.txt || echo "No Jones found!"
+
+\end{lstlisting}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Schleifen}
+\begin{lstlisting}
+#!/bin/sh
+
+for datei in datei1 datei2 datei3
+do
+ cp $datei $datei.bak
+done
+
+for datei in *
+do
+ ...
+done
+
+\end{lstlisting}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Schleifen}
+\begin{lstlisting}
+#!/bin/sh
+
+while [ bedingung ]
+do
+ ...
+done
+
+while [ bedingung ] ; do ... ; done
+
+# bedingung wie bei if
+
+\end{lstlisting}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Funktionen}
+\begin{lstlisting}
+#!/bin/sh
+
+error_log() {
+ echo "Fehler: $1" >> my_log_file
+}
+
+...
+
+error_log "Datei nicht gefunden."
+
+\end{lstlisting}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Einbinden anderer Skripte}
+\begin{lstlisting}
+#!/bin/sh
+
+# Include an external script:
+. my_other_script
+
+# run another script/command in the background:
+my_other_script&
+
+\end{lstlisting}
+\end{frame}
+
+% ----- Slide ------------------
+\begin{frame}[fragile]
+\frametitle{Zugriff auf Dateien}
+\begin{lstlisting}
+#!/bin/sh
-\subsection*{Unterrichts-Ablauf}
+ls -1 > dateiliste.txt
-Hinweise zur Präsentation, Zeitplanung, etc.
+while read dateiname
+do
+ if [ -d $dateiname ]
+ then
+ echo "$dateiname ist ein Verzeichnis"
+ fi
+done < dateiliste.txt
-\subsection*{Übungen bei vorhandener Hardware}
+\end{lstlisting}
+\end{frame}
-Hinweise zu Übungen, Zeitlimit dazu.
\end{document}
diff --git a/linux-basics/what-is-linux/pres_what-is-linux_de.tex b/linux-basics/what-is-linux/pres_what-is-linux_de.tex
index 85bcdb2..fbd44f1 100644
--- a/linux-basics/what-is-linux/pres_what-is-linux_de.tex
+++ b/linux-basics/what-is-linux/pres_what-is-linux_de.tex
@@ -46,6 +46,19 @@
\end{frame}
% ----- Slide ------------------
+\begin{frame}[fragile]
+\begin{verbatim}
+Hello everybody out there using minix -
+
+I'm doing a (free) operating system (just a hobby,
+won't be big andprofessional like gnu) for
+386(486) AT clones. This has been brewing
+since april, and is starting to get ready.
+\end{verbatim}
+Linus Torvalds (1991 / Minix newsgroup)
+\end{frame}
+
+% ----- Slide ------------------
\begin{frame}
\begin{figure}[h]
\centering
diff --git a/realtime/Makefile b/realtime/Makefile
new file mode 100644
index 0000000..fa8db4f
--- /dev/null
+++ b/realtime/Makefile
@@ -0,0 +1,7 @@
+SUBDIRS = rt-app-basics rt-basics rt-specialties
+
+all clean::
+ for dir in $(SUBDIRS) ; do \
+ (cd $$dir && make $@); \
+ done
+
diff --git a/realtime/rt-basics/handout_rt-basics_de.tex b/realtime/rt-basics/handout_rt-basics_de.tex
index 4c391b2..8d98ccc 100644
--- a/realtime/rt-basics/handout_rt-basics_de.tex
+++ b/realtime/rt-basics/handout_rt-basics_de.tex
@@ -1,17 +1,173 @@
-\documentclass{article}
+\documentclass{lxarticle}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{lxheaders}
+\usepackage{lxextras}
\begin{document}
-\section*{Titel}
+\section*{Realtime Linux}
-\subsection*{Abschnitt1}
+\subsection*{Grundlagen}
-Text
+\subsubsection*{Was ist Echtzeit?}
+Vor der Betrachtung verschiedener Ansätze, Linux echtzeitfähig zu machen, ist es
+notwendig, einige grundlegende Begrifflichkeiten zur erläutern:
+\begin{itemize}
+\item Echtzeit:
+Zur Definition eines Echtzeitsystems kann man folgende Aussagen Treffen: Auf
+einem Echtzeitsystem hängt die Korrektheit einer Berechnung nicht nur von ihrer
+logischen Korrektheit, sondern auch von der Ausführung zum korrekten Zeitpunkt
+ab. Das Nichteinhalten eines bestimmten Zeitrahmens resultiert in einem Fehler.
+\item Latenzzeit: Unter Latenzzeit versteht man den Zeitraum zwischen dem
+Auftreten eines Events und der Reaktion auf dieses Event.
+\item Jitter: Mit Jitter bezeichnet man die Varianz der Latenzzeit.
+\end{itemize}
-\subsection*{Abschnitt2}
+\subsubsection*{Anwendungsbereiche}
+Die wohl gängigsten Anwendungsbereiche für Echtzeitsysteme sind die
+Steuerungs- und Automatisierungstechnik, Multimediasysteme und die Luft- und
+Raumfahrttechnik. Ein weiteres interessantes Einsatzgebiet stellt die
+Finanzdienstleistung dar. Hier geht es insbesondere um die zeitgenaue,
+zuverlässige Abwicklung von Finanztransaktionen über hochverteilte Systeme.
-Text
+\subsubsection*{Anforderungen an ein Echtzeitsystem}
+Ein Echtzeitsystem muß in der Lage sein, in einem garantierten Zeitrahmen auf
+ein Ereignis zu reagieren. Es muß also möglich sein, in möglichst kurzer Zeit
+von einer niederprioren Task auf eine hochpriore Task umzuschalten, falls diese
+Rechenzeit benötigt. Das System muß also möglichst ''feingranular''
+unterbrechbar sein.
+Doch allein die Unterbrechbarkeit kann kein deterministisches Zeitverhalten
+garantieren. So kann eine niederpriore Task Resourcen blockieren, die von einer
+hochprioren Task benötigt werden. Wird die niederpriore Task nun unterbrochen,
+kommt es zur ''Prioritätsinversion / priority inversion'', da die hochpriore Task
+auf die Freigabe der Resource wartet, diese aber erst wieder dann freigegeben
+wird, wenn die niederpriore Task wieder Rechenzeit bekommt.
+Gelöst werden kann dieses Problem durch ''prioriy inheritance'' und ''priority ceiling''.
+\begin{itemize}
+\item Prioritätsvererbung / priority inheritance: Hier wird die Priorität der
+niederprioren Task angehoben, um zu erreichen, daß die blockierte Resource
+freigegeben werden kann.
+\item Prioritätsgrenzen / priority ceiling: Hier wird für jede Resource eine
+Prioritätsgrenze festgelegt. Jede Task, die die Resource belegt, wird auf die
+Prioritätsgrenze der Resource angehoben.
+\end{itemize}
+
+\subsection*{Realtime Linux Varianten}
+\subsubsection*{Historisches zu Echtzeitlinux}
+Im Gegensatz zu traditionellen Echtzeitsystem wurde Linux ursprünglich nicht als
+solches designt. Als General Purpose Operating System wurde Linux auf Fairness
+und Durchsatz optimiert. Linux echtzeitfähig zu machen, bedeutet also, ein
+Standardbetriebssystem um Echtzeitfunktionen bzw. entsprechende Sonderfälle zu
+erweitern. Mit dieser Tatsache lassen sich die zwei technischen Ansätze für
+Realtime Linux erklären.
+\begin{itemize}
+\item Dual Kernel Ansatz: Hier koexistieren ein Echtzeitkernel, der für alle
+zeitkritischen Dinge zuständig ist, und ein Standard Linux Kernel. Dieser Ansatz
+setzt voraus, daß alle externen Events zuerst vom Echtzeitkernel bearbeitet
+werden, bevor Sie an den Linux Kernel weitergereicht werden können. Die
+bekanntesten Vertreter dieser Technik sind RTAI und Xenomai.
+\item In-Kernel Ansatz: Diese Methode macht Linux an sich zu einem
+Echtzeitsystem. Dieser Ansatz wird mit dem Realtime Preemption Patch verfolgt
+und ist die Variante, die von den Linux Entwicklern zur Integration in den
+Hauptzweig von Linux abgenickt wurde.
+\end{itemize}
+
+\subsubsection*{RTAI}
+Das Realtime Application Interface (RTAI) ist eine Entwicklung der Technischen
+Universität Mailand und entstand unter der Schirmherrschaft von Professor Paolo
+Mantegazza. Oberstes Designziel von RTAI ist und war es, die kleinstmöglichen
+Latenzzeiten auf einer gegebenen Hardwareplattform zu erzielen. Dieses
+Designziel bedingt diverse Einschränkungen für RTAI Applikationen. Weiterhin
+wird nur eine recht kleine Anzahl an Zielplattormen unterstützt (derzeit x86,
+x86\_64 und diverse ARM Plattformen).
+\begin{figure}[h]
+\centering
+\includegraphics[height=0.5\textwidth]{images/rtai.png}
+\caption{Technischer Aufbau von RTAI}
+\label{img:rtai}
+\end{figure}
+RTAI ist ein typischer Vertreter des Dual Kernel Ansatzes. Abbildung
+\ref{img:rtai} zeigt die Funktionsweise von RTAI.
+
+\subsubsection*{Xenomai}
+Das Xenomai Projekt wurde im Jahre 2001 gegründet. Im Gegensatz zu RTAI erlaubt
+Xenomai auch Echtzeit im Userpace (RTAI erlaubt dies nur sehr eingeschränkt).
+Die Besonderheit von Xenomai sind die sogenannten Skins, die es vereinfachen sollen,
+Applikationen von anderen Echtzeitsystemen nach Xenomai zu portieren.
+Xenomai Skins bilden die API dieser Systeme ab. Xenomai unterstützt derzeit
+folgende Architekturen: PowerPC32, PowerPC64, x86, x86\_64, Blackfin, ARM und
+ia64). Die zentralen Begriffe im Designkonzept von Xenomai stellen Xenomai
+Nucleus, die Interrupt Pipeline (IPIPE), Hardware Abstraction Layer (HAL) und
+System Abstraction Layer (SAL) dar.
+IPIPE kann bildlich als virtueller Interruptkontroller betrachtet werden.
+Sie organisiert das System in verschiedenen Domains. Interrupts werden von
+IPIPE entgegengenommen und an die einzelnen Domains verteilt.
+Nucleus beeinhaltet die Xenomai Core Funktionalität. Dieser ist zuständig dafür,
+alle notwendigen Resourcen bereitzustellen, die Skins benötigen, um die Funktionalität
+von RTOSsen nachbilden zu können. Der Hardware Abstraction Layer beinhaltet
+den Plattform und CPU abhängigen Code. Alle darüberliegenden Layer (darunter auch Nucleus)
+bauen darauf auf. HAL ist kombiniert mit dem System Abstraction Layer. Dieser
+soll die darüberliegenden Layer, wie z.B. Nucleus, noch portierbarer machen.
+Abbildung \ref{img:xenomai} zeigt das technische Zusammenspiel der Xenomai
+Komponenten. Abbildung \ref{img:ipipe} zeigt die Funktionsweise von IPIPE.
+\begin{figure}[h]
+\centering
+\includegraphics[height=0.5\textwidth]{images/xenomai.png}
+\caption{Technischer Aufbau von Xenomai}
+\label{img:xenomai}
+\end{figure}
+\begin{figure}[h]
+\centering
+\includegraphics[height=0.5\textwidth]{images/ipipe.png}
+\caption{Technische Funktionsweise von IPIPE}
+\label{img:ipipe}
+\end{figure}
+
+\subsubsection*{Preempt RT}
+Der Realtime Preemption Patch entstand ursprünglich aus Arbeiten von Ingo Molnar
+und Thomas Gleixner. Beide sind bis zum heutigen Zeitpunkt die treibenden Kräfte
+bei der Entwicklung von Preempt RT.
+Im Gegensatz zu RTAI und Xenomai macht Preempt RT den Linux Kernel an sich
+echtzeitfähig. Dies wird im Besonderen durch folgende Mechanismen erreicht:
+\begin{itemize}
+\item Sleeping Spinlocks: Spinlocks werden durch RT Mutexe ersetzt. Raw
+Spinlocks ersetzen die Eigenschaft der ursprünglichen Spinlocks.
+\item Threaded Interrupt Handlers: Interrupt Handler laufen per Default nicht im
+harten Interruptkontext, sondern als Kernelthread.
+\end{itemize}
+Viele Mechanismen, die ursprünglich in Preempt RT entwickelt wurden, haben
+bereits Ihren Weg in den Mainline Linuxzweig gefunden: High Resolution Timer
+(Hochauflösende Timer unabhängig vom Scheduler Tick), Priority Inheritance,
+generisches Interrupthandling für alle Architekturen und mit 2.6.30 nun auch die
+Threaded Interrupt Handler.
+Weiterhin hat sich die Linux Entwicklergemeinde bereits 2006 darauf geeinigt,
+daß Preempt RT in den Linux Kernel integriert wird. Weiterhin bietet der
+Realtime Preemption Patch den großen Vorteil, daß Echtzeitapplikationen als POSIX
+Realtime Applikationen geschrieben werden. Es wird keine spezielle API
+verwendet. Preempt RT Unterstützt eine Vielzahl von Architekturen (PowerPc, x86,
+x86\_64, MIPS, ARM, ...).
+\begin{figure}[h]
+\centering
+\includegraphics[height=0.5\textwidth]{images/preempt_rt.png}
+\caption{Überblick Preempt RT}
+\label{img:preempt_rt}
+\end{figure}
+Wie Abbildung \ref{img:preempt_rt} zeigt, integriert Preempt RT die
+Echtzeitfunktionalität ''nahtlos'' in den Linux Kernel. Auch die Entwickler
+anderer Projekte haben die Vorzüge von Preempt RT bereits erkannt. Die Roadmap
+für Xenomai 3 sieht Preempt RT Support vor. Dies würde den Einsatz von Xenomai
+Skins auf Preempt RT Kerneln ermgöglichen.
+
+\subsection*{Kontrollfragen}
+
+\begin{enumerate}
+\item Was sind die wichtigsten Anforderungen an ein Echtzeitsystem?
+\item Welche beiden Ansätze gibt es, um Linux echtzeitfähig zu machen?
+\item Was sind die bekanntesten Vertreter für Echtzeitlinux und welche der oben
+beschriebenen Ansätze verfolgen Sie?
+\item Wird für das Schreiben einer Echtzeitapplikation mit Preempt RT eine
+spezielle API benötigt?
+\end{enumerate}
\end{document}
diff --git a/realtime/rt-basics/hints_rt-basics_de.tex b/realtime/rt-basics/hints_rt-basics_de.tex
index fd15c6e..11c5c34 100644
--- a/realtime/rt-basics/hints_rt-basics_de.tex
+++ b/realtime/rt-basics/hints_rt-basics_de.tex
@@ -1,17 +1,18 @@
-\documentclass{article}
+\documentclass{lxarticle}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{lxheaders}
+\usepackage{lxextras}
\begin{document}
-\section*{Block \lq Grundlagen Realtime\rq}
+\section*{Block \lq Was ist Linux?\rq}
\subsection*{Lernziele}
\begin{itemize}
-\item Kennenlernen der verschiedenen Ansätze (RTAI, Xenomai, RT-Preempt)
-\item Kennenlernen der Funktion von RT-Preempt
-\item Verstehen, wie der RT-Preempt-Patch beschafft und angewendet werden kann
-\item Anwendungen, Grenzen, Geschichte von RT-Preempt
+\item Lernziel 1
+\item Lernziel 2
+\item Lernziel 3
\end{itemize}
\subsection*{Unterrichts-Ablauf}
diff --git a/realtime/rt-basics/images/dual_kernel.png b/realtime/rt-basics/images/dual_kernel.png
new file mode 100644
index 0000000..c58d156
--- /dev/null
+++ b/realtime/rt-basics/images/dual_kernel.png
Binary files differ
diff --git a/realtime/rt-basics/images/dual_kernel.svg b/realtime/rt-basics/images/dual_kernel.svg
new file mode 100644
index 0000000..31f80ec
--- /dev/null
+++ b/realtime/rt-basics/images/dual_kernel.svg
@@ -0,0 +1,251 @@
+<?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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ id="svg3367"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="dual_kernel.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/jan/work/omnicron/schulung/realtime/rt-basics/images/dual_kernel.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs3369">
+ <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="perspective3375" />
+ <inkscape:perspective
+ id="perspective3442"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <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="perspective3230" />
+ <inkscape:perspective
+ id="perspective10"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 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.7"
+ inkscape:cx="285.06246"
+ inkscape:cy="582.52552"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1024"
+ inkscape:window-height="694"
+ inkscape:window-x="0"
+ inkscape:window-y="-60" />
+ <metadata
+ id="metadata3372">
+ <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">
+ <rect
+ style="fill:#fc7100;fill-opacity:1;stroke:#000000;stroke-width:1.60000002;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3448"
+ width="474.28571"
+ height="84.285713"
+ x="91.428574"
+ y="574.36218" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="237.14285"
+ y="634.36218"
+ id="text3377"><tspan
+ sodipodi:role="line"
+ id="tspan3379"
+ x="237.14285"
+ y="634.36218">Hardware</tspan></text>
+ <image
+ y="156.14793"
+ x="212.8571"
+ id="image3444"
+ height="257.28574"
+ width="237.14284"
+ sodipodi:absref="/home/jan/work/omnicron/tmp/tux_huge.png"
+ xlink:href="/home/jan/work/omnicron/tmp/tux_huge.png" />
+ <rect
+ style="fill:#fc7100;fill-opacity:1;stroke:#000000;stroke-width:2.17993641;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3450"
+ width="602.27716"
+ height="63.705776"
+ x="28.861397"
+ y="465.2236" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="217.14285"
+ y="511.21933"
+ id="text3452"><tspan
+ sodipodi:role="line"
+ id="tspan3454"
+ x="217.14285"
+ y="511.21933">Micro Kernel</tspan></text>
+ <g
+ transform="matrix(0.6623212,0,0,0.6661406,103.9692,395.35442)"
+ id="g3519"
+ inkscape:label="Calque 1">
+ <g
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ id="g3252">
+ <path
+ sodipodi:type="star"
+ style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:27.82019997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:24.29999924;stroke-dasharray:none;stroke-opacity:1"
+ id="path2383"
+ sodipodi:sides="3"
+ sodipodi:cx="191.09729"
+ sodipodi:cy="183.1349"
+ sodipodi:r1="187.79253"
+ sodipodi:r2="93.896263"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.5707963"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="M 353.73039,277.03117 L 191.09729,277.03117 L 28.464191,277.03117 L 109.78074,136.18677 L 191.09729,-4.6576233 L 272.41384,136.18677 L 353.73039,277.03117 z"
+ transform="matrix(0.35945,0,0,0.35945,28.8492,30.1932)" />
+ <g
+ id="g3163"
+ transform="translate(-0.510735,-1.02147)">
+ <path
+ id="path3155"
+ d="M 94.9375,108.40625 C 94.290019,108.49207 93.517293,108.86225 92.914114,109.2178 C 92.310935,109.57335 91.770059,109.9684 91.3641,110.47287 C 90.958141,110.97733 90.867103,111.63392 90.72033,112.21243 C 90.573557,112.79094 90.525438,113.26403 90.78125,113.90625 C 91.037062,114.54847 91.509887,115.41161 92.055252,115.93025 C 92.600617,116.44889 92.987635,116.9934 93.711376,117.22111 C 94.435117,117.44881 95.279851,117.7648 96,117.875 C 96.720149,117.9852 97.25089,117.77544 97.962055,117.59387 C 98.67322,117.4123 99.587555,117.07103 100.18371,116.67654 C 100.77986,116.28205 101.11025,115.82907 101.4724,115.36585 C 101.83455,114.90263 101.94155,114.45667 101.97237,113.8935 C 102.00319,113.33033 101.88899,112.7735 101.48418,112.24977 C 101.07937,111.72604 100.64982,111.06226 100.17793,110.52197 C 99.706043,109.98168 99.142309,109.4912 98.534118,109.19736 C 97.925927,108.90352 97.23572,108.65607 96.630291,108.50605 C 96.024862,108.35603 95.584981,108.32043 94.9375,108.40625 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ transform="matrix(1.41667,0,0,1.57627,-38.6775,-62.2193)"
+ sodipodi:nodetypes="czzzzzzzzzzzzzzzz" />
+ <path
+ id="path3157"
+ d="M 95.757212,60.26801 C 94.839875,60.407623 93.290633,60.580795 92.160034,60.92426 C 91.029435,61.267725 89.911438,61.914443 89.056586,63.01801 C 88.201734,64.121577 87.553727,65.489742 87.081665,67.17426 C 86.609604,68.858778 86.309324,70.138052 86.376336,72.54926 C 86.443347,74.960468 86.871609,78.248439 87.363796,81.26801 C 87.855982,84.287581 88.351917,87.858919 88.986053,90.86176 C 89.620189,93.864601 90.703057,96.535287 91.517717,98.646292 C 92.332377,100.7573 93.087791,102.49111 93.836704,103.50233 C 94.585617,104.51355 94.896259,104.9036 95.686679,105.33051 C 96.477099,105.75742 97.567003,106.06303 98.522102,105.98676 C 99.477201,105.91049 100.41608,104.41885 101.13839,103.59677 C 101.8607,102.77469 102.88842,99.504338 103.69761,96.48345 C 104.5068,93.462561 105.30597,91.53964 106.35271,86.599296 C 107.39945,81.658952 108.47781,74.293841 108.97508,71.01801 C 109.47234,67.742179 109.22234,67.929863 108.72878,66.467389 C 108.23521,65.004915 107.35398,64.101592 106.50643,63.26801 C 105.65887,62.434428 105.19482,61.932957 103.70986,61.473812 C 102.2249,61.014666 101.16364,60.702221 99.837564,60.539052 C 98.511488,60.375883 96.674549,60.128397 95.757212,60.26801 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ sodipodi:nodetypes="czzzzzzzzzzzzzzzzzzz" />
+ </g>
+ </g>
+ </g>
+ <g
+ transform="matrix(0.6623212,0,0,0.6661406,262.54063,386.49727)"
+ id="g3526"
+ inkscape:label="Calque 1">
+ <g
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ id="g3528">
+ <path
+ sodipodi:type="star"
+ style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:27.82019997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:24.29999924;stroke-dasharray:none;stroke-opacity:1"
+ id="path3530"
+ sodipodi:sides="3"
+ sodipodi:cx="191.09729"
+ sodipodi:cy="183.1349"
+ sodipodi:r1="187.79253"
+ sodipodi:r2="93.896263"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.5707963"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="M 353.73039,277.03117 L 191.09729,277.03117 L 28.464191,277.03117 L 109.78074,136.18677 L 191.09729,-4.6576233 L 272.41384,136.18677 L 353.73039,277.03117 z"
+ transform="matrix(0.35945,0,0,0.35945,28.8492,30.1932)" />
+ <g
+ id="g3532"
+ transform="translate(-0.510735,-1.02147)">
+ <path
+ id="path3534"
+ d="M 94.9375,108.40625 C 94.290019,108.49207 93.517293,108.86225 92.914114,109.2178 C 92.310935,109.57335 91.770059,109.9684 91.3641,110.47287 C 90.958141,110.97733 90.867103,111.63392 90.72033,112.21243 C 90.573557,112.79094 90.525438,113.26403 90.78125,113.90625 C 91.037062,114.54847 91.509887,115.41161 92.055252,115.93025 C 92.600617,116.44889 92.987635,116.9934 93.711376,117.22111 C 94.435117,117.44881 95.279851,117.7648 96,117.875 C 96.720149,117.9852 97.25089,117.77544 97.962055,117.59387 C 98.67322,117.4123 99.587555,117.07103 100.18371,116.67654 C 100.77986,116.28205 101.11025,115.82907 101.4724,115.36585 C 101.83455,114.90263 101.94155,114.45667 101.97237,113.8935 C 102.00319,113.33033 101.88899,112.7735 101.48418,112.24977 C 101.07937,111.72604 100.64982,111.06226 100.17793,110.52197 C 99.706043,109.98168 99.142309,109.4912 98.534118,109.19736 C 97.925927,108.90352 97.23572,108.65607 96.630291,108.50605 C 96.024862,108.35603 95.584981,108.32043 94.9375,108.40625 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ transform="matrix(1.41667,0,0,1.57627,-38.6775,-62.2193)"
+ sodipodi:nodetypes="czzzzzzzzzzzzzzzz" />
+ <path
+ id="path3536"
+ d="M 95.757212,60.26801 C 94.839875,60.407623 93.290633,60.580795 92.160034,60.92426 C 91.029435,61.267725 89.911438,61.914443 89.056586,63.01801 C 88.201734,64.121577 87.553727,65.489742 87.081665,67.17426 C 86.609604,68.858778 86.309324,70.138052 86.376336,72.54926 C 86.443347,74.960468 86.871609,78.248439 87.363796,81.26801 C 87.855982,84.287581 88.351917,87.858919 88.986053,90.86176 C 89.620189,93.864601 90.703057,96.535287 91.517717,98.646292 C 92.332377,100.7573 93.087791,102.49111 93.836704,103.50233 C 94.585617,104.51355 94.896259,104.9036 95.686679,105.33051 C 96.477099,105.75742 97.567003,106.06303 98.522102,105.98676 C 99.477201,105.91049 100.41608,104.41885 101.13839,103.59677 C 101.8607,102.77469 102.88842,99.504338 103.69761,96.48345 C 104.5068,93.462561 105.30597,91.53964 106.35271,86.599296 C 107.39945,81.658952 108.47781,74.293841 108.97508,71.01801 C 109.47234,67.742179 109.22234,67.929863 108.72878,66.467389 C 108.23521,65.004915 107.35398,64.101592 106.50643,63.26801 C 105.65887,62.434428 105.19482,61.932957 103.70986,61.473812 C 102.2249,61.014666 101.16364,60.702221 99.837564,60.539052 C 98.511488,60.375883 96.674549,60.128397 95.757212,60.26801 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ sodipodi:nodetypes="czzzzzzzzzzzzzzzzzzz" />
+ </g>
+ </g>
+ </g>
+ <g
+ transform="matrix(0.6623212,0,0,0.6661406,442.54063,461.0687)"
+ id="g3538"
+ inkscape:label="Calque 1">
+ <g
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ id="g3540">
+ <path
+ sodipodi:type="star"
+ style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:27.82019997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:24.29999924;stroke-dasharray:none;stroke-opacity:1"
+ id="path3542"
+ sodipodi:sides="3"
+ sodipodi:cx="191.09729"
+ sodipodi:cy="183.1349"
+ sodipodi:r1="187.79253"
+ sodipodi:r2="93.896263"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.5707963"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="M 353.73039,277.03117 L 191.09729,277.03117 L 28.464191,277.03117 L 109.78074,136.18677 L 191.09729,-4.6576233 L 272.41384,136.18677 L 353.73039,277.03117 z"
+ transform="matrix(0.35945,0,0,0.35945,28.8492,30.1932)" />
+ <g
+ id="g3544"
+ transform="translate(-0.510735,-1.02147)">
+ <path
+ id="path3546"
+ d="M 94.9375,108.40625 C 94.290019,108.49207 93.517293,108.86225 92.914114,109.2178 C 92.310935,109.57335 91.770059,109.9684 91.3641,110.47287 C 90.958141,110.97733 90.867103,111.63392 90.72033,112.21243 C 90.573557,112.79094 90.525438,113.26403 90.78125,113.90625 C 91.037062,114.54847 91.509887,115.41161 92.055252,115.93025 C 92.600617,116.44889 92.987635,116.9934 93.711376,117.22111 C 94.435117,117.44881 95.279851,117.7648 96,117.875 C 96.720149,117.9852 97.25089,117.77544 97.962055,117.59387 C 98.67322,117.4123 99.587555,117.07103 100.18371,116.67654 C 100.77986,116.28205 101.11025,115.82907 101.4724,115.36585 C 101.83455,114.90263 101.94155,114.45667 101.97237,113.8935 C 102.00319,113.33033 101.88899,112.7735 101.48418,112.24977 C 101.07937,111.72604 100.64982,111.06226 100.17793,110.52197 C 99.706043,109.98168 99.142309,109.4912 98.534118,109.19736 C 97.925927,108.90352 97.23572,108.65607 96.630291,108.50605 C 96.024862,108.35603 95.584981,108.32043 94.9375,108.40625 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ transform="matrix(1.41667,0,0,1.57627,-38.6775,-62.2193)"
+ sodipodi:nodetypes="czzzzzzzzzzzzzzzz" />
+ <path
+ id="path3548"
+ d="M 95.757212,60.26801 C 94.839875,60.407623 93.290633,60.580795 92.160034,60.92426 C 91.029435,61.267725 89.911438,61.914443 89.056586,63.01801 C 88.201734,64.121577 87.553727,65.489742 87.081665,67.17426 C 86.609604,68.858778 86.309324,70.138052 86.376336,72.54926 C 86.443347,74.960468 86.871609,78.248439 87.363796,81.26801 C 87.855982,84.287581 88.351917,87.858919 88.986053,90.86176 C 89.620189,93.864601 90.703057,96.535287 91.517717,98.646292 C 92.332377,100.7573 93.087791,102.49111 93.836704,103.50233 C 94.585617,104.51355 94.896259,104.9036 95.686679,105.33051 C 96.477099,105.75742 97.567003,106.06303 98.522102,105.98676 C 99.477201,105.91049 100.41608,104.41885 101.13839,103.59677 C 101.8607,102.77469 102.88842,99.504338 103.69761,96.48345 C 104.5068,93.462561 105.30597,91.53964 106.35271,86.599296 C 107.39945,81.658952 108.47781,74.293841 108.97508,71.01801 C 109.47234,67.742179 109.22234,67.929863 108.72878,66.467389 C 108.23521,65.004915 107.35398,64.101592 106.50643,63.26801 C 105.65887,62.434428 105.19482,61.932957 103.70986,61.473812 C 102.2249,61.014666 101.16364,60.702221 99.837564,60.539052 C 98.511488,60.375883 96.674549,60.128397 95.757212,60.26801 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ sodipodi:nodetypes="czzzzzzzzzzzzzzzzzzz" />
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/realtime/rt-basics/images/gpos_vs_rt.png b/realtime/rt-basics/images/gpos_vs_rt.png
new file mode 100644
index 0000000..07a4a79
--- /dev/null
+++ b/realtime/rt-basics/images/gpos_vs_rt.png
Binary files differ
diff --git a/realtime/rt-basics/images/gpos_vs_rt.svg b/realtime/rt-basics/images/gpos_vs_rt.svg
new file mode 100644
index 0000000..7862037
--- /dev/null
+++ b/realtime/rt-basics/images/gpos_vs_rt.svg
@@ -0,0 +1,134 @@
+<?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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="gpos_vs_rt.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/jan/work/omnicron/schulung/realtime/rt-basics/images/gpos_vs_rt.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4">
+ <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="perspective10" />
+ <inkscape:perspective
+ id="perspective2447"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <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="perspective3230" />
+ <inkscape:perspective
+ id="perspective3357"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 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.7"
+ inkscape:cx="486.9722"
+ inkscape:cy="699.91284"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1024"
+ inkscape:window-height="694"
+ inkscape:window-x="0"
+ inkscape:window-y="-60" />
+ <metadata
+ id="metadata7">
+ <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">
+ <image
+ y="58.076473"
+ x="137.14288"
+ id="image2449"
+ height="400"
+ width="420"
+ sodipodi:absref="/home/jan/work/omnicron/tmp/221401waage_517.jpg"
+ xlink:href="/home/jan/work/omnicron/tmp/221401waage_517.jpg" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="565.14288"
+ y="208.07646"
+ id="text2453"><tspan
+ sodipodi:role="line"
+ id="tspan2455"
+ x="565.14288"
+ y="208.07646"
+ style="font-size:32px;text-align:center;text-anchor:middle">Realtime</tspan><tspan
+ sodipodi:role="line"
+ x="565.14288"
+ y="248.07646"
+ id="tspan2457"
+ style="font-size:32px;text-align:center;text-anchor:middle">Operating System</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="169.57031"
+ y="210.39732"
+ id="text2459"><tspan
+ sodipodi:role="line"
+ id="tspan2461"
+ x="169.57031"
+ y="210.39732"
+ style="font-size:32px;text-align:center;text-anchor:middle">General Purpose</tspan><tspan
+ sodipodi:role="line"
+ x="169.57031"
+ y="250.39732"
+ id="tspan2463"
+ style="font-size:32px;text-align:center;text-anchor:middle">Operating System</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.47621512;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 15.652393,155.44315 L 15.652393,269.85264 L 331.49046,265.56229 L 331.49046,158.30338 L 331.49046,158.30338 L 331.49046,162.59374"
+ id="path2465" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.45622063;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 410.78525,152.57601 L 410.78525,267.0055 L 718.0719,262.7144 L 718.0719,155.43674 L 718.0719,155.43674 L 718.0719,159.72785"
+ id="path3237" />
+ </g>
+</svg>
diff --git a/realtime/rt-basics/images/ipipe.png b/realtime/rt-basics/images/ipipe.png
new file mode 100644
index 0000000..b7468fa
--- /dev/null
+++ b/realtime/rt-basics/images/ipipe.png
Binary files differ
diff --git a/realtime/rt-basics/images/ipipe.svg b/realtime/rt-basics/images/ipipe.svg
new file mode 100644
index 0000000..cc7baa9
--- /dev/null
+++ b/realtime/rt-basics/images/ipipe.svg
@@ -0,0 +1,185 @@
+<?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="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="ipipe.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/jan/work/omnicron/schulung/realtime/rt-basics/images/xenomai.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;">
+ <path
+ id="path3854"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <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="perspective10" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="336.82532"
+ inkscape:cy="280.92561"
+ inkscape:document-units="px"
+ inkscape:current-layer="g3159"
+ showgrid="false"
+ inkscape:window-width="906"
+ inkscape:window-height="694"
+ inkscape:window-x="88"
+ inkscape:window-y="-41" />
+ <metadata
+ id="metadata7">
+ <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
+ id="g3159"
+ transform="matrix(1.1055858,0,0,1.0705292,-68.76791,-183.84127)">
+ <rect
+ y="804.67487"
+ x="202.62572"
+ height="128.83612"
+ width="371.50049"
+ id="rect3157"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:1.10543263;stroke-opacity:1"
+ transform="matrix(0.9999966,2.6189089e-3,0,1,0,0)" />
+ <text
+ id="text2383"
+ y="884.51947"
+ x="219.0838"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="884.51947"
+ x="219.0838"
+ id="tspan2385"
+ sodipodi:role="line">Xenomai Domain</tspan></text>
+ <rect
+ y="612.91962"
+ x="202.97916"
+ height="130.6824"
+ width="371.49274"
+ id="rect3325"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:1.11331356;stroke-opacity:1"
+ transform="matrix(0.9999965,2.6564951e-3,0,1,0,0)" />
+ <text
+ id="text3327"
+ y="694.63696"
+ x="250.1862"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="694.63696"
+ x="250.1862"
+ id="tspan3329"
+ sodipodi:role="line">Linux Domain</tspan></text>
+ <rect
+ y="993.10321"
+ x="203.88388"
+ height="130.6824"
+ width="371.49274"
+ id="rect3331"
+ style="fill:#ecfc00;fill-opacity:1;stroke:#000000;stroke-width:1.11331355999999992;stroke-opacity:1"
+ transform="matrix(0.9999965,2.656493e-3,0,1,0,0)" />
+ <text
+ id="text3333"
+ y="1074.8231"
+ x="298.12457"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="1074.8231"
+ x="298.12457"
+ id="tspan3335"
+ sodipodi:role="line">Interrupts</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow1Lend)"
+ d="M 253,879.36218 C 253,816.36218 253,816.36218 253,816.36218"
+ id="path3337"
+ transform="matrix(0.9044979,0,0,0.9341174,62.200428,171.72934)" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.91918838px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+ d="M 347.11695,993.62386 C 347.11695,934.77446 347.11695,934.77446 347.11695,934.77446"
+ id="path4626" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="347"
+ y="851.36218"
+ id="text4628"
+ transform="matrix(0.9044979,0,0,0.9341174,62.200428,171.72934)"><tspan
+ sodipodi:role="line"
+ id="tspan4630"
+ x="347"
+ y="851.36218">.....</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.91918838px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+ d="M 459.27506,992.68977 C 459.27506,933.84037 459.27506,933.84037 459.27506,933.84037"
+ id="path4632" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.91918838px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+ d="M 291.91302,805.86818 C 291.91302,747.01782 291.91302,747.01782 291.91302,747.01782"
+ id="path4634" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.91918838px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+ d="M 347.99157,806.33518 C 347.99157,747.48482 347.99157,747.48482 347.99157,747.48482"
+ id="path4636" />
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="383.05804"
+ y="767.24927"
+ id="text4638"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan4640"
+ x="383.05804"
+ y="767.24927">.....</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.91918838px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;marker-end:url(#Arrow1Lend);stroke-opacity:1"
+ d="M 460.14968,805.40105 C 460.14968,746.55072 460.14968,746.55072 460.14968,746.55072"
+ id="path4642" />
+ </g>
+ </g>
+</svg>
diff --git a/realtime/rt-basics/images/mar01.png b/realtime/rt-basics/images/mar01.png
new file mode 100644
index 0000000..7f18317
--- /dev/null
+++ b/realtime/rt-basics/images/mar01.png
Binary files differ
diff --git a/realtime/rt-basics/images/mar01.svg b/realtime/rt-basics/images/mar01.svg
new file mode 100644
index 0000000..78d99db
--- /dev/null
+++ b/realtime/rt-basics/images/mar01.svg
@@ -0,0 +1,122 @@
+<?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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ id="svg3840"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="mar01.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs3842">
+ <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="perspective3848" />
+ <inkscape:perspective
+ id="perspective4064"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4094"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4161"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4228"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 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.7"
+ inkscape:cx="263.27793"
+ inkscape:cy="709.64957"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1024"
+ inkscape:window-height="694"
+ inkscape:window-x="24"
+ inkscape:window-y="-27" />
+ <metadata
+ id="metadata3845">
+ <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">
+ <image
+ y="39.862186"
+ x="117.71429"
+ id="image4066"
+ height="201"
+ width="60"
+ sodipodi:absref="/tmp/ocal-ZPHSVU-Anonymous_Groom.png"
+ xlink:href="/tmp/ocal-ZPHSVU-Anonymous_Groom.png" />
+ <image
+ y="93.076469"
+ x="410.64285"
+ id="image4163"
+ height="134"
+ width="217"
+ sodipodi:absref="/home/jan/work/omnicron/tmp/rtai.jpg"
+ xlink:href="/home/jan/work/omnicron/tmp/rtai.jpg" />
+ <image
+ y="50.076473"
+ x="558.64288"
+ id="image4096"
+ height="200"
+ width="141"
+ sodipodi:absref="/tmp/ocal-FKLEVU-Anonymous_Bride.png"
+ xlink:href="/tmp/ocal-FKLEVU-Anonymous_Bride.png" />
+ <image
+ y="183.64789"
+ x="47.071484"
+ id="image4230"
+ height="44.857128"
+ width="308.42877"
+ sodipodi:absref="/home/jan/work/omnicron/tmp/Xenomai.png"
+ xlink:href="/home/jan/work/omnicron/tmp/Xenomai.png" />
+ </g>
+</svg>
diff --git a/realtime/rt-basics/images/mar02.png b/realtime/rt-basics/images/mar02.png
new file mode 100644
index 0000000..f1f53a1
--- /dev/null
+++ b/realtime/rt-basics/images/mar02.png
Binary files differ
diff --git a/realtime/rt-basics/images/mar02.svg b/realtime/rt-basics/images/mar02.svg
new file mode 100644
index 0000000..3c9ac3a
--- /dev/null
+++ b/realtime/rt-basics/images/mar02.svg
@@ -0,0 +1,158 @@
+<?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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ id="svg3840"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="mar02.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/jan/work/omnicron/schulung/realtime/rt-basics/images/mar01.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs3842">
+ <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="perspective3848" />
+ <inkscape:perspective
+ id="perspective4064"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4094"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4161"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4228"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4329"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 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.7"
+ inkscape:cx="263.27793"
+ inkscape:cy="709.64957"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1024"
+ inkscape:window-height="694"
+ inkscape:window-x="24"
+ inkscape:window-y="-27" />
+ <metadata
+ id="metadata3845">
+ <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">
+ <image
+ y="39.862186"
+ x="117.71429"
+ id="image4066"
+ height="201"
+ width="60"
+ sodipodi:absref="/tmp/ocal-ZPHSVU-Anonymous_Groom.png"
+ xlink:href="/tmp/ocal-ZPHSVU-Anonymous_Groom.png" />
+ <image
+ y="93.076469"
+ x="410.64285"
+ id="image4163"
+ height="134"
+ width="217"
+ sodipodi:absref="/home/jan/work/omnicron/tmp/rtai.jpg"
+ xlink:href="/home/jan/work/omnicron/tmp/rtai.jpg" />
+ <image
+ y="50.076473"
+ x="558.64288"
+ id="image4096"
+ height="200"
+ width="141"
+ sodipodi:absref="/tmp/ocal-FKLEVU-Anonymous_Bride.png"
+ xlink:href="/tmp/ocal-FKLEVU-Anonymous_Bride.png" />
+ <image
+ y="183.64789"
+ x="47.071484"
+ id="image4230"
+ height="44.857128"
+ width="308.42877"
+ sodipodi:absref="/home/jan/work/omnicron/tmp/Xenomai.png"
+ xlink:href="/home/jan/work/omnicron/tmp/Xenomai.png" />
+ <image
+ y="281.2908"
+ x="249.28574"
+ id="image4331"
+ height="107.85714"
+ width="144.28572"
+ sodipodi:absref="/tmp/ocal-5YSIVU-freedo_Wedding_Ring.png"
+ xlink:href="/tmp/ocal-5YSIVU-freedo_Wedding_Ring.png" />
+ <image
+ y="264.14792"
+ x="317.85712"
+ id="image4335"
+ height="107.85714"
+ width="144.28572"
+ sodipodi:absref="/tmp/ocal-5YSIVU-freedo_Wedding_Ring.png"
+ xlink:href="/tmp/ocal-5YSIVU-freedo_Wedding_Ring.png" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="220"
+ y="433.79074"
+ id="text4337"><tspan
+ sodipodi:role="line"
+ id="tspan4339"
+ x="220"
+ y="433.79074">RTAI / Fusion</tspan></text>
+ </g>
+</svg>
diff --git a/realtime/rt-basics/images/mar03.png b/realtime/rt-basics/images/mar03.png
new file mode 100644
index 0000000..97ab7ba
--- /dev/null
+++ b/realtime/rt-basics/images/mar03.png
Binary files differ
diff --git a/realtime/rt-basics/images/mar03.svg b/realtime/rt-basics/images/mar03.svg
new file mode 100644
index 0000000..71e98ae
--- /dev/null
+++ b/realtime/rt-basics/images/mar03.svg
@@ -0,0 +1,163 @@
+<?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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ id="svg3840"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="mar03.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/jan/work/omnicron/schulung/realtime/rt-basics/images/mar03.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs3842">
+ <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="perspective3848" />
+ <inkscape:perspective
+ id="perspective4064"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4094"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4161"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4228"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4329"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective4473"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 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.7"
+ inkscape:cx="263.27793"
+ inkscape:cy="709.64957"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1024"
+ inkscape:window-height="694"
+ inkscape:window-x="24"
+ inkscape:window-y="-27" />
+ <metadata
+ id="metadata3845">
+ <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">
+ <image
+ y="39.862186"
+ x="117.71429"
+ id="image4066"
+ height="201"
+ width="60"
+ sodipodi:absref="/tmp/ocal-ZPHSVU-Anonymous_Groom.png"
+ xlink:href="/tmp/ocal-ZPHSVU-Anonymous_Groom.png" />
+ <image
+ y="93.076469"
+ x="410.64285"
+ id="image4163"
+ height="134"
+ width="217"
+ sodipodi:absref="/home/jan/work/omnicron/tmp/rtai.jpg"
+ xlink:href="/home/jan/work/omnicron/tmp/rtai.jpg" />
+ <image
+ y="50.076473"
+ x="558.64288"
+ id="image4096"
+ height="200"
+ width="141"
+ sodipodi:absref="/tmp/ocal-FKLEVU-Anonymous_Bride.png"
+ xlink:href="/tmp/ocal-FKLEVU-Anonymous_Bride.png" />
+ <image
+ y="183.64789"
+ x="47.071484"
+ id="image4230"
+ height="44.857128"
+ width="308.42877"
+ sodipodi:absref="/home/jan/work/omnicron/tmp/Xenomai.png"
+ xlink:href="/home/jan/work/omnicron/tmp/Xenomai.png" />
+ <image
+ y="332.71936"
+ x="190.71431"
+ id="image4331"
+ height="107.85714"
+ width="144.28572"
+ sodipodi:absref="/tmp/ocal-5YSIVU-freedo_Wedding_Ring.png"
+ xlink:href="/tmp/ocal-5YSIVU-freedo_Wedding_Ring.png" />
+ <image
+ y="272.71933"
+ x="377.85712"
+ id="image4335"
+ height="107.85714"
+ width="144.28572"
+ sodipodi:absref="/tmp/ocal-5YSIVU-freedo_Wedding_Ring.png"
+ xlink:href="/tmp/ocal-5YSIVU-freedo_Wedding_Ring.png" />
+ <image
+ y="280.14789"
+ x="291.5"
+ id="image4475"
+ height="133"
+ width="137"
+ sodipodi:absref="/tmp/ocal-5MEMVU-spite_overcloud_thunder.png"
+ xlink:href="/tmp/ocal-5MEMVU-spite_overcloud_thunder.png" />
+ </g>
+</svg>
diff --git a/realtime/rt-basics/images/nuclear.png b/realtime/rt-basics/images/nuclear.png
new file mode 100644
index 0000000..a434e91
--- /dev/null
+++ b/realtime/rt-basics/images/nuclear.png
Binary files differ
diff --git a/realtime/rt-basics/images/preempt_rt.png b/realtime/rt-basics/images/preempt_rt.png
new file mode 100644
index 0000000..463673f
--- /dev/null
+++ b/realtime/rt-basics/images/preempt_rt.png
Binary files differ
diff --git a/realtime/rt-basics/images/preempt_rt.svg b/realtime/rt-basics/images/preempt_rt.svg
new file mode 100644
index 0000000..a9c0ac7
--- /dev/null
+++ b/realtime/rt-basics/images/preempt_rt.svg
@@ -0,0 +1,254 @@
+<?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="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="preempt_rt.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/jan/work/omnicron/schulung/realtime/rt-basics/images/preempt_rt.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;">
+ <path
+ id="path3854"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <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="perspective10" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.70710678"
+ inkscape:cx="437.82107"
+ inkscape:cy="620.16427"
+ inkscape:document-units="px"
+ inkscape:current-layer="g3159"
+ showgrid="false"
+ inkscape:window-width="906"
+ inkscape:window-height="694"
+ inkscape:window-x="88"
+ inkscape:window-y="-41" />
+ <metadata
+ id="metadata7">
+ <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
+ id="g3159"
+ transform="matrix(1.1055858,0,0,1.0705292,-68.76791,-183.84127)">
+ <rect
+ style="fill:#00b8fc;fill-opacity:1;stroke:#000000;stroke-width:1.10370838999999998;stroke-opacity:1"
+ id="rect4714"
+ width="627.88263"
+ height="281.19434"
+ x="85.955544"
+ y="207.66618" />
+ <rect
+ style="fill:#ecfc00;fill-opacity:1;stroke:#000000;stroke-width:1.18113208;stroke-opacity:1"
+ id="rect4700"
+ width="627.80646"
+ height="322.06793"
+ x="86.633232"
+ y="488.18066" />
+ <rect
+ y="838.86499"
+ x="87.663139"
+ height="128.50444"
+ width="627.00702"
+ id="rect3157"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:1.43426394;stroke-opacity:1"
+ transform="matrix(0.9999988,1.5477038e-3,0,1,0,0)" />
+ <text
+ id="text2383"
+ y="918.14752"
+ x="304.10635"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="918.14752"
+ x="304.10635"
+ id="tspan2385"
+ sodipodi:role="line">Hardware</tspan></text>
+ <rect
+ y="658.21362"
+ x="120.17767"
+ height="130.42729"
+ width="560.55804"
+ id="rect3325"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:1.36624408;stroke-opacity:1"
+ transform="matrix(0.9999985,1.7570719e-3,0,1,0,0)" />
+ <text
+ id="text3327"
+ y="743.21082"
+ x="335.20877"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="743.21082"
+ x="335.20877"
+ id="tspan3329"
+ sodipodi:role="line">Linux</tspan></text>
+ <rect
+ y="500.0282"
+ x="541.06018"
+ height="131.12286"
+ width="136.75529"
+ id="rect4680"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:0.67662036;stroke-opacity:1"
+ transform="matrix(0.9999738,7.2405849e-3,0,1,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="619.31989"
+ y="555.37689"
+ id="text4682"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan4684"
+ x="619.31989"
+ y="555.37689"
+ style="text-align:center;text-anchor:middle">IRQ</tspan><tspan
+ sodipodi:role="line"
+ x="619.31989"
+ y="601.3363"
+ id="tspan4686"
+ style="text-align:center;text-anchor:middle">Thread</tspan></text>
+ <rect
+ y="325.95078"
+ x="124.87892"
+ height="130.9637"
+ width="208.23135"
+ id="rect4688"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:0.8344155;stroke-opacity:1"
+ transform="matrix(0.9999887,4.7494726e-3,0,1,0,0)" />
+ <text
+ id="text4690"
+ y="405.06094"
+ x="184.15723"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="405.06094"
+ x="184.15723"
+ id="tspan4692"
+ sodipodi:role="line">App</tspan></text>
+ <rect
+ y="325.59882"
+ x="354.0275"
+ height="130.74443"
+ width="331.42499"
+ id="rect4694"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:1.0518117;stroke-opacity:1"
+ transform="matrix(0.9999956,2.9790553e-3,0,1,0,0)" />
+ <text
+ id="text4696"
+ y="405.06009"
+ x="449.17447"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="405.06009"
+ x="449.17447"
+ id="tspan4698"
+ sodipodi:role="line">RT App</tspan></text>
+ <rect
+ y="500.85446"
+ x="265.56952"
+ height="131.12286"
+ width="136.75529"
+ id="rect4702"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:0.67662036;stroke-opacity:1"
+ transform="matrix(0.9999738,7.2405556e-3,0,1,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="339.36279"
+ y="554.22833"
+ id="text4704"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan4706"
+ x="339.36279"
+ y="554.22833"
+ style="text-align:center;text-anchor:middle">IRQ</tspan><tspan
+ sodipodi:role="line"
+ x="339.36279"
+ y="600.18774"
+ id="tspan4708"
+ style="text-align:center;text-anchor:middle">Thread</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="446.68961"
+ y="566.89685"
+ id="text4710"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan4712"
+ x="446.68961"
+ y="566.89685">.....</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="62.225395"
+ y="400.40973"
+ id="text4716"
+ transform="matrix(0.9044979,0,0,0.9341174,62.200428,171.72934)"><tspan
+ sodipodi:role="line"
+ id="tspan4718"
+ x="62.225395"
+ y="400.40973">Kernel</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="128.20709"
+ y="252.22173"
+ id="text4720"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan4722"
+ x="128.20709"
+ y="252.22173">User</tspan></text>
+ </g>
+ </g>
+</svg>
diff --git a/realtime/rt-basics/images/prio_inv.png b/realtime/rt-basics/images/prio_inv.png
new file mode 100644
index 0000000..574afb3
--- /dev/null
+++ b/realtime/rt-basics/images/prio_inv.png
Binary files differ
diff --git a/realtime/rt-basics/images/prio_inv.svg b/realtime/rt-basics/images/prio_inv.svg
new file mode 100644
index 0000000..c655052
--- /dev/null
+++ b/realtime/rt-basics/images/prio_inv.svg
@@ -0,0 +1,207 @@
+<?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="297mm"
+ height="210mm"
+ id="svg4744"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="prio_inv.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/jan/work/omnicron/schulung/realtime/rt-basics/images/prio_inv.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4746">
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;">
+ <path
+ id="path3854"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 372.04724 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1052.3622 : 372.04724 : 1"
+ inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
+ id="perspective4753" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:document-units="mm"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.61399264"
+ inkscape:cx="492.88764"
+ inkscape:cy="377.9895"
+ inkscape:current-layer="layer1"
+ id="namedview4748"
+ showgrid="false"
+ inkscape:window-width="906"
+ inkscape:window-height="694"
+ inkscape:window-x="123"
+ inkscape:window-y="-28" />
+ <metadata
+ id="metadata4750">
+ <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">
+ <rect
+ style="fill:#00b8fc;fill-opacity:1;stroke:#000000;stroke-width:0.84919637;stroke-opacity:1"
+ id="rect4755"
+ width="272.82034"
+ height="67.731445"
+ x="135.47668"
+ y="215.23705" />
+ <rect
+ style="fill:#fcfa00;fill-opacity:1;stroke:#000000;stroke-width:0.66878808;stroke-opacity:1"
+ id="rect4757"
+ width="168.76497"
+ height="67.91185"
+ x="135.4655"
+ y="309.28543" />
+ <rect
+ style="fill:#fc7100;fill-opacity:1;stroke:#000000;stroke-width:0.66878808;stroke-opacity:1"
+ id="rect4759"
+ width="168.76497"
+ height="67.91185"
+ x="136.61319"
+ y="406.2153" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99921262;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 101.74657,494.53451 L 101.74657,196.48534"
+ id="path5270"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="13.915524"
+ y="355.52271"
+ id="text5789"><tspan
+ sodipodi:role="line"
+ id="tspan5791"
+ x="13.915524"
+ y="355.52271">Prio</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="158.2692"
+ y="262.0885"
+ id="text5793"><tspan
+ sodipodi:role="line"
+ id="tspan5795"
+ x="158.2692"
+ y="262.0885">Task 1</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="158.40906"
+ y="358.99274"
+ id="text5797"><tspan
+ sodipodi:role="line"
+ id="tspan5799"
+ x="158.40906"
+ y="358.99274">Task 2</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="159.61105"
+ y="452.56006"
+ id="text5801"><tspan
+ sodipodi:role="line"
+ id="tspan5803"
+ x="159.61105"
+ y="452.56006">Task 3</tspan></text>
+ <rect
+ style="fill:#fc7100;fill-opacity:1;stroke:#000000;stroke-width:0.66878808;stroke-opacity:1"
+ id="rect5805"
+ width="168.76497"
+ height="67.91185"
+ x="409.13431"
+ y="405.01862" />
+ <rect
+ style="fill:#fcfa00;fill-opacity:1;stroke:#000000;stroke-width:0.92613;stroke-opacity:1"
+ id="rect5807"
+ width="324.8613"
+ height="67.65451"
+ x="575.52429"
+ y="306.04123" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.75060922;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 407.64817,233.15777 L 407.42676,396.27469"
+ id="path5814"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.58791548;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 578.18282,474.38161 L 578.18282,376.24928"
+ id="path5816"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="324.10812"
+ y="356.46768"
+ id="text5818"><tspan
+ sodipodi:role="line"
+ id="tspan5820"
+ x="324.10812"
+ y="356.46768">blockiert</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="586.28711"
+ y="413.35428"
+ id="text5822"><tspan
+ sodipodi:role="line"
+ id="tspan5824"
+ x="586.28711"
+ y="413.35428">unterbrochen</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="428.41046"
+ y="451.47217"
+ id="text5826"><tspan
+ sodipodi:role="line"
+ id="tspan5828"
+ x="428.41046"
+ y="451.47217">Task 3</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="670.6911"
+ y="353.93771"
+ id="text5830"><tspan
+ sodipodi:role="line"
+ id="tspan5832"
+ x="670.6911"
+ y="353.93771">Task 2</tspan></text>
+ </g>
+</svg>
diff --git a/realtime/rt-basics/images/rtai.dia b/realtime/rt-basics/images/rtai.dia
new file mode 100644
index 0000000..dedf883
--- /dev/null
+++ b/realtime/rt-basics/images/rtai.dia
Binary files differ
diff --git a/realtime/rt-basics/images/rtai.dia~ b/realtime/rt-basics/images/rtai.dia~
new file mode 100644
index 0000000..c4024ff
--- /dev/null
+++ b/realtime/rt-basics/images/rtai.dia~
Binary files differ
diff --git a/realtime/rt-basics/images/rtai.png b/realtime/rt-basics/images/rtai.png
new file mode 100644
index 0000000..c6c21ce
--- /dev/null
+++ b/realtime/rt-basics/images/rtai.png
Binary files differ
diff --git a/realtime/rt-basics/images/rtai.svg b/realtime/rt-basics/images/rtai.svg
new file mode 100644
index 0000000..39b34e4
--- /dev/null
+++ b/realtime/rt-basics/images/rtai.svg
@@ -0,0 +1,273 @@
+<?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="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="rtai.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4">
+ <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="perspective10" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.5"
+ inkscape:cx="713.45482"
+ inkscape:cy="537.44764"
+ inkscape:document-units="px"
+ inkscape:current-layer="g3159"
+ showgrid="false"
+ inkscape:window-width="906"
+ inkscape:window-height="694"
+ inkscape:window-x="88"
+ inkscape:window-y="-31" />
+ <metadata
+ id="metadata7">
+ <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
+ id="g3159"
+ transform="matrix(1.1055858,0,0,1.0705292,-68.76791,-183.84127)">
+ <rect
+ style="fill:#00c2fc;fill-opacity:1;stroke:#000000;stroke-width:0.70241845;stroke-opacity:1"
+ id="rect3228"
+ width="657.20056"
+ height="175.55843"
+ x="64.646378"
+ y="255.23193" />
+ <rect
+ style="fill:#fcf800;fill-opacity:1;stroke:#000000;stroke-width:1.02652764;stroke-opacity:1"
+ id="rect3226"
+ width="656.88165"
+ height="375.13019"
+ x="64.06218"
+ y="431.41074" />
+ <rect
+ y="806.15021"
+ x="62.441948"
+ height="76.543472"
+ width="658.19678"
+ id="rect3157"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:1.13413763;stroke-opacity:1" />
+ <text
+ id="text2383"
+ y="861.16669"
+ x="302.29761"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="861.16669"
+ x="302.29761"
+ id="tspan2385"
+ sodipodi:role="line">Hardware</tspan></text>
+ <rect
+ y="652.98529"
+ x="83.228462"
+ height="76.574478"
+ width="623.01147"
+ id="rect3164"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:1.1036309;stroke-opacity:1" />
+ <text
+ id="text3166"
+ y="705.27673"
+ x="302.23563"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="705.27673"
+ x="302.23563"
+ id="tspan3168"
+ sodipodi:role="line">RT Kernel</tspan></text>
+ <rect
+ y="521.28082"
+ x="84.68071"
+ height="77.063293"
+ width="197.03423"
+ id="rect3170"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:0.62262768;stroke-opacity:1" />
+ <text
+ id="text3176"
+ y="573.85217"
+ x="128.00005"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="573.85217"
+ x="128.00005"
+ id="tspan3178"
+ sodipodi:role="line">Linux</tspan></text>
+ <rect
+ y="522.2688"
+ x="299.24976"
+ height="77.063293"
+ width="197.03423"
+ id="rect3180"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:0.62262768;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="341.50241"
+ y="564.7182"
+ id="text3182"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan3184"
+ x="341.50241"
+ y="564.7182">RT App</tspan></text>
+ <rect
+ y="522.15295"
+ x="509.44202"
+ height="77.063293"
+ width="197.03423"
+ id="rect3186"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:0.62262768;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="555.10895"
+ y="564.60419"
+ id="text3188"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan3190"
+ x="555.10895"
+ y="564.60419">RT App</tspan></text>
+ <rect
+ y="337.62781"
+ x="85.736412"
+ height="76.947311"
+ width="276.30084"
+ id="rect3192"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:0.73675251;stroke-opacity:1" />
+ <text
+ id="text3194"
+ y="390.14197"
+ x="128.99979"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="390.14197"
+ x="128.99979"
+ id="tspan3196"
+ sodipodi:role="line">Linux App</tspan></text>
+ <rect
+ y="337.58328"
+ x="380.85403"
+ height="76.947311"
+ width="276.30084"
+ id="rect3198"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:0.73675251;stroke-opacity:1" />
+ <text
+ id="text3200"
+ y="390.09756"
+ x="424.11719"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="390.09756"
+ x="424.11719"
+ id="tspan3202"
+ sodipodi:role="line">Linux App</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.91918838px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 190.79792,651.99969 L 190.79792,598.80099 L 190.79792,598.80099"
+ id="path3206" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.91918838px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 387.76183,652.67974 L 387.76183,599.48103 L 387.76183,599.48103"
+ id="path3208" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.91918838px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 604.86584,652.817 L 604.86584,599.6183 L 604.86584,599.6183"
+ id="path3210" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.30547941px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 155.6171,521.34664 L 155.6171,414.03866 L 155.6171,414.03866"
+ id="path3212" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.16561925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 234.83091,520.18588 L 455.83604,414.91101"
+ id="path3214" />
+ <rect
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:0.91918838;stroke-opacity:1"
+ id="rect3216"
+ width="140.17979"
+ height="44.477608"
+ x="536.05273"
+ y="446.30197" />
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="579.94427"
+ y="475.21246"
+ id="text3218"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan3220"
+ x="579.94427"
+ y="475.21246">FIFO</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.91918838px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 605.4261,521.18321 L 605.4261,489.78725"
+ id="path3222" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.91918838px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 606.27056,445.30965 L 606.27056,413.91369"
+ id="path3224" />
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="103.65495"
+ y="301.68082"
+ id="text3230"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan3232"
+ x="103.65495"
+ y="301.68082">Userspace</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="102.72641"
+ y="767.17688"
+ id="text3234"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan3236"
+ x="102.72641"
+ y="767.17688">Kernelspace</tspan></text>
+ </g>
+ </g>
+</svg>
diff --git a/realtime/rt-basics/images/single_kernel.png b/realtime/rt-basics/images/single_kernel.png
new file mode 100644
index 0000000..d398b29
--- /dev/null
+++ b/realtime/rt-basics/images/single_kernel.png
Binary files differ
diff --git a/realtime/rt-basics/images/single_kernel.svg b/realtime/rt-basics/images/single_kernel.svg
new file mode 100644
index 0000000..31a06ce
--- /dev/null
+++ b/realtime/rt-basics/images/single_kernel.svg
@@ -0,0 +1,234 @@
+<?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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ id="svg3367"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="single_kernel.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/jan/work/omnicron/schulung/realtime/rt-basics/images/single_kernel.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs3369">
+ <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="perspective3375" />
+ <inkscape:perspective
+ id="perspective3442"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <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="perspective3230" />
+ <inkscape:perspective
+ id="perspective10"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 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.7"
+ inkscape:cx="285.06246"
+ inkscape:cy="582.52552"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="777"
+ inkscape:window-height="694"
+ inkscape:window-x="94"
+ inkscape:window-y="0" />
+ <metadata
+ id="metadata3372">
+ <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">
+ <rect
+ style="fill:#fc7100;fill-opacity:1;stroke:#000000;stroke-width:1.60000002;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3448"
+ width="474.28571"
+ height="84.285713"
+ x="91.428574"
+ y="574.36218" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="237.14285"
+ y="634.36218"
+ id="text3377"><tspan
+ sodipodi:role="line"
+ id="tspan3379"
+ x="237.14285"
+ y="634.36218">Hardware</tspan></text>
+ <image
+ y="289.00507"
+ x="204.28568"
+ id="image3444"
+ height="257.28574"
+ width="237.14284"
+ sodipodi:absref="/home/jan/work/omnicron/tmp/tux_huge.png"
+ xlink:href="/home/jan/work/omnicron/tmp/tux_huge.png" />
+ <g
+ transform="matrix(0.6623212,0,0,0.6661406,193.9692,368.21156)"
+ id="g3519"
+ inkscape:label="Calque 1">
+ <g
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ id="g3252">
+ <path
+ sodipodi:type="star"
+ style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:27.82019997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:24.29999924;stroke-dasharray:none;stroke-opacity:1"
+ id="path2383"
+ sodipodi:sides="3"
+ sodipodi:cx="191.09729"
+ sodipodi:cy="183.1349"
+ sodipodi:r1="187.79253"
+ sodipodi:r2="93.896263"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.5707963"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="M 353.73039,277.03117 L 191.09729,277.03117 L 28.464191,277.03117 L 109.78074,136.18677 L 191.09729,-4.6576233 L 272.41384,136.18677 L 353.73039,277.03117 z"
+ transform="matrix(0.35945,0,0,0.35945,28.8492,30.1932)" />
+ <g
+ id="g3163"
+ transform="translate(-0.510735,-1.02147)">
+ <path
+ id="path3155"
+ d="M 94.9375,108.40625 C 94.290019,108.49207 93.517293,108.86225 92.914114,109.2178 C 92.310935,109.57335 91.770059,109.9684 91.3641,110.47287 C 90.958141,110.97733 90.867103,111.63392 90.72033,112.21243 C 90.573557,112.79094 90.525438,113.26403 90.78125,113.90625 C 91.037062,114.54847 91.509887,115.41161 92.055252,115.93025 C 92.600617,116.44889 92.987635,116.9934 93.711376,117.22111 C 94.435117,117.44881 95.279851,117.7648 96,117.875 C 96.720149,117.9852 97.25089,117.77544 97.962055,117.59387 C 98.67322,117.4123 99.587555,117.07103 100.18371,116.67654 C 100.77986,116.28205 101.11025,115.82907 101.4724,115.36585 C 101.83455,114.90263 101.94155,114.45667 101.97237,113.8935 C 102.00319,113.33033 101.88899,112.7735 101.48418,112.24977 C 101.07937,111.72604 100.64982,111.06226 100.17793,110.52197 C 99.706043,109.98168 99.142309,109.4912 98.534118,109.19736 C 97.925927,108.90352 97.23572,108.65607 96.630291,108.50605 C 96.024862,108.35603 95.584981,108.32043 94.9375,108.40625 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ transform="matrix(1.41667,0,0,1.57627,-38.6775,-62.2193)"
+ sodipodi:nodetypes="czzzzzzzzzzzzzzzz" />
+ <path
+ id="path3157"
+ d="M 95.757212,60.26801 C 94.839875,60.407623 93.290633,60.580795 92.160034,60.92426 C 91.029435,61.267725 89.911438,61.914443 89.056586,63.01801 C 88.201734,64.121577 87.553727,65.489742 87.081665,67.17426 C 86.609604,68.858778 86.309324,70.138052 86.376336,72.54926 C 86.443347,74.960468 86.871609,78.248439 87.363796,81.26801 C 87.855982,84.287581 88.351917,87.858919 88.986053,90.86176 C 89.620189,93.864601 90.703057,96.535287 91.517717,98.646292 C 92.332377,100.7573 93.087791,102.49111 93.836704,103.50233 C 94.585617,104.51355 94.896259,104.9036 95.686679,105.33051 C 96.477099,105.75742 97.567003,106.06303 98.522102,105.98676 C 99.477201,105.91049 100.41608,104.41885 101.13839,103.59677 C 101.8607,102.77469 102.88842,99.504338 103.69761,96.48345 C 104.5068,93.462561 105.30597,91.53964 106.35271,86.599296 C 107.39945,81.658952 108.47781,74.293841 108.97508,71.01801 C 109.47234,67.742179 109.22234,67.929863 108.72878,66.467389 C 108.23521,65.004915 107.35398,64.101592 106.50643,63.26801 C 105.65887,62.434428 105.19482,61.932957 103.70986,61.473812 C 102.2249,61.014666 101.16364,60.702221 99.837564,60.539052 C 98.511488,60.375883 96.674549,60.128397 95.757212,60.26801 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ sodipodi:nodetypes="czzzzzzzzzzzzzzzzzzz" />
+ </g>
+ </g>
+ </g>
+ <g
+ transform="matrix(0.6623212,0,0,0.6661406,313.9692,475.0687)"
+ id="g3526"
+ inkscape:label="Calque 1">
+ <g
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ id="g3528">
+ <path
+ sodipodi:type="star"
+ style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:27.82019997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:24.29999924;stroke-dasharray:none;stroke-opacity:1"
+ id="path3530"
+ sodipodi:sides="3"
+ sodipodi:cx="191.09729"
+ sodipodi:cy="183.1349"
+ sodipodi:r1="187.79253"
+ sodipodi:r2="93.896263"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.5707963"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="M 353.73039,277.03117 L 191.09729,277.03117 L 28.464191,277.03117 L 109.78074,136.18677 L 191.09729,-4.6576233 L 272.41384,136.18677 L 353.73039,277.03117 z"
+ transform="matrix(0.35945,0,0,0.35945,28.8492,30.1932)" />
+ <g
+ id="g3532"
+ transform="translate(-0.510735,-1.02147)">
+ <path
+ id="path3534"
+ d="M 94.9375,108.40625 C 94.290019,108.49207 93.517293,108.86225 92.914114,109.2178 C 92.310935,109.57335 91.770059,109.9684 91.3641,110.47287 C 90.958141,110.97733 90.867103,111.63392 90.72033,112.21243 C 90.573557,112.79094 90.525438,113.26403 90.78125,113.90625 C 91.037062,114.54847 91.509887,115.41161 92.055252,115.93025 C 92.600617,116.44889 92.987635,116.9934 93.711376,117.22111 C 94.435117,117.44881 95.279851,117.7648 96,117.875 C 96.720149,117.9852 97.25089,117.77544 97.962055,117.59387 C 98.67322,117.4123 99.587555,117.07103 100.18371,116.67654 C 100.77986,116.28205 101.11025,115.82907 101.4724,115.36585 C 101.83455,114.90263 101.94155,114.45667 101.97237,113.8935 C 102.00319,113.33033 101.88899,112.7735 101.48418,112.24977 C 101.07937,111.72604 100.64982,111.06226 100.17793,110.52197 C 99.706043,109.98168 99.142309,109.4912 98.534118,109.19736 C 97.925927,108.90352 97.23572,108.65607 96.630291,108.50605 C 96.024862,108.35603 95.584981,108.32043 94.9375,108.40625 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ transform="matrix(1.41667,0,0,1.57627,-38.6775,-62.2193)"
+ sodipodi:nodetypes="czzzzzzzzzzzzzzzz" />
+ <path
+ id="path3536"
+ d="M 95.757212,60.26801 C 94.839875,60.407623 93.290633,60.580795 92.160034,60.92426 C 91.029435,61.267725 89.911438,61.914443 89.056586,63.01801 C 88.201734,64.121577 87.553727,65.489742 87.081665,67.17426 C 86.609604,68.858778 86.309324,70.138052 86.376336,72.54926 C 86.443347,74.960468 86.871609,78.248439 87.363796,81.26801 C 87.855982,84.287581 88.351917,87.858919 88.986053,90.86176 C 89.620189,93.864601 90.703057,96.535287 91.517717,98.646292 C 92.332377,100.7573 93.087791,102.49111 93.836704,103.50233 C 94.585617,104.51355 94.896259,104.9036 95.686679,105.33051 C 96.477099,105.75742 97.567003,106.06303 98.522102,105.98676 C 99.477201,105.91049 100.41608,104.41885 101.13839,103.59677 C 101.8607,102.77469 102.88842,99.504338 103.69761,96.48345 C 104.5068,93.462561 105.30597,91.53964 106.35271,86.599296 C 107.39945,81.658952 108.47781,74.293841 108.97508,71.01801 C 109.47234,67.742179 109.22234,67.929863 108.72878,66.467389 C 108.23521,65.004915 107.35398,64.101592 106.50643,63.26801 C 105.65887,62.434428 105.19482,61.932957 103.70986,61.473812 C 102.2249,61.014666 101.16364,60.702221 99.837564,60.539052 C 98.511488,60.375883 96.674549,60.128397 95.757212,60.26801 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ sodipodi:nodetypes="czzzzzzzzzzzzzzzzzzz" />
+ </g>
+ </g>
+ </g>
+ <g
+ transform="matrix(0.6623212,0,0,0.6661406,343.9692,338.21156)"
+ id="g3538"
+ inkscape:label="Calque 1">
+ <g
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ id="g3540">
+ <path
+ sodipodi:type="star"
+ style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:27.82019997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:24.29999924;stroke-dasharray:none;stroke-opacity:1"
+ id="path3542"
+ sodipodi:sides="3"
+ sodipodi:cx="191.09729"
+ sodipodi:cy="183.1349"
+ sodipodi:r1="187.79253"
+ sodipodi:r2="93.896263"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.5707963"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="M 353.73039,277.03117 L 191.09729,277.03117 L 28.464191,277.03117 L 109.78074,136.18677 L 191.09729,-4.6576233 L 272.41384,136.18677 L 353.73039,277.03117 z"
+ transform="matrix(0.35945,0,0,0.35945,28.8492,30.1932)" />
+ <g
+ id="g3544"
+ transform="translate(-0.510735,-1.02147)">
+ <path
+ id="path3546"
+ d="M 94.9375,108.40625 C 94.290019,108.49207 93.517293,108.86225 92.914114,109.2178 C 92.310935,109.57335 91.770059,109.9684 91.3641,110.47287 C 90.958141,110.97733 90.867103,111.63392 90.72033,112.21243 C 90.573557,112.79094 90.525438,113.26403 90.78125,113.90625 C 91.037062,114.54847 91.509887,115.41161 92.055252,115.93025 C 92.600617,116.44889 92.987635,116.9934 93.711376,117.22111 C 94.435117,117.44881 95.279851,117.7648 96,117.875 C 96.720149,117.9852 97.25089,117.77544 97.962055,117.59387 C 98.67322,117.4123 99.587555,117.07103 100.18371,116.67654 C 100.77986,116.28205 101.11025,115.82907 101.4724,115.36585 C 101.83455,114.90263 101.94155,114.45667 101.97237,113.8935 C 102.00319,113.33033 101.88899,112.7735 101.48418,112.24977 C 101.07937,111.72604 100.64982,111.06226 100.17793,110.52197 C 99.706043,109.98168 99.142309,109.4912 98.534118,109.19736 C 97.925927,108.90352 97.23572,108.65607 96.630291,108.50605 C 96.024862,108.35603 95.584981,108.32043 94.9375,108.40625 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ transform="matrix(1.41667,0,0,1.57627,-38.6775,-62.2193)"
+ sodipodi:nodetypes="czzzzzzzzzzzzzzzz" />
+ <path
+ id="path3548"
+ d="M 95.757212,60.26801 C 94.839875,60.407623 93.290633,60.580795 92.160034,60.92426 C 91.029435,61.267725 89.911438,61.914443 89.056586,63.01801 C 88.201734,64.121577 87.553727,65.489742 87.081665,67.17426 C 86.609604,68.858778 86.309324,70.138052 86.376336,72.54926 C 86.443347,74.960468 86.871609,78.248439 87.363796,81.26801 C 87.855982,84.287581 88.351917,87.858919 88.986053,90.86176 C 89.620189,93.864601 90.703057,96.535287 91.517717,98.646292 C 92.332377,100.7573 93.087791,102.49111 93.836704,103.50233 C 94.585617,104.51355 94.896259,104.9036 95.686679,105.33051 C 96.477099,105.75742 97.567003,106.06303 98.522102,105.98676 C 99.477201,105.91049 100.41608,104.41885 101.13839,103.59677 C 101.8607,102.77469 102.88842,99.504338 103.69761,96.48345 C 104.5068,93.462561 105.30597,91.53964 106.35271,86.599296 C 107.39945,81.658952 108.47781,74.293841 108.97508,71.01801 C 109.47234,67.742179 109.22234,67.929863 108.72878,66.467389 C 108.23521,65.004915 107.35398,64.101592 106.50643,63.26801 C 105.65887,62.434428 105.19482,61.932957 103.70986,61.473812 C 102.2249,61.014666 101.16364,60.702221 99.837564,60.539052 C 98.511488,60.375883 96.674549,60.128397 95.757212,60.26801 z"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:10;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ sodipodi:nodetypes="czzzzzzzzzzzzzzzzzzz" />
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/realtime/rt-basics/images/xenomai.png b/realtime/rt-basics/images/xenomai.png
new file mode 100644
index 0000000..d1ff146
--- /dev/null
+++ b/realtime/rt-basics/images/xenomai.png
Binary files differ
diff --git a/realtime/rt-basics/images/xenomai.svg b/realtime/rt-basics/images/xenomai.svg
new file mode 100644
index 0000000..8f71daa
--- /dev/null
+++ b/realtime/rt-basics/images/xenomai.svg
@@ -0,0 +1,274 @@
+<?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="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="xenomai.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/jan/work/omnicron/schulung/realtime/rt-basics/images/rtai.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4">
+ <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="perspective10" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="420.5163"
+ inkscape:cy="792.79929"
+ inkscape:document-units="px"
+ inkscape:current-layer="g3159"
+ showgrid="false"
+ inkscape:window-width="906"
+ inkscape:window-height="694"
+ inkscape:window-x="88"
+ inkscape:window-y="-31" />
+ <metadata
+ id="metadata7">
+ <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
+ id="g3159"
+ transform="matrix(1.1055858,0,0,1.0705292,-68.76791,-183.84127)">
+ <rect
+ style="fill:#00c2fc;fill-opacity:1;stroke:#000000;stroke-width:0.70241845;stroke-opacity:1"
+ id="rect3228"
+ width="657.20056"
+ height="175.55843"
+ x="64.646378"
+ y="221.60361" />
+ <rect
+ style="fill:#fcf800;fill-opacity:1;stroke:#000000;stroke-width:1.07145548;stroke-opacity:1"
+ id="rect3226"
+ width="656.83746"
+ height="408.71277"
+ x="64.084282"
+ y="397.80533" />
+ <rect
+ y="854.72406"
+ x="62.441948"
+ height="76.543472"
+ width="658.19678"
+ id="rect3157"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:1.13413763;stroke-opacity:1" />
+ <text
+ id="text2383"
+ y="909.74054"
+ x="302.29761"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="909.74054"
+ x="302.29761"
+ id="tspan2385"
+ sodipodi:role="line">Hardware</tspan></text>
+ <rect
+ y="652.98529"
+ x="83.228462"
+ height="76.574478"
+ width="623.01147"
+ id="rect3164"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:1.1036309;stroke-opacity:1" />
+ <text
+ id="text3166"
+ y="705.27673"
+ x="280.52774"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="705.27673"
+ x="280.52774"
+ id="tspan3168"
+ sodipodi:role="line">Adeos / IPIPE</tspan></text>
+ <rect
+ y="521.28082"
+ x="84.68071"
+ height="77.063293"
+ width="197.03423"
+ id="rect3170"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:0.62262768;stroke-opacity:1" />
+ <text
+ id="text3176"
+ y="573.85217"
+ x="128.00005"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="573.85217"
+ x="128.00005"
+ id="tspan3178"
+ sodipodi:role="line">Linux</tspan></text>
+ <rect
+ y="522.2688"
+ x="299.24976"
+ height="77.063293"
+ width="197.03423"
+ id="rect3180"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:0.62262768;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="328.63376"
+ y="564.7182"
+ id="text3182"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan3184"
+ x="328.63376"
+ y="564.7182">Nucleus</tspan></text>
+ <rect
+ y="522.15295"
+ x="509.44202"
+ height="77.063293"
+ width="197.03423"
+ id="rect3186"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:0.62262768;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="555.10895"
+ y="564.60419"
+ id="text3188"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan3190"
+ x="555.10895"
+ y="564.60419">RT App</tspan></text>
+ <rect
+ y="302.13153"
+ x="85.736412"
+ height="76.947311"
+ width="276.30084"
+ id="rect3192"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:0.73675251;stroke-opacity:1" />
+ <text
+ id="text3194"
+ y="354.64569"
+ x="128.99979"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1"
+ y="354.64569"
+ x="128.99979"
+ id="tspan3196"
+ sodipodi:role="line">Linux App</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.91918838px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 190.79792,651.99969 L 190.79792,598.80099 L 190.79792,598.80099"
+ id="path3206" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.91918838px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 387.76183,652.67974 L 387.76183,599.48103 L 387.76183,599.48103"
+ id="path3208" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.91918838px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 604.86584,652.817 L 604.86584,599.6183 L 604.86584,599.6183"
+ id="path3210" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.50373888px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 155.6171,521.13241 L 155.6171,378.75642 L 155.6171,378.75642"
+ id="path3212" />
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="103.65495"
+ y="266.75162"
+ id="text3230"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan3232"
+ x="103.65495"
+ y="266.75162">Userspace</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="102.72641"
+ y="767.17688"
+ id="text3234"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan3236"
+ x="102.72641"
+ y="767.17688">Kernelspace</tspan></text>
+ <rect
+ y="301.67725"
+ x="386.98862"
+ height="77.063293"
+ width="197.03423"
+ id="rect3289"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:0.62262768;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="430.66626"
+ y="347.65201"
+ id="text3291"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan3293"
+ x="430.66626"
+ y="347.65201">RT App</tspan></text>
+ <rect
+ y="415.63928"
+ x="357.13901"
+ height="77.063293"
+ width="197.03423"
+ id="rect3295"
+ style="fill:#00fc00;fill-opacity:1;stroke:#000000;stroke-width:0.62262768;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-size:36.76753235px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="413.20154"
+ y="459.79306"
+ id="text3297"
+ transform="scale(0.984018,1.0162416)"><tspan
+ sodipodi:role="line"
+ id="tspan3299"
+ x="413.20154"
+ y="459.79306">Skins</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 422,260.36218 C 422,221.36218 422,221.36218 422,221.36218"
+ id="path3301"
+ transform="matrix(0.9044979,0,0,0.9341174,62.200428,171.72934)" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 422,374.36218 L 422,342.36218"
+ id="path3303"
+ transform="matrix(0.9044979,0,0,0.9341174,62.200428,171.72934)" />
+ </g>
+ </g>
+</svg>
diff --git a/realtime/rt-basics/pres_rt-basics_de.tex b/realtime/rt-basics/pres_rt-basics_de.tex
index 07db328..128b115 100644
--- a/realtime/rt-basics/pres_rt-basics_de.tex
+++ b/realtime/rt-basics/pres_rt-basics_de.tex
@@ -1,24 +1,214 @@
-\documentclass{article}
+\documentclass{beamer}
+\usetheme{linutronix}
\usepackage{german}
\usepackage[utf8]{inputenc}
+\usepackage{pgf}
+\usepackage{graphicx}
+\usepackage{lxextras}
+
+\title{Block \lq Realtime Linux\rq}
+\institute{Linutronix GmbH}
\begin{document}
-\section*{Block \lq Was ist Linux?\rq}
+\maketitle
+
+
+% ----- Slide ------------------
+\begin{frame}
+\frametitle{Was ist Echtzeit?}
+\begin{itemize}
+\item Korrektheit bedeutet auch Ausführung zum korrekten Zeitpunkt
+\item Nicht Einhalten des korrekten Zeitrahmens führt zu einem Fehler
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Echtzeit ''anschaulich''}
+\begin{overprint}
+\onslide<1>
+\begin{alertblock}{Wir erinnern uns}
+Nicht Einhalten des korrekten Zeitrahmens führt zu einem Fehler!
+\end{alertblock}
+\onslide<2>
+\begin{figure}[h]
+\centering
+\includegraphics[height=0.5\textwidth]{images/nuclear.png}
+\end{figure}
+\end{overprint}
+\end{frame}
+
+\begin{frame}
+\frametitle{Anwendungsbereiche}
+\begin{itemize}
+\item Steuerungs- / Automatisierungstechnik
+\item Multimediasysteme
+\item Luft- und Raumfahrttechnik
+\item Finanzdienstleistung
+\item ...
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Anforderungen}
+\begin{itemize}
+\item Deterministisches Zeitverhalten
+\item Unterbrechbarkeit
+\item Priority Inheritance / Priority Ceiling
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Priority Inversion}
+\begin{figure}[h]
+\centering
+\includegraphics[width=0.8\textwidth]{images/prio_inv.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Linux und Echtzeit}
+\begin{figure}[h]
+\centering
+\includegraphics[height=0.5\textwidth]{images/gpos_vs_rt.png}
+\end{figure}
+\end{frame}
-\subsection*{Lernziele}
+\begin{frame}
+\frametitle{Ansätze}
\begin{itemize}
-\item Lernziel 1
-\item Lernziel 2
-\item Lernziel 3
+\item Dual-Kernel
+\item In-Kernel / Single Kernel
\end{itemize}
+\end{frame}
-\subsection*{Unterrichts-Ablauf}
+\begin{frame}
+\frametitle{Dual-Kernel}
+\begin{figure}[h]
+\centering
+\includegraphics[height=0.5\textwidth]{images/dual_kernel.png}
+\end{figure}
+\end{frame}
-Hinweise zur Präsentation, Zeitplanung, etc.
+\begin{frame}
+\frametitle{Single-Kernel}
+\begin{figure}[h]
+\centering
+\includegraphics[height=0.5\textwidth]{images/single_kernel.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{RTAI}
+\begin{itemize}
+\item Prof. Paolo Mantegazza, Universität Mailand
+\item Dual-Kernel Ansatz
+\item Echtzeit im Kernelspace
+\item Userspace Echtzeittasks nur eingeschränkt möglich
+\item Oberstes Designziel: Möglichst niedrige Latenzzeiten
+\item Unterstützte Plattformen: x86, x86\_64, einige ARM Plattformen
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{RTAI}
+\begin{figure}[h]
+\centering
+\includegraphics[height=0.5\textwidth]{images/rtai.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Xenomai}
+\begin{itemize}
+\item Gegründet 2001
+\item Echtzeit im Userpace
+\item Skins bilden API verschiedenster RTOSse nach
+\item Dual-Kernel Ansatz
+\item Unterstützte Plattformen: x86, x86\_64, PowerPC, ARM, ia64
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Xenomai}
+\begin{figure}[h]
+\centering
+\includegraphics[height=0.5\textwidth]{images/xenomai.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Xenomai / IPIPE}
+\begin{figure}[h]
+\centering
+\includegraphics[height=0.5\textwidth]{images/ipipe.png}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Drum prüfe, wer sich ewig bindet...}
+\begin{overprint}
+\onslide<1>
+\begin{figure}[h]
+\centering
+\includegraphics[width=0.8\textwidth]{images/mar01.png}
+\end{figure}
+\onslide<2>
+\begin{figure}[h]
+\centering
+\includegraphics[height=0.5\textwidth]{images/mar02.png}
+\end{figure}
+\onslide<3>
+\begin{figure}[h]
+\centering
+\includegraphics[height=0.5\textwidth]{images/mar03.png}
+\end{figure}
+\end{overprint}
+\end{frame}
+
+\begin{frame}
+\frametitle{Preempt RT}
+\begin{itemize}
+\item Thomas Gleixner, Ingo Molnar
+\item In-Kernel Ansatz
+\item Große Entwicklergemeinde
+\item Viele Funktionen bereits nach ''Mainline'' Linux übernommen
+\item POSIX Realtime
+\item Hohe Akzeptanz, vollständige Integration in Linux 2006 beschlossen
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Preempt RT und Mainline}
+\textit{''Controlling a laser with Linux is crazy, but everyone in this room is
+crazy in his own way. So if you want to use Linux to control an industrial
+welding laser, I have no problem with your using Preempt RT''} - Linus Torvalds
+auf dem Kernel Summit 2006
+\end{frame}
+
+\begin{frame}
+\frametitle{Wie macht Preempt RT Linux echtzeitfähig?}
+\begin{overprint}
+\onslide<1>
+\begin{alertblock}{Wir erinnern uns...}
+Unterbrechbarkeit ist eine zentrale Anforderung an ein Echtzeitsystem
+\end{alertblock}
+\onslide<2>
+\begin{itemize}
+\item Locking Primitiven: Spinlocks werden durch RT Mutexe ersetzt, die schlafen
+können. Raw Spinlocks ersetzen die ursprüngliche Spinlock
+\item Interrupt Handler laufen per default in einem Kernelthread
+\end{itemize}
+\end{overprint}
+\end{frame}
-\subsection*{Übungen bei vorhandener Hardware}
+\begin{frame}
+\frametitle{Preempt RT}
+\begin{figure}[h]
+\centering
+\includegraphics[height=0.5\textwidth]{images/preempt_rt.png}
+\end{figure}
+\end{frame}
-Hinweise zu Übungen, Zeitlimit dazu.
\end{document}
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..33dc9b6 100644
--- a/realtime/rt-specialties/handout_rt-specialties_de.tex
+++ b/realtime/rt-specialties/handout_rt-specialties_de.tex
@@ -1,17 +1,305 @@
-\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 Intervall 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 Timerintervall:
+\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 Last, 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.
+Da Interrupts unter Preempt RT als Kernelthread mit Echtzeitprioriät laufen
+und durch den Floodping eine hohe Anzahl an Netzwerkinterrupts
+(einschliesslich der zugehörigen Softinterrupts) erzeugt wird, nehmen Realtime
+Tasks im System einen Großteil der Resourcen ein. Somit kann es passieren, daß
+dieses Zeitlimit überschritten wird.
+Das Limit für die Rechenzeit 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 undeterministisches Zeitverhalten durch
+Pagefaults auszuschliessen.
+\item ''Stack Pre-Faulting'', um zu vermeiden, daß Stackfaults
+undeterministisches Zeitverhalten verursachen
+\end{itemize}
+Eine Ausgezeichnete Einführung zum Erstellen von Echtzeitapplikationen 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 steuern. 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 Kernels einige
+unter dem Menupunkt ''Kernel hacking-->Tracers'' einige Optionen aktiviert werden:
+\begin{itemize}
+\item Kernel Function Tracer
+\item 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 umgangen 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..046521d 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}