Untersuchung von Ans atzen zur CAN-Kommunikation in Echtzeit unter Linux

Die Seite wird erstellt Florian Heinrich
 
WEITER LESEN
Untersuchung von Ans atzen zur CAN-Kommunikation in Echtzeit unter Linux
L E H R S T U H L F Ü R R E A L Z E I T - C O M P U T E R S Y S T E M E
                T E C H N I S C H E U N I V E R S I T Ä T M Ü N C H E N
                    U N I V. - P R O F. D R. - I N G. G. F Ä R B E R

  Untersuchung von Ansätzen zur
CAN-Kommunikation in Echtzeit unter
              Linux

                          Matthias Keller

                    Bachelorarbeit
Untersuchung von Ansätzen zur
        CAN-Kommunikation in Echtzeit unter Linux

                                    Bachelorarbeit

              Betreut durch den Lehrstuhl für Realzeit-Computersysteme
                           Technische Universität München
                             Prof. Dr.-Ing. Georg Färber

    Ausgeführt bei DaimlerChrysler Forschung&Technologie, Abteilung REI/AU, Ulm

Betreuer:        Dipl.–Ing. Sebastian Drössler

Bearbeiter:      Matthias Keller
                 Hildachstraße 7a
                 81245 München

Eingereicht im Mai 2006
t4
Danksagung
Ich möchte mich bei Herrn Prof. Dr.–Ing. G. Färber und Herrn Dipl.–Ing. S. Drössler be-
danken, dass sie eine Betreuung dieser Bachelorarbeit durch den Lehrstuhl für Realzeit–
Computersysteme möglich gemacht haben.
Ebenso möchte ich mich bei Herrn N. Appenrodt und Herrn M. Skutek bedanken, dass sie
diese Bachelorarbeit in der Abteilung REI/AU am Forschungszentrum Ulm der DaimlerChrysler
AG ermöglicht haben.
Ein weiterer Dank geht an Herrn M. Steiner aus der Abteilung für Messtechnik der Fahrzeu-
gentwicklung in Sindelfingen für die Bereitstellung der Geräte zur Durchführung der für diese
Arbeit sehr wichtigen Messungen.
Mein besonderer Dank gilt meinen Betreuern, die mich jederzeit tatkräftig in allen Belangen
unterstützt haben. Sie waren maßgeblich am Gelingen dieser Arbeit beteiligt.
Außerdem möchte ich allen Mitarbeitern der Abteilung REI/AU für das freundliche, kollegiale
Arbeitsklima danken. Angeregte Diskussionen verhalfen mir zu neuen Ansätzen

München, im Mai 2006
Inhaltsverzeichnis

Abbildungsverzeichnis                                                                                      viii

Tabellenverzeichnis                                                                                         ix

Verzeichnis der verwendeten Symbole                                                                          x

1 Einleitung                                                                                                 1

2 Grundlagen                                                                                                3
  2.1 CAN-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .    3
      2.1.1 Einführung . . . . . . . . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .    3
      2.1.2 Medium . . . . . . . . . . . . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .    3
      2.1.3 Übertragungsrate und Leitungslänge . . . . . . . . .         .   .   .   .   .   .   .   .    4
      2.1.4 Objektidentifier und Buszugriff . . . . . . . . . . . .        .   .   .   .   .   .   .   .    4
      2.1.5 Frame-Formate . . . . . . . . . . . . . . . . . . . . .        .   .   .   .   .   .   .   .    5
      2.1.6 Einschränkungen . . . . . . . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .    5
  2.2 Echtzeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .    5
      2.2.1 Grundlagen . . . . . . . . . . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .    5
      2.2.2 Latenzzeit . . . . . . . . . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .    6
      2.2.3 Jitter . . . . . . . . . . . . . . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .    6
      2.2.4 Deadline . . . . . . . . . . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .    6
      2.2.5 Weiche und harte Echtzeit . . . . . . . . . . . . . . .        .   .   .   .   .   .   .   .    7
      2.2.6 Programmierung von Echtzeitsystemen . . . . . . . .            .   .   .   .   .   .   .   .    7
  2.3 Wichtige Konzepte eines Betriebssystems am Beispiel Linux            .   .   .   .   .   .   .   .    8
      2.3.1 Rechenprozess . . . . . . . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .    8
      2.3.2 Kernel-Modus und Benutzer-Modus . . . . . . . . . .            .   .   .   .   .   .   .   .    8
      2.3.3 Speicherverwaltung . . . . . . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .    8
      2.3.4 Kernelspace und Userspace . . . . . . . . . . . . . . .        .   .   .   .   .   .   .   .    9
      2.3.5 Ein-/Ausgabegeräte . . . . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .    9
      2.3.6 Multitasking . . . . . . . . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   10
      2.3.7 Interruptsystem . . . . . . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   10
      2.3.8 Scheduling . . . . . . . . . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   11
      2.3.9 Semaphoren . . . . . . . . . . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   13
      2.3.10 Gemeinsam genutzte Speicherbereiche . . . . . . . . .         .   .   .   .   .   .   .   .   13
      2.3.11 FIFO Puffer . . . . . . . . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   13
      2.3.12 Ringpuffer . . . . . . . . . . . . . . . . . . . . . . . .    .   .   .   .   .   .   .   .   14

                                                                                                             v
Inhaltsverzeichnis

3 Echtzeitsysteme auf Linux-Basis                                                                                       15
  3.1 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                         .   .   .   .   15
      3.1.1 Einschränkungen . . . . . . . . . . . . . . . . . . . . . . . .                            .   .   .   .   15
      3.1.2 Lösungsansätze . . . . . . . . . . . . . . . . . . . . . . . . .                          .   .   .   .   16
      3.1.3 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . .                             .   .   .   .   18
  3.2 RTAI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                        .   .   .   .   18
      3.2.1 Einführung . . . . . . . . . . . . . . . . . . . . . . . . . . .                           .   .   .   .   18
      3.2.2 Adeos Nanokernel mit Interrupt Pipeline . . . . . . . . . . .                               .   .   .   .   19
      3.2.3 Taktgenerierung . . . . . . . . . . . . . . . . . . . . . . . . .                           .   .   .   .   20
      3.2.4 Zeitmessung . . . . . . . . . . . . . . . . . . . . . . . . . . .                           .   .   .   .   21
      3.2.5 Scheduler . . . . . . . . . . . . . . . . . . . . . . . . . . . .                           .   .   .   .   22
      3.2.6 Speicherverwaltung . . . . . . . . . . . . . . . . . . . . . . .                            .   .   .   .   22
      3.2.7 Weitere Funktionen von RTAI . . . . . . . . . . . . . . . . .                               .   .   .   .   23
      3.2.8 Entwicklung von RT Applikationen im Kernelspace . . . . .                                   .   .   .   .   26
      3.2.9 Entwicklung von RT Applikationen mit LXRT im Userspace                                      .   .   .   .   29
      3.2.10 Hinweise zur Entwicklung von RT Applikationen mit RTAI .                                   .   .   .   .   30
      3.2.11 Hardwareunterstützung . . . . . . . . . . . . . . . . . . . . .                           .   .   .   .   30
  3.3 Weitere Ansätze . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                        .   .   .   .   31

4 Entwicklung eines CAN-Treibers für RTAI                                                                              32
  4.1 Einführung . . . . . . . . . . . . . . . . . . . . . . . . .             .   .   .   .   .   .   .   .   .   .   32
  4.2 Hardware . . . . . . . . . . . . . . . . . . . . . . . . . .              .   .   .   .   .   .   .   .   .   .   32
  4.3 Realtime CAN for Linux/RTAI . . . . . . . . . . . . . .                   .   .   .   .   .   .   .   .   .   .   34
      4.3.1 Hardware-Abstraktions-Schicht . . . . . . . . . .                   .   .   .   .   .   .   .   .   .   .   34
      4.3.2 Funktionsweise . . . . . . . . . . . . . . . . . . .                .   .   .   .   .   .   .   .   .   .   34
      4.3.3 Unterstützte Hardware . . . . . . . . . . . . . . .                .   .   .   .   .   .   .   .   .   .   34
      4.3.4 Wichtige Dateien . . . . . . . . . . . . . . . . . .                .   .   .   .   .   .   .   .   .   .   35
      4.3.5 Projektstatus . . . . . . . . . . . . . . . . . . . .               .   .   .   .   .   .   .   .   .   .   35
  4.4 Entwicklung der Anpassung für den PCAN-PCI Adapter                       .   .   .   .   .   .   .   .   .   .   35
      4.4.1 Wahl des Rahmens . . . . . . . . . . . . . . . . .                  .   .   .   .   .   .   .   .   .   .   35
      4.4.2 Einschränkungen und Probleme von Rtcan . . . .                     .   .   .   .   .   .   .   .   .   .   35
      4.4.3 Hardware-spezifische Anpassungen . . . . . . . .                    .   .   .   .   .   .   .   .   .   .   37
      4.4.4 Entwicklung einer Benutzerschnittstelle . . . . . .                 .   .   .   .   .   .   .   .   .   .   38
      4.4.5 Fehlerbehandlung . . . . . . . . . . . . . . . . . .                .   .   .   .   .   .   .   .   .   .   40
      4.4.6 Einschränkungen . . . . . . . . . . . . . . . . . .                .   .   .   .   .   .   .   .   .   .   40
      4.4.7 Installation und Verwendung . . . . . . . . . . . .                 .   .   .   .   .   .   .   .   .   .   41
  4.5 Socket-basierter CAN-Treiber . . . . . . . . . . . . . . .                .   .   .   .   .   .   .   .   .   .   41

