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