You are on page 1of 10

6.1 Interrupciones.

Concepto de interrupción: Ya que un procesador no puede procesar simultáneamente varios trozos de información (procesa un trozo de información por vez), un programa que está siendo ejecutado puede, gracias al pedido de interrupción, ser momentáneamente suspendido mientras se produce una interrupción. El programa interrumpido puede continuar ejecutándose luego. Existen 256 direcciones de interrupción diferentes. Una interrupción se convierte en una interrupción de hardware cuando es solicitada por uno de los componentes de hardware del equipo. En efecto, existen varios periféricos en un equipo. Estos periféricos necesitan generalmente utilizar los recursos del sistema aunque sólo sea para comunicarse con el sistema mismo. Cuando un periférico desea acceder a un recurso, envía un pedido de interrupción al procesador para llamar su atención. Los periféricos cuentan con un número de interrupción que se denomina IRQ (Peticiones de Interrupción. Es como si cada periférico tirara de un hilo que está atado a una campana para señalarle al equipo que desea que le preste atención. Este hilo es, de hecho, una línea física que conecta cada ranura de expansión así como cada interfaz E/S a la placa madre. Para una ranura ISA de 8 bits, por ejemplo, hay 8 líneas IRQ que unen ranuras ISA de 8 bits a la placa madre (IRQ0 a IRQ7). Estos IRQ están controlados por un controlador de interrupción que se encarga de cederle la palabra al IRQ que posee la mayor prioridad. Los métodos interrupt que se manejan en Java. Son 3 1. 2. 3. Interrupt() Interrupted() isInterrupted()

Interrupciones Sintaxis Public void interrupt () Interrumpe este thread Primero el método checkAccess de este thread es invocado, lo cual puede causar una Security Exception. Si este thread es bloqueado al invocar el wait(), wait(long), o wait(long, int) métodos de la clase objeto, o de los métodos join(), join(long), join(long,int), sleep(long), o sleep(long, int) de esta clase entonces los mismos interrupts(de la misma clase) serán despejados y se recibirá un Interrupted Exception.

posiblemente con un valor diferente a cero. entonces el estado en interrupt del thread será fijado (activado).Si este thread es bloqueado en una operación de E/S ante un canal interrumpidle. y el thread recibirá un Closed by Interrupt Exception. El estado de interrupción del thread no es afectado por este método. Returns: Verdadero si el thread actual a sido interrumpido. El estado de interrupción del thread es deshecho por este método. En otras palabras. Throws: Secutity Exception. falso de lo contrario IsInterrupted Sintaxis Public boolean isInterrupted () Hace una prueba para ver si este thread a sido interrumpido. Algunos canales están conectados a ellas en la caja del computador. Ranuras de expansión: Se conectan al bus eléctrico común. justo como si el método del selector wakeup hubiera sido invocado. 6. Si ninguna de las condiciones pasadas se cumple. entonces el canal se cerrará. entonces el estado del thread de intrrupt será fijado. la segunda vez devolvería un valor falso (al menos que el thread actual sea interrumpido de nuevo. Si el thread actual no puede cambiar el thread. Los usuarios pueden personalizar sus máquinas insertando tarjetas de circuitos (o tarjetas) de propósito especial en estas ranuras. el estado de interrupt del thread se fijara. Los canales más anchos pueden transmitir información con más rapidez que los canales angostos. Tienen 8. y retornara inmediatamente de la operación de selección. Interrupted (interrumpido) Sintaxis Public static boolean interrupted () Hace una prueba si el thread actual a sido interrumpido. Si este thread es bloqueado en un selector. si este método se llamara dos veces.2 Generalidades de los puertos. adaptadores de color y . después de que la primera llamada haya terminado su interrupción y antes de que la segunda empiece). Canales Grupos de cables a través de los cuales viaja la información entre los componentes del sistema. Existen tarjetas de expansión de RAM. 16 o 32 cables y este número indica la cantidad de bits de información que puede transmitir al mismo tiempo.

Puertos paralelos Permiten la transmisión paralela de datos. Sin embargo. El puerto permite una conexión directa con el bus eléctrico común de la PC.3. o si se necesita una latencia baja. 6. Puerto serial: El puerto serial es aquel que envía y recibe los datos BIT por BIT. El Universal Serial Bus (bus universal en serie) o Conductor Universal en Serie (CUS). y mejorar las capacidades plug-and-play permitiendo a esos dispositivos ser conectados o desconectados al sistema sin necesidad de reiniciar. Puertos Son puntos de conexión en la parte exterior del chasis de la computadora a los que se conectan algunos canales. cabe decir que cuando se conecta un nuevo dispositivo. abreviado comúnmente USB. los buses PCI o PCIe salen ganando. etc. Igualmente sucede si la aplicación requiere de robustez industrial. los puertos pueden ser: Puertos series Permiten la transmisión en serie de datos. puertos. o el puerto del MODEM. es un puerto que sirve para conectar periféricos a una computadora. unidades de cinta magnética de respaldo y otras computadoras. 6. Permiten la interfaz con dispositivos tales como impresoras de alta velocidad. entre los puertos seriales se puede mencionar el puerto de teclado. en aplicaciones donde se necesita ancho de banda para grandes transferencias de datos.1 USB. A favor del bus USB. . es decir que se transmiten varios bits simultáneamente. El diseño del USB tenía en mente eliminar la necesidad de adquirir tarjetas separadas para poner en los puertos bus ISA o PCI. el servidor lo enumera y agrega el software necesario para que pueda funcionar. Este tipo de puertos permiten una interfaz con impresoras y módems de baja velocidad. fax módem.3 Puerto serial y sus variantes. Las ranuras de expansión y los puertos simplifican la adición de dispositivos externos o periféricos.de gráficos. coprocesadores (procesadores adicionales que incrementan la capacidad o velocidad de procesamiento del sistema). un bit a la vez.

En el diseño original del PC. Este bit habilita o permite que se produzca la interrupción asociada a la entrada ACK#. no enmascarada. etc. Existen otras asignaciones de memoria en otras capas superiores de memoria pero estas son hechas por el sistema operativo y por los demás programas. Para que una petición de una IRQ llegue a la CPU. ésta debe estar permitida. El puerto 021h está asociado con la máscara de interrupciones de las IRQ. IBM reservó 8 interrupciones hardware. como muestra el código siguiente: in al. Puerto paralelo: Este tipo de puerto transmite la información byte por byte. Por medio de estas localidades de memoria el sistema puede enviarles o recibir información. estando sus vectores a partir de la dirección 0000:003Ch. o enviarla.4 Paralelo y sus variantes. lee la máscara de las IRQ . la IRQ1 con la 09h. o sea que transmite ocho bits al mismo tiempo. 6. de forma paralela. El bit 4 del puerto de control se denomina IRQEN. que son comúnmente conocidas como IRQ0 a IRQ7. Los puertos no solo se limitan a recibir la información. lo mismo que un puerto de entrada o de entrada / salida. Así la IRQ0 se corresponde con la interrupción 08h. A cada puerto la BIOS le asigna una dirección de memoria para que pueda trabajar. comenzando por la interrupción 08h. según sea el caso. para expansión de interrupciones.5 Interrupciones que intervienen en cada puerto. pero estas asignaciones son para fines específicos de los demás programas. Para habilitar una determinada interrupción se deberá escribir un cero en la posición correspondiente. dependiendo de que clase de puerto sea se le asigna un determinado espacio exclusivo para él. Manejo de la interrupción del puerto paralelo. Cuando este bit está a 1 y la señal ACK# pasa del nivel lógico 1 al nivel 0 se produce una petición de interrupción. si lo que se quiere es permitir la IRQ7 habrá que poner a cero el bit más significativo del puerto 021h.6. sin modificar el resto. El puerto provee la corriente eléctrica necesaria para el funcionamiento del dispositivo y revisa el estado de este.021h . Un puerto paralelo por excelencia pues es el puerto para impresora Se puede observar que un puerto de entrada puede ser paralelo o serial. A esto se le llama espacio de localidades de memoria y se realiza dentro del primer kilo bite de la memoria principal. que es la IRQ7. Así. es una especie de memoria de intercambio para la transmisión de dados de un lugar a otro. La IRQ7 se corresponde pues con la 0Fh.

teniendo por encima una capa muy simple de transporte de bytes. dejando la máscara del puerto 021h como estaba. es decir: mov al. 020h . Por ejemplo. se pueden enviar los códigos de inicio y fin de trabajo. A continuación se verán estos pasos detalladamente. No modifica el resto out 021h. 3. sino que también se debe inhibir la IRQ7. el modelo ISO de comunicaciones utilizado por TCP/IP también se aplica en este caso en que hay una capa eléctrica. Proporcionar al API de Comunicaciones Java control sobre alguno de los dispositivos. Escribir o leer algunos datos siguiendo el protocolo especificado para el dispositivo. el programa debe indicar a la CPU que la interrupción ya ha sido procesada. la pila PPP puede utilizar el API de Comunicaciones Java para la transferencia de bytes al módem. IRQ7. las tareas a realizar serían: 1. tanto en un sentido como en otro. Abrir el dispositivo y acondicionar la línea a la velocidad. Un programa que utilice la interrupción del puerto paralelo puede tener esta estructura. tan sólo queda por activar el bit que permite que la señal ACK# genere una petición de IRQ7. Para ello se deberá poner a 1 el bit 4 del puerto de control . paridad. 4. Al finalizar el programa. con ejemplos de código de la forma de realizar estas tareas. 2. carga en al 0010 0000 b out 020h. 01111111b . escribe la máscara Con estas operaciones quedará habilitada la IRQ7. Antes de usar un dispositivo. Además de proporcionar un protocolo. lo escribe en al puerto 020h Finalmente. Por ejemplo. sin modificar el resto. Inicialización del API con puertos serie . al . basta con poner a cero este bit. que se requiera. al .6 Envío y recepción de los datos. si hay que comunicarse con una impresora.and al. El trabajo con la capa de Comunicaciones es realmente poco cuando se usa en este contexto. el API debe conocerlo. no sólo se deben restablecer los vectores de interrupción modificados. Una vez atendida de la forma que se haya previsto. en lo que se refiere al manejo de dicha interrupción 6. etc. impone un 0 en el bit más significativo. para ello debe escribir un 1 en el bit 5 del puerto 020h. Cuando no se quiera que se produzca una IRQ7. Cerrar el puerto.

CommPortIdentifier. ya que en el arranque. OutputStream salida.addPort( ttya.SerialPort. se pueden añadir explícitamente utilizando código semejante al que se reproduce a continuación. En la última versión que JavaSoft ha proporcionado de este API.PORT_SERIAL ).getPortIdentifier( dispositivo ). // Registro del dispositivo CommPort ttya = new javax.timeout ).int timeout ) throws Exception { CommPortIdentifier idPuerto = CommPortIdentifier. CommPortIdentifier. SerialPort puertoSerie = null. CommPortIdentifier."/dev/ttyb" ).solaris.setSerialPortParams( 9600. puertoSerie. 1 bit de parada.STOPBITS_1. el API realiza una búsqueda de los puertos disponibles en la máquina en que se ejecuta y los va incorporando automáticamente. no es necesario que se inicialicen los puertos.openPort( "PuertoSerie". CommPort ttyb = new javax.SolarisSerial( "ttyb".comm.PARITY_NONE ).addPort( ttyb. El dispositivo conectado a esta línea tiene una velocidad de 9600 baudios. SerialPort. y lo que se pretende es proporcionar dos canales. fijan las características y abre un dispositivo.CommPortIdentifier. puertoSerie = (SerialPort)idPuerto. o streams. .solaris.comm. Apertura y Acondicionamiento de Dispositivos El código que aparece a continuación muestra como se añade.El API de Comunicaciones Java solamente puede controlar puertos de los cuales tenga conocimiento.PORT_SERIAL ).DATABITS_8. El ejemplo fija un dispositivo serie determinado para que sea accesible con el nombre ControlPuertoSerie.int baudios. uno para leer y otro para escribir en el dispositivo conectado a este puerto.SolarisSerial( "ttya". y en caso de que la nomenclatura de los dispositivos no siga la convención habitual. debe remitirse a la documentación del API. public ControlPuertoSerie( String dispositivo.SerialPort. Se pueden inicializar los puertos serie que se vayan a utilizar en la aplicación."/dev/ttya" ). 8 bits por carácter y no dispone de paridad. InputStream entrada = null. si el lector necesita detalles específicos sobre los parámetros de las llamadas a los métodos.

System.*. Escritura y Lectura de datos En el caso del API de Comunicaciones Java.7 Ejemplos de programación entre puertos y dispositivos. se puede hacer: try { salida. la lectura y escritura no se diferencia en nada de cualquier llamada a métodos semejantes para realizar estas mismas tareas en objetos derivados del uso de streams.util.*.longitud ). puertoSerie.enableRcvTimeout( timeout ).puertoSerie. Y para la lectura de datos.enableRcvThreshold( 1 ). entrada = puertoSerie.comm.write( arraySalida. es un ejemplo muy simple que permite escribir por el primer puerto serie de la máquina en que se esté ejecutando.getOutputStream(). El ejemplo java1901. .read() 6.*.getInputStream().out. import java. es suficiente con hacer: try { int b = entrada.FLOWCTRL_NONE ). Para escribir. import javax.println( "Dispositivo Serie abierto" ). public class java1901 { static Enumeration listaPuertos.0. import java.java.setFlowcontrolMode( SerialPort. puertoSerie. salida = puertoSerie.io.

getName(). static String mensaje = "Tutorial de Java. } catch( UnsupportedCommOperationException e ) {} // Se envía el mensaje try { salida. SerialPort.getBytes() ). static OutputStream salida. } catch( PortInUseException e ) {} // Se obtiene un canal de salida try { salida = puertoSerie. es la contrapartida.java.PARITY_NONE ).hasMoreElements() ) { idPuerto = (CommPortIdentifier)listaPuertos.open("AplEscritura".getOutputStream(). SerialPort.DATABITS_8. public static void main( String[] args ) { listaPuertos = CommPortIdentifier.STOPBITS_1. while( listaPuertos.getName(). if( idPuerto.equals("/dev/term/a") ) { if( idPuerto. una aplicación también muy simple.static CommPortIdentifier idPuerto. } catch( IOException e ) {} // Se fijan los parámetros de comunicación del puerto try { puertoSerie. SerialPort.equals("COM1") ) { // Si el puerto no está en uso.2000). que permite leer toda la información que llegue a través del primer puerto serie de la máquina en que se este .write( mensaje. se intenta abrir try { puertoSerie = ( SerialPort )idPuerto.getPortIdentifiers().setSerialPortParams( 9600.nextElement().PORT_SERIAL ) { // if( idPuerto. Comunicaciones Serie\n". static SerialPort puertoSerie. } catch( IOException e ) {} } } } } } Y el ejemplo java1902.getPortType() == CommPortIdentifier.