5 Messungen zur Beurteilung des Echtzeitverhaltens                                                                      42
  5.1 Einführung . . . . . . . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   42
  5.2 Ziel der Messungen . . . . . . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   42
  5.3 Versuchsaufbau . . . . . . . . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   42
      5.3.1 CAN Datenlogger . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   43
      5.3.2 Testsysteme . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   43

vi
Inhaltsverzeichnis

         5.3.3 Konfigurationen des Linux-PC . . . . . . . . . . . . . . . . . . . . .                                                              44
         5.3.4 Lastgeneratoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                           45
   5.4   Testszenarien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                         46
         5.4.1 Szenario 1: Periodisches Senden einer CAN-Nachricht . . . . . . . .                                                                 46
         5.4.2 Szenario 2: Paralleles, periodisches Senden mehrerer CAN-Nachrichten                                                                46
         5.4.3 Szenario 3: Messung der Reaktionszeit über den CAN-Bus . . . . .                                                                   47
   5.5   Testdurchführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                         47
   5.6   Auswertung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                          47
         5.6.1 Allgemeine Aufbereitung der Daten . . . . . . . . . . . . . . . . . .                                                               47
         5.6.2 Periodische Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                           47
         5.6.3 Reaktionstests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                          49
   5.7   Ergebnisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                        50
         5.7.1 Szenario 1: Periodisches Senden einer CAN-Nachricht . . . . . . . .                                                                 50
         5.7.2 Szenario 2: Paralleles, periodisches Senden mehrerer CAN-Nachrichten                                                                52
         5.7.3 Szenario 3: Messung der Reaktionszeit über den CAN-Bus . . . . .                                                                   53
         5.7.4 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                             55

6 Fazit und Ausblick                                                                                                                               56

A Installation der verwendeten Software                                                                                                            57

B Auflistung aller Testergebnisse                                                                                                                  59

C QT RTcan Display                                                                                                                                 63

D Quellcode                                                                                                                                        65
  D.1 Rtcan . . . . . . . .      . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   65
  D.2 Demo-Programme für        Rtcan     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   65
  D.3 QT RTcan Display .         . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   65
  D.4 Tests . . . . . . . . .    . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   65
  D.5 Auswertung der Tests       . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   66

Literaturverzeichnis                                                                                                                               67

                                                                                                                                                   vii
Abbildungsverzeichnis

       2.1 Abrupter Schaden bei der Überschreitung der Deadline bei einer harten
           Echtzeitanforderung. [Sch02] . . . . . . . . . . . . . . . . . . . . . . . . . .                                            7

       3.1   Interrupt Pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
       3.2   Systemaufbau ohne und mit Interrupt Pipeline . . . . . . . . . . . . . . . . 20

       4.1   PCAN-PCI Einsteckkarte . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
       4.2   Aufbau des PCAN-PCI Adapters . . . . . . . . . . . . . . . . . . . . . . . 33

       5.1   Messung   7: RTAI . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   51
       5.2   Messung   15: Linux . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   51
       5.3   Messung   11: PCAN-View . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   52
       5.4   Messung   4: LXRT, höchstpriorer Task .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   53
       5.5   Messung   4: LXRT, niedrigstpriorer Task      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   53
       5.6   Messung   24: Linux . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   54
       5.7   Messung   29: LXRT . . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   54

       C.1 Screenshot von QT RTcan Display . . . . . . . . . . . . . . . . . . . . . . 63

viii
Tabellenverzeichnis
 2.1 Werte auf dem CAN-Bus . . . . . . . . . . . . . . . . . . . . . . . . . .                 .   . 4
 2.2 Maximale Leitungslänge bei vorgegebener Übertragungsrate . . . . . .                    .   . 4
 2.3 Einige Ziele des Scheduling-Algorithmus bei verschiedenen Umgebungen                      .   . 11
 2.4 Prozesszustände unter Linux . . . . . . . . . . . . . . . . . . . . . . . .              .   . 12

 3.1   FIFO API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

 5.1   Maximale Abweichung von der Periode von 1 ms . . . . .          .   . . .   .   .   .   .   .   50
 5.2   Durchschnittliche Abweichung von der Periode von 1 ms .         .   . . .   .   .   .   .   .   51
 5.3   Vergleich der maximalen Abweichung über Szenario 1 & 2         .   . . .   .   .   .   .   .   52
 5.4   Vergleich der durchschnittlichen Abweichung über Szenario      1   &2      .   .   .   .   .   53
 5.5   Maximale Reaktionszeit . . . . . . . . . . . . . . . . . . .    .   . . .   .   .   .   .   .   54
 5.6   Durchschnittliche Reaktionszeit . . . . . . . . . . . . . . .   .   . . .   .   .   .   .   .   54

 B.1 Szenario 1: Periodisches Senden einer CAN-Nachricht . . . . . . . . . . . . 60
 B.2 Szenario 2: Paralleles, periodisches Senden mehrerer CAN-Nachrichten . . 61
 B.3 Szenario 3: Messung der Reaktionszeit über den CAN-Bus . . . . . . . . . 62

                                                                                                       ix
Verzeichnis der verwendeten Symbole

    ACPI      Advanced Configuration and Power Interface
    ADEOS     Adaptive Domain Environment for Operating Systems
    APM       Advanced Power Management
    API       Programmierschnittstelle (Application Programming Interface)
    CAN       Feldbussystem (Controller Area Network)
    CPU       Prozessor (Central Processing Unit)
    CRC       zyklische Redundanzprüfung (Cyclic Redundancy Code)
    CSMA/CA   Carrier Sense Multiple Access/Collision Avoidance
    DIAPM     Dipartimento di Ingegneria Aerospaziale
    DV        Datenverarbeitung
    EDF       Scheduler-Strategie (Earliest Deadline First)
    GNU       GNU is not UNIX
    GPL       GNU Public Licence
    HAL       Hardware-Abstraktions-Schicht (Hardware Abstraction Layer)
    IPC       Interprozesskommunikation
    IPIPE     Interrupt Pipeline
    LXRT      Linux Real-Time
    MOST      Feldbussystem (Media Oriented Systems Transport)
    PITA      PCI Interface for Telephony/Data Applications
    POSIX     standardisiertes Applikationsebeneninterface, das die Schnittstelle
              zwischen Applikation und dem Betriebssystem darstellt
              (Portable Operating System Interface for UniX)
    QT        Programm-Bibliothek zum Entwickeln grafischer Oberflächen mit C++
    RCS       Lehrstuhl für Realzeit-Computersysteme
    RPC       Funktionsaufruf auf einem entfernten Rechner (Remote Procedure Call)
    RT        Echtzeit (Real-Time)
    RTAI      Real Time Application Interface
    RTDM      Real-Time Driver Model
    RTHAL     Real-Time Hardware Abstraction Layer
    WCET      Worst Case Execution Time

x
Zusammenfassung
Aktuelle Weiterentwicklungen am Linux-Kernel sollen den Einsatz von Linux auf Standard-
Hardware der x86-Architektur in Echtzeitumgebungen ermöglichen. Frei verfügbare Echtzei-
terweiterungen wie RTAI erheben den Anspruch für einen Betrieb unter harten Echtzeitbedin-
gungen ausgelegt zu sein. Die permanente Weiterentwicklung an RTAI erhöht die Stabilität,
die Zeitgenauigkeit, den Funktionsumfang und die Hardwareunterstützung. RTAI wird dadurch
konkurrenzfähiger gegenüber kommerziellen Lösungen.
Durch diese Entwicklung und die steigende Popularität von Echtzeitsystemen auf Linux-Basis
werden diese Systeme im Vergleich zu kostenintensiven kommerziellen Lösungen sowie stark an
einzelne Mitarbeiter gebundene Eigenentwicklungen auch in der industriellen Forschung immer
lukrativer.
Zur Beurteilung eines möglichen Einsatzes bei Forschungsarbeiten im Rahmen der Umfel-
derkennung im Automobilbereich werden zunächst die für einen Echtzeitbetrieb relevanten
Konzepte genauer betrachtet. Diese Betrachtungen umfassen vor allem den Scheduler und die
damit verbundene Auslegung der untersuchten Systeme.
Weiterhin wird das als Grundlage für RTAI dienende Konzept der Hardwarevirtualisierung durch
den Einsatz einer Interrupt Pipeline untersucht. Dieses Konzept ermöglicht den Betrieb von
RTAI parallel zum Linux-Kernel, die Priorisierung von RTAI in der Abarbeitungsreihenfolge
gegenüber dem Linux-Kernel ist die Basis für die Echtzeitfähigkeit von RTAI.
Die Erweiterung der Software des Realtime CAN for Linux/RTAI“ Projektes ermöglicht CAN-
                                ”
