Entrada/Salida Polling e Interrupciones Mariano Moscato Organización del Computador 1 Verano de 2011 El GuidoBot Robot docente Basado en tecnologı́a ORGA1 tiene un procesador y una memoria ORGA1 Sus dispositivos principales son: motor un motor que controla su desplazamiento visión un sistema de visión El motor del GuidoBot El motor del GuidoBot tiene dos registros: PotenciaActual (de lectura) indica la potencia actual del motor PotenciaRequerida (de escritura) en él se debe escribir la potencia que se desea dar al motor del GuidoBot Los registros de los dispositivos son su medio de comunicación más común con el resto de los componentes del sistema. Registros de los dispositivos de E/S Pueden ser leı́dos o escritos por un tercero (por ej.: el CPU) de lectura su contenido no puede ser modificado desde fuera de escritura sólo se puede escribir en ellos de lectura y escritura se pueden leer y escribir Dependiendo de la arquitectura: espacio de direcciones especı́fico de E/S a través de instrucciones especı́ficas (IN, OUT) utilizando algunas direcciones de memoria direcciones mapeadas en memoria ORGA1 usa las direcciones de memoria FFF0h a FFFFh para E/S. El motor del GuidoBot Recordando que el motor del GuidoBot tiene dos registros: PotenciaActual (de lectura) indica la potencia actual del motor PotenciaRequerida (de escritura) en él se debe escribir la potencia que se desea dar al motor del GuidoBot Sus valores son números en complemento a 2 de 16 bits. Asumiendo que se les asignan las siguientes direcciones: PotenciaActual 0xFFF0 PotenciaRequerida 0xFFF1 Ejercicio Escribir un programa para la ORGA1 que mueva al GuidoBot a toda velocidad hacia adelante. El motor del GuidoBot Unas preguntitas Luego de ejercutar el programa, ¿Que contiene la posición de memoria 0xFFF1? Si en lugar de tener direcciones mapeadas a memoria, tuviéramos un espacio de direcciones distinto para E/S, ¿cómo cambiarı́a el programa? El sistema de visión del GuidoBot El sistema de visión es un dispositivo avanzado Sugiere movimientos periódicamente basado en los datos que registran sus cámaras Cuenta con un registro de lectura SugerenciaLista, que toma los valores: 0x0000 mientras se realiza el cálculo de la sugerencia 0x0001 si sugiere detener el robot 0x0002 si sugiere avanzar Ejercicio: rutina principal del GuidoBot Escribir la rutina principal del GuidoBot, que lo mueve de acuerdo a la sugerencia de su sistema de visión. Una mejora al GuidoBot Se desea agregar al GuidoBot un dispositivo receptor de correos electrónicos, para que pueda responder consultas por email. Recibido LECTURA Próximo LECTURA contiene un 1 cuando se recibe un mail 0x0000 si se está buscando la siguiente palabra 0x0001 si el registro Dato contiene la próxima palabra del mensaje 0x0002 si el mensaje concluyó (no hay más palabras) Dato Siguiente LECTURA contiene una palabra del mensaje ESCRITURA se escribe un 1 para pedir la próxima palabra Ejercicio: modificar la rutina principal del GuidoBot Modificar la rutina anterior para que el GuidoBot revise si hay un mail y lo copie a memoria (a partir de la dirección 0xA000). Una mejora al GuidoBot Unas preguntitas ¿Qué tipo de esquema de E/S estamos usando? Marcar las partes del código donde se materializa este esquema. Problemas prácticos Pero... Si cada transferencia desde o hacia memoria tarda 10 ms y cada mail de consulta suele medir unos 5000 Bytes ¿Cuánto tiempo está el GuidoBot sin prestar atención a su sistema de visión? ¿Y ahora? ¿Tiramos el GuidoBot a la basura? Interrupciones Ejercicio: modificando el GuidoBot Modificar la arquitectura de ORGA1 para dotarla de la capacidad de atender la interrupción de un único dispositivo de E/S. Indicar claramente qué cosas son responsabilidad del hardware y qué del software. Modificar la rutina para adaptarla a la nueva arquitectura. Interrupciones: Ejercicio 2 Solución Se agregan: Señal de entrada INTR y de salida INTA. Flag IF 1 el procesador puede ser interrumpido 0 el procesador no puede ser interrumpido Se reserva la posición de memoria 0000 para almacenar la dirección de la RAI del dispositivo. Se proveen cuatro instrucciones nuevas: CLI que pone en cero el flag IF STI que pone en uno el flag IF PUSH Ri apila el registro Ri ([SP]=Ri y SP=SP-1) POP Ri desapila en el registro Ri (SP=SP+1 y Ri =[SP]) Otra mejora al GuidoBot Se desea agregar al GuidoBot un dispositivo radio receptor, para poder comunicarle modificaciones de último momento (cambios en el calendario, criterios de correción de parciales, etc.). Emite una interrupción cuando llega un mesaje por radio Sus registros son: Próximo LECTURA 0x0000 si se está buscando la siguiente palabra 0x0001 si el registro Dato contiene la próxima palabra del mensaje 0x0002 si el mensaje concluyó (no hay más palabras) Dato Siguiente LECTURA contiene una palabra del mensaje ESCRITURA se escribe un 1 para pedir la próxima palabra ¿Y ahora cómo hacemos para implementar esta mejora? Le agregamos un Controlador de Interrupciones Es un dispositivo de E/S cuyo objetivo es gestionar la entrada/salida para el procesador. El controlador recibe un conjunto de señales de los distintos dispositivos, toma la decisión cual es la más prioritaria y envı́a una señal al procesador. Estructura del controlador Tiene cuatro entradas para solicitudes de interrupción (IR0 a IR3) y una salida para solicitar interrupción al CPU (INTR) y una entrada para reconocimiento de atención (INTA). Sus registros internos son: IRR (Interrupt Request Register) Cuando se activan una o varias de las entradas IR, estas quedan reflejadas en los bits correspondientes del IRR. ISR (Interrupt Service Register) De aquellos bits activados en el IRR, el más prioritario queda reflejado en el ISR. IMR (Interrupt Mask Register) El programador puede enmascarar algunas interrupciones de manera que si se activase la IR correspondiente, el controlador la ignorará. Ciclo de reconocimiento de interrupción 1 Tras la activación de una lı́nea IR, el controlador activa la salida INTR señalándole a la CPU la existencia de una interrupción activada. 2 Al recibir la señal, el procesador da un pulso en su salida INTA indicando que comienza un ciclo de reconocimiento de interrupción. 3 Al recibir el controlador el pulso por su entrada INTA comienza a arbitrar las interrupciones recibidas y selecciona la más prioritaria. 4 El controlador indica en su registro ISR qué dispositivo debe ser atendido (la interrupción de mayor prioridad). 5 El procesador almacena los flags y el PC, y salta a la dirección 0. Interrupciones Suponiendo que se utiliza un controlador de interrupciones, con sus registros asignados a las siguientes direcciones de memoria: ISR 0xFFFB IRR 0xFFFC IMR 0xFFFA y que se cuenta con la rutina AtenderMensajeRadial. Enunciado a) Describa la configuración inicial del sistema. b) ¿Qué acciones se llevan a cabo (tanto desde el hardware como desde el software) en el sistema cuando el componente de visión solicita una interrupción? c) Escriba la rutina de atención de interrupción del radio receptor. Interrupciones Solución b) 1. El dispositivo de visión levanta la IRQ0 2. El CI evalúa si corresponde enviar la solicitud de interrupción al CPU (INTR) 3. Cuando el CPU termina el ciclo de ejecución, si IF=1: a. b. c. d. Apila PSW Apila PC Levanta la INTA Asigna PC ← 0 4. La RAI lee el ID del dipositivo (registro ISR del CI) y salta a la RAI especı́fica del dispositivo de visión. Interrupciones Solución c) RAI Radio: CLI ; Guarda la máscara actual PUSH R0 MOV R0, [0xFFFA] PUSH R0 ; Setear nueva máscara MOV R0 , 0x0001 MOV [0xFFFA], R0 STI ; guarda el registro R0 en la pila ; copia el contenido del reg. de ES IMR en R0 ; apila la máscara actual ;copia el contenido de R0 en el reg. de ES IMR CALL TratarMensajeRadial CLI POP R0 MOV [0xFFFA], R0 POP R0 STI IRET ; Restauro la máscara y el registro R0 ; volver de la interrupción Repaso Hoy vimos Espacio de direcciones de E/S Independiente instrucciones especı́ficas Mapeadas a memoria usamos algunas direcciones de memoria para E/S Ejemplos de esquemas de entrada y salida: Polling e Interrupciones Esquemas de E/S E/S por encuesta (Polling) o Programada: Utilizado en las primeras computadoras (Apple II) o en algunos sistemas embebidos. La CPU sondea periódicamente al dispositivo para ver cuál es su estado. Sencillo pero claramente ineficiente. E/S por interrupciones: Es el dispositivo quien establece el momento en que se realizará la transferencia de datos. Cuando la CPU recibe notificación de la interrupción detiene el programa en ejecución, ejecuta la RAI y finalmente devuelve el control al programa. ¿Preguntas? GuidoBot: “Pueden hacer toda la primer parte de la práctica 6.” Homero: “¿Lo qué?”