LinuxCNC Documentation

BESCHREIBUNG

HAL steht für Hardware Abstraction Layer, und wird von LinuxCNC verwendet, um Echtzeit-Daten zu und von E/A-Geräten und anderen Low-Level-Modulen zu übertragen.

hal.h defines the API and data structures used by the HAL. This file is included in both realtime and non-realtime HAL components. HAL uses the RTPAI real-time interface, and the #define symbols RTAPI and ULAPI are used to distinguish between realtime and non-realtime code. The API defined in this file is implemented in hal_lib.c and can be compiled for linking to either realtime or non-realtime HAL components.

HAL ist ein sehr modularer Ansatz für die unteren Teile (nahe der Hardware) eines Bewegungssteuerungssystems. Das Ziel von HAL ist es, einem Systemintegrator die Möglichkeit zu geben, eine Gruppe von Softwarekomponenten miteinander zu verbinden, um alle E/A-Anforderungen zu erfüllen, die er (oder sie) benötigt. Dazu gehören Echtzeit- und Nicht-Echtzeit-E/A sowie die grundlegende Motorsteuerung bis hin zu einer PID-Positionsschleife. Was diese Funktionen gemeinsam haben, ist, dass sie alle Signale verarbeiten. Im Allgemeinen handelt es sich bei einem Signal um ein Datenelement, das in regelmäßigen Abständen aktualisiert wird. Eine PID-Schleife erhält beispielsweise Positionsbefehls- und Rückkopplungssignale und erzeugt ein Signal zur Steuerung der Geschwindigkeit.

HAL basiert auf dem Ansatz, der für den Entwurf elektronischer Schaltungen verwendet wird. In der Elektronik werden handelsübliche Komponenten wie integrierte Schaltkreise auf einer Leiterplatte platziert und ihre Pins miteinander verbunden, um die gewünschte Gesamtfunktion zu erreichen. Die einzelnen Komponenten können so einfach sein wie ein Operationsverstärker oder so komplex wie ein digitaler Signalprozessor. Jede Komponente kann einzeln getestet werden, um sicherzustellen, dass sie wie vorgesehen funktioniert. Nachdem die Komponenten in einen größeren Schaltkreis eingefügt wurden, können die Signale, die sie verbinden, immer noch zur Prüfung und Fehlersuche überwacht werden.

Wie elektronische Bauteile haben auch HAL-Bauteile Pins, die durch Signale miteinander verbunden werden können.

In der HAL enthält ein Signal den tatsächlichen Datenwert, der von einem Pin zum anderen weitergegeben wird. Wenn ein Signal erstellt wird, so wird Platz für den Datenwert zugewiesen. Ein Pin hingegen ist ein Zeiger, kein Datenwert. Wenn ein Pin mit einem Signal verbunden wird, dann wird der Zeiger des Pins so gesetzt, dass er auf den Datenwert des Signals zeigt. Dadurch kann die Komponente mit sehr geringem Laufzeit-Overhead auf das Signal zugreifen. (Wenn ein Pin nicht mit einem Signal verbunden ist, zeigt der Zeiger auf einen Dummy-Speicherplatz, so dass der Echtzeitcode nicht mit Null-Zeigern umgehen oder nicht verbundene Variablen in irgendeiner Weise als Sonderfall behandeln muss.)

Es gibt drei Ansätze für das Schreiben einer HAL-Komponente. Komponenten, die keine harte Echtzeitleistung erfordern, können als regulärer Nicht-Echtzeit-Prozess geschrieben werden. Komponenten, die harte Echtzeitleistung benötigen, aber einfache Konfigurations- und Initialisierungsanforderungen haben, können als einzelne Echtzeitkomponente geschrieben werden, wobei entweder vordefinierte Initialisierungsinformationen oder Ladezeitparameter verwendet werden. Komplexe Komponenten schließlich können sowohl eine Echtzeitkomponente für den Echtzeitteil als auch einen Nicht-Echtzeitprozess für den Zugriff auf INI-Dateien, die Benutzeroberfläche (möglicherweise einschließlich GUI-Funktionen) und andere Details verwenden.

HAL verwendet die RTAPI/ULAPI-Schnittstelle. Wenn RTAPI #defined ist, erzeugt hal_lib.c eine echtzeitfähige Bibliothek (die mit insmod in den Kernel eingefügt oder mit einem Echtzeitprozess verknüpft werden kann), welche die Funktionen für alle Echtzeitkomponenten bereitstellt. Dieselbe Quelldatei, die mit dem ULAPI-#define kompiliert wurde, würde eine Nicht-Echtzeit-Bibliothek erstellen, die mit Nicht-Echtzeit-Code verknüpft wäre, um ausführbare Dateien ohne Echtzeit zu erstellen. Die Variablenlisten und Link-Informationen werden in einem gemeinsamen Speicherblock gespeichert und mit Mutexen geschützt, so dass Echtzeitkomponenten und Nicht-Echtzeitprogramme auf die Daten zugreifen können.

REALTIME CONSIDERATIONS

Für eine Erläuterung der Echtzeitüberlegungen siehe rtapi(3).

HAL STATUS CODES

Außer wie in bestimmten Handbuchseiten angegeben, gibt HAL negative errno-Werte für Fehler und nicht-negative Werte für Erfolg zurück.

SIEHE AUCH

rtapi(3)