Kommunikation unter RTAI auf x86-Hardware.
Durch Messungen auf dem CAN-Bus wird die Einsatzfähigkeit der vorgestellten Echtzeitsy-
steme objektiv untersucht. Dazu werden an eine spätere Applikation orientierte Testszenarien
definiert. Nach der Auswertung der Tests werden weitere Schritte für eine genauere Untersu-
chung der Einsatzfähigkeit geschildert.

                                                                                           xi
xii
1 Einleitung

Im Rahmen von Forschungsarbeiten zur Umfelderkennung im Automobilbereich wer-
den Testfahrzeuge zur Durchführung von Fahrversuchen aufgebaut. Diese Versuchsträger
verfügen über verschiedene Sensoren wie Laserscanner oder Radare, sowie über Aktoren
wie zum Beispiel reversible Gurtstraffer.
Zur Evaluierung von verschiedenen Algorithmen im Bereich der Objekterkennung und
-verfolgung wird eine ebenfalls im Fahrzeug eingebaute Datenverarbeitungsanlage ver-
wendet. Die Vernetzung der Komponenten wird über den im Automobilbereich üblichen
CAN-Bus bzw. über Ethernet realisiert.
Mehrere Gründe machen den Einsatz eines echtzeitfähigen Betriebssystems auf der zu
Versuchszwecken im Fahrzeug installierten Datenverarbeitungsanlage erforderlich:
Die Einleitung von Maßnahmen zur Erhöhung des Insassenschutzes muss unmittelbar bei
der Erkennung einer Gefahrensituation erfolgen.
Aus marktstrategischen Gründen sowie der Wirtschaftlichkeit beim Verkauf an mehre-
re Automobilhersteller werden die Sensoren von den Zulieferern häufig als komplette
Subsysteme verkauft, die bereits eine eigene Aufbereitung der Daten bis hin zu einer
vollständigen Objekterkennung beinhalten. Um Datenverluste bzw. fehlerhafte Messda-
ten zu vermeiden, müssen bei der Kommunikation mit diesen Subsystemen verschiedene
Echtzeitbedingungen eingehalten werden.
Beim späteren Einsatz einer Applikation auf einem Steuergerät im Fahrzeug müssen
durch Abhängigkeiten vom Gesamtsystem verschiedene Laufzeit- und Echtzeitbedingun-
gen eingehalten werden. Eine Entwicklung auf Echtzeitsystemen schon in der frühen
Entwicklungsphase erleichtert die spätere Portierung auf ein Steuergerät und stellt die
grundsätzliche Eignung der Applikation für den Einsatz auf einem Steuergerät sicher.
Neben den zeitkritischen Aufgaben wie z. B. der Steuerung der Sensoren und Aktoren,
gibt es nicht-zeitkritische Aufgaben wie die Visualisierung der Messdaten.
Der bisherige Ansatz sieht eine Auftrennung der zeitkritischen und nicht-zeitkritischen
Aufgaben über zwei unabhängige Rechnersysteme vor. Auf Seiten der zeitkritischen
Aufgaben wird das kommerzielle Echtzeitbetriebssystem LynxOS auf einer Motorola-
Architekur eingesetzt, für die nicht-zeitkritischen Aufgaben wird Linux auf Standard-
Hardware verwendet.
Diese Architektur bringt verschiedene Probleme mit sich:

                                                                                       1
1 Einleitung

    • Die Anschaffung des Echtzeitrechners mit dem kommerziellen Betriebssystem ist
      mit hohen Kosten verbunden.
    • Sowohl innerhalb der Arbeitsgruppe als auch in der Öffentlichkeit ist ein wesentlich
      geringeres Know-How zu LynxOS als zu Linux vorhanden.
    • Die Standard C-Bibliothek von LynxOS hat im Vergleich zur Standard C-Bibliothek
      von Linux einen geringeren Funktionsumfang.
    • Die Verteilung der Software über zwei Systeme bringt einen erhöhten Entwicklungs-
      und Wartungsaufwand mit sich.
Die Einschränkungen auf Seiten der Softwareentwicklung führen zu einem erhöhten Ein-
satz von Workarounds, und sind daher nicht optimal.
Aktuelle Weiterentwicklungen an Linux, sowie neue, frei verfügbare Echtzeiterweiterun-
gen, sollen einen Einsatz von Linux als Echtzeitbetriebssystem ermöglichen. Besonders
vielversprechend ist dabei die Echtzeiterweiterung RTAI. RTAI kann parallel mit Linux
auf Standard-Hardware betrieben werden und soll dabei für den Einsatz in einer Echt-
zeitumgebung geeignet sein.
Eine Einsatzfähigkeit eines Echtzeitsystems auf Linux-Basis würde den Austausch der
aktuellen Architektur durch eine neue auf Standard-Hardware basierende Architektur
ermöglichen. Gleichzeitig könnten die beschriebenen Probleme bei der Entwicklung von
RT Anwendungen auf der aktuellen Architektur dadurch vermindert werden.
Das Ziel der hier vorliegenden Arbeit besteht deshalb aus der Überprüfung der Ein-
satzfähigkeit von Linux und RTAI im beschriebenen Applikationsumfeld.
Kapitel 1 gibt die Motivation wieder und führt auf die Problematik hin.
In Kapitel 2 werden Begriffe eingeführt und die theoretischen Grundlagen geschaffen, die
zum Verständnis dieser Arbeit benötigt werden.
Die im Rahmen dieser Arbeit zu testenden Ansätze für Echtzeitbetriebssysteme werden
in Kapitel 3 technisch erläutert.
Kapitel 4 beschreibt die Entwicklung eines CAN-Treibers für die Echtzeiterweiterung
RTAI.
Das Ergebnis der durchgeführten Messungen sowie das dazu verwendete Testverfahren
werden im fünften Kapitel dieser Arbeit genauer beschrieben.

2
2 Grundlagen
Dieses Kapitel dient zur Einführung in das Umfeld der Thematik der vorliegenden Arbeit.
Zu den drei Begriffen CAN-Kommunikation“, Echtzeit“ und Linux“ aus dem Titel der
                      ”                        ”                ”
Arbeit wird jeweils ein grober Überblick gegeben. Die für die Arbeit relevanten Aspekte
der einzelnen Themen werden präziser dargestellt.

2.1 CAN-Bus

2.1.1 Einführung

Beim CAN-Bus (controller area network) handelt es sich um ein asynchrones, serielles
Feldbussystem zur digitalen Signalübertragung.
Der CAN-Bus wurde 1983 von Bosch zur Vernetzung von Steuergeräten im Automobil
entwickelt. Durch die serielle Verkabelung konnte im Vergleich zur vorher üblichen par-
allelen Verkabelung die Länge der verlegten Kabelbäume, und damit das Gewicht der
Fahrzeuge, verringert werden. Außerdem ist die verwendete digitale Übertragungstechnik
im Vergleich zur analogen Signalübertragung weniger anfällig für Störungen.
1991 wurde von Bosch die bis heute aktuelle CAN Spezifikation 2.0 [Bos91] veröffentlicht.
Im Jahr 1993 wurde das CAN Protokoll unter Verwendung des ISO-Schichtenmodells zum
internationalen Standard ISO 11898.
Der CAN-Bus wird sowohl zur Vernetzung von Steuergeräten im Automobilbereich, als
auch in vielen Industrie- und Automatisierungsanwendungen zum Messen und Steuern
verwendet.

2.1.2 Medium

Der CAN-Bus kann über Kupferleitungen oder Glasfaser geführt werden. Im Falle von
Kupferleitungen arbeitet der CAN-Bus mit Differenzsignalen. Es werden die zwei Leitun-
gen CAN HIGH und CAN LOW benötigt.
Ein Bit kann bei seiner Übertragung entweder dominant oder rezessiv auf die Busleitungen
wirken. Ein rezessives Bit wird von einem dominanten Bit überschrieben.
Die CAN Spezifikation 2.0 [Bos91] trifft dabei folgende Festlegung:

                                                                                        3
2 Grundlagen

                                      dominant 0
                                      rezessiv 1

                         Tabelle 2.1: Werte auf dem CAN-Bus

Die Entscheidung welches Bit überschrieben wird, kann somit als logisches UND-Gatter
interpretiert werden.