ejecutando.. es necesario emplear un protocolo que permita multiplexar la información proveniente de cada uno de ellos. Habría que comprobar el comportamiento del API de Comunicaciones Java ante grandes avalanchas de datos o aplicaciones en tiempo real. si el lector necesita desarrollar una aaplicación que utilice tarjetas inteligentes. No obstante esa duda. solamente proporciona. . no estará disponible para otras aplicaciones. y si algún canal no se cierra. solamente aquella que indica que hay datos disponibles para leer.close().comm. y un dispositivo que quiere conectar a través de uno de los puertos. a través del uso de javax. y cientos de otros dispositivos. } . en donde sí se puede valorar la bondad de API. usando javax. try { entrada. salida. También es verdad que hay otros APIs de Java que se apoyan en este API de Comunicaciones. pero no dispone de la implementación del driver correspondiente. que hace uso de javax. puede utilizar un API ya definido como OpenCard Framework. y el fabricante todavía no la tiene disponible. en el manual del dispositivo. una somera información de cómo se podría acceder al dispositivo a través de llamadas realizadas en C. impresoras. o comunicarse directamente utilizando javax. se puede plantear el problema de que el lector tiene a su disposición un ordenador con puertos serie. como lo único que interesa es la lectura de datos.. por ejemplo.smartcard. lectores de tarjetas. aunque en este caso. e incluso. Y el problema que se plantea es cómo. La respuesta pasa por implementar un interfaz que se comunique con ese dispositivo a través de métodos nativos. Si se quiere utilizar un dispositivo para múltiples usuarios sobre una misma línea serie.comm se puede utilizar este dispositivo especial.close().comm. Conclusión Ahora bien. la aproximación tan disciplinada que proporciona este API de Comunicaciones hará mucho más sencilla la integración de cualquier dispositivo serie como lectores de códigos de barras. no se tienen en cuenta ninguno de los eventos que generan las demás señales de control del puerto. Cierre de Puertos El cierre de los puertos con este API de Comunicaciones no es distinto a otras peticiones de cierre de dispositivos. el cierre es un paso sumamente importante porque el API de Comunicaciones Java siempre intenta proporcionar acceso exclusivo a los dispositivos.

debe valorar las siguientes cuestiones. para comprobar que el uso de este API satisface los requerimientos que deban tener esas aplicaciones. Caracteres perdidos a la entrada Caracteres perdidos a la salida Frecuencia del flujo de control Tiempo que tarda en despachar un evento Tiempo de procesado de un carácter Tiempo de procesado de un bloque de datos . o sensiblemente críticas.Como recomendación final al lector. en caso de que desee utilizar este API en aplicaciones con gran trasiego de datos.