Skip to content

Latest commit

 

History

History
581 lines (443 loc) · 15.2 KB

Interrupciones.md

File metadata and controls

581 lines (443 loc) · 15.2 KB

💻Interrupciones

Indice

Interrupciones_por_Software

Interrupcion Funcion
INT 0 Detiene el programa. Igual a HLT
INT 3 Debug. No lo vamos a utilizar
INT 6 Lee un caracter desde teclado
INT 7 Imprime un string en pantalla
INT 6 INT 7
ORG 1000H
 LEIDO DB ?
ORG 2000H
 MOV BX, OFFSET LEIDO
 INT 6    
 INT 0
END
ORG 1000H
 MENSAJE DB "ARQUITECTURA DE COMPUTADORAS"
 FIN DB ?
ORG 2000H
 MOV BX, OFFSET MENSAJE
 MOV AL, OFFSET FIN - OFFSET MENSAJE
 INT 7    
 INT 0
END

Memoria_E_S_y_PIO

La memoria E/S es igual a la memoria común! Como son iguales, necesito de un mecanismo para distinguirlas :

  • Para leer desde la memoria E/S usaremos IN, para escribir en ella OUT. Ambas instrucciones solo se pueden usar con el registro AL
  • Ej. Lectura: Leer el dato que está en la posición 40H de E/S, IN AL, 40H
  • Ej. Escritura: Poner el valor 30 en la posicion 50H de E/S, OUT 50H, AL

Nos comunicamos con los dispositivos de E/S a través de dispositivos internos.

Cada uno de estos dispositivos internos se configuran, a través de la E/S y tienen asignado una zona de memoria fija (de E/S)

PIO

Es un puerto paralelo de E/S

Contra de 2 puertos paralelos configurables.

Ocupa 4 celdas en la memoria de E/S:

  • 2 de datos llamados PA Y PB
  • 2 de configuración llamados CA Y CB
Memoria Dispositivos
  • Cada celda (Tambien llamada registro) consta de 8 bits.
  • Debemos configurar cada bit de datos como entrada o salida.
  • En los puertos de configuracion debemos poner un 0 para que ese bit en el puerto de datos sea de Salida y 1 para que sea de Entrada

Ej. Queremos que el PA tenga todos los bits como entrada excepto el menos significativo

  • Debemos configurar CA
  • Todos en 1 menos el menos significativo (11111110)
MOV AL, 11111110b
OUT 32H, AL ;CA = 11111110
Ej Salida. Prender todas las luces Ej Entrada. Leer el estado de las llaves y prender las luces de aquellas llaves que esten en 1.
ORG 2000H
 MOV AL, 0H
 OUT 33H, AL ;CB = 00000000
 MOV AL, 11111111B ;Tambien se pueden usar hexa
 OUT 31H, AL ;PB = 11111111
 INT 0
END 
ORG 2000H
;CONFIGURAMOS PA (ENTRADA) Y PB (SALIDA)
MOV AL, 11111111b
OUT 32H, AL ;CA = 11111111
MOV AL, 00000000B
OUT 33H, AL ;CB = 00000000
;PASO LO QUE TENNGO EN PA (LAS LLAVES)
  
LOOP: IN AL, 30H 
;MANDAR LA INFORMACION DE LAS LLAVES A LAS LUCES (PB)
OUT 31H, AL 
JMP LOOP
  
INT 0
END

Interrupciones_por_Hardware

Nos vamos a manejar con 4 dispositivos externos.

HARDWAREOWO

PIC

Los dispositivos interrumpen al cpu a través del PIC.

Es el intermediario entre los dispositivos que quieren interrumpir y la cpu. Avisa a la cpu que tiene que frenar, se maneja desde la memoria de E/S así que para configurar haremos uso de IN y OUT. Tambien permite configurarr el resto de cosas que nos quedaron pendientes. Las sentenicas CLI y STI bloquean y habilitan, respectivamente, las interrupciones. Cuando configuremos el PIC siempre debemos hacerlo entre CLI y STI

image

interrupciones

EOI_20H

  • El PIC nos avisa que un dispositivo nos quiere interrumpir. Nosotros le avisamos que ya atendimos la interrupcion.
  • Antes de volver de la subrutina de la interrupcion debemos poner el valor 20H en el EOI.
