hal - Introducción a la API HAL
HAL significa Capa de Abstracción de Hardware y LinuxCNC la utiliza para transferir datos en tiempo real desde y hacia dispositivos de E/S y otros módulos de bajo nivel.
hal.h define la API y las estructuras de datos utilizadas por HAL. Este archivo se incluye en componentes HAL de tiempo real y no real. HAL usa la interfaz RTAPI en tiempo real, y los sÃmbolos #define RTAPI y ULAPI se utilizan para distinguir entre código en tiempo real y no real. La API definida en este archivo se implementa en hal_lib.c y se puede compilar para vincularla a componentes HAL en tiempo real o de espacio de usuario.
HAL es un enfoque muy modular para las partes de bajo nivel de un sistema de control de movimiento. El objetivo de HAL es permitir que un integrador de sistemas conecte un grupo de componentes de software juntos para cumplir con los requisitos de E/S que él (o ella) necesita. Esto incluye E/S en tiempo real y no real, asà como control básico del motor hasta, e incluyendo, un lazo de posición PID. La funcion que tienen en común todos ellos es que procesan señales. En general, una señal es un elemento de datos que se actualiza a intervalos regulares. Por ejemplo, un bucle PID obtiene el comando de posición y señales de retroalimentación, y produce una señal de comando de velocidad.
HAL se basa en el enfoque utilizado para diseñar circuitos electrónicos. En electrónica, los componentes listos para usar, como circuitos integrados, se colocan en una placa de circuito y sus pines están interconectados para construir lo que, en general, se necesite. Los componentes individuales pueden ser tan simples como un amplificador operacional, o tan complejo como un procesador digital de señal. Cada componente puede ser probado individualmente, para asegurarse de que funciona según lo diseñado. Después, los componentes se colocan en un circuito más grande y las señales que los conectan pueden ser monitoreadas para pruebas y resolución de problemas.
Al igual que los componentes electrónicos, los componentes HAL tienen pines, y los pines pueden ser interconectados por señales.
En el HAL, una signal o señal, contiene el valor real de datos que pasa de un pin a otro. Cuando se crea una señal, se asigna espacio para el valor de los datos. Un pin, por otro lado, es un puntero, no un valor de datos. Cuando un pin es conectado a una señal, el puntero del pin está configurado para apuntar al valor de los datos de la señal. Esto permite que el componente acceda a la señal con muy poca sobrecarga de tiempo de ejecución. (Si un pin no está vinculado a ninguna señal, el puntero apunta a una ubicación ficticia, por lo que el código en tiempo real no tiene que tratar con punteros nulos o tratar las variables no vinculadas como un caso especial).
Hay tres enfoques para escribir un componente HAL. Los que no requieren un rendimiento en tiempo real se pueden escribir como un proceso único de modo de usuario. Los componentes que necesitan un gran rendimiento en tiempo real pero que tienen una configuración y requisitos de inicio simples se pueden hacer como un unico módulo del núcleo, utilizando información de inicio predefinida o parámetros insmod-time. Finalmente, los componentes mas complejos puede usar tanto un módulo de kernel para la parte en tiempo real como un proceso de espacio de usuario para manejar el acceso a archivos ini, la interfaz de usuario (posiblemente incluyendo funciones de GUI) y otros detalles.
HAL utiliza la interfaz RTAPI/ULAPI. Si RTAPI está definido en hal_lib.c hará generar un módulo kernel hal_lib.o que se "insmoded" y proporciona las funciones para todos los componentes basados ââen módulos del núcleo. El mismo archivo fuente compilado con #define ULAPI lo harÃa en espacio de usuario hal_lib.o que está vinculado estáticamente al código de espacio de usuario para hacer ejecutables de espacio de usuario. Las listas de variables y la informacion de enlaces se almacena en un bloque de memoria compartida y se protege con mutexes, para que los módulos del núcleo y cualquiera de los varios programas en modo de usuario puedan acceder a los datos.
Para obtener una explicación de las consideraciones en tiempo real, consulte intro(3rtapi).
Excepto como se indica en páginas especÃficas del manual, HAL devuelve valores errno negativos para errores y valores no negativos en caso de éxito.
intro(3rtapi)