Sicherheitskritische Echtzeitanwendungen

Einfacher Programmieren mit Ada

19. Februar 2015, 8:08 Uhr | Ralf Higgelke
Diesen Artikel anhören

Fortsetzung des Artikels von Teil 1

Blinker in der »Task«-Version

Bild 2: Hauptprozedur der Blinker-Anwendung in der »Task«-Version
Bild 2: Hauptprozedur der Blinker-Anwendung in der »Task«-Version
© Berger IT Cosmos

Das Hauptprogramm in Bild 2 ist über die Syntax zwischen Zeile 37 »procedure Blinky is« bis Zeile 47 »end Blinky« definiert, ohne in einer »package«-Deklaration beziehungsweise -Definition eingebettet zu sein. Die »with«-Anweisungen ab Zeile 31 ähneln der »include«-Anweisung in C. Dort binden wir zum Beispiel das Package »Timer_Task« ins Hauptprogramm ein. Das Hauptprogramm läuft lediglich in einer leeren Programmschleife (Loop) nach der Initialisierung. Links in Bild 2 ist die Struktur zu sehen: Im Blinky-Projekt ist das Projekt »Common« mit eingebunden, das Hardwaredetails versteckt und eine Bibliothek für mehrere Projekte bildet. Im Timer-Beispiel werden wir später die gleiche Bibliothek benutzen.

Auf dem Board ist das Ravenscar-Profil voreingestellt, dessen Standard-Scheduling-Policy »FIFO_WITHIN_PRIORITIES« ist. Die Main-Task ist hier ein Dummy und darf nicht den »Task« beeinflussen, der die LED kontrolliert. Deswegen wird mit »pragma Priority(Priority’First)« in Zeile 38 der Haupttask auf die niedrigste Priorität gesetzt, im Gegensatz dazu die Timer_Task mit »Priority’Last« auf die höchste Priorität. Bemerkenswert ist, dass mit der with-Anweisung in Zeile 31 der Timer_Task direkt nach der sogenannten Elaboration losläuft, also noch vor der »begin«-Anweisung im Hauptprogramm (Zeile 40), da das Taskobjekt im Package Timer_Task definiert wird.

passend zum Thema

Bild 3: Code des »Package Body« von Timer_Task bei der »Task«-Version
Bild 3: Code des »Package Body« von Timer_Task bei der »Task«-Version
© Berger IT Cosmos

In Bild 3 ist der Code des »Package Body« von Timer_Task dargestellt. Das Package für Echtzeitberechnungen und -prozesse »Ada.Real_Time«, das Bestandteil von Ada ist, wird hier verwendet (Zeile 1). Hier benutzen wir die Funktion »Clock« (Zeile 11), welche die momentane Zeit zurückgibt, und den Typ »Time_Span« (Zeile 12), um ein Zeitintervall von einer Sekunde zu definieren. Der neue Timeout-Wert wird immer wieder neu ermittelt und um 1 s erhöht, bevor mit der Anweisung »delay until Timeout« der Task bis zu diesem Zeitpunkt schläft (Zeile 15).

Bild 4: Hauptprozedur der Blinker-Anwendung in der »Timer«-Version
Bild 4: Hauptprozedur der Blinker-Anwendung in der »Timer«-Version
© Berger IT Cosmos

Somit läuft der Task mit der Frequenz von 1 Hz. Die Prozedur »Toggle_Led« der Common Library (Zeile 17) schaltet die LED um. Bemerkt sei hier, dass im Ravenscar-Profil die delay-Anweisung nicht erlaubt ist, da man mit einer relativen Zeitverzögerung nicht so genau sein kann wie mit einer absoluten. Zudem ersparen wir uns zum Beispiel zu schreiben »Control.Toggle_Led«, da wir mit der »use Control«-Anweisung dem Compiler sagen, in diesem Package nach der entsprechenden Funktion zu suchen.


  1. Einfacher Programmieren mit Ada
  2. Blinker in der »Task«-Version
  3. Blinker in der »Timer«-Version
  4. Ravenscar-Profil und Restrictions

Das könnte Sie auch interessieren

Jetzt kostenfreie Newsletter bestellen!