Sunteți pe pagina 1din 15

ESCUELADEINGENIERAINFORMTICA GradoenIngenieraInformtica

PERIFRICOSEINTERFACES
PRCTICASDELABORATORIO Mdulo1Prctica1 Excepcioneseinterrupciones:MIPS32
Actualizado:enero,2012

Prctica1

Excepcioneseinterrupciones:MIPS32

1. Competenciasyobjetivosdelaprctica
La primera prctica de la asignatura Perifricos e Interfaces se centra en el uso de los mecanismos de sincronizacinbsicosentreCPUydispositivosdeentrada/salida.Paraello,seutilizarelsimuladorPCSpim versin 7 o posterior que simula la arquitectura MIPS32. Concretamente la versin a utilizar en el laboratorio ser la versin 8. Para poder utilizar las tcnicas de sincronizacin bsicas el simulador PCSpim simulavariosdispositivoshardwareentrelosquepodemosencontrar:untimer,undispositivodeentradao receptor (teclado) y un dispositivo de salida o transmisor (pantalla). El comportamiento y uso de estos dispositivossedefineatravsdelosregistrosdesusinterfaces. Estareadelusuariodesarrollarelsoftware de bajo nivel para programar el modo de funcionamiento de estos dispositivos y realizar las transferencias de datos sincronizando la actividad de los dispositivos de entrada/salida y CPU con las tcnicas bsicas de: consulta de estado (o polling) e interrupciones. Con la realizacin de esta prctica se pretende que el alumnoalcancelassiguientescompetencias: 1. Capacidad para entender los diversos aspectos software y hardware involucrados en los mtodos desincronizacin. 2. Capacidad para disear e implementar el software necesario para la gestin de interrupciones y excepcionesenunsistemaconarquitecturadeprocesadortipoMIPS32simuladoporelPCSpim. 3. Capacidad para hacer uso de los perifricos simulados en el PCSpim para el intercambio de informacin entre el sistema y su entorno utilizando como mtodos de sincronizacin la consulta deestadoylasinterrupciones. 4. Capacidadparaaprenderyaplicarnuevosconceptosdeformaautnomaeinterdisciplinar. 5. Capacidadparaemplearlacreatividadenlaresolucindelosproblemas. 6. Capacidadparatrabajarenequipoycolaborareficazmenteconotraspersonas. Paraalcanzarestascompetenciasseplantealaconsecucindelossiguientesobjetivos: 1. Conocer y usar el simulador PCSpim para la ejecucin y depuracin de programas sencillos realizadosenensambladordelprocesadorMIPS. 2. Conocer y entender los aspectos bsicos de funcionamiento de los dispositivos hardware simuladosenelPCSpim. 3. Realizar programas sencillos que impliquen operaciones de entrada/salida con los perifricos simuladosenelPCSpimutilizandolaconsultadeestadocomomtododesincronizacin. 4. ConoceryentenderlagestindeinterrupcionesenlaarquitecturadelMIPS32atravsdelestudio delmanejadordeexcepcioneseinterrupcionesexception.sdelPCSpim. 5. Disear y programar una aplicacin sencilla que implique operaciones de entrada/salida con los perifricos simulados en el PCSpim, combinando la consulta de estado y las interrupciones como mtodosdesincronizacin.

2. Documentacin

La documentacin bsica a manejar en la realizacin de esta prctica est disponible en la plataforma Moodleinstitucional,yseconcretaen: Enunciadodelaprctica:estedocumento SimuladorPCSpim:Versin8disponibleenMoodle(software) DocumentosvariosrelativosalfuncionamientodelPCSpim. Librodetexto: o [Patt00] Patterson, David and Hennessy, John L. Estructura y Diseo de Computadores. Interficiecircuietera/programacin,Ed.Revert,S.A.,2000
GII:PerifricoseInterfaces

Prctica1

Excepcioneseinterrupciones:MIPS32

3. Conceptosprevios

