Sistemas electrónicos digitales Interrupciones

Anuncio
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
Descargar