Download enunciado del Microcontrolador

Document related concepts
no text concepts found
Transcript
Objetos que representan comportamiento
Simulador de Microcontroladores
Un microcontrolador es una computadora hecha en un solo chip (aunque puede ser en varios). Suelen utilizarse
en la industria para controlar maquinas herramientas, robots, teléfonos celulares, etc.
Un fabricante de microcontroladores le solicita a Ud. que haga un simulador en java de uno de sus modelos de
microcontroladores, el cual consta de:
•
•
•
1024 bytes de memoria de datos
Dos acumuladores de 1 byte cada uno identificados como A y B.
Un program counter (PC) que indica la dirección en la memoria de programa de la próxima instrucción a
ejecutar, se incrementa cada vez que el microcontrolador ejecuta una instrucción.
El fabricante nos pasó la lista de instrucciones mínimas que debe soportar
Mnemotécnico
Descripción
NOP
No operación, el programa sigue en la próxima instrucción.
ADD
Suma los valores de los dos acumuladores
SUB
Resta el valor del acumulador A al valor del acumulador B
DIV
Divide el valor del acumulador A por el valor del acumulador B
SWAP
Intercambia los valores de los acumuladores
LOD addr
Carga el acumulador A con el contenido de la memoria de datos en la posicion addr
STR addr
Guarda el valor del acumulador A en la posicion addr de la memoria de datos
LODV val
Carga en el acumulador A el valor val
El sistema debe permitir agregar nuevas instrucciones en forma simple a medida que el fabricante lo solicite.
La memoria datos tiene un rango de direcciones válidas del 0 al 1023.
Las operaciones aritméticas ADD, SUB y DIV siempre tienen como resultado un valor de 2 bytes, el menos
significativo queda en el acumulador A y el más significativo en el B (ver ejemplo en test de Suma de un número
mayor a 255).
Si se produce un error durante la ejecución de un programa, ya sea porque se indicó una dirección de memoria
fuera de rango, o se produjo un error por división por 0, el programa se detiene y el PC queda con la dirección de
la instrucción que causó el error.
Los métodos que reciben direcciones como parámetros deben controlar que éstas estén en el rango válido, en
caso contrario lanzar una IllegalArgumentException indicando el problema.
Se pide que el microcontrolador pueda resolver estos programas:
Objetivo
Programa
Resultado esperado
Hacer avanzar 3 posiciones el PC
Sumar 10 + 22
NOP
NOP
NOP
LODV 10
PC pasa a 3
En el acumulador B debe quedar 32, en el A 0 (cero)
1
Objetos que representan comportamiento
Sumar 100 + 50
Intentar dividir 2 por 0
Sumar 2 + 8 + 5
SWAP
LODV 22
ADD
LODV 100
SWAP
LODV 50
ADD
LODV 0
SWAP
LODV 2
DIV
LODV 2
STR 0
LODV 8
SWAP
LODV 5
ADD
SWAP
LOD 0
ADD
Hay que distribuir el resultado de la suma (150) en dos
signed bytes : nos queda 127 (MAX_VALUE) en
Acumulador B y 23 en Acumulador A
El programa debe tirar una excepción representativa y
el PC debe quedar en 4 (el índice de la instrucción
donde ocurrió el error).
En el Acumulador B debe quedar 15, en el A 0 (cero)
Su solución debe implementar la siguiente interface:
public interface MicroController {
/*** programacion: carga y ejecuta un conjunto de instrucciones en memoria */
public void run(List<Instruccion> program);
/*** Getters y setters de acumuladores A y B */
public byte getAAcumulator();
public void setAAcumulator(byte value);
public byte getBAcumulator();
public void setBAcumulator(byte value);
/*** Manejo
public void
public byte
public void
de program counter */
advancePC(); // Avanza el program counter una instrucción
getPC();
reset();
// Inicializa el microcontrolador
/*** Manejo de dirección de memoria de datos: getter y setter */
public byte getData(int addr);
public void setData(int addr, byte value);
}
2
Objetos que representan comportamiento
Parte 2:
1) Interesa poder diferenciar los momentos de carga y ejecución de un programa. En particular:
a) carga de un programa en memoria (sin ejecución, el microcontrolador debe estar detenido)
b) borrar la memoria de datos y comenzar la ejecucion del programa cargado actualmente
c) Ejecutar la siguiente instruccion del programa actual (y avanzar el program counter, para lo
cual el programa tiene que estar “ejecutándose”)
d) detener el programa en ejecución
load
start
execute
stop
Queremos que ambas funcionalidades (ejecución automática y asistida) funcionen a la vez.
2) Se desea poder deshacer la última instrucción ejecutada (o sea, que el microprocesador vuelva al estado
anterior). Ejemplo: si se hizo un SWAP, el acumulador A debe volver a tener lo que el acumulador B tenía
y viceversa. En el caso del ADD se debe deshacer la suma y los valores de los acumuladores deben
quedar como estaban previamente.
3) Para simplificar la construcción de programas, la segunda versión del procesador agregó algunas
instrucciones de más alto nivel:
Mnemotécnico
HALT
Descripción
Detiene la ejecución del programa, cualquier operación step() posterior debe arrojar
excepción de negocio
WHNZ
Ejecuta un conjunto de instrucciones mientras el valor del acumulador A sea distinto de
cero.
IFNZ
Ejecuta un conjunto de instrucciones si el valor del acumulador A es distinto de cero.
3