2.1.3 Übertragungsrate und Leitungslänge

Die maximale Datenübertragungsrate beträgt 1 MBit s−1 auf einem Highspeed Bus. Die
maximale Leitungslänge bei einer vorgegebenen Übertragungsrate wird von den physika-
lischen Eigenschaften des Trägers bestimmt.
Durch die Ausbreitungsgeschwindigkeit v in Kupfer ergeben sich folgende theoretisch ma-
ximal mögliche Leitungslängen:

                         1 MBit s−1     40 m     Highspeed-Bus
                         500 KBit s−1   100 m
                         125 KBit s−1   500 m    Lowspeed-Bus

        Tabelle 2.2: Maximale Leitungslänge bei vorgegebener Übertragungsrate

Die Abhängigkeit von der Ausbreitungsgeschwindigkeit beruht darauf, dass das Signal das
Ende des Busses erreicht haben muss, bevor das Signal des folgenden Bits angelegt wird.
Im Automobilbereich wird in der Regel eine Datenübertragungsrate von 500 KBit s−1 auf
Highspeed-Bussen verwendet. Meistens werden noch zusätzliche Busse mit einer geringe-
ren Datenübertragungsrate eingesetzt.

2.1.4 Objektidentifier und Buszugriff

Der Objektidentifier, kurz Identifier, kennzeichnet den Inhalt einer Nachricht. Es wird
zwischen 11 Bit langen Identifiern im Base frame format“, sowie 29 Bit langen Identifiern
                                      ”
im Extended frame format“ unterschieden.
   ”
Der CAN-Bus arbeitet nach dem CSMA/CA-Verfahren, Kollisionen beim Buszugriff wer-
den durch die Arbitrierung vermieden.
Bei der Arbitrierung beginnt jeder Sender mit dem Versand des Identifiers seiner zu ver-
sendenden Nachricht. Sobald ein Sender am Bus ein dominantes Signal misst, obwohl er
ein rezessives Signal angelegt hat, beendet er seine Übertragung. Am Ende gewinnt der
Sender mit der Nachricht mit dem kleinsten Objektidentifier.
Somit lassen sich die Nachrichten über ihren Objektidentifier priorisieren. Die Nachricht
mit dem kleinsten Identifier hat die höchste Priorität.

4
2.2 Echtzeit

Ein Gerät kann als Sender mehrerer Identifier fungieren, wegen der Arbitrierung darf es
allerdings für jeden Identifier nur einen einzigen Sender am Bus geben.

2.1.5 Frame-Formate

Die CAN Spezifikation beschreibt vier Arten von Frames:
   • Daten-Frame zum Transport von bis zu 8 Byte Daten
   • Error-Frame zur Signalisierung eines erkannten Übertragungsfehlers an alle Teilneh-
     mer
   • Remote-Frame zur Anforderung eines Daten-Frames von einem anderen Teilnehmer
   • Overload-Frame als Verzögerung zwischen Daten- und Remote-Frames
In einem Daten-Frame sind neben dem Objektidentifier und den Daten weitere Informa-
tionen wie z. B. eine CRC-Prüfsumme zur Sicherung der Daten enthalten.

2.1.6 Einschränkungen

Trotz der Hierarchie der Nachrichten ist auch bei hochprioren Nachrichten der Sendezeit-
punkt nicht exakt bestimmbar. Dieses nicht-deterministische Verhalten macht Schwierig-
keiten in hoch zeitkritischen Anwendungen. Eine Abhilfe ist die Verwendung eines für
eine Applikation exklusiven Busses. Für zukünftige Anwendungen wie zum Beispiel die
 Elektrische Bremse“ (brake by wire) werden neue Standards benötigt.
”
Eine weitere Einschränkung stellt die für Multimedia-Anwendungen zu geringe maximale
Datenübertragungsrate von 1 MBit s−1 dar.
Als Bussystem der Zukunft wird dabei z. B. FlexRay [Fle] mit einer Datenübertragungsrate
von bis zu 10 MBit s−1 sowie garantierten Latenzzeiten gehandelt.
Für heutige Multimedia-Anwendungen wird bereits der MOST-Bus mit speziellen Kanälen
zur Audio- und Videoübertragung im Fahrzeug eingesetzt.

2.2 Echtzeit

2.2.1 Grundlagen

Der Begriff Echtzeit beschreibt eine Zeitanforderung an das Antwortverhalten einer An-
wendung bei der Bearbeitung von Rechenprozessen.

                                                                                       5
2 Grundlagen

Je nach Anwendung ist diese Zeitanforderung unterschiedlich. Sehr hohe Anforderungen
sind zum Beispiel im Automobilbereich vorhanden. Diese liegen hier teilweise im Mikro-
sekundenbereich (z. B. Motorsteuerung), für Regelungen meist in einem Bereich von 10
ms.

2.2.2 Latenzzeit

Bei der Latenzzeit handelt sich um eine Verzögerung. In Kommunikationsnetzwerken ent-
spricht die Latenzzeit der durch den Übertragungsweg bedingten Verzögerung. Leitungs-
wege und Gatterlaufzeiten führen zu Latenzen in elektrischen Schaltungen.
Beim Vergleich von Betriebssystemen wird oft die Interrupt-Latenzzeit betrachtet. Sie
gibt die Verzögerung zwischen dem Eintreffen einer Unterbrechung bis zum Start ihrer
Bearbeitungsroutine an.
Verschiedene Faktoren in einem Betriebssystem können die Interrupt-Latenzzeit ver-
schlechtern. Folgende Latenz-Killer“ sind zu vermeiden:
                     ”
   • hohe DMA Aktivitäten durch Festplatten oder andere PCI-Geräte
    • Energiesparfunktionen (APM und ACPI)
    • dynamischer Wechsel der Taktfrequenz des Prozessors
    • Verwendung einer Hardware-beschleunigten grafischen Oberfläche
    • System Maintenance Interrupt (SMI) auf neueren Mainboard-Chipsätzen

2.2.3 Jitter

Der Jitter ist laut [Kop97] die Differenz zwischen dem minimalen und dem maximalen
Wert der Verzögerung.
Der maximal zulässige Jitter ist ein wichtiges Designkriterium für Echtzeitanwendungen.
Unter einem hohen Jitter leidet die Worst-Case Abschätzung der Anwendung.

2.2.4 Deadline

Die Deadline gibt die maximal zulässige Antwortzeit eines Rechenprozesses an. In dieser
Antwortzeit sind die Latenzzeit, die Rechenzeit und weitere Wartezeiten während der
Abarbeitung enthalten.
Wartenzeiten können durch die Blockierung von benötigten Betriebsmitteln, durch Unter-
brechungen von höherprioreren Tasks, Unterbrechungen durch externe Ereignisse, sowie
bei der Kommunikation mit anderen Prozessen zu Stande kommen.

6
2.2 Echtzeit

2.2.5 Weiche und harte Echtzeit

Anhand des Schadens bei der Überschreitung einer Deadline kann zwischer weicher und
harter Echtzeit unterschieden werden [Sch02].

Bild 2.1: Abrupter Schaden bei der Überschreitung der Deadline bei einer harten Echt-
          zeitanforderung. [Sch02]

Während die Verletzung einer harten Echtzeitbedingung zu einem schwerwiegenden Scha-
den wie dem physikalischen Defekt des gesteuerten Systems führen kann, wird bei der
Verletzung einer weichen Echtzeitbedingung nur die Güte des Ergebnisses beeinflusst.
Beispiele für Systeme mit weichen Echtzeitbedingungen sind die Übertragung von Vide-
odaten oder das Digitalisieren von analogen Audiodaten.

2.2.6 Programmierung von Echtzeitsystemen

Nach [Fär04] sollten bei der Programmierung von Echtzeitsystemen all diejenigen Kon-
strukte vermieden werden, die eine Bestimmung der WCET erschweren. Folgende Punkte
müssen dabei beachtet werden:
   • Keine rekursiven Programme/Prozeduren verwenden, Umformen in Programm-
     schleifen.
   • Schleifen sollten immer durch eine maximale Schleifendurchlaufzahl begrenzt sein
     (feste Obergrenze).
   • Bei Verzweigung- und Schleifenbedingungen muss die Endbedingung sicher erreicht
     werden. Eventuell Begrenzung durch übergeordnete Schleife mit fester Obergrenze.
   • Datenstrukturen solltest möglichst statisch definiert werden, nicht erst zur Laufzeit
     dynamisch entstehen (Zeitbedarf, Risiko des nicht mehr vorhandenen Speichers, der
     dann zu einer aufwendigen Speicherreinigung führt).

                                                                                         7
2 Grundlagen

2.3 Wichtige Konzepte eines Betriebssystems am
    Beispiel Linux
