Simulador de Microcontroladores

Anuncio
Ejemplos creacionales - Microprocesador
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:
•
•
•
•
4096 bytes de memoria de programa y 1024 bytes de memoria de datos.
Dos acumuladores de 1 byte cada uno identificados como A y B.
128 canales de entrada/salida.
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 microcontrolador ejecuta instrucciones de uno, dos o tres bytes, el primero siempre es el código de
instrucción, en el caso de instrucciones de dos bytes el segundo es un dato y en el caso de instrucciones de tres
bytes el segundo y tercer byte denotan la parte alta y la parte baja respectivamente de una dirección de
memoria.
Instrucciones de 1 byte:
Cód
Mnemotécnico
Descripción
00
NOP
No operación, el programa sigue en la próxima instrucción.
01
02
03
04
ADD
SUB
MUL
DIV
Suma los valores de los dos acumuladores
Resta el valor del acumulador A al valor del acumulador B
Multiplica los valores de los dos acumuladores
Divide los valores de los dos acumuladores
05
SWAP
Intercambia los valores de los acumuladores
Instrucciones de 2 bytes:
Cód
Mnemotécnico
Descripción
09
LODV val
Carga en el acumulador A el valor val
Instrucciones de 3 bytes:
Cód
10
Mnemotécnico
LOD addr
Descripción
Carga el acumulador A con el contenido de la memoria de datos en la posicion addr
11
STR addr
Guarda el valor del acumulador A en la posicion addr de la memoria de datos
La memoria de programa y la de datos son espacios separados, la de programa tiene un rango de direcciones
válidas desde el 0 al 4095, y la de datos del 0 al 1023.
Los canales de E/S se identifican con números que van desde 0 a 127.
1
Ejemplos creacionales - Microprocesador
Las operaciones aritméticas ADD, SUB, MUL y DIV siempre tienen como resultado un valor de 2 bytes, el menos
significativo queda en el acumulador B y el más significativo en el A.
Si se produce un error durante la ejecución de un programa , ya sea porque se indicó una dirección de memoria
o un canal de E/S 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 causo el error.
Su solución debe implementar la siguiente interface:
public interface MicroController {
/**
* programacion: ejecuta un conjunto de instrucciones cargadas en memoria
*/
public void run();
/*** carga el programa en memoria, el microcontrolador debe estar detenido*/
public void loadProgram(byte[] program); //
/**
* Borra la memoria de datos y comienza la ejecucion del programa cargado
* actualmente
*/
public void start();
/**
* Detiene el programa en ejecucion
*/
public void stop();
/**
* Ejecuta la siguiente instruccion del programa actual
*/
public void step();
/**
* Inicializa el microcontrolador
*/
public void reset();
/*** 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 de program counter */
public byte getPC();
public void 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);
public void updateAccumulators(int value);
}
2
Ejemplos creacionales - Microprocesador
Ud. debe implementar una solución que permita agregar nuevas instrucciones en forma cómoda, teniendo en
cuenta ahora que debe cargar en memoria el programa con los códigos de instrucción y no con un conjunto de
instrucciones. Ejemplos:
Objetivo
Programa original
Hacer avanzar 3
posiciones el PC
NOP
NOP
NOP
(programa NOP)
LODV 8
SWAP
LODV 5
ADD
(programa ADD)
Sumar 8 +5
Programa en código
Resultado esperado
PC pasa a 3
1
9
L
O
D
V
1
8
d
a
t
o
5
S
W
A
P
1
9
L
O
D
V
0…
5
d
a
t
o
2
A
D
D
0…
En el acumulador B debe
quedar 13, en el A 0 (cero)
La forma de ejecutarlo debe ser:
micro.loadProgram(programNOP);
micro.start();
micro.step();
micro.step();
micro.step();
micro.stop();
Otros tests posibles:
Prueba
Resultado esperado
Cargar el programa NOP en memoria,
Luego arrancarlo (con start).
Volver a cargar el mismo programa NOP en memoria.
Hacer un step() de un programa no cargado
Error: ya hay un programa en ejecución
Ejecutar un programa no cargado (start + step)
Error: no hay programa cargado
Ejecutar primero el programa ADD y luego el NOP paso por
paso
Luego de ejecutar ADD el acumulador B debe
quedar en 13 (trece) y el A en 0 (cero) y después
de ejecutar el programa NOP ambos
acumuladores deben quedar en 0 (cero)
Mismo resultado que ejecutarlo paso a paso
Ejecutar el programa ADD enviando mensaje run()
Error: no hay programa cargado
Pensar de qué manera instanciar los objetos instrucciones a partir de códigos de instrucción numéricos y cómo
distinguir en el array del programa cargado en memoria los bytes de instrucciones y los de datos.
3
Descargar