Las tareas de RT-Linux deben ``buscarse la vida'' para comunicarse con el exterior, es decir, programar sus propios controladores de dispositivos, accediendo directamente a la E/S. Sin embargo, en ocasiones se desea realizar algún tipo de monitorización de lo que sucede al sistema de tiempo real, desde Linux, la tarea menos prioritaria. Esto es así pues es, evidentemente, la única manera segura de usar recursos complejos como el disco (para almacenar datos) o la red.
RT-Linux proporciona para ello las colas de tiempo real (RT-FIFO). Las colas de tiempo real son similares a los pipes nombrados de Unix: existe un dispositivo especial, /dev/rtfN, donde pueden leer y escribir con seguridad, tanto tareas de tiempo real como procesos del sistema Linux.
Estos ficheros de dispositivo llevan como número principal, el 63, y como número secundario, de 0 a 19 (se permiten hasta 20 RT-FIFOS). Pueden crearse con el comando mknod /dev/rtfN c 63 N, donde N va de 0 a 19.
Los procesos Linux pueden leer y escribir en un RT-FIFO de la manera habitual: abren el dispositivo con la llamada al sistema open() y leen o escriben en él con las llamadas respectivas read() y write().
Para tratar los RT-FIFOs desde las tareas de tiempo real tenemos las siguientes funciones (previa inclusión de linux/rtf.h:
Para abrir el RT-FIFO n se usa:
extern int rtf_create(unsigned int n, int tamanyo);
El tamaño es la capacidad en bytes de la cola. Hay que tener en cuenta que la escritura en RT-FIFOs desde la tarea de tiempo real no es bloqueante, de manera que si un RT-FIFO se llena se empezarán a ignorar los nuevos datos. La función devuelve el tamaño solicitado si hubo éxito, o -1 si no pudo crearse la cola.
Para abandonar un RT-FIFO, usamos:
extern int rtf_destroy(unsigned int fifo);
Es posible, una vez abierto un RT-FIFO, reajustar su tamaño. No sirve de mucho esta función ya que se pierden los datos que haya dentro, sin embargo resulta más rápido que cerrarlo y volverlo a abrir con el nuevo tamaño:
extern int rtf_resize(unsigned int fifo, int nuevo_tam);
La función devuelve el tamaño nuevo si hay éxito, o -1 si no pudo realizarse.
Para leer caracteres de un RT-FIFO abierto tenemos:
extern int rtf_get(unsigned int fifo, char *datos, int nbytes);
La función tratará de leer nbytes de la cola e introducirlos en el báfer datos. Si hay datos suficientes retornará el número nbytes. Si no, retornará -1.
Para escribir algo a la RT-FIFO tenemos:
extern int rtf_put(unsigned int fifo, char *datos, int nbytes);
Retornará nbytes si hay espacio en la cola para introducir nbytes caracteres del báfer datos, o -1 si no hay espacio suficiente.
Finalmente, podemos crear un controlador de RT-FIFOS, es decir, una función que se activa cuando algún proceso usa la RT-FIFO. La función es:
extern int rtf_create_handler (unsigned int fifo, int (*handler)(unsigned int fifo));
La función controladora se activa y recibe como parámetro la RT-FIFO cuando algún proceso Linux lee o escribe en la RT-FIFO.
Una anotación importante: cuando vayamos a usar RT_FIFOs, hay que instalar antes otro módulo que es quien hace las operaciones con las colas de tiempo real. Este módulo que hay que cargar antes es rt_fifo_new.