Sistemas electrónicos digitales Interrupciones (Introducción) Cesáreo Fernández Martínez Álvaro Sánchez Miralles Interrupciones Creadas para evitar los tiempos de espera de polling (desperdicio de ciclos de CPU) Mecanismo básico – – – – – (inicialización del periférico) Durante el “trabajo normal” el periférico solicita atención. El procesador suspende el “trabajo normal” Atiende al periférico Continúa con el “trabajo normal” (en el lugar interrumpido). Programa principal Interrupción Sistemas electrónicos digitales- 2 Interrupciones II (en más detalle) El periférico solicita interrupción (línea IRQ bus control) – Ej: T0IR, S0TIR, etc (hasta 56 flags de interrupt request) El muP completa la instrucción actual (código máquina). El muP guarda PSW y PC (CSP+IP) en el Stack (de CPU). El muP lanza un ciclo de reconocimiento de interrupt. – Determina qué periférico ha solicitado la interrupción • De entre todos ellos (56) el de mayor prioridad (16 niveles de prioridad. La prioridad se indica en el registro de control de la Interrupc.). – Salta a la función de tratamiento de la interrupción • Tabla de “vectores de interrupción” . Vector: dirección de comienzo de la subrutina de tratamiento de la interrupción. – Durante el tratamiento en PSW se pone el nivel del la interrupción. Sistemas electrónicos digitales- 3 Recursos 167 para tratamiento interrupciones Por cada fuente interrupción (56) tenemos: – Un vector de interrupción • Tabla de vectores en RAM desde 0000H a 0100H (un salto a una subrutina de tratamiento para cada interrupción) – Un registro de control de interrupción Registro de control de interrupción xxIC 15 8 7 6 xxIR xxIE 5 2 1 ILVL 0 GLVL – ILVL: Nivel de la interrupción (0 a 15. Nivel 15 nivel más alto) – xxIE: Bit de habilitación de la interrupción (I Enable) – xxIR: Bit de petición de interrupción (I Request, ej T0IR). Si se pone a 1 se está solicitando una interrupción. Suele indicar que se ha terminado una tarea. Sistemas electrónicos digitales- 4 Y además ... Registro de estado del procesador (PSW) 15 12 ILVL 11 IEN 7 - 0 Flags – Bit 11, IEN : Bit de habilitación global de interrupciones Prioridad del programa en curso en PSW (bits 12 a 15, ILVL) = Prioridad de la interrupción en curso – Bits de ILVL del xxIC de la interrupción en curso (todos a 0 cuando se ejecuta main) ¿Por qué se salva en el stack no sólo el PC sino que se salva también el PSW? Sistemas electrónicos digitales- 5 Ejemplo Programa principal void main(void) { T01CON = 0x06; T0REL = PERIOD; /* indica el valor de recarga del timer */ T0 = PERIOD; /* habilita interrupción de timer: T0IE = 1 */ /* pone prioridad de inter de timer a 1: ILVL = 1 */ T0IC = 0x44; IEN = 1; /* habilita de forma general las interrupciones */ T0R = 1; /* pone en marcha el timer 0 */ DP2 = 0x00FF; while(1) { if (flag % 2 == 0) P2 = P2 >> 8; else P2 = 0xFFFF; } } Variable global: flag (enlace con la f. Interrupción). Sistemas electrónicos digitales- 6 Ejemplo Interrupción de timer 0 (subrutina de trat. de interrupt) #include <reg167.h> #include <stdio.h> #define PERIOD -39062 int flag=0; void timer0(void) interrupt 0x20 { flag++; } Las funciones de tratamiento de interrupción son: – De tipo void xx(void) interrupt num_vect;. – La comunicación con main: con variables globales. Sistemas electrónicos digitales- 7 Tratamiento interrupciones Reglas para escribir una función de tratamiento de interrupción CORRECTA: Escribir funciones cortas – A mayor prioridad, menos líneas de código (es tiempo de CPU que se “roba” a otras interrupciones de menor nivel, y a la propia interrupción con lo que se pueden “perder” interrupciones). – No usar printf (incluye la librería matemática). En ensamblador además – Inicializar el vector de interrupción (“a mano”). – Salvar todos los registros que se usan en la f. Trat. Interr. (cambio de contexto) en el Stack! (para recuperalos a la salida). – ¿Que puede suceder si no se hace así?. – Comprobar (si es posible) a la entrada de la función de tratamiento el xxIR (flag de petición de interrupción). – Retorno de interrupción RETI (RET retorno de función “normal”) Sistemas electrónicos digitales- 8 Ejemplo: Reloj/Calendario Programa principal #include <reg167.h> #include <stdio.h> #define PERIOD -2500 int ticks, sec, min, hour; void main(void) { ticks = sec = min = hour = 0; T01CON = 0x00; T0REL = PERIOD; /* set reload value */ T0 = PERIOD; T0IC = 0x44; /* set T0IE and ILVL = 1 */ IEN = 1; /* set global interrupt enable flag */ T0R = 1; /* start timer 0 */ DP2 = 0x00FF; while(1){ if (P2 & 0x8000) P2 = ~min; else P2 = ~hour; } } Sistemas electrónicos digitales- 9 Interrupción Los contadores se llevan en la interrupción void timer0(void) interrupt 0x20 { ticks++; if (ticks == 1000) { ticks = 0; sec++; if (sec == 60) { sec = 0; min++; if (min == 60) { min = 0; hour++; if (hour == 24) hour = 0; } } } } Sistemas electrónicos digitales- 10 Un ejemplo más Supuesto que la vía serie está inicializada char buffer[MAXB], *ps; int bandera; void main(void) { S0TIC = 0x48; IEN = 1; bandera = 0; /* set S0TIE and ILVL = 2 */ /* set global interrupt enable flag */ while(1) if (!bandera){ strcpy(buffer,”mensaje”); bandera = 1; ps=buffer; S0TIC |= 0x80; } } Sistemas electrónicos digitales- 11 Interrupción La interrupción “salta” cuando se transmite el dato de S0TBUF Si en la subrutina de tratamiento – No se pone carácter en S0TBUF – No “salta” una nueva interrupción !! void vs(void) interrupt 0x2A { if (*ps) S0TBUF = *ps++; else bandera = 0; } ¿Para qué sirve la bandera? – main no se pelea con main – MUTEX: Mutua Exclusión en el acceso a buffer Sistemas electrónicos digitales- 12