In diesem Abschnitt sollen die für diese Arbeit relevanten grundlegenden Konzepte ei-
nes modernen Betriebssystems wiederholt werden. Innerhalb der Theorie wird auf die
Umsetzung der vorgestelltungen Konzepte unter Linux eingegangen.

2.3.1 Rechenprozess

Ein Prozess bzw. Rechenprozess wird von [UB01] als Ablauf in einem Betriebssystem
definiert. Ein Prozess ist gleichzeitig eine Verwaltungseinheit des Betriebssystems.
Es wird zwischen Prozessen für Benutzeraufträge, den Benutzerprozessen, sowie Prozessen
des Betriebssystems, den Systemprozessen unterschieden.
Jeder Rechenprozess erhält einen eigenen, exklusiven Adressraum. Eine Ausnahme sind
die sog. leichtgewichtigen“ Prozesse (Threads), die über einen gemeinsamen Speicherbe-
         ”
reich verfügen.
Aus Sicht des Betriebssystems belegt jeder Rechenprozess ein oder mehrere Threads. Der
Begriff Task“ wird als Synonym für einen solchen Thread verwendet. Eine Verwendung
       ”
als Synonym für Prozess“ ist ebenso gebräuchlich.
                 ”
Der Prozesskontext enthält alle Informationen, die das Betriebssystem über einen Rechen-
prozess besitzt. Neben dem Adressraum gehören dazu Informationen wie der Name des
Prozesses, die Stellung in der Prozesshierarchie oder der ausführende Systembenutzer.
Linux verwaltet alle Prozesse in einer Prozesstabelle, jeder Prozess wir dabei durch eine
Struktur vom Typ task struct (/usr/src/include/sched.h) beschrieben.

2.3.2 Kernel-Modus und Benutzer-Modus

Die Berechtigungsstufe eines Prozesses wird als Ring bezeichnet. Diese schränkt den Pro-
zess in dem auf dem Prozessor nutzbaren Befehlssatz und Speicherbereich ein.
Die x86-Architektur sieht die Ringe 0 bis 3 vor. Prozesse im Ring 0 befinden sich im
Kernel-Modus, alle anderen Prozesse sind im Benutzer-Modus. Ring 0 stellt die höchste
Berechtigungsstufe dar, die bis zur Stufe 3 immer weiter eingeschränkt wird.

2.3.3 Speicherverwaltung

Der Begriff Speicher“ wird im aktuellen Kontext als Synonym für Arbeitsspeicher“
            ”                                                    ”
verwendet.

8
2.3 Wichtige Konzepte eines Betriebssystems am Beispiel Linux

Folgende zwei Aspekte der virtuellen Speicherverwaltung eines modernen Betriebssystems
sollen hier betrachtet werden:

Über den virtuellen Adressraum kann mehr Speicher adressiert werden, als physikalisch
vorhanden ist. Dies wird durch eine Verdrängung von Speicherabschnitten auf die Festplat-
te erreicht. Das Verdrängen von Daten aus dem physikalischen Speicher auf die Festplatte
wird als Paging“ bezeichnet. Das Verdrängen sowie das Zurückladen sind sehr aufwendig,
         ”
Paging sollte in zeitkritischen Anwendungen daher vermieden werden.

Der Speicherschutz schützt den Speicherbereich eines Prozesses vor unberechtigten Zu-
griffen von anderen Prozessen. Dadurch kann die Beeinträchtigung der Stabilität anderer
Prozesse bzw. des Betriebssystems durch ein fehlerhaftes Programm vermieden werden.

Unter Linux wird der virtuelle Speicher über dreistufige Seitentabellen realisiert, als Er-
setzungsstrategie wird der Buddy-Algorithmus [Tan03] verwendet.

Bei einem Speicherzugriffsfehler wird der auslösende Prozess vom Betriebssystem beendet
(segmentation fault).

2.3.4 Kernelspace und Userspace

Der Speicherbereich des Kernels wird als Kernelspace“ bezeichnet. Er befindet sich immer
                                        ”
im physikalischen Speicher und wird nicht ausgelagert. Da der Linux-Kernel als ein Prozess
anzusehen ist, gibt es im Kernelspace keinen Speicherschutz.

Im Userspace“ befinden sich die Speicherbereiche der übrigen Prozesse. Diese Speicher-
   ”
bereiche können aus dem physikalischen Speicher verdrängt werden, der Speicherschutz
beschränkt die Prozesse auf ihren eigenen Speicherbereich.

2.3.5 Ein-/Ausgabegeräte

Ein-/Ausgabegeräte können in die zwei Klassen blockorientierte Geräte“ und zeichen-
                                               ”                             ”
orientierte Geräte“ unterteilt werden.

Bei blockorientierten Geräten wie Festplatten kann parallel auf verschiedenen Blöcken
lesen und geschrieben werden. Zu den zeichenorientierten Geräten zählen zum Beispiel
die Maus und die Tastatur.

Linux stellt Ein-/Ausgabegeräte in Form von Gerätedateien für den Benutzer zum Zugriff
bereit. Diese können dann über die grundlegenden Dateioperationen geöffnet, gelesen,
geschrieben und geschlossen werden.

                                                                                          9
2 Grundlagen

2.3.6 Multitasking

Linux unterstützt preemptives Multitasking, womit mehrere Rechenprozesse quasiparallel
ablaufen können.

Auf einem System von n Prozessoren können maximal n Rechenprozesse gleichzeitig ab-
laufen. Durch Multitasking wird die gleichzeitige Ausführung von m Rechenprozessen mit
m größer n simuliert. Da der Zeitpunkt eines Prozesswechsel nicht vorhergesagt werden
kann, geht jeder Prozess von echt parallelen Abläufen aus.

Folgende drei Komponenten werden für Multitasking benötigt:

     • Unterbrechungssystem (Interruptsystem) zur Unterbrechung des aktiven Rechen-
       prozesses

     • Scheduler mit Prozessumschalter zur Verteilung der Ressourcen auf die Rechenpro-
       zesse

     • Speicherverwaltung mit exklusivem Adressraum für jeden Rechenprozess

2.3.7 Interruptsystem

Unter einem Interrupt versteht man die kurzfristige Unterbrechung eines Prozesses durch
eine vom Prozessor abzuarbeitende Befehlssequenz.

Interrupts können durch unterschiedliche Ereignisse ausgelöst werden. Einige Beispiele
sind das Ablaufen eines Timers, das Eintreffen eines Netzwerkpaketes am Ethernetcon-
troller und die Bewegung der Maus.

Ein Interrupt wird durch eine Signalisierung an den Prozessor angezeigt. Nachdem der
aktuell rechnende Prozess angehalten und sein Prozesskontext gesichert wurde, wird vom
Prozessor die Unterbrechungsroutine (Interrupt Service Routine) abgearbeitet. Nach der
Beendigung der Unterbrechungsroutine wird der vorherige Prozesskontext wiederherge-
stellt und der Prozess in den aktiven Zustand zurückgesetzt.

Innerhalb der Interrupts werden Prioritäten vergeben. Durch Maskierung kann ein Inter-
rupt unterbunden werden.

Neben den bisher beschriebenen Hardwareinterrupts, gibt es sog. Softwareinterrupts. Dies
sind Systemaufrufe, die ebenso zu einer Unterbrechung führen. Systemaufrufe ermöglichen
Prozessen aus dem Benutzer-Modus die Ausführung von Routinen im Kernel-Modus.

Interrupts sind die Grundbedingung für preemptives Multitasking. Ohne Interrupts wäre
es nicht möglich einem rechnenden Prozess von außen ein Betriebsmittel zu entziehen.

10
2.3 Wichtige Konzepte eines Betriebssystems am Beispiel Linux

2.3.8 Scheduling

Scheduling beschäftigt sich mit der Verteilung der Rechenzeit auf die Rechenprozesse. Ne-
ben der Verteilung der Rechenzeit gibt es auch Verfahren zur Verteilung anderer Ressour-
cen wie dem Massenspeicher. An dieser Stelle wird nur auf die Verteilung von Rechenzeit
eingegangen.
Zunächst werden die fünf Prozesszustände lauffähig, ruhend, aktiv, wartend und nicht exi-
stent eingeführt. Mit der Beachtung der Randbedingungen wie der Priorität des Prozesses
oder dem Belegungszustand der Betriebsmittel, entscheidet der Scheduling-Algorithmus
für jeden Prozess über die Übergänge in die verschiedenen Zustände. Jeder Übergang ist
mit einem Aufwand für das Sichern und Laden des Prozesskontextes verbunden.
[Tan03] definiert folgende Ziele für einen Scheduling-Algorithmus in verschiedenen Umge-
bungen:

          Alle Systeme
          Fairness – jeder Prozess bekommt Rechenzeit der CPU
          Policy Enforcement – Politiken werden sichtbar durchgeführt
          Balance – alle Teile des Systems sind ausgelastet
          Stapelverarbeitungssysteme
          Durchsatz – maximiere nach Jobs pro Stunde
          Turnaround-Zeit – minimiere die Zeit vom Start bis zur Beendigung
          CPU-Belegung – belege die CPU konstant mit Jobs
          Interaktive Systeme
          Antwortzeit – antworte schnellstmöglich auf Anfragen
          Proportionalität – auf die Bedürfnisse des Nutzers eingehen
          Echtzeitsysteme
          Meeting Deadlines – keine Daten verlieren
          Predictability – Qualitätsverlust bei Multimedia vermeiden

  Tabelle 2.3: Einige Ziele des Scheduling-Algorithmus bei verschiedenen Umgebungen