MOV AL, 20H
OUT 20H, AL ;EOI = 20H

IMR_21H

  • Nos permite definir qué interrupciones vamos a atender y cuáles ignorar.
  • 1 Significa deshabilitada, 0 habilitada

digitos

VECTOR_DE_INTERRUCIONES

Hemos visto que existen dos tipos de interrupciones, por hardware y por software, que son necesarios por razones distintas. En las interrupciones por hardware, el que interrumpe es un dispositivo y la CPU pasa el control a una subrutina especial llamada manejador de interrupciones para atenderlo. En las que son por software, el que interrumpe es el mismo programa, y la CPU pasa el control al sistema operativo que lo atiende ejecutando una subrutina de sistema.

  • Va de la posición 0(0000H) a la 1023 (0400H)
  • Consta de 1024 posiciones de memoria
  • Lo usamos para asociar las interrupciones con una subrutina a ejecutar
  • Seleccionar un ID es crucial ya que se usará para asociar una interrupción con una subrutina
  • Cuando ocurre una interrupcion la máquina toma el ID que elegimos y busca la dirección de la subrutina a ejecutar en la posición ID*4 del vector de int.
  • Solo puede manejar 256 interrupciones ya que tengo 1024 casillas y cada interrupcion ocupa 4 casillas (1024 / 4 = 256)

TIMER

Es otro dispositivo de E/S como el F10. Se utiliza como reloj despertador para la CPU. Se configura para contar una cantidad determinada de segundos y cuando finaliza la cuenta emite una interrupcion. Tiene dos registros CONT y COMP, con direcciones de la memoria E/S 10H y 11H, respectivamente

regis

CLI
 MOV AL, 11111101b ;Activamos el timer
 OUT 21H, AL ; PIC: registro IMR
 MOV AL, 10
 OUT 25H, AL ; PIC: registro INT1 (Timer)
 MOV AL, 10 ;ES 10, POR SI LO CAMBIO
 OUT 11H, AL ; TIMER: registro COMP 
 MOV AL, 0
 OUT 10H, AL ; TIMER: registro CONT
STI

F10

Contar las veces que se presionó la tecla F10 en DL

Vamos a realizar los siguientes pasos:

  • Escribir la subrutina que se ejecutará cuando se produzca la interrupcion (que finaliza con IRET)
  • Elegir un ID de interrupción (cualquiera menos 0, 3, 6 o 7)
  • Poner la dirección de la subrutina en el Vector de Interrupciones
  • Configurar PIC
    • Bloquear las interrupciones con la sentencia CLI
    • Poner el ID en el PIC para la interrupción que nos interesa
    • Desenmascarar la interrupcion.
    • Desbloquear las instrucciones con la sentencia STI
Parte 1 Parte 2
ORG 2000H
 ;SELECCIONAR ID 10 PARA EL F10
  
 ;CONFIGURAMOS EL VECTOR DE INTERRUPCIONES
 MOV AX, CONTAR ;AX = Dir de CONTAR(3000H)
 MOV BX, 40 ;10 * 4 en el Vec. de Int.
 MOV [BX], AX ;EN LA POSICION 40 PONE EL 3000H

 ;CONFIGURAMOS EL PIC
 CLI
 MOV AL, 11111110B ;Configuramos solo el INT0 (F10)
 OUT 21H, AL  ;IMR
 MOV AL, 10
 OUT 24H, AL ;ID 10(PUEDE SER CUALQUIERA)
 STI
 
 LOOP: JMP LOOP ;LOOP INFINITO
 
INT 0
END
ORG 3000H
;Subrutina que atiende a la F10
CONTAR: INC DL
 
 ;AVISAR AL PIC QUE TERMINAMOS!
 MOV AL, 20H
 OUT 20H, AL
 
 ;VOLVEMOS
IRET

HANDSHAKE

Es una abstracción de la impresora, la impresora va a generar una comunicación con este. Nos interrumpe a través del pic.

handd

ESTADO: Tiene 8 bits como todas las celdas de memoria. Estos bits tienen diferentes significados dependiendo de si los pusimos en ENTRADA o SALIDA.

ENTRADA SALIDA
END SALIDA2

IMPRIMIR_POR_CONSULTA_DE_ESTADO

