TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: jgpeiro06 en 01 de Abril de 2008, 06:03:26
-
Hola a todos
Estoy trabajando hace unas semanas en una JVM ( maquina virtual de java ) para dspic. La idea es poder utiliar un lenguaje orientado a objetos para nuestras aplicaciones con dsPIC.
Todos hemos oido alguna vez eso de que el java es un lenguaje interpretado y que necesita de una JVM para funcionar. Cuando escribimos un programa en Java y lo compilamos el compilador genera el .class, un archivo que contiene el programa en codigo ensamblador y alguna informacion mas para depurar el programa ( nombres de variables, posiciones del PC donde podemos poner breakpoints...). El codigo ensamblador que se genera no es compatible con el juego de instrucciones de nuestro PC o nuestro PIC, y es JVM la que se encarga de leer cada instruccion y ejecutar las instrucciones correspondientes.
El programa ya funciona y se puede usar para probar programas java con muchas limitaciones, pero ya iremos haciendolo cada vez mas y mas funcional...
La info mas interesante la podeis encontrar en:
picoJava-II Programmers Reference manual ( http://www.sun.com/software/communitysource/processors/download_picojava.xml )
http://www.hio.hen.nl/~vanleeuw/pse/vmspec.pdf
Un programa muy util para decodificar los .class
www.classfileinspector.com
Este es un ejemplo xa comprobar la de la JVM.
//javacode.txt
package javaapplication3;
public class Main {
public static void main(String[] args) {
// Test variable declaration
long i = 0, j = 0;
// Test variable operations
i = 10;
j = i + 2;
j = i * 2;
j = i / 2;
// Test bucle for
for (i = 0, j = 0; i < 3; i++) {
j = i * 3;
}
// Test bucle while
j = 8;
while (i != 0) {
j /= 2;
i--;
}
// Test bucle do-while
j = 0;
do {
i++;
j += i;
} while (i < 3);
for (i = 0; i < 10; i++) {
// Test if-else if-else sentence
if (i == 0) {
j = 0;
} else if (i == 1) {
j = 5;
} else if (i == 2) {
j = 10;
} else if (i == 3) {
j = 15;
} else if (i == 4) {
j = 20;
} else {
// Test switch sentence
switch ((int)i) {
case 5:
j = 25;
break;
case 6:
j = 30;
break;
case 7:
j = 35;
break;
case 8:
j = 40;
break;
default:
j = 45;
break;
}
}
}
}
}
Os adjunto el codigo del proyecto, si quereis probar como funciona, poner un breakpoint en la linea 391 del picJava-II.c
case lstore_0 : /*0x3f lstore_0*/
case lstore_1 : /*0x40 lstore_1*/
case lstore_2 : /*0x41 lstore_2*/
case lstore_3 : /*0x42 lstore_3*/
n = mem[PC] - lstore_0;
//long_64( stack[32-(VARS - n)] ) = long_64( stack[32-(OPTOP - 2)] );// ERROR at picoJava-II.pdf or VMspec.pdf
long_64( stack[32-(VARS - n)] ) = long_64( stack[32-(OPTOP + 2)] ); //Corrected code, similar to dstore_n
>>BREAKPOINT>>>>OPTOP += 2;
PC++;
break;
y correr el programa. Visualizar el array stack[] entero y podreis ir viendo como van apareciendo los valores 10, 12, 20, 5 en un elemento del stack[](que corresponderia a la variable j)...
Si quereis compilar un nuevo programa, utilizar el netbeans para generar el .class, convertir el .class a HEX e introducirlo como datos en mem[] (opcodes.h).
Espero que os guste...saludos
-
Me parece muy interesante, a la vez que inalcanzable para un profano en estos menesteres como yo.
De todas formas, si quiero montarlo, ¿qué hardware necesito?, ¿cuál es el esquema?
-
De momento el unico hardware que necesita es un dsPIC/dsPIC33, ni memoria externa, ni puertos especificos de IO, ni nada de nada... La forma probar este proyecto es usando el MPLAB como depurador, e ir observando el codigo en Java (javacode.txt) y todo lo que el programa va haciendo para ejecutarlo sobre el dsPIC...
-
Hola Jgpeiro06:
Muy interesante el proyecto. Algunas preguntas:
¿Cuanto ocupa la JVM en el dsPIC?
¿Cuál es su performance?
Me acuerdo haber leido en el libro "Organización de Computadoras Un Enfoque Estructurado (http://cwx.prenhall.com/bookbind/pubbooks/tanenbaum2_la/)" de Tanenbaum como implementar un microprocesador de picoJAVA. ¿Estás usando ese libro para el proyecto?
Saludos
-
Os felicito por el proyecto, y amí también me interesa saber cuánto ocupa en el dsPic.
Suerte!!! ;)
-
No estoy usando ese libro, pero la info necesaria la encontre en el picoJava-II programmers reference manual, un documento que nombro en el primer post.
Ahora mismo el proyecto ocupa 10K de memoria de programa y 1k de ram (el dsPIC33 incorpora 96k de programa y 32 de ram).
El programa que cito en el primer post, compilado en C cn el MPLAB C30 requiere 1700 instrucciones para ejecutarse. Este mismo programa, compilado en java con el netbeans e interpretado con esta JVM requiere 75000. Mas o menos es 50 veces mas lento el java interpretado...La eficiencia de la JVM aumenta cuando se usan librerias previamente compiladas en C( como las matematicas x ejemplo) e incluso creo que el java permite añadir codigo escrito en otros lenguajes...
-
¡Gracias Jgpeiro06!
Muy interesante el proyecto sobre todo por usar el Netbeans como IDE y por llevar la JVM a un entorno tan limitado como un microcontrolador.
Ya tengo este hilo en mis favoritos.
Saludos
-
Zaphyrus, el IDE que uso es el MPLAB, el compilador de C es el MPLAB C30. El Netbeans lo uso para compilar el programa en java que quiera usar.
-
Perdón, me expresé mal. Entiendo que desarrolles la JVM en Mplab y en C30. Me refería al beneficio de poder programar en JAVA en el Netbeans para obtener el .class para luego ejecutarlo en el PIC con la JVM que estas desarrollando.
Me parece interesante porque es como el BASIC STAMP pero con un muy buen lenguaje como JAVA, salvando las diferencias de lo que es interpretado y una máquina virtual.
Desde acá felicitarte y darte ánimos para que continues desarrollando y posteando las novedades.
Saludos.
PD: Estuve viendo que también estuviste desarrollando un PSpice para PIC. La verdad que admiro tu dedicación y entusiasmo.
-
Las llamadas a funciones:
ha llegado la hora de probar subir un nivel, despues de comprobar que ya se pueden ejecutar programillas con varios tipos de datos primitivos y varios tipos de sentencias, ha llegado la hora de probar funciones.
Cuando compilo un programa simple de una o dos funciones, despues de cargar los argumentos necesarios se utiliza la instruccion invokevirtual, asi que debe ser un "call".
Existen al menos 4 instrucciones, pero no se ni que hace exactamenete cada una, ni sus diferencias... las instrucciones son
invokeinterface
invokespecial
invokestatic
invokevirtual
en http://en.wikipedia.org/wiki/Java_bytecode podemos leer un poco sobre su funcion, pero no me basta... quizas si alguien que conozca el java pueda decirme que significan cada una...
-
Buenísimo!!! La JVM va tomando forma.
Lamento no poder ayudarte porque mis conocimientos en Java son básicos.
Podes preguntar en el foro de Java Hispano (http://www.javahispano.org/forum/) o en el foro de Paneta Código (http://www.planetacodigo.com/foros/) que seguro que te puede ayudar con el tema.
Saludos