diff options
| author | Manuel Traut <manut@linutronix.de> | 2009-06-22 15:47:30 +0200 |
|---|---|---|
| committer | Manuel Traut <manut@linutronix.de> | 2009-06-22 15:47:30 +0200 |
| commit | 9cbb0a699f398daffa8c1808d02bf447ebf0c1f0 (patch) | |
| tree | ea3f4d4081b0648e1da7b1e1d8d3dabe12705a0a | |
| parent | 9e0bab8ec70646ed9c51d5c7d272da4b51698c6c (diff) | |
| parent | 719085c3dc98ab3df272476e16e983e4a16fe14b (diff) | |
Merge branch 'master' of ssh://tglx.de/home/linutronix/git/schulung
67 files changed, 4789 insertions, 104 deletions
@@ -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 Binary files differnew file mode 100644 index 0000000..27f26cd --- /dev/null +++ b/kernel-devel/kernel-build/images/menu_rt_001.png 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 Binary files differnew file mode 100644 index 0000000..f7ab989 --- /dev/null +++ b/kernel-devel/uio-driver/images/greg-all-hardware.jpg diff --git a/kernel-devel/uio-driver/images/greg-kernel-org.jpg b/kernel-devel/uio-driver/images/greg-kernel-org.jpg Binary files differnew file mode 100644 index 0000000..dbfb915 --- /dev/null +++ b/kernel-devel/uio-driver/images/greg-kernel-org.jpg diff --git a/kernel-devel/uio-driver/images/hjk-desperate.jpg b/kernel-devel/uio-driver/images/hjk-desperate.jpg Binary files differnew file mode 100644 index 0000000..740f574 --- /dev/null +++ b/kernel-devel/uio-driver/images/hjk-desperate.jpg diff --git a/kernel-devel/uio-driver/images/ioctl-vs-uio.png b/kernel-devel/uio-driver/images/ioctl-vs-uio.png Binary files differnew file mode 100644 index 0000000..8536934 --- /dev/null +++ b/kernel-devel/uio-driver/images/ioctl-vs-uio.png diff --git a/kernel-devel/uio-driver/images/konventioneller-treiber.png b/kernel-devel/uio-driver/images/konventioneller-treiber.png Binary files differnew file mode 100644 index 0000000..bea54da --- /dev/null +++ b/kernel-devel/uio-driver/images/konventioneller-treiber.png diff --git a/kernel-devel/uio-driver/images/uio-treiber.png b/kernel-devel/uio-driver/images/uio-treiber.png Binary files differnew file mode 100644 index 0000000..caa2152 --- /dev/null +++ b/kernel-devel/uio-driver/images/uio-treiber.png 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 Binary files differnew file mode 100644 index 0000000..c58d156 --- /dev/null +++ b/realtime/rt-basics/images/dual_kernel.png 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 Binary files differnew file mode 100644 index 0000000..07a4a79 --- /dev/null +++ b/realtime/rt-basics/images/gpos_vs_rt.png 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 Binary files differnew file mode 100644 index 0000000..b7468fa --- /dev/null +++ b/realtime/rt-basics/images/ipipe.png 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 Binary files differnew file mode 100644 index 0000000..7f18317 --- /dev/null +++ b/realtime/rt-basics/images/mar01.png 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 Binary files differnew file mode 100644 index 0000000..f1f53a1 --- /dev/null +++ b/realtime/rt-basics/images/mar02.png 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 Binary files differnew file mode 100644 index 0000000..97ab7ba --- /dev/null +++ b/realtime/rt-basics/images/mar03.png 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 Binary files differnew file mode 100644 index 0000000..a434e91 --- /dev/null +++ b/realtime/rt-basics/images/nuclear.png diff --git a/realtime/rt-basics/images/preempt_rt.png b/realtime/rt-basics/images/preempt_rt.png Binary files differnew file mode 100644 index 0000000..463673f --- /dev/null +++ b/realtime/rt-basics/images/preempt_rt.png 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 Binary files differnew file mode 100644 index 0000000..574afb3 --- /dev/null +++ b/realtime/rt-basics/images/prio_inv.png 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 Binary files differnew file mode 100644 index 0000000..dedf883 --- /dev/null +++ b/realtime/rt-basics/images/rtai.dia diff --git a/realtime/rt-basics/images/rtai.dia~ b/realtime/rt-basics/images/rtai.dia~ Binary files differnew file mode 100644 index 0000000..c4024ff --- /dev/null +++ b/realtime/rt-basics/images/rtai.dia~ diff --git a/realtime/rt-basics/images/rtai.png b/realtime/rt-basics/images/rtai.png Binary files differnew file mode 100644 index 0000000..c6c21ce --- /dev/null +++ b/realtime/rt-basics/images/rtai.png 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 Binary files differnew file mode 100644 index 0000000..d398b29 --- /dev/null +++ b/realtime/rt-basics/images/single_kernel.png 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 Binary files differnew file mode 100644 index 0000000..d1ff146 --- /dev/null +++ b/realtime/rt-basics/images/xenomai.png 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, ¶m) == -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 Binary files differnew file mode 100644 index 0000000..6b9f247 --- /dev/null +++ b/realtime/rt-specialties/images/g4894.png diff --git a/realtime/rt-specialties/images/menu_rt_001.png b/realtime/rt-specialties/images/menu_rt_001.png Binary files differnew file mode 100644 index 0000000..27f26cd --- /dev/null +++ b/realtime/rt-specialties/images/menu_rt_001.png diff --git a/realtime/rt-specialties/images/menu_rt_002.png b/realtime/rt-specialties/images/menu_rt_002.png Binary files differnew file mode 100644 index 0000000..c4dd8dc --- /dev/null +++ b/realtime/rt-specialties/images/menu_rt_002.png diff --git a/realtime/rt-specialties/images/menu_rt_003.png b/realtime/rt-specialties/images/menu_rt_003.png Binary files differnew file mode 100644 index 0000000..8449d80 --- /dev/null +++ b/realtime/rt-specialties/images/menu_rt_003.png diff --git a/realtime/rt-specialties/images/menu_rt_004.png b/realtime/rt-specialties/images/menu_rt_004.png Binary files differnew file mode 100644 index 0000000..21045c8 --- /dev/null +++ b/realtime/rt-specialties/images/menu_rt_004.png diff --git a/realtime/rt-specialties/images/pitfall.png b/realtime/rt-specialties/images/pitfall.png Binary files differnew file mode 100644 index 0000000..a083003 --- /dev/null +++ b/realtime/rt-specialties/images/pitfall.png 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 Binary files differnew file mode 100644 index 0000000..6b9f247 --- /dev/null +++ b/realtime/rt-specialties/images/thumb.png 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, ¶m) + == -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} |