PROGRAMA PRINCIPAL DATOS FUNCIONAMIENTO
ORG 2000H
;CONFIGURO EL HANDSHAKE PARA EL POOLING
IN AL, HAND_ESTADO
AND AL, 01111111B        ;7FH MODIFICO SOLO EL ULTIMO BIT
OUT HAND_ESTADO, AL      ;ESTADO = 0XXXXXXX

;RECORREMOS EL MENSAJE Y LO ENVIAMOS POR CARACTER A LA IMPRESORA
MOV BX, OFFSET MENSAJE   ;PARA RECORRER EL MENSAJE

;DESOCUPO LA IMPRESORA
POLL: IN AL, HAND_ESTADO ;TOMO EL ESTADO ACTUAL
AND AL, 1                ;CHEQUEO EL PRIMER BIT
JNZ POLL                 ;MIENTRAS SEA 1 SIGO EN EL LOOP

; IMPRIMO 
MOV AL, [BX]             ;TOMO EL CARACTER
OUT HAND_DATO, AL        ;LO ENVIO AL REGISTRO DE DATOS

; AVANZO
INC BX                   ;AVANZO A LA SIGUIENTE POSICION
CMP BX, OFFSET FIN       ;CHEQUEO SI LLEGUE AL FINAL
JNZ POLL

INT 0
END
HAND_DATO EQU 40H
HAND_ESTADO EQU 41H

ORG 1000H
 MENSAJE DB "HOLA"
 FIN DB ?

Tiempo

IMPRIMIR_POR_INTERRUPCION

PROGRAMA PRINCIPAL DATOS FUNCIONAMIENTO
ORG 2000H
 ;CONFIGURO EL VECTOR DE INTERRUPCIONES. ID = 9
 MOV AX, IMPRIMIR
 MOV BX, 36       ;9*4 = 36
 MOV [BX], AX
 
 ;CONTADOR
 MOV BX, OFFSET MENSAJE ;PARA COMENZAR EL CONTEO
 MOV DL, OFFSET FIN - OFFSET MENSAJE
 
 ;CONFIGURO PIC
 CLI
 MOV AL, 11111011B ;SOLO HANDSHAKE HABILITADO (0FBH)
 OUT 21H, AL ; IRM
 MOV AL, 9   ; ID = 9
 OUT 26H, AL ; MANDO LA ID AL INT2 (HANDSHAKE)
 
 ;CONFIGURO EL HANDSHAKE PARA LA INTERRUPCION
 OR AL, 10000000B    ; MANDO UN 1 AL MENOS SIGNIFICATIVO 
 OUT 41H, AL         ; ACTIVO EL HANDSHAKE COMO INTERRUPCION
 STI
 
 ;SIMULAMOS UN PROGRAMA EN EJECUCION
 POLL: CMP DL, 0    ; CHEQUEO QUE SE TERMINO EL CONTADOR
 JNZ POLL   
 IN AL, 41H                
 AND AL, 7FH         ; 0111 1111
 OUT 41H, AL         ; DESACTIVO EL HANSHAKE COMO INTERRUPCION

INT 0
END
ORG 1000H
 MENSAJE DB "HOLA"
 FIN DB ?
 
ORG 3000H
;RECORREMOS EL MENSAJE Y LO ENVIAMOS POR CARACTER
IMPRIMIR: PUSH AX
 MOV AL, [BX] 
 OUT 40H, AL
;AVISO AL PIC Y VUELVO
INC BX
DEC DL
JNZ CONTINUAR
;DESACTIVO HANDSHAKE POR INTERRUPCION
MOV AL, 01111111B
OUT 21H, AL
;___________________________________
CONTINUAR: MOV AL, 20H
OUT 20H, AL
POP AX
IRET

Tiempo

Impresora_Por_Pio

Memoria Dispositivos
PIOOO

Registro de Estado: Veamos cuáles bits del registro estado son de entrada y cuáles de salida..

busi2

  • Bit 0 (busy): 1 si está ocupada la impresora, 0 si está libre. (ENTRADA)
  • Bit 1 (strobe): seteando el bit en 1 le avisamos a la impresora que dejamos un caracter en DATO para que lo imprima. (SALIDA)
  • Cuando la impresora esta llena, manda automaticamente un 1 al PA

