# RTAI

RTAI Interfaz para Aplicaciones en Tiempo Real, es una implementación de Linux para tiempo real basada en un principio en RTLinux, y actualmente en ADEOS, no es un sistema operativo tal como VXworks o QNX. Se basa en el núcleo Linux, proporcionando la capacidad de hacerla completamente requisable (preemptable). RTAI añade un pequeño núcleo Linux de tiempo real bajo el núcleo estándar de linux y trata al núcleo linux como una tarea de menor prioridad. RTAI además proporciona una amplia selección de mecanismos de comunicación entre procesos y otros servicios de tiempo real.
Adicionalmente, RTAI proporciona un módulo llamado LXRT para facilitar el desarrollo de aplicaciones de tiempo real en el espacio de usuario.

## Arquitectura

RTAI tiene una arquitectura similar a RTLinux. Al igual que RTLinux, RTAI trata el núcleo estándar de Linux como una tarea de tiempo real con la menor prioridad, lo que hace posible que se ejecute cuando no haya ninguna tarea con mayor prioridad ejecutándose. Las operaciones básicas de las tareas de tiempo real son implementadas como módulos del núcleo al igual que RTLinux. RTAI maneja las interrupciones de periféricos y son atendidas por el núcleo linux después de las posibles acciones de tiempo real que hayan podido ser lanzadas por efecto de la interrupción.
En la arquitectura básica de RTAI, que es muy similar a la de RTLinux, las interrupciones se originan en el procesador y en los periféricos. Las originadas en el procesador (principalmente señales de error como división por cero), son manejadas por el núcleo estándar, pero las interrupciones de los periféricos (como los relojes) son manejadas por RTAI Interrupt Dispatcher. RTAI envía las interrupciones a los manejadores del núcleo estándar de linux cuando no hay tareas de tiempo real activas. Las instrucciones de activar/desactivar las interrupciones del núcleo estándar son reemplazadas por macros que se enlazan con las instrucciones de RTAI. Cuando las interrupciones están desactivadas en el núcleo estándar, RTAI encola las interrupciones para ser repartidas después de que el núcleo estándar haya activado las interrupciones de nuevo.
Adicionalmente, el mecanismo de comunicación entre procesos (IPC), que está implementado de forma separado por Linux y por RTAI. También existe un planificador (scheduler) distinto para Linux y para RTAI.

## HAL – Hardware Abstraction Layer

Los desarrolladores de RTAI introducen el concepto de Real Time Hardware Abstraction Layer (RTHAL) que es usado para interceptar las interrupciones hardware y procesarlas después. RTHAL es una estructura instalada en el núcleo Linux que reúne los punteros a los datos internos del hardware relacionados en el núcleo y las funciones necesarias por RTAI para operar.

## Planificación

Las unidades de planificación de RTAI son las tareas. Siempre hay al menos una tarea, llamada núcleo linux, que ejecuta como la tarea de menor prioridad. Cuando las tareas de tiempo real son añadidas, el planificador da entonces mayor prioridad a éstas sobre la tarea del núcleo Linux. El planificador proporciona servicios tales como suspend, resume, yield, make periodic, wait until, que son usadas en varios sistemas operativos de tiempo real.
El planificador es implementado como un módulo del núcleo dedicado (contrario a RTLinux) lo que facilita la implementación de planificadores alternativos si es necesario. Actualmente hay tres tipos de planificadores dependiendo del tipo de máquina:

### Uniprocesador (UP)

es aquel que es de un solo usuario

### Multiprocesador simétrico (SMP)

Está diseñado para máquinas SMP y proporciona una interfaz para las aplicaciones de forma que es posible seleccionar el procesador o procesadores que deben ejecutar una tarea. Si el usuario no especifica un procesador para la tarea, SMP selecciona el procesador en función de la carga de trabajo.

### Multi-Uniprocesador (MUP)

Puede ser usado con ambos, pero al contrario que SMP, a las tareas se les debe especificar el procesador que deben usar. Viéndolo por el lado positivo, el planificador MUP permite unos mecanismo de tiempo más flexibles para las tareas que los planificadores SMP o UP.

## Características de RTAI

Con el objetivo de hacer el desarrollo de aplicaciones más fáciles y flexibles posibles, los desarrolladores de RTAI han introducido diferentes mecanismos para la comunicación entre procesos (IPC), entre las tareas de tiempo real y los procesos en el espacio de usuario. Como añadido al mecanismo IPC, RTAI proporciona servicios de manejo de memoria y threads compatibles con Posix.

## Comunicación entre procesos (IPC – Inter-process comunication)