Las excepciones e interrupciones en un procesador con arquitectura MIPS32 son eventos que hacen que elprocesadorcambieelflujonormaldeejecucinde lasinstrucciones.Lasexcepcionestienensuorigenen el interior del procesador y se generan como consecuencia de algn error en la ejecucin de una instruccin (desbordamiento aritmtico, accesos errneos a memoria, ) o por otros motivos (llamadas al sistema, puntos de ruptura, ...). Las interrupciones son eventos que tienen su origen en el exterior del procesador generados normalmente por los perifricos que solicitan la atencin del procesador para que atiendanunaoperacindeE/S. EnlosprocesadoresconarquitecturaMIPS32,unadelapartedelaCPUllamadacoprocesador0registrala informacin que el software necesita para tratar las excepciones e interrupciones. El simulador PCSpim (versin7yposteriores)deMIPSnoimplementatodoslosregistrosdelcoprocesador0realperoslosque semuestranenlasiguientetablaquesonsuficientesparalafuncionalidadsimulada:

Nombrederegistro BadAddr Count

Registrodel coprocesador0 8 9

Uso Registroquecontieneladireccindememoriaenla queseprodujolaexcepcin. Timer:Registrode32bits.Seincrementacada10 ms(comprobarencadacaso!)mientraselPCSpim estnenfuncionamiento. Valorconelquesecomparaelcontenidodeltimer. Cuandosonigualessegeneraunainterrupcin hardwaredeltimer(nivel5). Mscaradeinterrupcinybitsdehabilitacin Tipodeexcepcinybitsdeinterrupciones pendientes Registroquecontienedireccindelainstruccin queprovoclaexcepcin. Configuracindemquina

Compare Status Cause EPC Config


11 12 13 14 16

Estos registros son parte del conjunto de registros del coprocesador 0 y se pueden acceder a ellos en operacionesdelecturaoescrituraatravsdelassiguientesinstrucciones:

Instruccin Descripcin lwc0 rt,inm16(rs) Cargaunapalabraenelregistrortdelcoprocesador0 swc0 rt,inm16(rs) Almacena registro rt del coprocesador 0 en la direccin de memoria dada por inm16(rs). mtc0 rt,rd TransfiereelregistrortdelaCPUalregistrorddelcoprocesador0 mfc0 rt,rd Transfiereelregistrorddelcoprocesador0alregistrortdelaCPU

Despus de una excepcin, el registro EPC contiene la direccin de la instruccin que se estaba ejecutando cuando se produjo la excepcin o interrupcin. Si la instruccin que caus la excepcin realizaba un acceso a memoria (por ejemplo, acceso a una palabra en una direccin impar de memoria), el registro BadAddr contiene la direccin de la posicin de memoria referenciada. Los otros dos registros, Cause y Status, contienenvarioscamposquesedescribenacontinuacin.

GII:PerifricoseInterfaces

Prctica1

Excepcioneseinterrupciones:MIPS32

Registrodestatus(12) LasiguientefiguramuestraloscamposderegistroStatusimplementadosporelsimulador.