Ejemplo: Escribir un programa que envíe datos a la impresora a través del PIO.

  • ¿Cómo configuramos el PA a partir de CA? Strobe en 0 (salida) y Busy en 1(entrada)
  • ¿Cómo configuramos el PB a partir de CB? Todos de salida!
  • Consultaremos constantemente si está libre Chequear si el bit Busy = 0
  • Cuando la impresora esté libre mandamos el caracter a PB (31H)
  • Hasta que no mandemos el bit de Strobe en 1 no se va a imprimir!
  • Después de enviar el Strobe en 1, debemos volver a ponerlo en 0.
  • DEL PUNTO 3 AL 6 DEBEMOS REPETIRLO PARA CADA CARACTER
;CONFIGURACION BASE DEL PIO
MOV AL, 11111101B ;STROBE DE SALIDA, BUSY DE ENTRADA
OUT 32H, AL       ;CA

MOV AL, 0         ;TODOS DE SALIDA
OUT 33H, AL       ;CB
;RECORREMOS EL STRING
MOV BX, OFFSET MENSAJE
POLL: IN AL, 30H         ; CHEQUEAMOS EL ULTIMO BIT EN PA
  AND AL, 1              ; CUANDO ESTA EN 0, SIGNIFICA QUE ESTA LIBRE LA IMPRESORA
  JNZ POLL               ; MIENTRAS NO ESTE LIBRE, SIGO CONSULTANDO
;LA IMPRESORA ESTA LIBRE
MOV AL, [BX]            ; EN PB PONGO EL DIGITO ACTUAL
OUT 31H, AL             ; MANDO A LA IMPRESORA EL DIGITO ACTUAL (AL PUERTO DE DATOS)

COMO ESTAMOS TRABAJANDO CON LA IMPRESORA POR PIO, TENEMOS QUE MANDAR LOS DATOS MANUALMENTE, TENEMOS QUE MANDAR LA SEÑAL DE STROBE, QUE ES LO QUE AVISA QUE DEJAMOS UN CARACTER EN PB

;MANDO STROBE EN 1  (ESTO SIRVE PARA IMPRIMIR EL DATO)
IN AL, 30H
OR AL, 2            ; FUERZO EL STROBE A 1
OUT 30H, AL         ; MANDAMOS EL STROBE AL PUERTO DE ESTADO (PA)

;MANDO STROBE EN 0 (ESTO SIRVE PARA VOLVER AL ESTADO Y DETECTAR SI EN EL PROXIMO CARACTER DEBE IMPRIMIRSE)
IN AL, 30H
AND AL, 0FDH      ; FUERZO EL STROBE A 0
OUT 30H, AL       ; MANDAMOS EL STROBE AL PUERTO DE ESTADO (PA)
;FIN DEL BUCLE, HASTA LLEGAR AL FIN
INC BX
CMP BX, OFFSET FIN
JNZ POLL
PROGRAMA PRINCIPAL FUNCIONAMIENTO
ORG 1000H
 MENSAJE DB "AQUITECTURA"
 FIN DB ?

ORG 2000H
MOV AL, 11111101B ;STROBE DE SALIDA, BUSY DE ENTRADA
OUT 32H, AL       ;CA

MOV AL, 0         ;TODOS DE SALIDA
OUT 33H, AL       ;CB
  
IN AL, 30H        ;poner el strobe en 0
AND AL, 0FDH
OUT 30H, AL

;RECORREMOS EL STRING
MOV BX, OFFSET MENSAJE
POLL: IN AL, 30H
  AND AL, 1
  JNZ POLL       ;MIENTRAS NO ESTE LIBRE, SIGO CONSULTANDO
  
  ;LA IMPRESORA ESTA LIBRE
  MOV AL, [BX]
  OUT 31H, AL
  
  ;MANDO STROBE EN 1
  IN AL, 30H
  OR AL, 2      ;TOMAMOS EL ESTADO
  OUT 30H, AL
  
  ;MANDO STROBE EN 0
  IN AL, 30H
  AND AL, 0FDH
  OUT 30H, AL
  
  INC BX
  CMP BX, OFFSET FIN
  JNZ POLL
  
INT 0
END

ARGGGG