Das Scheduling-Verfahren von Linux wird im folgenden beschrieben und auf die Einhal-
tung dieser Ziele untersucht.
Der Scheduler von Linux arbeitet nach einem Zeitverteilungsverfahren. Er wird dazu von
einer Uhr getaktet, die in den aktuellen Kernel-Versionen mit einer Frequenz von 100 Hz,
250 Hz oder 1000 Hz betrieben werden kann. Die Zeit zwischen zwei Ticks, im Falle von
1000 Hz entspricht dies 1 ms, wird als Jiffie bezeichnet.
Der Scheduler vergibt, ähnlich zu den bereits genannten allgemeinen Zuständen, folgende
Prozesszustände:
Alle Prozesse mit dem Status TASK RUNNING befinden sich in einer Warteschlange.
Jeder Prozess hat eine Priorität, diese kann entweder statisch oder dynamisch sein. Pro-
zesse mit einer dynamischen Priorität werden erst dann ausgeführt, wenn kein Prozess

                                                                                          11
2 Grundlagen

 TASK RUNNING                      Task rechnet oder ist rechenbereit
 TASK INTERRUPTIBLE                Task wartet auf ein externes Ereignis, kann durch
                                   einen Interrupt aufgeweckt werden
 TASK UNINTERRUPTIBLE              Task wartet auf ein externes Ereignis, kann nicht
                                   durch einen Interrupt aufgeweckt werden
 TASK ZOMBIE                       beendeter Task, dessen Prozessstruktur sich noch in der
                                   Prozesstabelle befindet
 TASK STOPPED                      Task, dessen Ausführung angehalten wurde

                         Tabelle 2.4: Prozesszustände unter Linux

mit einer statischen Priorität mehr im rechenbereiten Zustand ist.
Im folgenden soll der Standard-Scheduler-Algorithmus SCHED OTHER genauer beschrie-
ben werden. Prozesse mit statischer Priorität gehören zu den Echtzeit-Ansätzen von Li-
nux, und werden daher erst im nächsten Kapitel näher erläutert.
Zur Berechnung der dynamischen Prioritäten wird zunächst der Begriff der Epoche“
                                                                           ”
eingeführt. Eine Epoche entspricht einer bestimmten Rechenzeit.
Beim Beginn einer Epoche bekommt jeder rechenbereite Prozesse einen Anteil der Re-
chenzeit zugeteilt. Dieser Anteil in Jiffies ist seine Standardpriorität bzw. der Startwert
seines Quantums“. Das Quantum am Beginn einer Epoche setzt sich aus einem vordefi-
       ”
nierten Standardwert und einem vom ausführenden Benutzer bestimmbaren Wert (nice)
zusammen.
Falls ein Prozess in der aktuellen Periode auf dem Prozessor gerechnet hat, wird sein
Quantum nach dem Ablauf dieser Periode um eins erniedrigt. Bei Eingabe/Ausgabe-
Operationen verändert sich das Quantum nicht. Falls der Prozess in der vorhergehenden
Epoche nicht sein komplettes Quantum verwendet hat, erhält er einen Bonuspunkt. Eine
Epoche geht dann zu Ende, wenn alle rechenbereiten Prozesse ihr Quantum verbraucht
haben.
Die dynamische Priorität jedes Prozesses ergibt sich aus seiner Standardpriorität und der
aktuellen Höhe seines Quantums. Sie wird nach jedem Tick der Uhr neu berechnet.
Ein rechnender Prozess kann durch folgende Ereignisse verdrängt werden:
     • Sein Quantum ist 0.
     • Er blockiert wegen Eingabe/Ausgabe oder aus anderen Gründen.
     • Ein anderer Prozess mit einer höheren Priorität wird rechenbereit.
     • Er wird durch den Interrupt eines interaktiven Prozesses unterbrochen.
Der Scheduler-Algorithmus SCHED OTHER erfüllt somit folgende Anforderungen:
     • Jeder Prozess bekommt nach einem fairen und durchsichtigen System Rechenzeit
       der CPU zugeteilt.

12
2.3 Wichtige Konzepte eines Betriebssystems am Beispiel Linux

   • Stapelverarbeitungs-Prozesse mit einem hohen Bedarf an Eingabe/Ausgabe-Operationen
     werden gegenüber rechenlastigen Prozessen bevorzugt und erreichen damit einen
     hohen Durchsatz bzw. eine kurze Turnaround-Zeit.

   • Interaktive Prozesse erlangen durch Interrupts eine sehr hohe dynamische Priorität
     und erzielen dadurch eine gute Antwortzeit.

Die Anforderungen von Realzeitsystemen können nicht eingehalten werden, das Schedu-
ling ist nicht vorhersagbar, garantierte Ausführungszeiten sind nicht möglich.

2.3.9 Semaphoren

Ein Semaphor ist eine Datenstruktur zur Prozesssynchronisation. Mit Hilfe von Sema-
phoren kann der gleichzeitige Zugriff mehrerer Prozesse auf ein begrenztes Betriebsmittel
verwaltet werden.

Eine zählende Semaphor wird mit der maximal möglichen Anzahl gleichzeitiger Zugriffe
initialisiert. Bei jeder Anforderung wird ihr Wert um eins dekrementiert, bei einer Freigabe
um eins erhöht.

Ein Wert von Null zeigt an, dass momentan keine weitere Zuteilung mehr stattfinden kann.
In diesem Fall wird der anfordernde Prozess blockiert. Die Blockierung wird aufgelöst,
sobald wieder eine Zuteilung des Betriebsmittels möglich ist.

2.3.10 Gemeinsam genutzte Speicherbereiche

 Shared Memory“ ist eine Möglichkeit zum Datenaustausch zwischen Prozessen. Dies kann
”
auch zwischen Prozessen im Userspace und Prozessen im Kernelspace stattfinden. Dazu
wird ein Speicherbereich definiert, auf dem die Teilnehmer lesen und schreiben können.

Diese Form des Datenaustauschs ist sehr performant, allerdings müssen vom Anwen-
dungsentwickler Mechanismen zur Kontrolle des konkurrierenden Zugriffs sowie zur
Gültigkeitskontrolle der Inhalte implementiert werden.

2.3.11 FIFO Puffer

Bei einem Puffer nach dem First In - First Out Prinzip werden die Elemente in der gleichen
Reihenfolge abgerufen, in der sie zuvor abgelegt wurden.

Unter Linux entspricht eine named pipe“ einem FIFO Puffer.
                           ”

                                                                                         13
2 Grundlagen

2.3.12 Ringpuffer

Ein Ringpuffer ist eine spezielle Variante eines FIFO Puffers. Im Vergleich zu einer War-
teschlange ist der Platz in einem Ringpuffer auf eine bestimmte Anzahl von Elementen
begrenzt.
Ein Ringpuffer kann über zwei Zeiger implementiert werden, die auf die aktuelle Schreib-
bzw. Leseposition zeigen.
Bei einer zu hohen Asynchronität zwischen dem Erzeuger und dem Verbraucher kann es
zu einem Überlauf kommen. In diesem Fall werden nacheinander die ältesten Elemente
durch neue Daten überschrieben, womit es zu einem Datenverlust kommt.

14
3 Echtzeitsysteme auf Linux-Basis
Im ersten Teil dieses Kapitels werden die Einsatzmöglichkeiten von Linux als Echtzeitbe-
triebssystem analysiert [3.1].
Als zweites Echtzeitsystem wird aufgrund der freien Verfügbarkeit sowie der erhöhten
Ausgereiftheit gegenüber anderen Ansätzen die Echtzeiterweiterung RTAI verwendet. Ein
Beschreibung von RTAI sowie ein Überblick über den mitgelieferten Funktionsumfang be-
findet sich im zweiten Teil dieses Kapitels [3.2]. Kurze Beispiele sollen dem Programmierer
einen groben Einblick über die Entwicklung von Anwendungen unter RTAI geben.
Die beschriebenen Funktionen und Konzepte sind ein Teil der heutigen Möglichkeiten,
durch die tägliche Weiterentwicklung an den Systemen ist eine alles umfassende Zusam-
menfassung nicht möglich.

3.1 Linux

