Microcontrolador con API Java

10

Mi equipo de hardware está planeando usar un microcontrolador Atmel AVR de 8 bits para un proyecto futuro.

Hasta donde sé, debe programarse en C. He encontrado una JVM para AVR, aunque es más limitada que las bibliotecas C nativas de Atmel.

¿Me puede sugerir un microcontrolador de 8 bits que admita Java?

PD. No sé C y no tengo experiencia en programación de microprocesadores.

sterz
fuente
28
Digamos que alguien estaba vendiendo una gran falda flotante y algunos postes largos que decían que podría usar con su automóvil para ir a pescar a un lago. Después de luchar durante tres días para ponértelo, entras unos 15 pies en el lago antes de que tu auto se voltee y se hunda. Tu papá va a estar realmente enojado. Había pasado la tienda de botes local con una bonita canoa. La canoa es el compilador C del micro, y el carro flotante con palos es Java en un microcontrolador de 8 bits. Afortunadamente, esto no sucedió ... nos preguntas dónde puedes encontrar las carrozas. Entonces, como tu papá, déjame decirte "¡¿Qué estás pensando? ¡Consigue una canoa!"
darron
66
Tengo problemas para visualizar el coche de falda flotante con palos. ¿Tienes fotos?
endolito
8
@darron: ¿no debería ser un big_floating_skirtobjeto que implementa la boatinterfaz en el org.buoyantpaquete y poleobjetos que tienen algún tipo de patrón de herencia extraño con el java.netque no puedo recordar ahora (pero se describe claramente en el UML)?
Kevin Vermeer
2
@sterz: Creo que sin antecedentes de microprocesador es perfectamente comprensible que no te hayas dado cuenta de cuán fuera de lugar está realmente Java en un micro de 8 bits. Lo siento si mi primer comentario sonó duro ... Un simple "No hagas eso" parecía demasiado débil.
darron
1
@darron: gracias por la analogía de "disparar pájaros con un cañón"
sterz

Respuestas:

32

Si no tiene experiencia en el campo de programación de microprocesadores / microcontroladores, probablemente debería aprender C primero, para que pueda entender cuándo y por qué Java es una mala elección para la mayoría de los proyectos de microcontroladores.

¿Leíste las restricciones en la JVM que vinculaste? Incluye los siguientes problemas:

  • Tan poco como 512 bytes de memoria de programa (no KB, y definitivamente no MB)
  • Tan poco como 768 bytes de RAM (donde van sus variables. Está limitado a 768 caracteres de cadenas por esta restricción).
  • Alrededor de 20k códigos de operación Java por segundo en 8 Mhz AVR.
  • Solo incluye java.lang.Object, java.lang.System, java.io.PrintStream, java.lang.StringBuffer, una clase de control JVM y una clase IO nativa. No podrá importar java.util. *; y obtener todas las clases que no están en esta lista.

Si no está familiarizado con lo que significan estas restricciones, asegúrese de tener un plan B si resulta que en realidad no puede hacer el proyecto con Java debido a las restricciones de espacio y velocidad.

Si todavía desea utilizar Java, tal vez porque espera que el dispositivo sea programado por muchas personas que solo conocen Java, le sugiero encarecidamente que obtenga un hardware más grande, probablemente algo que ejecute Linux incorporado. Consulte esta página de Oracle para obtener algunas especificaciones para ejecutar la JVM incorporada, en las preguntas frecuentes de su discusión recomiendan un mínimo de 32 MB de RAM y 32 MB de Flash. Eso es aproximadamente 32,000 veces la RAM y 1,0000 veces el Flash del AVR que estás viendo. La página de Introducción Incrustada Java de Oracle entra en más detalles sobre las restricciones de la JVM. Su tono de voz es, como puede suponer, mucho más amigable con Java que el mío. Tenga en cuenta que este tipo de hardware es mucho más difícil de diseñar que un AVR de 8 bits.

Soy un estudiante de ingeniería informática con especialización en informática. El departamento de CS de mi universidad ha bebido el Java Kool-aid, por lo que muchos estudiantes en el programa de ingeniería solo conocen Java (lo cual es un triste estado de cosas para un programador, al menos aprende Python o C ++ si no lo haces). quiero aprender C ...), entonces uno de mis profesores publicó una Cheat Sheet C para estudiantes con un año de experiencia en Java. Son solo 75 páginas; Le sugiero que lo lea o lea antes de tomar una decisión. En mi opinión, C es el lenguaje más eficiente, duradero y profesional para desarrollar un proyecto integrado.

Otra alternativa a considerar es el marco Arduino . Utiliza una versión simplificada del cableado de la lengua, que es como C ++ y sin objetos o cabeceras. Puede ejecutarse en muchos chips AVR, definitivamente no está restringido a su hardware. Le dará una curva de aprendizaje más fácil que simplemente saltar directamente a C.

En conclusión,
XKCD Golden Hammer
texto alternativo: me llevó cinco intentos encontrar el correcto, pero al final pude salvar nuestra noche, si no el bote.

