[Top Down] Interrupción de tiempo en ArquiSim

[Top Down] Interrupción de tiempo en ArquiSim

de Guillermo Leon Bentos -
Número de respuestas: 4

Buenas, estamos haciendo pruebas con la interrupción de tiempo como indica el manual:

.interrupts

!INT 8 5

mov ax, 7777h

iret

!ENDINT

Y lo que notamos es que si ponemos que el Timer interrumpa cada 5 instrucciones por ejemplo, una vez que ocurre la interrupción y empieza a ejecutar las líneas de MOV AX, 7777h y IRET, dichas lineas se cuentan y luego el Timer vuelve a interrumpir a las 3 lineas de donde estaba ejecutando antes. A modo de prueba pusimos un código de Timer con más de 5 instrucciones y la interrupción queda corriendo una y otra vez sin volver al programa principal nunca.

No sabemos si este comportamiento tiene que ser así efectivamente o la cantidad de líneas a las que debe interrumpir el Timer deben ser contadas solo sobre el programa principal.

En respuesta a Guillermo Leon Bentos

Re: [Top Down] Interrupción de tiempo en ArquiSim

de Gustavo Brown -

Hola,

  Es el comportamiento esperado. La interrupción del temporizador intenta imitar el hardware original (PIT 8253/8254) configurado para disparar un pedido de interrupción cada N unidades de tiempo. Como el simulador ejecuta cada instrucción en una unidad de tiempo el valor indicado en la definición indica cada cuantas instrucciones ejecutadas hacer el pedido de interrupción.

SI el código del manejador no llega a terminar antes de que se "dispare" otra petición como las interrupciones están deshabilitadas queda "marcada" para ejecutar cuando se vuelvan a habilitar. Por eso en ese caso te vuelve a ejecutar la interrupción en cuento se llama a IRET.

Saludos,
  Gustavo

En respuesta a Gustavo Brown

Re: [Top Down] Interrupción de tiempo en ArquiSim

de Federico Jaime Frade Monzon -

Buenas, no entendí la respuesta. Detallo nuestro caso:

Post Condiciones: Timer cada 5 instrucciones (Nuestra rutina 100 tiene 30 instrucciones)


Caso: En nuestro programa main, ejecutamos cli y luego verificamos banderas y tenemos IF=0, cargamos ax y bx con los valores de un proc definido más abajo, llamamos a la interrupcion 100, entra instala la rutina (lo hace correctamente), y al llegar al iret de la interrupcion 100 nos salta a la interrupcion 8 (timer).

¿Por qué pasa esto? Lo que nosotros esperabamos es que como el IF esta en 0 al terminar la interrupcion 100 volviera al main.

En resumen las preguntas son 2:

1. ¿Qué estamos razonando mal, que nos lleva a la conclusion erronea de que no debería interrumpir la rutina 8?

2. ¿Como podriamos generar que el comportamiento sea el que esperabamos? 

Gracias !


EDIT: Además de lo anterior, vale decir que al entrar en la interrupcion 8, verificamos las flags e IF sigue en 0, pero nunca sale de la interrupción 8

En respuesta a Federico Jaime Frade Monzon

Re: [Top Down] Interrupción de tiempo en ArquiSim

de Gustavo Brown -

Hola. Es un bug. Quedó arreglado en el ArquiSim que acabo de actualizar en el EVA (1.3.2)

El bug se reproduce de la siguiente manera:

  1. Se tienen deshabilitadas las interrupciones (IF=0)
  2. Se llama a una interrupción por código (instrucción INT n)
  3. Al finalizar la interrupción (IRET) si hay interrupción por hardware pendiente (el temporizador) ésta se dispara independientemente del valor de la flag IF. **este es el bug, pues no chequea que IF=1**
  4. Si mientras se ejecuta la interrupción del temporizador se vuelve a realizar una petición para dicha interrupción (o sea, si la cantidad de ticks es menor la cantidad de instrucciones que ejecuta la rutina que atiende al temporizador) entonces al llegar al IRET se vuelve al paso 3 y por eso quedás en un loop infinito.

Por otro lado, no tiene sentido poner en cantidad de ticks un número menor que la cantidad de instrucciones que ejecuta la rutina del temporizador porque eso hace que apenas se sale de la rutina se vuelva a entrar porque queda la interrupción pendiente. Esto es independiente del bug.

El workaround para no quedar en loop es poner una cantidad de ticks mayor que la cantidad de instrucciones que ejecuta la ISR 8. 

Saludos,
  Gustavo

En respuesta a Gustavo Brown

Re: [Top Down] Interrupción de tiempo en ArquiSim

de Santiago Miguel Castro Rizzo -

Dado el siguiente codigo con timer cada 3 instrucciones:

.code

CLI

mov bx, 1h

mov bx, 1h

mov bx, 1h

mov bx, 1h

STI

mov cx, 2h

mov cx, 2h

mov cx, 2h

mov cx, 2h

CLI

.interrupts

!int 8 5

mov ax,7777h

iret

!ENDINT


Por qué al momento de ejecutar STI (que hace IF =1) se ejecuta el timer? Yo quiero que empieze a contar instrucciones entre el STI y el CLI del final. Cuando entra al int 8 cuenta las dos instrucciones (mov ax,7777h y iret) sale del int 8, recorre una instrucción (mov cx, 2h) y entra denuevo al int 8. El timer esta pensado para que cuente sus propieas instrucciones?


Muchas gracias