Nachdem die grundlegenden Konzepte von Linux bereits erläutert wurden, sollen nun die
Aspekte für eine Verwendung als Echtzeitbetriebssystem erarbeitet werden.
Zuerst werden einige Punkte gegen einen Einsatz von Linux als Echtzeitbetriebssystem
genannt, danach werden mögliche Ansätze und Verbesserungen für einen solchen Einsatz
gezeigt.

3.1.1 Einschränkungen

Linux ist ein traditionelles Multitasking-Betriebssystem

Linux ist ein general purpose“ Betriebssystem und damit auf den durchschnittlich auf-
              ”
tretenden Fall optimiert. Im Multitasking-Betrieb wird eine große Anzahl von Diensten
parallel ausgeführt, das Scheduling ist auf eine Optimierung des Datendurchsatzes ausge-
legt.
Dies widerspricht dem Konzept eines auf den Worst-Case ausgelegten Echtzeitbetriebs-
systems, das die Minimierung von Latenzzeiten sowie garantierte Ausführungszeiten als
Ziel hat.

                                                                                        15
3 Echtzeitsysteme auf Linux-Basis

Paging

Das Auslagern von Speicherbereichen auf die langsame Festplatte ist sehr zeitaufwendig
und kann daher zu einer Verletzung von Echtzeitbedingungen führen.

Dynamische Speicherverwaltung

Die Standard C-Bibliothek bietet mit den Funktionen malloc() und free() eine dynamische
Speicherverwaltung an. Beim Aufruf von malloc() wird der Speicher zur Laufzeit über den
Systemaufruf mmap() reserviert. Neben dem Effekt, dass dieser Systemaufruf aufwendig
ist, kann er bei zu wenig frei verfügbarem physikalischen Speicher ein Auslöser für Paging
sein.

Zeitgranularität

Bei einem Schedulertakt von 1000 Hz wird in jeder Millisekunde ein Interrupt ausgelöst.
Die aufgerufene Routine entscheidet welcher Prozess als nächstes abzuarbeiten ist. Bei
einer Verfeinerung der Granularität würde sich durch viele Scheduleraufrufe und die damit
verbundenen Kontextwechsel der Overhead erhöhen. Das System kann dadurch sogar
schlechter reagieren als zuvor. Dieses Problem wächst mit der Anzahl der im System
gleichzeitig ablaufenden Prozesse.
Allerdings sind selbst bei einem perfekten Scheduling ohne Wartezeiten durch andere
Ereignisse keine Reaktionszeiten unter einer Millisekunde realisierbar. Echtzeitaufgaben
im Mikrosekundenbereich sind daher mit Linux nicht lösbar.

Nicht-preemptiver Kernel

Sehr viele Codeabschnitte des Linux-Kernels sind nicht darauf ausgelegt während ihrer
Abarbeitung unterbrochen zu werden. Kritische Abschnitte sind nicht klar herausgearbei-
tet, weshalb der Linux-Kernel aus Sicherheitsgründen nicht-preemptiv ist.
Dies hat zur Folge, dass ein niederpriorer Prozess, der über einen Systemaufruf Routinen
im Kernel-Modus ausführt, einen höherprioreren Prozess blockieren kann.

3.1.2 Lösungsansätze

Echtzeitfähige Scheduler-Strategien

Neben der bereits beschriebenen Scheduler-Strategie SCHED OTHER sind die zwei wei-
teren Strategien SCHED FIFO sowie SCHED RR vorhanden.

16
3.1 Linux

Beide Strategien arbeiten mit statischen Prioritäten, die immer über den dynamischen
Prioritäten der von SCHED OTHER verwalteten Prozesse liegen. Prozesse mit dynami-
schen Prioritäten werden daher erst abgearbeitet, wenn kein Prozess mit einer statischen
Priorität mehr rechenbereit ist.
Bei der SCHED FIFO Strategie werden die Prozesse innerhalb der selben Priorität in der
Reihenfolge ihrer Ankunft bearbeitet (First In - First Out). Bei der SCHED RR Strategie
wird zusätzlich ein Zeitscheibenverfahren nach dem Round Robin-Prinzip verwendet.
Der Name Echtzeit“ kommt vor allem daher, dass diese Scheduler-Strategien nach dem
           ”
POSIX.1b-1993 Standard für Echtzeitprozesse implementiert sind. Dies reicht nicht aus
um harte Echtzeitbedingungen zu erfüllen, vor allem da die bereits beschriebenen Ein-
schränkungen nicht aufgehoben werden.
Aus den Anforderungen an einen Scheduler-Algorithmus (2.3) zielen diese beiden Stra-
tegien auf die Punkte kurze Antwortzeit, Einhalten von Deadlines und Vorhersagbarkeit
des Schedulings ab. Diese Ziele können allerdings nicht immer vollständig erfüllt werden.

Preemption Patches

Preemption Patches versuchen die nicht-preemptiven Bereiche im Linux-Kernel auf ein
Minimum zu reduzieren. Die beschriebene Prioritätsinversion soll dadurch vermieden wer-
den.
Ein solcher Patch ist inzwischen in die offiziellen Quellen des Linux-Kernel 2.6 eingeflossen
und kann bei der Konfiguration aktiviert werden.

Low-Latency Patches

Mit diesen Patches soll die Latenzzeit verkürzt werden, indem nicht-deterministische Pfa-
de (zum Beispiel Schleifen mit einer nach oben unbegrenzten Anzahl von Iterationen) in
den Kernel-Quellen durch deterministische Routinen ersetzt werden.
Aufgrund der hohen Komplexität der Kernel-Quellen ist es allerdings nicht möglich alle
Pfade zu analysieren. Dieses Verfahren wird dadurch sehr ungenau und soll daher nicht
weiter behandelt werden.

Deaktivierung des Pagings

Mit der Funktion mlockall() aus der Standard C-Bibliothek kann das Paging für den
aktuellen Prozess gesperrt werden. Damit wird garantiert, dass alle eingebundenen Spei-
cherseiten im physikalischen Speicher bleiben.

                                                                                          17
3 Echtzeitsysteme auf Linux-Basis

3.1.3 Zusammenfassung

Einige dieser Ansätze klingen sehr vielversprechend und machen Linux zumindest als
Echtzeitbetriebssystem für weiche Echtzeitbedingungen interessant. Inwieweit sich diese
Ansätze mit richtigen Echtzeitbetriebssystemen messen können, wird im fünften Kapitel
dieser Arbeit ermittelt.

3.2 RTAI

3.2.1 Einführung

RTAI (Real Time Application Interface) ist eine Erweiterung von Linux zu einem Echt-
zeitbetriebssystem. Unter der Leitung von Prof. Paolo Mantegazza vom Dipartimento di
Ingegneria Aerospaziale (DIAPM) der Universität Mailand wurde RTAI zunächst für am
Institut anfallende Echtzeit-Aufgaben aus dem Bereich der Luftfahrttechnik verwendet.
Dabei sind viele Teile aus der bereits bestehenden Echtzeiterweiterung RTLinux eingeflos-
sen. Seit 1998 steht RTAI unter der GNU Public Licence als freie Software zur Verfügung.

Die Hauptidee von RTLinux und RTAI ist, dass der Linux-Kernel als normaler Benut-
zerprozess angesehen wird. Der Kernel bekommt nur Rechenzeit zugeteilt, wenn keine
Echtzeitaufgaben anstehen. Dazu wird bei RTAI auf der unterster Softwareebene der
Real-Time Hardware Abstraction Layer (RTHAL) eingefügt. Der RTHAL entzieht dem
Linux-Kernel die Kontrolle über die Interrupts und setzt ihn an eine untergeordnete Po-
sition.

RTAI wurde 1998 unter der Less GNU Public Licence (LGPL) veröffentlicht und steht
damit als freie Software zur Verfügung. Im Jahr 1999 entbrannte eine Patentdiskussion
im Bezug auf das im Besitz von FSMLabs, dem kommerziellen Betreiber von RTLinux,
befindlichen US-Patents Adding real-time support to general purpose operating systems“
                        ”
(US 5,995,745). Als Ausweg wurde der patentgefährdete RTHAL im Dezember 2003 durch
den unter der GPL stehenden Adeos Nanokernel ersetzt.

Auf den für den Linux-Kernel 2.4 ausgelegten Zweig 24.x folgte der um die Unterstützung
für den Linux-Kernel 2.6 erweiterte Zweig 3.x von RTAI. Die aktuelle stabile Version von
RTAI hat die Version 3.3.

Zunächst werden nun die grundsätzlichen Konzepte hinter RTAI erläutert. Danach werden
die Funktionen beschrieben und Hinweise zur Entwicklung von Applikationen unter RTAI
gegeben. Zusätzlich befinden sich einige Quellcode-Beispiel im Anhang dieser Arbeit.