Kevin Vermeer
fuente
55
Una de mis historietas favoritas que he disfrutado.
Kortuk
1
Mmm, genial ayudante. +1
tyblu
Me pregunto cómo se compara esa JVM con los "iButtons de Java" que estaban disponibles hace un par de décadas.
supercat
¡El enlace @kevin "C Cheat sheet" no funciona! ¡Por favor actualice!
charansai
6

El entorno de programación más popular para Atmel AVR es Arduino . El lenguaje Arduino es un subconjunto de C ++.

Los "bocetos" / programas de Arduino aparecen sintácticamente muy similares a Java. El lenguaje de cableado del que se deriva Arduino tiene implementaciones en C ++ ( Arduino ), Java ( Processing ) y Javascript ( processing.js ).

Ambos idiomas comparten el mismo estilo de declaración, construcciones de bucle y operadores aritméticos debido a su ascendencia común en Algol68. Por lo general, todos los objetos en Arduino se declaran globalmente o en la pila, por lo que, como Java, las funciones miembro se llaman con el .operador (por ejemplo LED.flash()).

El lenguaje será muy familiar para un programador de Java, pero, lo que es más importante, los bocetos de Arduino se compilan en código nativo que se ejecuta a toda velocidad con acceso completo al hardware. Esto es fundamental para aprovechar al máximo su microcontrolador.

Aquí está la API .

Arduino proporciona todo lo que necesita para comenzar: hardware de bajo costo, un entorno de desarrollo integrado gratuito y un gestor de arranque (para que pueda cargar el código a través de USB / serie).

Toby Jaffey
fuente
3
Para ser más precisos, es (muy probablemente) el entorno de programación más popular entre los aficionados, pero no necesariamente sobre todos los desarrolladores de AVR.
pfyon
2
Yo afirmaría que Arduino es más popular por la cantidad de usuarios, pero no por la cantidad de unidades de productos que se envían con el firmware Arduino. Hay muchos usuarios de Arduino por ahí
Toby Jaffey
1
Aunque se compilan "bocetos", la velocidad de acceso de E / S puede mejorarse enormemente usando C o ensamblaje.
tyblu
1
C ++ y Java se ven muy diferentes para mí. ("Arduino" es solo C ++ con una estructura de inclusión extraña para ocultar algunos de los bits técnicos.)
Nick T
2
@Jason S "Bocetos" Arduino "/ programas parecen muy similares a Java"
Toby Jaffey
4

Quiero dejar en claro que no he usado uno antes, pero solía haber uno hace un año llamado Jabalina. Es posible que Parallax los haya adquirido o algo así, porque ahora el único que aparece es el "Sello de Jabalina". Hace años, también solía haber una compañía llamada Velocity Semiconductor, que hizo un reemplazo (supuestamente) para los módulos principales de Rabbit Semiconductor, y tenía un JVM en hardware, pero esa compañía aparentemente ha desaparecido. ¡Buena suerte en tu búsqueda!

Dave
fuente
4

Sun Microsystems solía hacer una plataforma llamada Sun Spot, que era básicamente una plataforma Java integrada. Ahora, obviamente, Sun Microsystems ya no existe (Oracle los compró), pero parece que todavía puede comprar Sun Spots: http://www.sunspotworld.com/products/ . No me gusta la idea de usar Java en un entorno integrado (nivel de abstracción incorrecto para el trabajo en mi humilde opinión), pero esta parece ser la plataforma integrada más natural para Java. Tenga en cuenta las especificaciones sobre estas cosas: son resistentes de 180MHz / 512k RAM, y no son baratas a $ 400 por un kit de inicio.

Así que seré un segundo o un tercero para los defensores de Arduino que abogan por esta pregunta. Existe una gran comunidad para apoyarlo si necesita ayuda. Y si necesita hardware periférico, busque "Arduino Shields" en Google y sorpréndase: puede hacer cualquier cosa, desde servomotores de control hasta una red inalámbrica 802.11 con la combinación correcta de escudos. No es práctico aprender C (¿el puntero dice qué? DorkBoard) por menos de $ 15.

vicatcu
fuente
¡Ah sí, lo vi en el Maker Faire hace dos años! Muy buen dispositivo.
Dave
La característica principal de SunSpots no es Java, sino el material inalámbrico incorporado que les permite comunicarse entre sí. Si desea tener conocimiento el uno del otro o una comunicación inalámbrica fácil con la base de operaciones, eso es muy, muy agradable.
Thorbjørn Ravn Andersen
3

Parallax crea el Javelin Stamp , un CoM (Computer-on-Module) que ejecuta una JVM.

Cuesta $ 60 y ejecuta unas asombrosas ~ 8,500 instrucciones Java / seg.

Además, el PCB es rosa (¡en serio!)

Connor Wolf
fuente
2

Los sistemas Ajile hacen una variedad de chips java embebidos nativos en tiempo real y placas de evaluación.