El campo de mscara de interrupcin (IM7..IM0) dispone de un bit para cada una de las 8 interrupciones: dos interrupciones software (IM1IM0) y 6 interrupciones hardware (IM7IM2). Un bit a 1 de mscara permitir las interrupciones a ese nivel y un bit a 0 las deshabilita. La correspondencia entre dispositivos y lneasdeinterrupcineslasiguiente: IM0:Interrupcinsoftwarenivel0 IM1:Interrupcinsoftwarenivel1 IM2:Interrupcinhardwarenivel0(pantallaenPCSpim) IM3:Interrupcinhardwarenivel1(tecladoenPCSpim IM4:Interrupcinhardwarenivel2 IM5:Interrupcinhardwarenivel3 IM6:Interrupcinhardwarenivel4 IM7:Interrupcinhardwarenivel5(timer) Otros bits del registro de estado de inters para esta prctica son: el bit 0 (IE: Interrupt enable) y el bit 1 (EXL:Exceptionlevel).ELbit0(IE)esunbitdehabilitacindeinterrupciones.Paraqueelprocesadoracepte interrupciones es necesario que este bit est a 1. Cuando est a 0 las interrupciones estn deshabilitadas y aunque se produzcan, el procesador no las atender. El bit 1 (EXL) est normalmente a 0, sin embargo cuando el procesador detecta y acepta una excepcin este bit se coloca a 1 provocando que el procesador funcione en modo supervisor y no aceptar ms interrupciones o excepciones hasta que retorne a 0. Por tanto, el procesador no atender nuevas excepciones o interrupciones mientras est atendiendo a la actual. En resumen, podemos concretar que para que el procesador acepte interrupciones ser necesario que el bit0(IE)esta1,lasmscarasconvenientementehabilitadassegnelnivelquesequierapermitiryelbit1 (EXL)a0.LaarquitecturadeMIPS32disponedeinstruccionestalescomo: Habilitainterrupciones:EI EI #r0regstatus;StatusIE=1 EIrt #rtregstatus;StatusIE=1 Deshabilitainterrupciones:DI DI #r0regstatus;StatusIE=0 DIrt #rtregstatus;StatusIE=0 Estas operaciones tambin se pueden hacer directamente leyendo el registro de estado del procesador y realizando las operaciones convenientes de modificacin para colocar los bits IM7IM0, EXL e IE a los valores adecuados y volver a escribirlo. Usar un mtodo u otro depender de si en el simulador se han implementadoestasinstruccionesespecialesdelaarquitectura.
GII:PerifricoseInterfaces

Prctica1

Excepcioneseinterrupciones:MIPS32

Registrodecause(13) En el registro de cause se guarda, entre otra informacin, la causa de la interrupcin o excepcin (EXc. Code)yelnivelenlaqueseprodujo(IP7IP0).

LasiguientetablamuestraloscamposdelregistroCauseimplementadosporPCSpim.
3116N.D. BD 15 14 13 12 11 10 9 8 Interrup.Pendientes(IPn) 7 6 0 0 0 0 0 0 0 0 0 0 5 4 3 2 Excepcin 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 <bitsdeReg.Cause 0 0 ValorenHex. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0x00000000 0x00000010 0x00000014 0x00000018 0x0000001C 0x00000020 0x00000024 0x00000028 0x00000030

Los bits del campo de interrupciones pendientes (IPn) corresponden a los 8 niveles de interrupcin (6 hardware y 2 software). Un bit se pone a 1 cuando se ha presentado una interrupcin en su nivel y est pendiente de ser atendida por el procesador. Por otra parte, el campo de cdigos de excepcin (exception code)describelacausadeunaexcepcinconlossiguientescdigos:

Nmero 0 4 5 6 7 8 9 10 12

Nombre INT ADDRL ADDRS IBUS DBUS SYSCALL BKPT RI OVF

Descripcin Interrupcinexterna Excepcindeerrordedireccin(encargaobsquedadeinstruccin). Excepcindeerrordedireccin(enalmacenamiento) Errordebusenbsquedadeinstruccin Errordebusencargaoalmacenamientodedatos Excepcinsyscall.Llamadasalsistema Excepcindepuntoderuptura Excepcindeinstruccinreservada Excepcindedesbordamientoaritmtico

La siguiente tabla muestra a modo de resumen el mapeo o correspondencia entre instrucciones y los registrosdeestadoydecause.

GII:PerifricoseInterfaces

Prctica1

Excepcioneseinterrupciones:MIPS32

Registroscount(9)ycompare(11) El registro count es un registro de 32 bits que funciona como un timer de modo que se incrementa cada x milisegundos. La velocidad con la que se incrementa depende de cada implementacin. En el caso del simulador PCSpim y segn la informacin disponible, el registro count se incrementa cada 10 ms. Este registrosepuedeleeryescribiraunquelaoperacinqueserealizanormalmenteeslapuestaacero. El registro compare es un registro de lectura y escritura cuyo valor se compara constantemente con el valor almacenado en el registro count o timer. Si ambos valores coinciden entonces se genera una interrupcinhardwaredenivel5.Segnlatablaanteriorseobservaqueelbit15delosregistrosdeestado (IM7)ycause(IP7)sonlosqueestnrelacionadosconeltimer.Parasufuncionamientobastaconcargarun valor de comparacin en el registro de compare y luego poner el registro count o timer a 0. Mientras funcione el PCSpim el registro count incrementar su valor cada 10 ms (comprobar!) y cuando su valor alcance el almacenado en el registro compare se generar una interrupcin hardware de nivel 5. Si queremos que el timer vuelva a interrumpir ser necesario ponerlo a cero o resetearlo. El valor almacenadoenelregistrocomparepermaneceestableynoesnecesarioreescribirlo. LagestindeinterrupcionesyexcepcionesenlaarquitecturaMIPS32 Las excepciones e interrupciones hacen que el procesador MIPS bifurque a la direccin 0x80000180 (espacio de direcciones de la memoria reservada para el sistema operativo) donde ha de residir el manipulador de interrupciones (ver exception.s en PCSpim) o trozo de cdigo del sistema operativo que gestionaeltratamientodelainterrupcinsegnlossiguientespasos: Paso1.Paraqueelprocesadoratiendaunainterrupcinesnecesarioqueseprogrameadecuadamentesu registro de estado y tambin los registros de los interfaces de los perifricos para que sean capaces de generar interrupciones. Cuando el procesador es interrumpido entra en un ciclo de reconocimiento y aceptacin de interrupcin en el que lo primero que hace es guardar el estado en el que se encontraba antes de la interrupcin. Esto consiste en guardar en el registro EPC la direccin de la instruccin interrumpida o la que gener el fallo o excepcin. Es importante destacar que si esta instruccin se encuentraenunhuecoderetardoentoncesenEPCseguardaladireccinPC4yseactivaelbit31(BD)del registro de cause. En este primer paso tambin se guarda en el registro BadVAddr la direccin de memoria a la que accede el procesador cuando la interrupcin se produce en una acceso a memoria(load/store). En el registro de cause se guarda adems de las interrupciones pendientes (IPn) la causa de la interrupcin.
GII:PerifricoseInterfaces

Prctica1

Excepcioneseinterrupciones:MIPS32

Porltimo,elprocesadordeshabilitalasinterrupciones(EXL=1,IE=0delregistrodeestadodelprocesador) yseponeenmodosupervisor. Paso 2. El procesador bifurca a la direccin de memoria fija 0x80000180 reservada para el sistema operativoyalaqueslosepuedeaccederenmodosupervisor. Paso 3. El procesador ejecuta el manejador de interrupciones (exception.s en el caso del simulador PCSpim) y bifurca a la rutina de servicio de la interrupcin o excepcin. Es importante destacar que es absolutamente necesario guardar el estado de cualquier recurso del procesador (registros) antes de utilizarlo. Tenga en cuenta que el manejador de interrupciones que se suministra con el el PCSpim slo trata las excepciones de modo que tendr que modificar este manejador para que detecte las interrupcionesquepuedagenerarelperifricoyseejecutelarutinadeserviciocorrespondiente. Paso 4. Una vez ejecutadas las instrucciones que forman el cuerpo de la rutina de servicio slo queda retornar al programa interrumpido. Para ello ser necesario recuperar el estado original de todos los registros que hayan sido modificados en la rutina de servicio y el registro de estado para dejarlos a todos ellos en el mismo estado que tenan cuando se produjo la interrupcin. El retorno al programa interrumpido se realizar mediante la instruccin ERET que carga en el PC el contenido del registro EPC. Tenga en cuenta que cuando se retorna del tratamiento de una excepcin se ha de actualizar el EPC con EPC + 4 para saltar la instruccin que gener la excepcin o fallo. Si es una interrupcin no ser necesario modificar el EPC, ya que este contiene la direccin de la instruccin interrumpida que an no se ha ejecutadoyportantosernecesarioqueelprocesadorvuelvaaellaparaejecutarla. A modo de ejemplo veamos en detalle algunas lneas de cdigo que podemos encontrar en el manejador de interrupciones con las que se implementa los pasos anteriormente comentados. El sistema operativo respondeaunaexcepcinbienterminandoelprocesoqueprovoclaexcepcinorealizandoalgunaaccin (ejecucin de una rutina de servicio). Un proceso que produce un error, tal como ejecutar una instruccin no implementada, es destruido por el sistema operativo. Veamos a continuacin un ejemplo de un manejador de interrupciones simple que llama a una rutina para imprimir un mensaje para cada excepcin (nointerrupcinexterna). 1. Elmanejadordeinterrupcionesprimeroguardalosregistros$a0y$a1,quemstardeutilizaparapasar argumentos. El manipulador de interrupciones no puede guardar estos registros en la pila, como hara una rutina ordinaria, porque la causa de la excepcin puede haber sido una referencia a memoria que utiliz un valor malo en el puntero de pila. Guarda estos dos registros en dos posiciones de memoria: save0 y save1. Durante la ejecucin de este manejador no atiende a otras interrupciones (interrupcionesinhabilitadas),porloqueessuficienteestasdosposiciones. .kdata save0: .word 0 save1: .word 1 .ktext 0x80000180 sw $a0,save0 sw $a1,save1 2. SetransfiereloscontenidosdelosregistrosCauseyEPCdelcoprocesador0alosregistros$k0y$k1de la CPU (reservados para el sistema operativo). Si es una interrupcin se trata y si es una excepcin se imprimemensajeenpantalla: mfc0 $k0, $13 # transfiere Cause a $k0
GII:PerifricoseInterfaces

Prctica1

Excepcioneseinterrupciones:MIPS32

mfc0 $k1, $14

# transfiere EPC a $k1

srl $a0, $k0, 2 andi $a0,$a0,0x1f # extrae el cdigo de la excepcin bnez $a0, noint # Exc. Code = 0 interrupcin externa # Interrupcin externa: rutina de servicio perifrico .. .. j ret noint: # Excepcin: imprime mensaje de la excepcin producida jal print_excp j done 3. Luego, se calcula la direccin a la que se debe retornar. Si es una excepcin ajustaremos el EPC sumndole 4 (etiqueta done) para que el programa la instruccin que gener la excepcin no vuelva a producirla y quede en un bucle. Si no ha sido una interrupcin no ser necesario (etiqueta ret). Por ltimo, se habilitan las interrupciones en el registro de estado, se recuperan los registros modificados $a0 y $a1 y se retorna al programa interrumpido con la instruccin eret que bifurca a la direccin de memoriaqueleindiqueelcontenidodelEPC. done: mfc0 $k0, $14 # EPC addiu $k0,$k0, 4 # EPC = EPC + 4 mtc0 $k0, $14 ret: mtc0 $0,$13 # clear del registro de cause mfc0 $k0, $12 # lectura registro de estado andi $k0,$k0,0xfffd # bit EXL = 0 ori $k0,$k0,0x01 # bit IE = 1 mtc0 $k0, $12 # actualizamos registro de estado # recuperamos registros lw $a0,save0 lw $a1,save1 eret # retorno EPC DISPOSITIVOSDEENTRADA/SALIDAENPCSpim PCSpim simula un dispositivo de entrada/salida que se corresponde con un terminal que podemos encontrar en cualquier sistema informtico y que bsicamente consta de una pantalla (dispositivo de salida) y un teclado (dispositivo de entrada). Desde el punto de vista del PCSpim el dispositivo terminal consta de dos unidades independientes: un receptor (teclado) y un transmisor (pantalla). El receptor lee caracteres del teclado. El transmisor visualiza caracteres en pantalla. Esto significa que los caracteres tecleados en el teclado no se visualizan automticamente en la pantalla. Para ello, es necesario que un programalealosdatosdelreceptorylosescribaeneltransmisor. El terminal es controlado a travs de cuatro registros que se encuentran mapeados en memoria (memory mapped I/O) o lo que es lo mismo, cada registro aparece como una posicin especial de memoria. Veamos a continuacin los registros asociados a cada dispositivo. Existen dos registros por cada dispositivo: uno de controlyotrodedatos. REGISTRODECONTROLDELRECEPTOR(teclado) 1 1 Receptor:control Nousado Inte Prep. 0xFFFF0000
GII:PerifricoseInterfaces

Prctica1

Excepcioneseinterrupciones:MIPS32

bit0:Preparado.Datorecibido;bit1:Habilitacindeinterrupcin De este registro slo se utilizan los dos bits menos significativos. El bit de preparado es de slo lectura. Cambiade0a1cuandosetecleauncarcter.Cuandoelcarcteresledoatravsdelregistro"receptorde datos" el bit se pone de nuevo a 0. El bit 1 del registro de control del receptor es el de habilitacin de interrupcin. Inicialmente est a 0. Si se pone a 1 por programa, el terminal genera una interrupcin hardware de nivel 1 (correspondencia con bit IM3 mscara registro de status y bit IP3 registro de cause) siempre que el bit de preparado est a 1. El procesador tratar la interrupcin si ese nivel est habilitado enelregistroStatus(bit8=1ybit0=1). REGISTRODEDATOSDELRECEPTOR(teclado) 8 Receptor:dato Nousado Byterecibido 0xFFFF0004 Losochobitsinferiorescontieneelcdigodelaltimateclapulsada. REGISTRODECONTROLDELTRANSMISOR(pantalla) 1 0 Transmisor:control Nousado Inte Prep. 0xFFFF0008 bit0:Preparadoparatransmitir;bit1:Habilitacindeinterrupcin De este registro slo se utilizan los dos bits menos significativos. El bit de preparado es de slo lectura. Si este bit es 1, el trasnmisor est listo para transmitir un nuevo carcter. Si el bit es 0, el transmisor todava estocupadotransmitiendoalapantallaelcarcteranterior.Elbit1delregistrodecontroldeltransmisor es el bit de habilitacin de interrupcin. Inicialmente est a 0. Si se pone a 1 por programa, el terminal genera una interrupcin hardware a nivel 0 (correspondencia con bit IM2 mscara registro de status y bit IP2 registro de cause) siempre que el bit de preparado est a 1. El procesador tratar la interrupcin si ese nivelesthabilitadoenelregistroStatus(bit9=1ybit0=1). REGISTRODEDATOSDELTRANSMISOR(pantalla) 8 Transmisor:Dato Nousado Bytetransmitido 0xFFFF000C Cuando se escribe un valor en esta posicin , los ocho bits inferiores (cdigo ASCII) son enviados a la pantalla (ventana console). Cuando es transmitido, el bit de preparado del registro de control del transmisorseponea1indicandoqueestlistoparaaceptarunnuevocarcterytransmitirlo.

GII:PerifricoseInterfaces

Prctica1

Excepcioneseinterrupciones:MIPS32

4. Realizacinprctica
La actividad prctica consistir en el desarrollo modular de cdigo para las diferentes tareas que se plantean a continuacin. En el ltimo apartado se plantea una tarea de carcter integrador que combina todos los apartados desarrollados anteriormente para dar lugar a una aplicacin final. Las tareas a desarrollarsonlassiguientes: Tarea1. Realizar una subrutina llamada PrintCharacter para imprimir un carcter al dispositivo de salida(pantalla)utilizandolasincronizacinporconsultadeestadodelperifrico. Tarea2. Realizar un programa que, de forma indefinida, imprima una frase en la pantalla. Establezca una pausa entre la impresin de cada carcter de la frase (por ejemplo un carcter por segundo) y haga uso de la subrutina desarrollada anteriormente. Observe si hay prdida de caracteres. Tarea3. Analizar y estudiar el cdigo del manejador de excepciones suministrado con PCSpim y mostradoenelApndiceA.Realizarundiagramadeflujodelmanejador. Tarea4. Realizar la programacin que estime oportuna para atender al teclado por interrupciones. La rutina de servicio del teclado leer el cdigo de la tecla pulsada , actualizar un contador que indique el nmero de pulsaciones realizadas hasta ese momento y enviar a pantalla el siguientemensaje:"[Pulsacin(nmero)=teclapulsada]". Tarea5. Combinarlaimpresincontinuadelafraseconelfuncionamientodelteclado.Paracomprobar el funcionamiento correcto del atendimiento del teclado y del sistema en general, se desarrollarunprogramaprincipalconsistenteenunbucleindefinidoimprimiendoenpantalla una frase determinada. Si se pulsa una tecla debe interrumpirse la ejecucin del programa principal y atender al teclado a travs de su rutina de servicio. La salida ser similar a la que figuraenlasiguienteventana:

Tarea6. Implementar un reloj haciendo uso de los registros count (timer) y compare del procesador. La interrupcin del timer (una por segundo) desencadenar la ejecucin de la rutina de servicio del timer que ser la encargada de actualizar los contadores internos asociados a las horas, minutos y segundos. Antes de salir la rutina de servicio mostrar en pantalla (en una nueva lnea) la hora segn el siguiente formato: <nueva lnea> Hora local 13:23:55 <nueva lnea>. La puesta en hora del reloj se activar al pulsar en el teclado CTRL+R cuyo cdigo ser detectado por la rutina de servicio del teclado para saltar o llamar a la subrutina de puesta en hora. Esta subrutina de puesta en hora pedir al usuario el valor de cada uno de los campos correspondientes a horaminseg. Tiene completa libertad para disearlosdiversosaspectosdelinterfazdeusuariodeestatarea:sevalorarpositivamentela calidaddedichointerfaz.
GII:PerifricoseInterfaces

10

Prctica1

Excepcioneseinterrupciones:MIPS32

Tengaen cuentaqueha demodificarelmanejador deexcepcionesoriginal(ficheroexception.s)yaque este no gestiona las interrupciones externas. La modificacin del manejador permitir tratar las interrupciones externas bifurcando a la rutina de servicio CaseIntr cuya funcin es la de detectar el origen de la interrupcin externa (en nuestro caso: teclado o timer). Una vez detectado el origen de la interrupcin se llamar a la rutina de servicio del teclado (KbdIntr) o a rutina de servicio del timer (TimerIntr). Una vez que el perifrico es atendido se retornar al kernel o manejador de excepciones desde donde se retornar al programa principal interrumpido encargado de imprimir en pantalla un mensajedeformacontinua. La estructura general del programa deber ajustarse a la que se muestra en el Apndice B de esta memoria.

5. Defensayentregadelaprctica
Una vez realizada la prctica, el estudiante deber elaborar una memoria que consistir en los listados de los programas convenientemente documentados y los diagramas de flujo que se requieran en cada apartado. Adems, el alumno deber mostrar al profesor el funcionamiento correcto de los programas y contestaracuantaspreguntessteformule. Lafechalmiteparalaentregadelasmemoriasessiemprelafechadecomienzodelasiguienteprctica.

GII:PerifricoseInterfaces

11

Prctica1

Excepcioneseinterrupciones:MIPS32

APNDICEA
Listadodelficherotrap.handler(manejadordeexcepciones/interrupciones)suministradoconPCSpim. # SPIM S20 MIPS simulator. # The default exception handler for spim. # # Copyright (c) 1990-2010, James R. Larus. # All rights reserved. # ## Define the exception handling code. This must go first! .kdata __m1_: .asciiz " Exception " __m2_: .asciiz " occurred and ignored\n" __e0_: .asciiz " [Interrupt] " __e1_: .asciiz " [TLB]" __e2_: .asciiz " [TLB]" __e3_: .asciiz " [TLB]" __e4_: .asciiz " [Address error in inst/data fetch] " __e5_: .asciiz " [Address error in store] " __e6_: .asciiz " [Bad instruction address] " __e7_: .asciiz " [Bad data address] " __e8_: .asciiz " [Error in syscall] " __e9_: .asciiz " [Breakpoint] " __e10_: .asciiz " [Reserved instruction] " __e11_: .asciiz "" __e12_: .asciiz " [Arithmetic overflow] " __e13_: .asciiz " [Trap] " __e14_: .asciiz "" __e15_: .asciiz " [Floating point] " __e16_: .asciiz "" __e17_: .asciiz "" __e18_: .asciiz " [Coproc 2]" __e19_: .asciiz "" __e20_: .asciiz "" __e21_: .asciiz "" __e22_: .asciiz " [MDMX]" __e23_: .asciiz " [Watch]" __e24_: .asciiz " [Machine check]" __e25_: .asciiz "" __e26_: .asciiz "" __e27_: .asciiz "" __e28_: .asciiz "" __e29_: .asciiz "" __e30_: .asciiz " [Cache]" __e31_: .asciiz "" __excp: .word __e0_, __e1_, __e2_, __e3_, __e4_, __e5_, __e6_, __e7_, __e8_, __e9_ .word __e10_, __e11_, __e12_, __e13_, __e14_, __e15_, __e16_, __e17_, __e18_, .word __e19_, __e20_, __e21_, __e22_, __e23_, __e24_, __e25_, __e26_, __e27_, .word __e28_, __e29_, __e30_, __e31_ s1: .word 0 s2: .word 0 # # # # # # This is the exception handler code that the processor runs when an exception occurs. It only prints some information about the exception, but can server as a model of how to write a handler. Because we are running in the kernel, we can use $k0/$k1 without saving their old values.

# This is the exception vector address for MIPS-1 (R2000): # .ktext 0x80000080 # This is the exception vector address for MIPS32: .ktext 0x80000180 # Select the appropriate one for the mode in which SPIM is compiled. .set noat move $k1 $at # Save $at .set at sw $v0 s1 # Not re-entrant and we can't trust $sp sw $a0 s2 # But we need to use these registers mfc0 $k0 $13 srl $a0 $k0 2 andi $a0 $a0 0x1f # Cause register # Extract ExcCode Field

# Print information about exception.

GII:PerifricoseInterfaces

12

Prctica1
# li $v0 4 la $a0 __m1_ syscall li $v0 1 srl $a0 $k0 2 andi $a0 $a0 0x1f syscall li $v0 4 andi $a0 $k0 0x3c lw $a0 __excp($a0) nop syscall bne $k0 0x18 ok_pc nop mfc0 $a0 $14 andi $a0 $a0 0x3 beq $a0 0 ok_pc nop li $v0 10 syscall ok_pc: li $v0 4 la $a0 __m2_ syscall srl $a0 $k0 2 andi $a0 $a0 0x1f bne $a0 0 ret nop

Excepcioneseinterrupciones:MIPS32

# syscall 4 (print_str)

# syscall 1 (print_int) # Extract ExcCode Field

# syscall 4 (print_str)

# Bad PC exception requires special checks

# EPC # Is EPC word-aligned?

# Exit on really bad PC

# syscall 4 (print_str)

# Extract ExcCode Field # 0 means exception was an interrupt

# Interrupt-specific code goes here! # Don't skip instruction at EPC since it has not executed.

ret: # Return from (non-interrupt) exception. Skip offending instruction # at EPC to avoid infinite loop. # mfc0 $k0 $14 # Bump EPC register addiu $k0 $k0 4 # Skip faulting instruction # (Need to handle delayed branch case here) mtc0 $k0 $14

# Restore registers and reset procesor state # lw $v0 s1 # Restore other registers lw $a0 s2 .set noat move $at $k1 .set at mtc0 $0 $13 mfc0 $k0 $12 ori $k0 0x1 mtc0 $k0 $12

# Restore $at

# Clear Cause register # Set Status register # Interrupts enabled

# Return from exception on MIPS32: eret # Return sequence for MIPS-I (R2000): # rfe # Return from exception handler # Should be in jr's delay slot # jr $k0 # nop

GII:PerifricoseInterfaces

13

Prctica1

Excepcioneseinterrupciones:MIPS32

APNDICEB
Estructura del programa para implementar la ltima de las tareas del apartado de realizacin prctica. # Definicin de los segmentos de datos .data 0xFFFF0000 # Registros de los dispositivos de entrada/salida .data 0x10000000 # frase a imprimir por el programa principal # definicin del mensaje: [Pulsacin (n) = tecla" # Implementacin del reloj, # Segmento de texto .text 0x400000 .globl main # Programa principal main: jal KbdIntrEnable

# Habilita interrupciones teclado

# En teora y a partir de ahora cada vez que se pulse una tecla se # genera una interrupcin. jal TimerIntrEnable # Habilita interrupciones timer # En teora y a partir de ahora el timer debe interrumpir con una frecuencia que depende del valor que se cargue en el registro compare.

# Programa principal (bucle infinito) que imprime una frase en pantalla de forma indefinida ..... ..... ..... # Fin programa principal

################################################################################ ################################################################################ # Utilidades # -> PrintCharacter(): Imprime un dato en pantalla # -> Delay(): Temporizador # ################################################################################ ################################################################################ # PrintCharacter(): Imprime un carcter en pantalla # $a0: Carcter a imprimir PrintCharacter: ..... ..... ..... # Delay(): Temporizador (0.5 seg aproximadamente) # $a0: Tiempo Delay: GII:PerifricoseInterfaces

14

Prctica1

Excepcioneseinterrupciones:MIPS32

..... ..... ################################################################################ ################################################################################ # Subrutinas relacionadas con la gestin de interrupciones # -> KbdIntrEnable():Habilita interrupciones del teclado # -> TimerIntrEnable(): Habilita interrupciones del timer # -> CaseIntr():Detecta disposivo que interrumpe.Salta a rutina servicio. # -> KbdIntr():Rutina de servicio para atender al teclado # -> TimerIntr():Rutina de servicio para atender al timer ################################################################################ ################################################################################ # KbdIntrEnable(): Subrutina de habilitacin de interrupciones del teclado KbdIntrEnable: ..... ..... ..... ..... # TimerIntrEnable(): Subrutina de habilitacin de interrupciones del timer TimerIntrEnable: ..... ..... ..... ..... # CaseIntr(): Detecta origen de la interrupcin (teclado, timer u otros) y llama # a la rutina de servicio que corresponda (KbdIntr o TimerIntr). CaseIntr: # $k0 = Al llamar a esta rutina $k0 = Registro de Cause ..... ..... ..... ..... # KbdIntr(): Rutina de servicio del teclado KbdIntr: ..... ..... ..... ..... # TimerIntr(): Rutina de servicio del timer TimerIntr: ..... ..... ..... .....

GII:PerifricoseInterfaces

15

S-ar putea să vă placă și