Zur Installation von RTAI auf einem vorhandenen Linux System wird ebenfalls im Anhang
dieser Arbeit eingegangen [A].

18
3.2 RTAI

3.2.2 Adeos Nanokernel mit Interrupt Pipeline

Nachdem der Real-Time Hardware Abstraction Layer wie bereits erwähnt durch den Ade-
os Nanokernel ersetzt wurde, soll an dieser Stelle ausschließlich der Adeos Nanokernel be-
trachtet werden. Beide Ansätze verfolgen das Ziel die Kontrolle über Teile der Hardware
zu übernehmen und Linux nur noch als einen Leerlauf-Prozess anzusehen. Die Umset-
zung ist dabei unterschiedlich, der Adeos Nanokernel beschreibt einen breiter gefächerten
Ansatz, während der RTHAL eine spezifische Lösung für RTAI ist.
Adeos steht für Adaptive Domain Environment for Operating Systems“ [Yag] und be-
                 ”
schreibt zunächst ein allgemeines Konzept zur Virtualisierung von Hardware zum par-
allelen Betrieb mehrerer Betriebssysteme. Der Adeos Nanokernel für den Linux-Kernel
wird neben dem Einsatz von Linux als Echtzeitbetriebssystem zum Debuggen des Linux-
Kernels und für das Clustern von Mehrprozessorsystemen verwendet.
Im Vergleich zu Virtualisierungslösungen wie VMWare oder VirtualPC, bei denen auf
dem bestehenden Betriebssystem ein Simulator aufgesetzt wird, wird durch den Adeos
Nanokernel das bestehende Betriebssystem unterwandert.
Jedes registrierte Betriebsystem erhält einen Platz in der Interrupt Pipeline. Ein Platz
in der Interrupt Pipeline wird als Domäne bezeichnet, diese bildet den Rahmen für das
zugeordnete Betriebssystem.
Im Falle des Nanokernels für Linux geschieht dies durch einen Patch des Linux-Kernels.
Dieser Patch entzieht dem Linux-Kernel die direkte Kontrolle über die Interrupts und re-
gistriert Linux als eine Domäne im Adeos Nanokernel. Der Linux-Kernel hat weiterhin den
direkten Zugriff auf den gesamten Adressraum der Hardware, sämtliche Interruptvektoren
zeigen nun allerdings auf die Interrupt Pipeline (IPIPE) des Adeos Nanokernels.
Ein ankommender Interrupt wird zunächst an die Domäne an der vordersten Position
übergeben. Nachdem eine Domäne die Bearbeitung eines Interrupts beendet hat, wird
dieser an die nächste Domäne in der Pipeline weitergereicht. Die Bearbeitung endet,
nachdem die letzte Domäne durchlaufen wurde. Die letzte Domäne wird als Leerlauf-
Domäne bezeichnet, da sie nur dann bedient wird, wenn alle weiter vorne platzierten
Domänen im Leerlauf sind.

                               Bild 3.1: Interrupt Pipeline

Die einzelnen Domänen sind voneinander abgeschottet, jedes Betriebssystem sieht nur
sich selbst sowie den Adeos Nanokernel.
Es gibt zwei Arten, auf die ein Betriebssystem mit dem Adeos Nanokernel interagie-
ren kann. Die erste Möglichkeit ist die des reinen Verbrauchers, die nur sehr geringe

                                                                                       19
3 Echtzeitsysteme auf Linux-Basis

Änderungen am Betriebsystem bedingt. Das Betriebssystem hat die Möglichkeit ana-
log zu den Intel Befehlen Set Interrupt Flag (STI) und Clear Interrupt Flag (CLI) die
Interruptbearbeitung in der Pipeline kurzfristig anzuhalten, weitere Möglichkeiten exi-
stieren nicht. Das Ziel von Adeos möglichst wenig an den beteiligten Betriebssystemen zu
verändern wird bei dieser Variante erfüllt.
Bei der zweiten Möglichkeit nimmt das Betriebssystem Einfluß auf die Interrupt Pipeline.
Zum einen hat es die Möglichkeit sich selbst an einen höher priorisierten Platz weiter vorne
in der Interrupt Pipeline zu setzen. Zum anderen kann es entscheiden, ob ein Interrupt
entlang der Pipeline weitergegeben werden soll, und kann damit Einfluß auf die Ressourcen
der anderen Domänen in der Pipeline nehmen.
Im Falle von Linux und RTAI nimmt der Linux-Kernel die Rolle eines reinen Verbrauchers
ein, während RTAI sich an die vorderste Position der Pipeline setzt und den Linux-Kernel
bei Bedarf blockiert. Der Linux-Kernel wird nur dann bedient, wenn sich RTAI im Leerlauf
befindet.
Folgende Illustrationen zeigen die Struktur mit und ohne Interrupt Pipeline:

                 Bild 3.2: Systemaufbau ohne und mit Interrupt Pipeline

Es ist dabei zu beachten, dass die Interrupt Pipeline nur einen Einfluß auf die Interrupts
nimmt. Die Betriebssysteme können weiterhin direkt mit dem Prozessor kommunizieren
und haben Zugriff auf den kompletten Adressraum der Hardware des Rechners.

3.2.3 Taktgenerierung

RTAI unterstützt verschiedene Taktgeber zur Generierung des Taktes für den Scheduler
[Man99].
Auf der x86 Plattform ist als Bestandteil der Architektur in jedem System ein program-
mierbarer Zeitgeber vom Typ 8254 von Intel enthalten. Dieser heutzutage meistens im
Chipsatz integrierte Baustein besitzt drei unabhängige Zähler der Länge 16 Bit, jeder

20
3.2 RTAI

Zähler kann mit bis zu 10 MHz von einem externen Zeitgeber getaktet werden. Frequen-
zen unterhalb der Frequenz des externen Zeitgebers können über einen Teiler erreicht
werden, höhere Frequenzen sind nicht möglich.
Von den zahlreichen vom 8254 unterstützten Modi sind für RTAI der periodische Modus
sowie der sogenannte Oneshot-Modus interessant. Beim periodischen Modus wird nach
jedem Ablauf der Zeitvorgabe ein Interrupt ausgelöst, beim Oneshot-Modus muss der
Timer nach jeder Auslösung neu programmiert werden. Jeder der drei Timer kann nur
exklusiv in einem der beiden Modi betrieben werden.
Obwohl drei Zeitgeber vorhanden sind, muss sich RTAI den ersten Timer zusammen mit
Linux teilen. Dieser wird je nach Konfiguration des Linux-Kernels mit 100 Hz, 250 Hz
oder 1000 Hz getaktet. RTAI steht in diesem Fall also nur die gleiche Zeitgranularität wie
dem Linux-Kernel zur Verfügung. Die weiteren des 8254 Timer sind für andere Dienste
des Systems reserviert.
Die zweite Möglichkeit der Taktgenerierung auf der x86 Plattform ist bei modernen Mul-
tiprozessorsystemen die Verwendung des Local Advanced Programmable Interrupt Con-
trollers (Local APIC). Dieser Teil ist auf jedem Prozessor vorhanden und wird zusammen
mit dem IO APIC zur Synchronisation zwischen den Prozessoren verwendet. Der Local
APIC wird vom Front Side Bus des Systems getaktet und kann ebenso als Zeitgeber im
periodischen Modus bzw. im Oneshot-Modus verwendet werden.
Im verwendeten Testsystem mit einem Intel Pentium 4 Prozessor mit Hyper-Threading
Technologie konnte RTAI über den Local APIC mit 12 MHz versorgt werden. Diese weit
unter dem Takt des Front Side Bus liegende Taktfrequenz entsteht laut einer Nachfra-
ge auf der Mailingliste von RTAI durch die Hardware, RTAI selbst hat hier keine Be-
schränkungen.
Der Local APIC ist im Vergleich zum 8254 nicht pro System, sondern pro Prozessor,
einmal vorhanden. Daraus ergibt sich zusätzlich zum Vorteil des höheren Taktes die
Möglichkeit, sowohl einen Zeitgeber im periodischen Modus, als auch einen Zeitgeber
im Oneshot-Modus, parallel zur Verfügung zu haben.
Der Local APIC kann, sofern auf dem Prozessor vorhanden, über die Konfiguration des
Linux-Kernels aktiviert werden.
Der für den Entwickler relevante Unterschied zwischen dem periodischen Modus und dem
Oneshot-Modus wird zu einem späteren Zeitpunkt erläutert.

3.2.4 Zeitmessung

Seit der Intel Pentium Prozessorenreihe kann über den rdtsc-Befehl der interne Taktzy-
kluszähler des Prozessors ausgelesen werden. Dieser Zähler wird bei jedem Taktzyklus
inkrementiert und hat bei heutigen Prozessoren mit Taktfrequenzen im Bereich von meh-
reren Gigahertz somit eine sehr hohe Auflösung.

                                                                                        21
Sie können auch lesen