Corren java de metal desnudo. Es muy agradable

www.ajile.com hace las fichas y evalúa las tablas.

www.systronix.com vende una variedad de hardware integrado de Java.

He usado AJ-100 de ajile para trabajos exigentes, es muy agradable trabajar con ellos. Y no, no son tan baratos como un avr, pero procesan datos como un pentium de gama baja.

Los chips de Ajiles responden a las interrupciones (latencia de interrupción) en menos de 1 microsegundo.

Tim Williscroft
fuente
¿'nunca hagas eso en un sistema C incrustado'? ¿Hacer qué? 1 latencia de EE. UU. ¿Alta velocidad? Apenas. Creo que te estás olvidando DSP de 1 GHz +, muchos ARM y muchos otros más. Mucha gente escribe para esto con solo C metal (sin sistema operativo, etc.). Le concederé que este tipo de cosas es una forma medio racional de utilizar Java en un sistema integrado (fuera de un sistema operativo Linux a escala completa) ... aunque después de echar un vistazo rápido a Systronix, diría que parece que está pagando un Buena prima por esa poca comodidad. Iría ARM incrustado seguro. Además, muchos de los enlaces a esos proyectos fuera de Systronix están muertos.
darron
Ah, y TINI es increíblemente tonto. JVM en ROM en un 8051. Estúpidamente intenté volver cuando quería Ethernet fácil, e incluso en C la cosa se vio inundada por el tráfico de transmisión de una LAN corporativa normal. Sería un buen producto si lo comercializaran como los sellos básicos de Parallax, pero no lo hacen. No es apto para ningún propósito no aficionado.
darron
1
Estos chips están funcionando a varios cientos de megahercios. La latencia de 1uS es posible cuando se programa en C en un procesador que funciona 100 veces más lento que estos dispositivos. Puede hacer algunas cosas geniales (como iPads y teléfonos Droid) con procesadores equivalentes, pero publicar esto como una alternativa al AVR de 8 bits en la pregunta no es una comparación de manzanas con manzanas.
Kevin Vermeer
@reemrevnivek: Dado que el OP quería Java, consideraría que la parte de Ajile es apropiada ya que es una de las únicas formas razonables de ejecutar Java incrustado (fuera de un sistema operativo Linux completo o algo así). Si el último párrafo y los bits TSTIK no estuvieran allí, incluso lo votaría.
darron
2

Mi experiencia personal es que el código C para programar y comenzar con AVR es bastante fácil, también vengo de muchos años haciendo Java, y después de aproximadamente 2 meses de usar bocetos arduino, abandoné el entorno y busqué sitios de avr-gcc. como avrfreaks, hace que sea fácil encontrar respuestas a problemas comunes. (Todavía hago todo en mi fiel Arduino Duemillenove)

Usar eclipse para compilar y "desplegar", es decir, escribir en el chip, también es bueno ya que no tengo que lidiar con otro IDE

Creo que en realidad es más difícil entender los registros, registros de 16 bits y leerlos en el orden apropiado, interrupciones, temporizadores, hardware PWM, que el lenguaje de programación en sí.

webclimber
fuente
1

Aunque generalmente pertenecería al campo de "aprender C y comprender lo que los procesadores realmente hacen" en lo que respecta al trabajo integrado, vale la pena señalar que un chip de brazo pequeño no es mucho más caro que un AVR, y es casi plausible posición para manejar tareas simples encima de un jvm.

Chris Stratton
fuente
1

NanoVM es una máquina virtual Java diseñada para ejecutarse en microcontroladores AVR de 8 bits.

(desde la página de inicio)

No es una máquina virtual Java con todas las funciones y nunca lo será. Siempre estará limitado a un pequeño subconjunto del lenguaje java y las bibliotecas java estándar y algunos métodos específicos de la aplicación. Además, no está destinado a reemplazar a C como la forma estándar de programar microcontroladores. Es menos flexible y tiene un rendimiento más bajo que C o los programas de ensamblador.

El NanoVM es una forma de proporcionar una interfaz de programación limitada pero controlable a un dispositivo basado en microcontrolador. Dado que la mayoría del código más específico de hardware forma parte del propio NanoVM, el usuario puede centrarse en la aplicación misma. Si un usuario recibe un dispositivo equipado con NanoVM, no está obligado a pensar en el hardware en sí. Además, no necesita ningún compilador específico de destino o similar. Todo lo que necesita es un compilador estándar de Java y el NanoVMTool que está escrito en Java. Por lo tanto, toda la cadena de desarrollo funciona en cualquier dispositivo que tenga un compilador de Java y pueda ejecutar código Java. Con la abstracción de hardware que proporciona NanoVM, el usuario ni siquiera tiene que preocuparse por el tipo de microcontrolador en el que se basa el objetivo.

Toby Jaffey
fuente
1

No es del todo Java, u 8 bits, pero hay un intérprete de Javascript disponible para microcontroladores ARM de baja potencia llamado Espruino .

Gordon Williams
fuente