ОПИС
HAL розшифровується як Hardware Abstraction Layer (Шар Абстракції Апаратного Забезпечення) і використовується LinuxCNC для передачі даних у реальному часі до пристроїв вводу/виводу та інших низькорівневих модулів та з них.
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 — це дуже модульний підхід до низькорівневих частин системи керування рухом. Мета HAL — дати системному інтегратору можливість з’єднати групу програмних компонентів, щоб задовольнити будь-які вимоги до вводу-виводу, які йому (або їй) потрібні. Це включає в себе ввід-вивід у реальному часі та не в реальному часі, а також базове керування двигуном, включаючи PID-контур позиціонування. Спільним для цих функцій є те, що всі вони обробляють сигнали. Загалом, сигнал — це елемент даних, який оновлюється через регулярні проміжки часу. Наприклад, контур PID отримує команди позиціонування та сигнали зворотного зв’язку і генерує сигнал команди швидкості.
HAL базується на підході, що використовується для проектування електронних схем. В електроніці готові компоненти, такі як інтегральні схеми, розміщуються на друкованій платі, а їхні виводи з’єднуються між собою для створення необхідної загальної функції. Окремі компоненти можуть бути простими, як операційний підсилювач, або складними, як цифровий сигнальний процесор. Кожен компонент можна перевірити окремо, щоб переконатися, що він працює відповідно до проекту. Після розміщення компонентів у більшій схемі сигнали, що їх з’єднують, все ще можна контролювати для тестування та усунення несправностей.
Як і електронні компоненти, компоненти HAL мають контакти, і ці контакти можуть бути з’єднані між собою за допомогою сигналів.
У HAL сигнал містить фактичне значення даних, яке передається від одного виводу до іншого. При створенні сигналу виділяється простір для значення даних. З іншого боку, вивід є покажчиком, а не значенням даних. Коли вивід підключається до сигналу, покажчик виводу встановлюється так, щоб вказувати на значення даних сигналу. Це дозволяє компоненту отримувати доступ до сигналу з дуже невеликими накладними витратами на виконання. (Якщо контакт не пов’язаний з жодним сигналом, покажчик вказує на фіктивне місце, тому код реального часу не повинен мати справу з нульовими покажчиками або розглядати непов’язані змінні як особливий випадок.)
Існує три підходи до написання компонента HAL. Ті, що не вимагають жорсткої реальної продуктивності, можуть бути написані як звичайний нереальний процес. Компоненти, які потребують жорсткої реальної продуктивності, але мають прості вимоги до конфігурації та ініціалізації, можуть бути реалізовані як єдиний компонент реального часу з використанням заздалегідь визначеної інформації про ініціалізацію або параметрів завантаження. Нарешті, складні компоненти можуть використовувати як компонент реального часу для частини реального часу, так і процес нереального часу для обробки доступу до файлу INI, інтерфейсу користувача (можливо, включаючи функції GUI) та інших деталей.
HAL використовує інтерфейс RTAPI/ULAPI. Якщо RTAPI визначено як #defined, hal_lib.c генерує бібліотеку, здатну працювати в режимі реального часу (для інсмодування в ядро або зв’язування з процесом реального часу), яка надає функції для всіх компонентів реального часу. Той самий вихідний файл, скомпільований з #define ULAPI, створить бібліотеку, що не підтримує роботу в режимі реального часу, яка буде пов’язана з кодом, що не підтримує роботу в режимі реального часу, для створення виконуваних файлів, що не підтримують роботу в режимі реального часу. Списки змінних та інформація про зв’язки зберігаються в блоці спільної пам’яті та захищені м’ютексів, щоб компоненти, що підтримують роботу в режимі реального часу, та програми, що не підтримують роботу в режимі реального часу, могли отримати доступ до даних.
МІРКУВАННЯ В РЕАЛЬНОМУ ЧАСІ
Пояснення щодо врахування реального часу див. у rtapi(3).
КОДИ СТАНУ HAL
За винятком випадків, зазначених на окремих сторінках довідки, HAL повертає від’ємні значення errno для помилок та невід’ємні значення для успішних завершень.
ДИВІТЬСЯ ТАКОЖ
rtapi(3)