diff options
| author | Jan Altenberg <jan@homerjsimpson.(none)> | 2009-06-20 03:38:22 +0200 |
|---|---|---|
| committer | Jan Altenberg <jan@homerjsimpson.(none)> | 2009-06-20 03:38:22 +0200 |
| commit | b208259c74504385c2f9b90d892785c55cc9aff5 (patch) | |
| tree | 6b2da1433f080913369f11ef6d2ddbaa76f38246 /realtime | |
| parent | 3ed5b5306f5fa4ee95bcb5a57733bd116ce008e3 (diff) | |
rt-specialties chapter
Diffstat (limited to 'realtime')
| -rw-r--r-- | realtime/rt-specialties/Makefile | 9 | ||||
| -rw-r--r-- | realtime/rt-specialties/handout_rt-specialties_de.tex | 295 | ||||
| -rw-r--r-- | realtime/rt-specialties/hints_rt-specialties_de.tex | 18 | ||||
| -rw-r--r-- | realtime/rt-specialties/images/g4894.png | bin | 0 -> 12196 bytes | |||
| -rw-r--r-- | realtime/rt-specialties/images/menu_rt_001.png | bin | 0 -> 30735 bytes | |||
| -rw-r--r-- | realtime/rt-specialties/images/menu_rt_002.png | bin | 0 -> 32309 bytes | |||
| -rw-r--r-- | realtime/rt-specialties/images/menu_rt_003.png | bin | 0 -> 32025 bytes | |||
| -rw-r--r-- | realtime/rt-specialties/images/menu_rt_004.png | bin | 0 -> 23627 bytes | |||
| -rw-r--r-- | realtime/rt-specialties/images/pitfall.png | bin | 0 -> 32291 bytes | |||
| -rw-r--r-- | realtime/rt-specialties/images/pitfall.svg | 121 | ||||
| -rw-r--r-- | realtime/rt-specialties/images/thumb.png | bin | 0 -> 12196 bytes | |||
| -rw-r--r-- | realtime/rt-specialties/images/thumb.svg | 86 | ||||
| -rw-r--r-- | realtime/rt-specialties/pres_rt-specialties_de.tex | 227 |
13 files changed, 732 insertions, 24 deletions
diff --git a/realtime/rt-specialties/Makefile b/realtime/rt-specialties/Makefile new file mode 100644 index 0000000..e80961b --- /dev/null +++ b/realtime/rt-specialties/Makefile @@ -0,0 +1,9 @@ +all: + pdflatex pres_rt-specialties_de.tex + pdflatex hints_rt-specialties_de.tex + pdflatex handout_rt-specialties_de.tex + pdflatex handout_rt-specialties_de.tex + +clean: + rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out + diff --git a/realtime/rt-specialties/handout_rt-specialties_de.tex b/realtime/rt-specialties/handout_rt-specialties_de.tex index 4c391b2..372aa25 100644 --- a/realtime/rt-specialties/handout_rt-specialties_de.tex +++ b/realtime/rt-specialties/handout_rt-specialties_de.tex @@ -1,17 +1,300 @@ -\documentclass{article} +\documentclass{lxarticle} \usepackage{german} \usepackage[utf8]{inputenc} +\usepackage{lxheaders} +\usepackage{lxextras} \begin{document} -\section*{Titel} +\section*{Anwendung des Preempt RT Patches} +\subsection*{Besorgen und Anwenden des Patches} +Preempt RT wird als Patch gegen den Mainline Linux Kernel gepflegt. +Unter:\newline +http://www.kernel.org/pub/linux/kernel/projects/rt sind die aktuellsten Patche +für Preempt RT zu finden. Im Unterverzeichnis older/ sind ältere Patche +archiviert. Das Vorbereiten eines Kerneltrees mit Preempt RT ist denkbar +einfach: +\begin{lstlisting} +# Vanilla Kernel +wget http://www.kernel.org/pub/linux/kernel\ +/v2.6/linux-2.6.29.5.tar.bz2 -\subsection*{Abschnitt1} +# Preempt RT Patch +wget http://www.kernel.org/pub/linux/kernel\ +/projects/rt/patch-2.6.29.5-rt21.bz2 -Text +# Extract the kernel tree +tar xjvf linux-2.6.29.5.tar.bz2 +# Patch the kernel tree +cd linux-2.6.29.5 +bzcat ../patch-2.6.29.5-rt21.bz2 | patch -p1 +\end{lstlisting} +Mit Steven Rostedt's Version des Pythonskripts ''ketchup'' geht es sogar noch einfacher (Steven +Rostedt's ketchup Version steht unter:\newline +http://people.redhat.com/srostedt/rt/tools/ketchup-0.9.8-rt3 zum Download +bereit): +\begin{lstlisting} +mkdir linux-2.6.29.5-rt21 +cd linux-2.6.29.5-rt21 +ketchup -f --no-gpg 2.6.29.5-rt21 +\end{lstlisting} -\subsection*{Abschnitt2} +\subsection*{Konfigurieren und Übersetzen eines Preempt RT Kernels} +Die Konfiguration und das Übersetzen machen keinen Unterschied zu Linux ohne +Preempt RT Patch: +\begin{lstlisting} +# external build directory +mkdir ../build +# base build on existing config +cp /boot/config-x-x-x ../build/.config +make O=../build oldconfig +\end{lstlisting} +Für ein Echtzeitsystem müssen verschiedene Kerneloptionen aktiviert werden: +\begin{lstlisting} +make O=../build menuconfig +\end{lstlisting} +Die wichtigsten Optionen befinden sich unter dem Menupunkt ''Kernel features'' +bzw. ''Processor type and features''. +\begin{figure}[ht!] +\centering +\includegraphics[height=0.5\textwidth]{images/menu_rt_001.png} +\end{figure} +Dort müssen folgende Optionen aktiviert werden: +\begin{itemize} +\item High Resolution Timer Support +\item Preemption Mode (Complete Preemption (Real-Time)) +\end{itemize} +\begin{figure}[ht!] +\centering +\includegraphics[height=0.5\textwidth]{images/menu_rt_002.png} +\end{figure} +\begin{figure}[ht!] +\centering +\includegraphics[height=0.5\textwidth]{images/menu_rt_003.png} +\end{figure} +\begin{figure}[ht!] +\centering +\includegraphics[height=0.5\textwidth]{images/menu_rt_004.png} +\end{figure} +Das Übersetzen des Kernels erfolgt nun wie üblich mit +\begin{lstlisting} +make O=../build +make O=../build modules +make O=../build install +make O=../build modules_install +\end{lstlisting} +\section*{Testen eines Preempt RT Systems} +\subsection*{RT Tests} +Die RT Tests sind eine Sammlung von Programmen, zur Validierung der +Eigenschaften von Echtzeitsystemen. Die RT Tests umfassen folgende Tools: +\begin{itemize} +\item cyclictest: High Resolution Timer Testsoftware. +\item hwlatdetect: Python Script, zur Steuerung des Kernelmoduls zur Erkennung +von System Management Interrupts (hwlat\_detector). +\item pi\_stress: Stresstest für Mutexe mit Priority Inheritance Attribut +\item signaltest: Benchmark, bei dem Signale zwischen Tasks ausgetauscht werden. +\end{itemize} +Die Sourcen der RT Tests werden in einem GIT Tree verwaltet. +\begin{lstlisting} +# Checkout RT Tests +git-clone git://git.kernel.org/pub/scm/linux/kernel\ +/git/clrkwllms/rt-tests.git -Text +# Compile RT Tests +cd rt-tests +make +\end{lstlisting} +\subsection*{Cyclictest} +Cyclictest ist die wohl meistgenutzte Testsoftware auf Preempt RT Systemen. Mit +Cyclictest kann eine bestimmte Anzahl von Timertasks mit einem definierten +Interval aufgesetzt werden. Für diese Tasks wird kontinuierlich die Abweichung +zum gewünschten Interval gemessen und hierfür die Maximale und Durchschnittliche +Abweichung aufgezeichnet. Die wichtigsten Parameter für Cyclictest sind die +Anzahl und die Priorität der gewünschten Timertasks, die Art des zu verwendenden +Timers und das gewünschte Timerinterval: +\begin{lstlisting} +# 4 Timertasks (2000 , 2500, 3000, 3500us) +# -i options tells us the interval of the first task +# the interval of all other tasks will be increased +# by 500us +# The -p options tells us the priority of the first task +# the priorities of all other tasks will be decremented by 1 +# -n = using nanosleep +zi:~# cyclictest -p80 -n -t4 -i2000 +0.32 0.30 0.12 1/56 2124 +T: 0 ( 2121) P:80 I:2000 C: 1258 Min: 62 Act: 99 Avg: 83 Max: 161 +T: 1 ( 2122) P:79 I:2500 C: 1007 Min: 47 Act: 76 Avg: 77 Max: 130 +T: 2 ( 2123) P:78 I:3000 C: 841 Min: 54 Act: 76 Avg: 82 Max: 136 +T: 3 ( 2124) P:77 I:3500 C: 723 Min: 67 Act: 95 Avg: 96 Max: 177 +\end{lstlisting} +\subsection*{Lastszenarien} +Um eine Aussage über das Echtzeitverhaltens treffen zu können, interessiert in +der Hauptsache das Verhalten in Worst-Case Szenarien (hohe CPU Laste, hohe +Interruptlast). Ein ausgezeichnetes Werkzeug, um CPU Last zu erzeugen, ist +''hackbench''. Hackbench wurde ursprünglich als Schedulerbenchmark entwickelt. +Es erzeugt eine bestimme Anzahl an Prozessgruppen von Clients und Servern, die +über Sockets miteinander kommunizieren:\newline +http://people.redhat.com/mingo/cfs-scheduler/tools/hackbench.c + +Interruptlast, läßt sich hervorragend mit einem Floodping von einem entfernten +Rechner erzeugen. Ein Floodping schickt eine große Anzahl von ICMP Paketen in +kurzer Zeit. Dies erzeugt eine hohe Anzahl von Netzwerkinterrupts. Um Floodpings +zu generieren muß das Programm ping mit Rootrechten und mit der Option -f +ausgeführt werden. +\subsection*{Pitfall} +Ein sehr häufig gemeldetes Phänomen bei Testläufen von Cyclictest mit einem +Floodping als Lastszenario, sind extrem große Ausreißer in der Größenordnung von +50ms. Dies ist auf ein ''Feature'' aktueller Preempt RT Kernel zurückzuführen. +Da Preempt RT auch auf vielen Desktops eingesetzt wird, auf denen Low Latency +Anwendungen betrieben werden (z.B. Multimedia Anwendungen), häuften sich +Fehlerberichte, die letztendlich nicht auf ein Kernelproblem zurückzuführen +waren, sondern auf eine Realtime Applikation, die den Rest des Systems +aushungerte. Daher wurde eine Option eingeführt, die die Laufzeit von Realtime +Tasks beschränken kann. Überschreiten die Realtime Tasks dieses Zeitlimit, +werden diese für einen bestimmten Zeitraum nicht mehr geschedult. Die +Standardeinstellung liegt bei 950ms. Bei Überschreiten der 950ms werden die +Echtzeittasks für 50ms suspendiert. Dieser Wert kann durch Schreiben des +gewünschten Wertes nach /proc/sys/kernel/sched\_rt\_runtime\_us angepaßt werden. +Zum Deaktivieren dieser Funktion muß folgendes getan werden: +\begin{lstlisting} +echo -1 > /proc/sys/kernel/sched_rt_runtime_us +\end{lstlisting} +\section*{Erstellen einer Realtime Task für Preempt RT} +\subsection*{Schedulingklassen / Prioritäten} +Eine Realtime Applikation auf Preempt RT ist eine POSIX Realtime Applikation. +POSIX sieht für Echtzeitapplikationen folgende Schedulingstrategien vor: +\begin{itemize} +\item SCHED\_FIFO: Scheduling mit statischen Prioriäten +\item SCHED\_RR: Round Robin mit Prioritäten +\end{itemize} +Echtzeitpriorität bekommt eine Applikation nur dann, wenn dies explizit +gewünscht wird. Hierzu ist die Funktion sched\_setscheduler() vorgesehen. +\subsection*{Beispiel einer Echtzeitapplikation} +Das folgende Beispiel zeigt eine einfache POSIX Realtimeapplikation: +\begin{lstlisting} +/* + * POSIX Realtime Example + * based on the example on http://rt.wiki.kernel.org + / +#include <stdlib.h> +#include <stdio.h> +#include <time.h> +#include <sched.h> +#include <sys/mman.h> +#include <string.h> + +#define MAX_SAFE_STACK (8*1024) /* The maximum stack size which is + guranteed safe to access without + faulting */ + +void stack_prefault(void) { + + unsigned char dummy[MAX_SAFE_STACK]; + + memset(&dummy, 0, MAX_SAFE_STACK); + return; +} + +int main(int argc, char* argv[]) +{ + struct sched_param param; + + /* Declare ourself as a real time task */ + param.sched_priority = 80; + if(sched_setscheduler(0, SCHED_FIFO, ¶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 zu vermeiden, um undeterministisches Zeitverhalten +durch Pagefaults auszuschliessen. +\item ''Stack Pre-Faulting'', um zu zu vermeiden, daß Stackfaults +undeterministisches Zeitverhalten verursachen +\end{itemize} +Eine Ausgezeichnete Einführung zum Erstellen von Echtzeitapplikation und zur +Verwendung von Preempt RT, findet sich unter:\newline +http://rt.wiki.kernel.org +\subsection*{Tracing / Latenzen aufspüren} +\subsubsection*{FTrace} +Ein hervorragendes Werkzeug, um kernelseitige Codepfade aufzuspüren, die lange +Latenzzeiten verursachen, ist Ftrace. Ftrace wird über DebugFS, einem virtuellen +Dateisystem, gesteuert und platziert dort auch seine Ausgaben. Die einfachste +Methode, FTrace zu verwenden ist Cyclictest. Cyclictest biete bereits einige +Optionen, um FTrace zu verwenden. Die Option -f schällt Cyclictests Ftrace +Support an, -b <max\_latency> veranlaßt Cyclictest, bei Überschreiten einer +maximalen Latenzzeit, abzubrechen und einen Trace zu triggern. +\subsubsection*{Kerneloptionen für FTrace} +Um FTrace verwenden zu können, müssen beim Konfigurieren des Kernel einige +unter dem Menupunkt ''Kernel hacking-->Tracers'' einige Optionen aktiviert werden: +\begin{itemize} +\item Kernel Function Tracer +\item Optional: Beliebige Optionen, die mit Trace beginnen (der zu verwendende +Tracetyp kann cyclictest über die Commandline mitgegeben werden, siehe +cyclictest -h. Default ist der +Event Tracer) +\end{itemize} +\subsubsection*{Beispiel eines Traces} +Das Erstellen eines Traces mit cyclictest läßt sich am Besten mit einem Beispiel +erläutern: +\begin{lstlisting} +# mount DebugFS +mkdir -p /mnt/debugfs +mount -t debugs debugfs /mnt/debugfs + +# list available tracers +zi:~# cat /mnt/debugfs/tracing/available_tracers +wakeup_rt wakeup preemptoff function sched_switch nop + +# start trace +cyclictest -p80 -n -f -b 100 + +zi:~# less /mnt/debugfs/tracing/trace +# tracer: function +# +# TASK-PID CPU# TIMESTAMP FUNCTION +# | | | | | +IRQ-129-772 [000] 4154503386.851178: __rt_mutex_adjust_prio<-t +IRQ-129-772 [000] 4154503386.851186: __rt_mutex_adjust_prio<-t +IRQ-129-772 [000] 4154503386.851189: task_setprio<-__rt_mutex_ +IRQ-129-772 [000] 4154503386.851192: task_rq_lock <-task_setpr +IRQ-129-772 [000] 4154503386.851195: sched_clock <-sched_clock +IRQ-129-772 [000] 4154503386.851199: dequeue_task <-task_setpr +IRQ-129-772 [000] 4154503386.851202: dequeue_task_fair <-deque +IRQ-129-772 [000] 4154503386.851206: update_curr <-dequeue_tas +IRQ-129-772 [000] 4154503386.851217: enqueue_task_rt <-task_se +IRQ-129-772 [000] 4154503386.851221: dequeue_rt_stack<-enqueue +IRQ-129-772 [000] 4154503386.851226: switched_to_rt <-task_set +IRQ-129-772 [000] 4154503386.851234: timer_interrupt<-ret_from +[...] +\end{lstlisting} + +\subsection*{Kontrollfragen} +\begin{itemize} +\item Welche Optionen sollten beim Übersetzen eines Preempt RT Kernels +mindestens gesetzt sein? +\item Wozu dient das Tool cyclictest? +\item Welchen bekannten ''Pitfall'' gibt es bzgl. hoher Latencies mit Floodping +als Lastszenario? Wie kann dieser behoben werden? +\item Welche 3 Schritte sind notwendig, um das deterministische Zeitverhalten +einer Applikation zu garantieren? +\end{itemize} \end{document} diff --git a/realtime/rt-specialties/hints_rt-specialties_de.tex b/realtime/rt-specialties/hints_rt-specialties_de.tex index b8b74bc..e07f25a 100644 --- a/realtime/rt-specialties/hints_rt-specialties_de.tex +++ b/realtime/rt-specialties/hints_rt-specialties_de.tex @@ -1,25 +1,27 @@ -\documentclass{article} +\documentclass{lxarticle} \usepackage{german} \usepackage[utf8]{inputenc} +\usepackage{lxheaders} +\usepackage{lxextras} \begin{document} -\section*{Block \lq Realtime-Besonderheiten\rq} +\section*{Block \lq Was ist Linux?\rq} \subsection*{Lernziele} \begin{itemize} -\item Verstehen, warum Kernel-Treiber SMP-fest sein müssen -\item Kennenlernen der Grundregeln für korrektes Locking im Kernel -\item Kennenlernen von Möglichkeiten zum Test der RT-Funktionalität - (lockdep, cyclictest) +\item Beschaffen und anwenden des Preempt RT Patches +\item Konfigurieren und Kompilieren eines Preempt RT Kernels +\item Testen des Preempt RT Kernels \end{itemize} \subsection*{Unterrichts-Ablauf} -Hinweise zur Präsentation, Zeitplanung, etc. +Vortrag + Übungen (insgesamt 90 - 120 Minuten) \subsection*{Übungen bei vorhandener Hardware} -Hinweise zu Übungen, Zeitlimit dazu. +RT Kernel für das Entwicklungssystem. Testen des RT Kernels und dessen +Echtzeitverhaltens auf dem Entwicklungssystem. \end{document} diff --git a/realtime/rt-specialties/images/g4894.png b/realtime/rt-specialties/images/g4894.png 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..e7e3d1d 100644 --- a/realtime/rt-specialties/pres_rt-specialties_de.tex +++ b/realtime/rt-specialties/pres_rt-specialties_de.tex @@ -1,24 +1,231 @@ -\documentclass{article} +\documentclass{beamer} +\usetheme{linutronix} \usepackage{german} \usepackage[utf8]{inputenc} +\usepackage{pgf} +\usepackage{graphicx} +\usepackage{lxextras} + +\title{Block \lq Anwendung des Preempt RT Patches\rq} +\institute{Linutronix GmbH} \begin{document} -\section*{Block \lq Was ist Linux?\rq} +\maketitle + + +% ----- Slide ------------------ +\begin{frame}[fragile] +\frametitle{Besorgen und Anwenden des Preempt RT Patches} +\begin{lstlisting} +# Vanilla Kernel +wget http://www.kernel.org/pub/linux/kernel\ +/v2.6/linux-2.6.29.5.tar.bz2 + +# Preempt RT Patch +wget http://www.kernel.org/pub/linux/kernel\ +/projects/rt/patch-2.6.29.5-rt21.bz2 + +# Extract the kernel tree +tar xjvf linux-2.6.29.5.tar.bz2 +# Patch the kernel tree +cd linux-2.6.29.5 +bzcat ../patch-2.6.29.5-rt21.bz2 | patch -p1 +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Besorgen und Anwenden des Preempt RT Patches} +\begin{lstlisting} +mkdir linux-2.6.29.5-rt21 +cd linux-2.6.29.5-rt21 +ketchup -f --no-gpg 2.6.29.5-rt21 +\end{lstlisting} +\end{frame} -\subsection*{Lernziele} +\begin{frame}[fragile] +\frametitle{Konfigurieren und Übersetzen eines Preempt RT Kernels} +\begin{overprint} +\onslide<1> +\begin{lstlisting} +# external build directory +mkdir ../build +# base build on existing config +cp /boot/config-x-x-x ../build/.config +make O=../build oldconfig +\end{lstlisting} +\onslide<2> +\begin{lstlisting} +make O=../build menuconfig +\end{lstlisting} +\onslide<3> +\begin{figure}[ht!] +\centering +\includegraphics[height=0.5\textwidth]{images/menu_rt_001.png} +\end{figure} +\onslide<4> +\begin{figure}[ht!] +\centering +\includegraphics[height=0.5\textwidth]{images/menu_rt_002.png} +\end{figure} +\onslide<5> +\begin{figure}[ht!] +\centering +\includegraphics[height=0.5\textwidth]{images/menu_rt_003.png} +\end{figure} +\onslide<6> +\begin{figure}[ht!] +\centering +\includegraphics[height=0.5\textwidth]{images/menu_rt_004.png} +\end{figure} +\onslide<7> +\begin{lstlisting} +make O=../build +make O=../build modules +make O=../build install +make O=../build modules_install +\end{lstlisting} +\end{overprint} +\end{frame} + +\begin{frame} +\frametitle{Testen eines Preempt RT Systems} +RT Tests: \begin{itemize} -\item Lernziel 1 -\item Lernziel 2 -\item Lernziel 3 +\item cyclictest +\item hwlatdetect +\item pi\_stress +\item signaltest \end{itemize} +\end{frame} -\subsection*{Unterrichts-Ablauf} +\begin{frame} +\frametitle{Cyclictest} +\begin{itemize} +\item Ursprünglich entwickelt von Thomas Gleixner für Preempt RT Testing +\item High Resolution Timer Testsoftware +\item Setzt beliebige Anzahl von Realtime Tasks mit unterschiedlicher Priorität +und unterschiedlichen Intervallen auf +\item Viele Debuggingmöglichkeiten +\item Sehr Aussagekräftig, um echtzeitverhalten auf einer bestimmten Plattform +zu beurteilen. +\end{itemize} +\end{frame} -Hinweise zur Präsentation, Zeitplanung, etc. +\begin{frame} +\frametitle{Lastszenarien} +Geeignete Lastszenarien, um Worst-Case Situationen nachstellen /provozieren zu +können: +\begin{itemize} +\item CPU Last: ''hackbench'', ursprünglich als Scheduler Benchmark geschrieben. +\item Interrupt Last: Floodping (''ping -F'') +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Pitfall!} +\begin{lstlisting} +cat /proc/sys/kernel/sched_rt_runtime_us +\end{lstlisting} +\begin{figure}[l!] +\centering +\includegraphics[height=0.4\textwidth]{images/pitfall.png} +\end{figure} +\end{frame} + +\begin{frame} +\frametitle{Echtzeitapplikationen mit Preempt RT} +\begin{columns} +\column[r]{7cm} +\begin{figure}[l!] +\centering +\includegraphics[height=0.4\textwidth]{images/thumb.png} +\end{figure} +\column[l]{8cm} +\huge +POSIX! +\end{columns} +\end{frame} + +\begin{frame} +\frametitle{Schedulingstrategien} +\begin{itemize} +\item SCHED\_FIFO: Static priority +\item SCHED\_RR: Round Robin mit Prioritäten +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Aufbau einer RT Applikation} +\begin{overprint} +\onslide<1> +Schedulingstrategie / Priorität +\begin{lstlisting} +struct sched_param param; + +param.sched_priority = 80; +if(sched_setscheduler(0, SCHED_FIFO, ¶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} |
