II75. Sistemas de Tiempo Real Programación en RT-Linux Introducción En esta práctica se va a realizar otra implementación práctica con técnicas de programación en tiempo real, utilizando conceptos vistos de tareas periódicas, acceso a recursos hardware, manejo de interrupciones y comunicación entre tareas a través de FIFOS y/o otros mecanismos. En particular, la práctica trata de realizar una comunicación en tiempo real entre dos ordenadores conectados por el puerto paralelo, a través del protocolo descrito en las secciones siguientes. También se propone el mismo ejercicio pero simulando la interacción hardware, que igualmente utiliza conceptos como los descritos anteriormente. Driver para comunicación bi-direccional a través de un puerto paralelo. Opción 1. Utilización del hardware del puerto paralelo. El driver para la gestión de la comunicación a través del puerto paralelo conectando dos ordenadores deberá gestionar la comunicación utilizando las líneas de datos e información de estado y control que se muestran en la siguiente figura. BUSY STROBE BUSY STROBE ACK SELECT PRN AKC SELECT PRN DATOS El funcionamiento de la comunicación consistirá en los siguientes principios: 1. Al inicializar el driver, el bit de la línea de STROBE deberá estar a “0” y se habilitará la interrupción de ACK. 2. Cuando se quiera enviar un dato, se comprobará que la línea está libre, BUSY=0, y se colocará a “1” la línea de STROBE para indicar al otro lado que se ocupa la línea. Para liberar la línea se pondrá la señal de STROBE a “0”. 3. Para generar una interrupción al otro lado, se pondrá el bit de SELECT PRINTER a “0” durante un cierto periodo de tiempo, poniéndolo a “1” de nuevo para poder generar un flanco de bajada. 4. Para recoger el dato del puerto, se debe pasar a modo bi-direccional y, una vez leído, volver a modo normal para devolver las líneas de control y de estado a modo funcionamiento estándar. El driver consistirá en: 1. Una función manejadora de la interrupción, que una vez leído el dato del puerto, lo colocará en una FIFO, para que lo pueda leer otra tarea RT o proceso Linux. Esta FIFO representará el buffer de recepción de datos a recoger por la aplicación. 2. Una tarea periódica de periodo T, que en cada periodo compruebe si la línea esta libre. Si está libre, consulte si hay un dato disponible en otra FIFO que representará el buffer de datos de emisión. Si hay dato disponible, lo sacará de la FIFO y lo enviará al puerto de datos según el principio de funcionamiento indicado anteriormente. Se implementará una aplicación de “talk” entre dos ordenadores consistiendo en dos procesos Linux, uno para mostrar lo que se recibe y otro para enviar a la FIFO de emisión lo que se quiere enviar al otro ordenador. Como sugerencia para una implementación sencilla, cada proceso se puede implementar en sendos programas 1 independientes. Para comprobar su funcionamiento, se ejecutarán simultáneamente cada uno en un terminal de texto diferente (si se utiliza el entorno gráfico, se puede ejecutar cada uno en una ventana y poder ver al tiempo el texto que se va recibiendo y que se va enviado). Opción 2. Simulación del funcionamiento del puerto paralelo. Si no se dispone de dos ordenadores o de un cable configurado según el esquema anterior, se puede simular el comportamiento del puerto paralelo y de la interrupción de la siguiente forma: 1. Enviar una señal de ACK al otro PC mediante la línea SELECT PRINTER se simulará escribiendo un dato cualquiera en una FIFO, Dicha FIFO representará la interrupción del puerto paralelo del puerto del otro PC al que se le envía la señal. 2. La función manejadora de la interrupción generada por el flanco de bajada de ACK se simulará mediante una función manejadora de la FIFO que representará la interrupción. 3. Crear una estructura de datos que represente la conexión entre los dos puertos, con un campo de tipo byte que represente el puerto de datos y otro campo de tipo booleano, por ejemplo, que simule la línea de STROBE-BUSY. La simulación del funcionamiento de dos ordenadores se realizará implementado en módulos diferentes cada una de las tareas y procesos que simulen un ordenador. Se puede utilizar un tercer módulo que puede representar la conexión de los puertos paralelos, donde estará situada la estructura de datos que representa la conexión entre los dos puertos. El resto del esquema de funcionamiento, incluyendo la utilidad de “talk”, se implementará de la misma forma según las especificaciones descritas en la Opción 1. 2 Apéndice. El puerto paralelo El puerto paralelo está controlado desde el PC por tres registros de 8 bits. Hay un registro de datos (0x378), uno de estado (0x379) y otro de control (0x37A). Escribiendo en el registro de control se puede programar el funcionamiento del puerto. De los 8 bits del registro, el bit 4 de IRQ, representa la activación/desactivación de la interrupción que genera la señal de ACK en el puerto de estado. Escribiendo un "1" en este bit, el hardware del puerto paralelo generará una interrupción (normalmente la número 7) cuando detecte que la línea de estado ACK pasa de nivel alto (5 voltios, “1” lógico) a nivel bajo (0 voltios, “0” lógico). En un puerto paralelo bi-direccional, es decir, que puede tanto leer como escribir datos (EPP Enhaced Paralell Port), se puede habilitar el modo bi-direccional escribiendo un “1” en el bit número 5 del puerto de control. Habilitando este bit, leyendo el registro de datos nos dará el valor que figura en esos momentos en las líneas de datos del cable conectado al puerto. No obstante, al pasar a este modo, solo se pueden leer datos de entrada, por lo que debe pasarse a modo normal para poder enviar datos por el puerto. Además, activando el modo bi-direccional, el funcionamiento de otras líneas de control y estado varían (ver documento sobre funcionamiento del puerto paralelo en la página web de la asignatura). El puerto de control también posee un bit, el número “0” de STROBE, que puede ser de entrada y salida, dependiendo del modo de funcionamiento del puerto. Este bit puede utilizarse como bit de salida para indicar que existe un dato disponible en el puerto, y por tanto indicar si está la línea ocupada con un dato. El bit 3 del puerto de control, SELECT PRINTER, se puede utilizar también como línea de salida. Escribiendo en este bit, el valor aparece en la patilla correspondiente del conector del puerto paralelo. El registro de datos es una puerta directa a las patillas del conector. Cualquier dato que escribamos en ese puerto, aparecerá en las patillas 2 a 9 del conector paralelo. Este puerto es sólo de salida, pero cuando el puerto se encuentra en modo bi-direccional anteriormente descrito, funciona como puerto de entrada, pudiendo leer el dato que en esos momentos está en el puerto de datos. El puerto de estado refleja el estado de las líneas de control con la impresora. Mediante estas líneas la impresora es capaz de informar al ordenador sobre el estado en el que se encuentra. Son líneas que gestiona la impresora (o dispositivo externo) y que lee el ordenador, por tanto son líneas de entrada. Aunque el registro es de 8 bits, solo los 5 bits de mayor peso están conectados a las líneas, los otros tres bits están siempre a cero. Los nombres de las líneas tienen su origen en la función que desempeñan cuando se utilizan para comunicarse con una impresora, pero realmente estas líneas son unas entradas digitales genéricas que se pueden utilizar para casi cualquier cosa. De estas 5 líneas la más interesante es la patilla 10 (bit 6 del registro), pues además de servir como línea de entrada digital, también se pueden producir interrupciones cuando la línea cambia de estado (de 5 voltios a 0), tal como se comentó en párrafos anteriores. En un puerto en modo bi-direccional, la línea SELECT, bit número “4” del puerto de estado, es de salida, por lo que puede también utilizarse para poder sacar algún tipo de información. Como línea de entrada se puede utilizar el bit 7 del puerto de estado, BUSY. Leyendo este bit se puede ver el valor que aparece en la correspondiente patilla del conector del puerto paralelo. 3