EJERCICIO Se dispone de un módulo de entrada/salida conectado

Transcripción

EJERCICIO Se dispone de un módulo de entrada/salida conectado
EJERCICIO
Se dispone de un módulo de entrada/salida conectado al controlador de una pantalla gigante de datos numéricos. Suponga que el
procesador tiene un mapa de e/s separado, y que se utilizan las siguientes direcciones para acceder a los registros del módulo de e/s:
Dirección
2B0 (hex)
2B1 (hex)
2B2 (hex)
Acceso
Lectura
Escritura
Escritura
Registro
Estado
Datos
Control
Registro de estado: 8 bits
Bit 0: Error. Si está a uno indica que hay un error en el dispositivo externo.
Bit 1: Preparado. Si está a uno indica que el dispositivo externo está preparado para recibir datos.
Registro de datos: (8 bits) Una escritura en el registro de datos implica el envío del dato escrito al dispositivo externo, para que lo
muestre en su display.
Registro de control: 8 bits
Bit 0: Si está a uno hace que las letras parpadeen en el display.
Bit 1: A uno enciende el display para que los números se vean.
Bit 2: Si se pone a uno, resetea el dispositivo externo.
Bit 3: Si se pone a uno, habilita las interrupciones en el módulo de e/s.
1.
Escriba el código de la rutina de inicialización del dispositivo atendiendo al siguiente prototipo. El parámetro de entrada indica si se
van a activar las interrupciones (valor distinto de cero) o no (valor igual a cero) en el módulo de e/s. Active el dispositivo externo de
manera que los números no parpadeen en el display.
void Inicializar (int habilitar_interrupciones);
2.
Escriba el código de la rutina que envía un número al dispositivo externo para que se muestre en el display (siempre que no se haya
producido un error en el dispositivo). Emplee el método de e/s programada. Tenga en cuenta que el controlador tarda como máximo
10ms en presentar el número en la pantalla, por lo que se ha de garantizar una espera mínima de 10ms entre dos escrituras sucesivas
de registro de datos. Aténgase al siguiente prototipo:
int MostrarNumero(short int numero);
La rutina devuelve un valor distinto de cero si hay un error en el dispositivo externo. Para implementar la espera, utilize la siguiente
función, cuyo argumento expresa el tiempo a esperar en milisegundos:
void delay(int misilegundos);
3.
Escriba el código del manejador de interrupciones. Dicha función se dedicará a enviar un número al dispositivo externo. Suponga
que el número que se envía está en una variable global (la variable numero), tal y como se sugiere a continuación. El prototipo y la
variable son los siguientes:
short int numero;
void INTERRUPT ManejadorDisplay(void);
EJERCICIO
Imagínese por un momento que trabaja como ingeniero de sistemas informáticos en una famosa compañía
aeronáutica y desea diseñar el sistema de control de vuelo de un nuevo avión dedicado al transporte de patitos de
goma desde Murcia a Hong Kong. Según sus superiores, el sistema constará de los siguientes elementos:
•
CPU con entrada / salida separada. Interrupciones vectorizadas del tipo x86 (INTR + INTA) y una entrada de
interrupción no enmascarable (NMI).
• Memoria dinámica y ROM. En esta última se ubica el programa.
• Caché separada para datos e instrucciones.
• Tres interfaces de periféricos programables 8255. Estos se utilizarán para manejar los siguientes elementos.
• Dos controladores de motores. Uno de ellos controla los dos motores destinados a mover las superficies
móviles de las alas, y el otro los de los timones de profundidad del aparato. Cada controlador recibe 8 bits
de datos correspondientes a la posición deseada de cada uno de sus motores, y no necesita de señales de
protocolo de comunicación para recibir dichos datos. El dato enviado al controlador es instantáneamente
procesado por éste.
• Un controlador de palanca de mando. Dicho controlador envía continuamente dos datos de 8 bits,
correspondientes a los valores de X e Y de la palanca de mando. No necesita protocolo de comunicación.
• Un controlador de pulsadores de cabina. El controlador envía un dato de 8 bits correspondiente al código
del pulsador que ha sido pulsado, y señales de protocolo de comunicación. Es necesario que la pulsación
de la tecla genere una interrupción de tratamiento de pulsador.
• Un controlador de detección de alarmas y emergencias. Este envía un dato de 8 bits correspondiente al
código de alarma, y dispone de señales de protocolo de comunicación. Es necesario que cuando se
produzca una alarma se genere una interrupción de gestión de alarma, que debe de ser servida
obligatoriamente por el procesador.
• Controlador de interrupciones 8259A.
a) (1,75 puntos) Suponga que otro ingeniero ha conectado dichos elementos al bus del sistema y ha realizado
toda la lógica de selección de direcciones del sistema. Conecte los controladores a los 8255. Indique a qué puerto
conecta las señales de los controladores, e indique el modo de funcionamiento de los grupos de los 8255, y si
utilizan o no interrupciones. En el caso de que algún grupo utilice interrupciones, saque la señal del puerto donde
se generará la señal correspondiente y conéctelo a donde le parezca. Acompañe su solución de una explicación y
tenga en cuenta que no se puede añadir ningún elemento más al sistema (ni siquiera puertas lógicas).
b) (0,5 puntos) ¿Tendría alguna utilidad un módulo DMA en dicho sistema? Razone la respuesta.
c) (0,25 puntos) Suponga que el software del sistema consiste en una rutina de configuración del sistema y otra
(la rutina principal) que ejecuta un bucle infinito como el siguiente:
Hacer {
Leer valores de la palanca de mando;
Consultar parámetros de funcionamiento de la memoria del sistema;
Calcular posición deseada de los motores en función de los valores de la palanca de mando y de los
parámetros de funcionamiento;
Escribir posición deseada en los puertos de entrada/salida de las alas y los timones;
}Mientras (verdadero):
¿Qué tipo de programación de la entrada /salida se está aplicando con este bucle?
d) (1 punto) ¿Cómo se las arreglaría para introducir las dos rutinas enunciadas a continuación? No se puede
alterar el código de la rutina principal. ¿Qué necesitaría hacer en la rutina de configuración? Razone la respuesta.
• Gestión de pulsadores: cuando un pulsador ha sido pulsado, se recoge el código del pulsador y en función del
mismo se alteran los parámetros de funcionamiento del sistema.
Gestión de alarmas: cuando se produce una alarma, se recoge el valor de la alarma y se altera el valor de los
parámetros de funcionamiento del sistema.
EJERCICIO
Se desea construir una caché para un computador. Para implementarla se ha construido un sistema con un microcontrolador asociado a
un sistema de E/S que se comunica con el computador principal de esta forma:
1 ms
(*)AS
No determinado. Hay que esperar a la MP.
(+)Mem Op OK
(*)A0-A15
1 ms
Sistema Caché
CPU
Dirección
Datos de MP
(+)Data In 0-7
Ciclo
de
lectura
(*)W/R#
(*)Data Out 0-7
Datos de la CPU a MP
Ciclo de
escritura
(*)W/R#
Leyenda:
(*) Generada por la CPU.
DataIn,
DataOut
8255 (1)
8255 (3)
8255 (2)
8255 (4)
µC
MP del
µC
A0-15, W/R#, AS,
MemOpOK
DataIn,
DataOut
MP
de la
CPU
A0-15, W/R#,
AS,
MemOpOK
Bus del
sistema
(+) Generada por la memoria.
8255
La CPU es un procesador con E/S mapeada en memoria y un bus asíncrono no multiplexado de direcciones de 16 bits y datos de 8 bits,
con las señales que se indican en el cronograma. Téngase en cuenta que existen dos grupos de señales para datos: Data in 0-7, que se
dedica a enviar los datos de la memoria a la CPU y Data out 0-7 que lleva los datos de la CPU a la memoria principal. El
microcontrolador (µC) es un procesador con un bus compatible con el del 8088-6 (con E/S separada), pero con una diferencia: sólo
tiene una línea de interrupción (sin aceptación), y no es vectorizada. La dirección base del 8255(1) es la 100hex y la del 8255(2) es la
200hex. La del 8255(3) es la 300hex y la del 8255(4) es la 400hex. La caché es serie, totalmente asociativa y tiene 256 líneas con bloques de
16bytes. La gestión de la caché la realiza un programa del µC, de manera que las líneas de la caché están implementadas como variables
globales del programa del µC.
1. (0.25 pto) Dibuje la conexión entre la CPU y el sistema caché, indicando exactamente los puertos y señales que utiliza, así como los
modos de funcionamiento de cada 8255. No se utilizan interrupciones.
2. (0.25 pto.) Indique las señales y los modos de funcionamiento del 8255(3) y 8255(4), indicando exactamente los puertos y señales
que utilizan. No se utilizan interrupciones.
3. (0.25 pto.) Declare las variables globales que necesite para implementar y manejar las líneas del sistema caché. Escriba en C la
función void Inicializacion(void) en el que se realiza la inicialización del sistema.
4. (0.75 pto.) Escriba en C la función int localizar(short int direccion) en la que se implementa la estrategia de localización de la
caché. La función da un número de línea como resultado: si el número es negativo indicará que no se ha podido localizar el dato
correspondiente a la dirección especificada. Esta función sólo intenta localizar el bloque, no a subir bloques de MP a caché. Use el
operador x >> n que desplaza los bits de la variable x, n bits a la derecha.
5. (0.75 pto.) Escriba en C la función int dondeubicar(short int direccion) en la que se implementa la estrategia de ubicación de la
caché. La función da un número de línea como resultado. Esta función decide dónde ubicar un bloque, sin subir el bloque a caché.
Utilice la estrategia de reemplazo aleatoria. Apóyese en la sentencia rand()%n que genera un número aleatorio entre 0 y n-1.
6. (1 pto.) Escriba en C la función void subirbloque(shor int direccion). La función sube el bloque a caché, correspondiente a la
dirección que se pasa como parámetro (que no tiene porqué ser la primera dirección del bloque). Apóyese en la función y los
operadores anteriormente descritos.
7. (1 pto.) Escriba en C la función void procesarLecturaCPU(void). La función se encarga de esperar a que la CPU realice un ciclo de
bus de lectura, recoger la dirección, gestionar la caché y devolverle el dato a la CPU. Apóyese en las funciones anteriores y en la
función C, void delay(int x), que retrasa la ejecución el programa x milisegundos. Realice la función con E/S programada.
8. (0.25 pto.) Imagínese que se conecta un módulo de E/S al bus del sistema principal y que no se utiliza DMA para la transferencia de
datos entre la E/S y la memoria principal. ¿Habría que realizar algún cambio en el sistema de caché? Justifique la respuesta.
9. (0.5 pto.) Se desea implementar la gestión de la caché por interrupciones. Enumere los cambios necesarios, tanto hardware como
software para implementar dicha estrategia. Justifique la respuesta.
EJERCICIO
7. Un sistema basado en 8086 está conectado a un 8255, para la recepción de datos provenientes de un
dispositivo externo. El esquema de conexión se indica a continuación:
8255-A
D0-D7
A0
A1
A2...A11
WR#
RD#
IO/M#
D0-D7
Decodificación
Pto. A
A0
A1
CS#
Pto. CH
WR#
RD#
Pto. CL
Pto. B
Datos
Protocolo
Señales de control
Dispositivo externo
CPU
Señales de estado
La decodificación de direcciones activa la señal CS# en el rango de direcciones 0A00-0A03. Sabiendo que los
datos se reciben de acuerdo a un protocolo de señales (implementado mediante las señales de la parte alta del
puerto C del 8255), y que no se necesita un protocolo de comunicación para enviar o recibir las señales de
control o estado, responda a las siguientes cuestiones:
a) (0.5pto.) Escriba en C la rutina de inicialización del 8255, teniendo en cuenta que no se activan
interrupciones.
b) (0.5pto.) Escriba en C una rutina que le envíe las señales de control al dispositivo externo y recoja del
mismo las señales de estado, y las devuelva como resultado de la función. Aténgase al siguiente
prototipo:
unsigned char EnviarControl(unsigned char s_control);
c) (1pto.) Imagine que se quieren implementar interrupciones en dicho sistema. Explique qué cambios
se tendrían que producir tanto en el hardware como en el software de los apartados anteriores.
d) (1pto.) Con las interrupciones habilitadas, escriba en C la rutina de servicio de interrupción que
recoge un dato del puerto A, y guarda el valor recogido en una variable global.
EJERCICIO.
Se desean transferir 4096 bytes desde la memoria a un determinado dispositivo. Para ello se han de observar las
siguientes consideraciones:
1.
2.
3.
4.
La CPU tiene un reloj de 1Mhz y ejecuta una instrucción cada ciclo de reloj.
El dispositivo es capaz de transferir 1 byte cada 10ms.
Se necesitan 200 instrucciones de la CPU para transferir un byte desde la CPU hasta el dispositivo.
La CPU necesita hacer 20 instrucciones para entrar en una rutina de interrupción y otras 20 para salir de la
misma.
5. Se necesitan 20 instrucciones para programar la órden de transferencia del DMA.
6. Se necesitan 80 instrucciones para chequear la operación del DMA.
Se pide:
(1) Especificar cuanto tiempo tiene que dedicar el procesador a la transferencia de los datos si se supone que
dicha operación se hace por entrada salida programada. Supóngase que el número de instrucciones del bucle de
chequeo del periférico es 0.
(1) Especificar cuanto tiempo tiene que dedicar el procesador a la transferencia de los datos si se supone que
dicha operación se hace por interrupciones.
(1) Especificar cuanto tiempo tiene que dedicar el procesador a la transferencia de los datos si se supone que
dicha operación se hace por DMA. Se supone que se hace toda la transferencia en una sola orden y que el DMA la
realiza con éxito.
(0,5) ¿Qué método de programación de la E/S es el más eficiente? ¿Porqué?
SEGUNDO EJERCICIO.
Dado un sistema compuesto por CPU, E/S y memoria, se le pide diseñar un DMA para dicho sistema que trabaje
con el único módulo de E/S que tiene éste. Para ello dispone de un pequeño microcontrolador (que hará las veces
de DMA) y un banco de registros conectados al bus del sistema (el bus tiene una palabra de 32 bits) tal y como
aparece en la siguiente figura:
CPU
Módulo de E/S
DATOS
ST_ES
MicroC
(DMA)
Memoria
CTRL
INT
Banco de registros
ESTADO
CONTROL_0
CONTROL_1
CONTROL_2
Considere los siguientes registros: los bits que no se comentan no son importantes para el ejercicio.
• ESTADO: (8 bits, R/W). Registro dedicado a indicar el resultado de una operación del DMA.
o Bit 0: a cero indica que la operación se ha realizado correctamente, y a 1 que ha ocurrido un error.
• CONTROL_0: (32 bits R/W) Contiene la dirección de memoria (de origen o destino) de la operación de
transferencia.
• CONTROL_1: (32 bits R/W) Contiene el tamaño en bytes de la operación de transferencia, codificado
como un entero sin signo.
• CONTROL_2: (8 bits R/W) Utilizado por la CPU para indicar el sentido de la operación.
o Bit 0: a 1 indica que la transferencia es desde memoria a E/S, y a cero lo contrario.
o Bit 1: a 1 indica al DMA que debe de comenzar una operación de transferencia con los datos que
se le indican en los registros de control. El DMA pondrá este bit a cero cuando finalice ésta.
• DATOS: (32 bits R/W) Se utiliza para leer o escribir datos en el módulo de E/S, por parte de la CPU o del
DMA.
• ST_ES: (8 bits R). Si tiene algún bit distinto de cero indica error en la última operación del módulo E/S.
• CTRL.: (8 bits W). Indica que tipo de operaciones se van a realizar sobre el módulo de E/S.
o Bit 0: a cero, operaciones de escritura. A uno, operaciones de lectura.
o
El módulo de E/S produce una señal de interrupción cuando está preparado para recibir un nuevo dato desde la
CPU o el DMA (ops. de escritura) o cuando ha llegado un nuevo dato al módulo desde el exterior (ops. de lectura)
y puede leerse por la CPU o el DMA.
(1 pto.) Implemente en C la siguiente función:
EsperarOrdenDMA(void *dir_memoria, int *sentido, unsigned int *size)
Dicha función se ejecutará dentro del DMA, y esperará a que la CPU principal indique que quiere realizar una
transferencia DMA (utilice para ello el bit 1 del registro CONTROL_2). Utilice E/S programada para ello.
Después de que la CPU haya indicado que quiere dar comienzo la transferencia, la función retornará mediante sus
parámetros de entrada la dirección de memoria de la transferencia, el sentido de ésta (0 para transferir al módulo
de E/S y 1 para transferir a la memoria), y el tamaño en bytes de la misma. Puede considerar los nombres de los
registros como constantes en su código. Si lo cree conveniente, utilice las siguientes funciones, que son capaces
de operar con palabras completas:
void outportb32(unsigned int valor, unsigned int puerto)
unsigned int inportb32(unsigned int puerto)
(1 pto.) Desde el punto de vista de la programación del propio DMA, ¿Con qué tipo de programación de E/S
debería de implementarse la transferencia de datos entre la E/S y la memoria? Sea cual sea la opción, ¿Qué
acciones tendrían que realizarse para realizar una SOLA transferencia desde memoria a E/S? Razone la respuesta.
(0.5 pto.) Escribir el código C necesario para que la CPU principal le pida al DMA que transfiera 1024 bytes
desde la dirección FFAD0 al módulo E/S. No olvide hacer que este código sea compatible con la función
EsperarOrdenDMA().
EJERCICIO
Imagine que el ordenador tiene un módulo de E/S que se encarga de controlar la torre de radar, y que dicho
módulo tiene una señal de interrupción que va dirigida a la CPU y que le avisa de cuando se ha producido un
nuevo contacto de radar. En ese momento, la CPU tiene que recoger del registro de datos del dispositivo 1024
bytes, que son los datos pertenecientes al nuevo contacto. Consideraciones:
•
•
•
•
La CPU tiene un reloj de 100Mhz y ejecuta una instrucción cada ciclo de reloj.
El dispositivo es capaz de transferir 1 byte cada microsegundo.
Se necesitan 200 instrucciones de la CPU para transferir un byte desde la CPU hasta el dispositivo.
La CPU necesita hacer 20 instrucciones para entrar en una rutina de interrupción y otras 20 para salir de la
misma.
(1 pto.) Especifique cuanto tiempo tardaría la CPU en gestionar una interrupción proveniente del radar. Razone la
respuesta.
Imagine ahora que la CPU dispone de 4 líneas de interrupción diferentes (INT0 ... INT3), de manera que la CPU
las gestiona por prioridad (mayor prioridad cuanto menor es el número de la línea de interrupción). Cada linea de
interrupción está conectada a un módulo de E/S de radar como el anteriormente comentado, de manera que
puedan controlarse simultáneamente 4 radares diferentes (Radar0 ... Radar3). Supóngase que la rutina de
interrupción hace que el procesador no atienda nuevas interrupciones durante su ejecución, y que la ejecución
completa de una rutina de interrupción dura 3 microsegundos aproximadamente.
Teniendo en cuenta que se producen los siguientes eventos:
•
•
•
•
Nuevo contacto en radar 3 en el instante t.
Nuevo contacto en radar 1 en el instante t+2µs.
Nuevo contacto en radar 3 en el instante t+3µs.
Nuevo contacto en radar 0 en el instante t+4µs.
(2 ptos.) Especifique gráficamente el orden de ejecución de las diferentes rutinas de interrupción, indicando el
instante en el que se inicia y termina su ejecución. Indique además el instante en el que se activa cada una de las
líneas de interrupción. Razone la respuesta.
EJERCICIO
5) (2,5 pto.) Se desea controlar el funcionamiento de un horno microondas utilizando un microprocesador de bajo costo. Para esto, es
necesario controlar el “programa de cocción”, el motor del plato giratorio y la luz interna. Un “programa de cocción” es una pareja
(duración, potencia), que indica el tiempo y la potencia de las microondas para la cocción.
Cuando se desea utilizar el horno el usuario selecciona la duración, la potencia y oprime la tecla comenzar. Toda vez que se abra la
puerta debe detenerse el programa en curso inmediatamente. La luz debe encenderse cuando el horno está en funcionamiento o la
puerta del mismo está abierta. El motor del plato debe girar sólo cuando el horno está en funcionamiento.
Puertos de E/S para acceso a los dispositivos:
MECANISMOS (sólo escritura.):
o Bit 0: Encender (1) o apagar la luz.
o Bit 1: Encender (1) o apagar el motor del plato giratorio.
MICROONDAS (sólo escritura): potencia a generar por el microondas. Para apagar el generador de microondas se debe
escribir un 0 en este puerto.
U_POTENCIA (sólo lectura): potencia del programa seleccionado por el usuario.
U_DURACION (sólo lectura): duración en segundos del programa seleccionado por el usuario.
ENTRADA (sólo lectura):
o Bit 0: Estado de la puerta (0 abierta, 1 cerrada).
o Bit 1: Estado de la tecla comenzar (0 no pulsada, 1 pulsada). Este bit se pone a cero automáticamente después de
una lectura en este puerto.
Nota:
Se dispone de un reloj que genera una interrupción cada segundo, que es atendida por la rutina TIEMPO.
Se pide:
Implemente la rutina de interrupción TIEMPO. Suponga que los puertos de e/s definidos anteriormente
son constantes ya definidas en el programa.

Documentos relacionados