RTAI proporciona una variedad de mecanismos para la comunicación entre procesos. Aunque los sistemas Unix proporcionan mecanismos similares a IPC para los procesos en el espacio de usuarios, RTAI necesita proporcionar una implementación propia para que las tareas de tiempo real puedan usar este mecanismo y no usen el estándar del núcleo Linux. Los diferentes mecanismo de IPC están incluidos como módulos de núcleo, lo que facilita la carga cuando son necesarios. Como ventaja adicional, el uso de módulos para los servicios IPC facilita el mantenimiento y la expansión.
El antiguo mecanismo básico de comunicación de RTAI eran los FIFOs. FIFO es un asíncrono y no bloqueante canal de comunicación entre los procesos de Linux y las tareas de tiempo real. La implementación de RTAI de FIFO está basado en la implementación de RTLinux, pero RTAI proporciona algunas características que no son posibles en RTLinux. Primeramente RTAI puede lanzar señales cuando hay eventos en el FIFO (escritura de nuevos datos). Los procesos en el espacio de usuario pueden entonces crear un manejador para la señal por los mecanismos estándar de Unix. Sin embargo, este mecanismo no es necesario para los procesos de usuario que quieran leer o escribir del FIFO. Adicionalmente, puede haber múltiples lectores y escritores en el FIFO, cosa que no es posible en la versión de RTLinux. Finalmente, los identificadores FIFO pueden ser dinámicamente localizados con un nombre simbólico. Antes era necesario establecer un identificador global para el FIFO, lo que causaba problemas cuando múltiples e independientes procesos y tareas lo usaban.
Los semáforos es otra herramienta básica de sincronización entre procesos usada en los sistemas operativos. RTAI proporciona un API para usar semáforos, aunque cada semáforo esta técnicamente asociado a un FIFO, por tanto cada semáforo usa una entrada global del FIFO. Como añadido al servicio básico de semáforos, un semáforo puede estar asociado con un reloj, el cual puede ser usado para despertar un proceso encolado en un semáforo, incluso cuando el semáforo aún está cerrado.
La compartición de memoria proporciona una alternativa a IPC y al paradigma FIFO, cuando un modelo de comunicación diferente es requerido. La memoria compartida es un bloque común de memoria que puede ser leída o escrita por un proceso y una tarea en el sistema. Como los diferentes procesos pueden operar de forma asíncrona en la región de memoria, es necesario un diseño para asegurar que los datos no sean sobreescritos de forma intencionada.
Finalmente, el método más flexible de IPC quizás sean los mailboxes. Cualquier número de procesos pueden enviar y recibir mensaje de y desde un mailbox. Un mailbox almacena mensajes hasta un límite que se defina, y contrario a los FIFOs, mailbox preserva los mensajes que están en el límite. Puede haber un número arbitrario de mailbox activos en el sistema simultáneamente. RTAI también facilita la comunicación entre procesos mediante RPC.

## Gestión de memoria

En las primeras versiones de RTAI la memoria tenía que ser asignada estáticamente y no era posible las asignación en tiempo real. Sin embargo en las actuales versiones se incluye un módulo gestor de memoria que permite la asignación dinámica de memoria por parte de las tareas de tiempo real usando una interfaz basada en una biblioteca estándar de C.
RTAI preasigna trozos de memoria antes de la ejecución de tiempo real. Cuando la tarea de tiempo real llaman a la función rt_malloc, la respuesta que obtiene es el trozo preasignado. Antes de que el espacio se agote, RTAI reserva nuevos trozos de memoria (preasigna) para futuras llamadas. De manera similar ocurre con la función rt_free, en este caso, se libera la memoria preasignada a la espera de futuras reservas. Cuando la suma de memoria liberada es mayor que un valor para una marca, se ordena su liberación.

## Threads Posix

RTAI tiene módulos que proporcionan la implementación de threads de acuerdo al estándar POSIX 1003.1c. Usando las operaciones especificadas en el estándar, el usuario puede manejar de manera similar a como lo hace con los threads posix convencionales, excepto en cuanto a los conceptos de joining y detaching.
Los threads de un mismo proceso comparten el espacio de memoria, por tanto es fácil el intercambio de información entre ellos, sin embargo, el uso de áreas de memoria compartida son necesarias para la sincronización. También se proporcionan los mecanismos de mutex y de variables de condición.

## Enlaces

* RTAI (Artículo) (en inglés)
* RTAI (Historia) (en inglés)
* RTAI (web oficial) (en inglés)
* RTAI (Manual de instalación en Centos 5)
* Datos: Q730693