210 likes | 410 Views
RTAI-Linux Echtzeiterweiterung für Linux. Niklaus Burren - 17. Oktober 2006. Inhalt. Funktionsprinzip - Architektur - RTHAL (Realtime Hardware Abstraction Layer) - Interrupt-Handling - Scheduler - Intertask-Kommunikation - Prozesskommunikation Beispielprogramm
E N D
RTAI-LinuxEchtzeiterweiterung für Linux • Niklaus Burren - 17. Oktober 2006
Inhalt • Funktionsprinzip- Architektur- RTHAL (Realtime Hardware Abstraction Layer)- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation • Beispielprogramm • Interrupt-Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation
1. Funktionsprinzip- Architektur-RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Architektur
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation RTHAL (Realtime Hardware Abstraction Layer) Fall A Abstraktion ist transpa- rent, Interrupt-Kontrolle liegt beim Linux Kernel. Fall B Dem Linux Kernel wird die Interrupt-Kontrolle entzogen und der Echt- zeiterweiterung zuge- wiesen. • RTAI Core • Der RTAI-Kern wird durch verschiedene Kernel-Module implementiert. • Solange die Module nicht geladen werden, behält der Kernel die Interrupt-Kontrolle (Fall A). • Beim Laden der RTAI-Module tritt Fall B in Kraft.
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation RTHAL (Realtime Hardware Abstraction Layer) • RTHAL besteht im wesentlichen aus einer Struktur von Funktions-pointern. • Beim Systemstart zeigen sie auf die Interrupt-Handling-Funktionen des Linux-Kernels. • Beim Laden der RTAI-Module werden die Funktionspointer auf RTAI interne Funktionen umgelenkt. • Nach dem Entfernen der RTAI-Module zeigen die Pointer der Struktur RTHAL wieder auf die Standard-Kernel-Funktionen.
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Interrupt-Handling • Interruptspezifische Funktionsaufrufe des Linux-Kernels werden mit Hilfe von RTHAL an RTAI interne Funktionen umgeleitet. • RTAI implementiert einen Ersatz für das Funktionspaar sti() und cli(). • Diese RTAI-Funktionen greifen nicht mehr auf die Hardware zu, sondern setzen Flags in RTAI internen Datenstrukturen • So wird festgehalten, ob Linux über eingehende Interrupts informiert werden möchte (sti) oder nicht (cli).
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Interrupt-Handling
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Scheduler • RTAI unterstützt drei Scheduling-Varianten für Uni- und Multiprozessor- • Systeme: • Uni-Prozessor-Scheduler (UP)Für Plattformen mit nur einem Prozessor. • SMP-Scheduler (SMP)Der SMP-Scheduler (Symetric Multiprocessing) ist für Multiprozessor-Systeme gedacht. Tasks können an eine CPU gebunden werden oder symmetrisch auf einen Cluster von CPUs laufen. • Multi-Uni-Porzessor-Scheduler (MUP)Dieser Scheduler sieht ein Multiprozessor-System als eine Ansamm-lung von mehreren Einzelprozessoren. Vorteil: Jeder Prozessor kann seine Timer unabhängig von den anderen programmieren. • Je nachdem welchen Scheduler man verwenden möchte, lädt man ein • anderens Kernel-Modul.
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Intertask-Kommunikation • Mailboxenrt_mbx_init() Initialisiert eine Mailbox mit einer definierten Grösse.rt_mbx_delete() Löscht die von einer Mailbox genutzten Ressourcen.rt_mbx_send() Sendet eine Nachricht mit definierter Grösse an die Mailbox.rt_mbx_receive() Empfängt eine Nachricht mit definierter Grösse von einer Mailbox. • Semaphorenrt_sem_init() Initialisiert eine Semaphore mit gegebenem Wert.rt_sem_delete() Löscht die gegebene Semaphore.rt_sem_signal() Gibt die Semaphore zurück.rt_sem_wait() Wartet auf eine Semaphore. • Mailboxen und Semaphoren werden in den Kernel-Modulen der Scheduler implementiert.
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Prozesskommunikation • RTAI-FIFOtf_create() Erzeugt einen FIFO mit gegebner Grösse und Nummer.rtf_destroy() Löscht einen FIFO.rtf_reset() Löscht den Inhalt eines FIFO.rtf_put() Schreibt Daten in den FIFO.rtf_get() Liest Daten aus dem FIFO.rtf_create_handler() Registriert einen Handler (Ausführung beim Eintreffen von Daten) • Shared MemorySpeicherbereich, der sich Linux-Prozess und RTAI-Task teilen.Zur Übertragung von grossen Datenmengen von einem RTAI-Task zu einem Linux-Prozess.
printer.c Userspace-Programm fifotest.c Kernel-Modul 1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Beispielprogramm
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Beispielprogramm: fifotest.c int xinit_module(void) { RTIME tick_period; // Timer Periode RTIME now; // Timestamp für Task-Start // FIFO erzeugen rtf_create(FIFO_0, // FIFO-Nummer 20000); // FIFO-Grösse // Periodischen Task erzeugen rt_task_init(&rt_task, // Task-Struktur taskFkt, // Task-Handler 1, // Initialisierungswert 2000, // Stackgrösse 0, // Taskpriorität 0, // Task arbeitet ohne FPU 0); // Signal-Handler // Timer und periodischen Task starten tick_period = start_rt_timer(nano2count(TIMERTICKS)); now = rt_get_time(); rt_task_make_periodic(&rt_task, now + tick_period, tick_period); return 0; }
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Beispielprogramm: fifotest.c void xcleanup_module(void) { // Timer stoppen stop_rt_timer(); // FIFO löschen rtf_destroy(FIFO_0); // Task löschen rt_task_delete(&rt_task); }
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Beispielprogramm: fifotest.c static void taskFkt(int t) { // Message für Übertragung in den Userpace static struct { int taskId; RTIME time; } msg; msg.taskId = t; static long long last_cpu_time; long long cpu_time; while (1) { // Systemtimer auslesen cpu_time = rt_get_cpu_time_ns(); // Differenz bilden msg.time = cpu_time - last_cpu_time; last_cpu_time = cpu_time; // Übergabe an FIFO rtf_put(FIFO_0, &msg, sizeof(msg)); // Warten auf nächste Periode rt_task_wait_period(); } }
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Beispielprogramm: printer.c static int end;static void endme(int dummy){ end = 1;}int main (int argc, char** argv){ int fifo; static struct { int taskId; long long time; } msg; // FIFO (Datei) öffnen if ((fifo = open("/dev/rtf0", O_RDONLY)) < 0) { fprintf(stderr, "Error opening /dev/rtf0\n"); exit(1); } signal(SIGINT, endme); while(!end) { // Nachricht aus der FIFO auslesen read(fifo, &msg, sizeof(msg)); // Ausgabe auf der Konsole printf("Task%d: %f ms\n", msg.taskId, (float)msg.time/1000000); } exit(0); }
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Beispielprogramm Demonstration des Beispielprogramms auf dem Evaluation-Kit SmartModule 855 MSEBX855 von Digital-Logic • Software: Ubuntu 5.04, Kernel 2.6.10, RTAI 3.2 • Prozessor: Intel Pentium M 1.4 GHz • RAM: DRAM 1024 MB • Festplatte: 20 GB
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Messaufbau • Pulsbreite entspricht Interrupt-Latenzzeit. • Messung der Pulsbreite mit Oszilloskop. • Aufzeichnung der Messdaten in einem Text-File mit Hilfe von Labview.
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Messung ohne RTAI SmartModule 855 MSEBX855 (Intel Pentium M 1.4 GHz) Durchschnittliche Interrupt-Latenzzeit (Leerlauf): 8.5 μs Maximale Interrupt-Latenzzeit: 1680.0 μs Minimale Interrupt-Latenzzeit: 4.0 μs
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Messung mit RTAI SmartModule 855 MSEBX855 (Intel Pentium M 1.4 GHz) Durchschnittliche Interrupt-Latenzzeit (Leerlauf): 8.5 μs Maximale Interrupt-Latenzzeit: 11.42 μs Minimale Interrupt-Latenzzeit: 7.17 μs
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Interpretation • Die durchschnittliche Interrupt-Latenzzeit im Leerlauf ist mit und ohneRTAI etwa gleich gross (8.5 us). • Im Belastungsfall ist die Interrupt-Latenzzeit mit RTAI wesentlich stabiler als ohne RTAI.
1. Funktionsprinzip-Architektur- RTHAL- Interrupt-Handling- Scheduler- Intertask-Kommunikation- Prozesskommunikation 2. Beispielprogramm 3. Latenzzeitmessungen- Messaufbau- Messung ohne RTAI- Messung mit RTAI- Interpretation Fragen