Microcontrolador com API Java

10

Minha equipe de hardware planeja usar um microcontrolador Atmel AVR de 8 bits para um projeto futuro.

Até onde eu sei, ele deve ser programado em C. Encontrei uma JVM para AVR, embora seja mais limitada que as bibliotecas C nativas da Atmel.

Você pode me sugerir um microcontrolador de 8 bits que suporte Java?

PS. Não conheço C e sou inexperiente em programação de microprocessadores.

sterz
fonte
28
Digamos que alguém esteja vendendo uma grande saia flutuante e alguns bastões compridos que eles disseram que você poderia usar com seu carro para pescar em um lago. Depois de três dias de luta para colocá-lo, você fica cerca de 15 pés no lago antes que seu carro vire e afunde. Seu pai vai ficar realmente chateado. Você passou pela loja de barcos local com uma bela canoa. A canoa é o compilador C do micro e o carro flutuante com paus é Java em um microcontrolador de 8 bits. Felizmente, isso não aconteceu ... você está nos perguntando onde pode encontrar os carros alegóricos. Então, como seu pai, deixe-me dizer "O que você está pensando ?! Pegue uma canoa!"
darron
6
Estou tendo problemas para visualizar o carro de saia flutuante com paus. você tem alguma foto?
endolith 15/12/10
8
@arron - Isso não deveria ser um big_floating_skirtobjeto que implementa a boatinterface no org.buoyantpacote e poleobjetos que possuem algum tipo de padrão de herança estranho com o java.netqual não me lembro agora (mas está claramente descrito na UML)?
Kevin Vermeer
2
@sterz: Eu acho que sem experiência com microprocessador, é perfeitamente compreensível que você não tenha percebido o quão fora de lugar o Java em um micro de 8 bits realmente é. Desculpe se meu primeiro comentário soou duro ... Um simples "Não faça isso" parecia muito fraco.
darron
11
@ Darron: obrigado pela analogia "atirando em pássaros com um canhão"
sterz

Respostas:

32

Se você não tem experiência no campo de programação microprocessador / microcontrolador, provavelmente deve aprender C primeiro, para entender quando e por que Java é uma má escolha para a maioria dos projetos de microcontroladores.

Você leu as restrições na JVM que você vinculou? Inclui os seguintes problemas:

  • Tão pouco quanto 512 bytes de memória de programa (não KB, e definitivamente não MB)
  • Tão pouco quanto 768 bytes de RAM (para onde vão suas variáveis. Você está limitado a 768 caracteres de cadeias por esta restrição.)
  • Aproximadamente 20k opcodes Java por segundo no 8 Mhz AVR.
  • Inclui apenas java.lang.Object, java.lang.System, java.io.PrintStream, java.lang.StringBuffer, uma classe de controle da JVM e uma classe IO nativa. Você não poderá fazer uma importação java.util. *; e obtenha todas as classes que não estão nesta lista.

Se você não estiver familiarizado com o significado dessas restrições, verifique se possui um plano B, caso não consiga executar o projeto com Java devido às restrições de espaço e velocidade.

Se você ainda deseja usar o Java, talvez porque espere que o dispositivo seja programado por muitas pessoas que conhecem apenas o Java, sugiro fortemente que obtenha hardware maior, provavelmente algo que execute o Linux incorporado. Consulte esta página da Oracle para obter algumas especificações a serem executadas para executar a JVM incorporada. Nas perguntas frequentes de suas discussões, eles recomendam um mínimo de 32 MB de RAM e 32 MB de Flash. Isso é cerca de 32.000 vezes a RAM e 1.0000 vezes o Flash do AVR que você está vendo. A página Java Embedded Intro da Oracle detalha as restrições da JVM. O tom de voz deles é, como você pode imaginar, muito mais amigável a Java do que o meu. Esteja ciente de que esse tipo de hardware é muito mais difícil de projetar do que um AVR de 8 bits.

Eu sou um estudante de engenharia da computação com um menor de ciência da computação. O departamento de CS da minha universidade bebeu o Java Kool-aid, então muitos estudantes do programa de engenharia conhecem apenas Java (o que é um estado triste para um programador, pelo menos aprenda um pouco de Python ou C ++, se você não deseja aprender C ...), então um de meus professores publicou uma C Cheat Sheet para estudantes com um ano de experiência em Java. São apenas 75 páginas; Sugiro que você o leia ou remova antes de tomar uma decisão. Na minha opinião, C é a linguagem mais eficiente, durável e profissional para desenvolver um projeto incorporado.

Outra alternativa a considerar é a estrutura do Arduino . Ele usa uma versão simplificada da linguagem Wiring , que é como C ++ sem objetos ou cabeçalhos. Pode ser executado em muitos chips AVR, definitivamente não está restrito ao seu hardware. Isso lhe dará uma curva de aprendizado mais fácil do que apenas pular direto para C.

Em conclusão,
XKCD Golden Hammer
Alt text: Levei cinco tentativas para encontrar a certa, mas consegui salvar nossa noite fora - se não o barco - no final.

Kevin Vermeer
fonte
5
Uma das minhas histórias em quadrinhos favoritas que eu já gostei.
Kortuk
11
Mmm, ajudante legal. +1
tyblu
Gostaria de saber como essa JVM se compara aos "iButtons Java" que estavam disponíveis há algumas décadas?
Supercat
@kevin O link "C Cheat sheet" não está funcionando! Por favor atualize!
charansai
6

O ambiente de programação mais popular para o Atmel AVR é ​​o Arduino . A linguagem Arduino é um subconjunto de C ++.

Os "esboços" / programas do Arduino parecem sintaticamente muito semelhantes ao Java. A linguagem Wiring da qual o Arduino deriva possui implementações em C ++ ( Arduino ), Java ( Processing ) e Javascript ( processing.js ).

Ambos os idiomas compartilham o mesmo estilo de declaração, construções de loop e operadores aritméticos devido à sua ancestralidade comum em Algol68. Normalmente, todos os objetos no Arduino são declarados globalmente ou na pilha; assim, como Java, as funções de membro são chamadas com o .operador (por exemplo LED.flash()).

A linguagem será muito familiar para um programador Java - mas, o mais importante, os esboços do Arduino são compilados em código nativo, que é executado a toda velocidade com acesso total ao hardware. Isso é essencial para obter o máximo do seu microcontrolador.

Aqui está a API .

O Arduino fornece tudo o que você precisa para começar: hardware de baixo custo, um ambiente de desenvolvimento integrado gratuito e um gerenciador de inicialização (para que você possa carregar o código via USB / serial).

Toby Jaffey
fonte
3
Para ser mais preciso, é (provavelmente) o ambiente de programação mais popular entre os entusiastas, mas não necessariamente sobre todos os desenvolvedores de AVR.
Pfyon
2
Eu diria que o Arduino é o mais popular pelo número de usuários, mas não pelo número de unidades de produtos enviadas contendo o firmware do Arduino. Existem muitos usuários de Arduino por aí
Toby Jaffey
11
Embora os "esboços" sejam compilados, a velocidade de acesso IO pode ser bastante aprimorada usando C ou montagem.
tyblu
11
C ++ e Java parecem muito diferentes para mim. ("Arduino" é apenas C ++, com uma estrutura de inclusão bizarra para ocultar alguns dos bits técnicos.)
Nick T
2
@ Jason S esboços "Arduino '' / programas parecem muito semelhante ao Java"
Toby Jaffey
4

Quero deixar claro que não usei um antes, mas havia um ano atrás chamado de Javelin. É possível que a Parallax as tenha adquirido ou algo assim, porque agora o único que aparece é o "Javelin Stamp". Anos atrás, também costumava haver uma empresa chamada Velocity Semiconductor, que substituía (supostamente) os módulos principais da Rabbit Semiconductor e possuía uma JVM em hardware, mas essa empresa aparentemente desapareceu. Boa sorte na sua pesquisa!

Dave
fonte
4

A Sun Microsystems costumava criar uma plataforma chamada Sun Spot, que era basicamente uma plataforma Java incorporada. Agora, obviamente, a Sun Microsystems não existe mais (a Oracle os comprou), mas parece que você ainda pode comprar os Sun Spots - http://www.sunspotworld.com/products/ . Eu não sou grande com a idéia de usar Java em um ambiente incorporado (nível errado de abstração para a tarefa imho), mas essa parece ser a plataforma incorporada mais natural para Java. Observe as especificações sobre essas coisas - elas são pesadas 180MHz / 512k RAM e não são baratas por US $ 400 para um kit inicial.

Portanto, serei um segundo ou terceiro entre os respondentes de advocacia do Arduino a esta pergunta. Existe um inferno de uma comunidade lá fora para apoiá-lo, se você precisar de ajuda. E se você precisar de hardware periférico, procure "Arduino Shields" no Google e surpreenda-se - você pode fazer qualquer coisa, desde servomotores de controle até pular em uma rede sem fio 802.11 com a combinação certa de escudos. Não é prático aprender C (o ponteiro diz o quê !?) sem tempo de prática, mas você pode começar a escrever esboços do Arduino em pouco tempo ... Você também pode obter plataformas Arduino "reais" em torno de US $ 30 e clones (por exemplo, RBBB ou DorkBoard) por menos de US $ 15.

vicatcu
fonte
ah sim, eu vi isso na Maker Faire há dois anos! Dispositivo muito legal.
Dave
O recurso matador do SunSpots não é o Java, mas o material sem fio embutido, permitindo que eles se comuniquem. Se você quer conhecer um ao outro ou facilitar a comunicação sem fio com a base, isso é muito, muito bom.
Thorbjørn Ravn Andersen
3

A Parallax produz o Javelin Stamp , um CoM (Computer-on-Module) que executa uma JVM.

São US $ 60 e executam aproximadamente 8.500 instruções Java por segundo.

Além disso, o PCB é rosa (sério!)

Connor Wolf
fonte
2

Os sistemas Ajile produzem uma variedade de chips java e placas de avaliação incorporados nativos em tempo real.

Eles executam java bare metal. É muito agradável.

www.ajile.com faça as fichas e as placas de avaliação.

www.systronix.com vende uma variedade de hardware Java incorporado.

Eu usei o AJ-100 da ajile para trabalhos exigentes, eles são muito agradáveis ​​de se trabalhar. E não, eles não são tão baratos quanto um avr, mas processam dados como um pentium de baixo custo.

Os chips de Ajiles respondem a interrupções (latência de interrupção) em menos de 1 microssegundo.

Tim Williscroft
fonte
'nunca faça isso em um sistema C incorporado' ??? Fazer o que? 1 latência nos EUA? Alta velocidade? Dificilmente. Acho que você está esquecendo DSPs de 1 GHz +, muitos ARMs e muitos outros. Muitas pessoas escrevem para elas com apenas C bare metal (sem SO, etc). Devo admitir que esse tipo de coisa é uma maneira racional de usar Java em embarcados (fora de um sistema operacional completo em escala de Linux) ... embora depois de dar uma rápida olhada no Systronix, eu diria que parece que você está pagando bom prêmio por essa pouca conveniência. Eu iria incorporar o ARM, com certeza. Além disso, muitos dos links para esses projetos do Systronix estão inoperantes.
darron
Ah, e TINI é incrivelmente burro. JVM na ROM em um 8051. Tentei estupidamente o caminho de volta quando queria Ethernet fácil, e mesmo em C a coisa foi inundada pelo tráfego de transmissão de uma LAN corporativa normal. Seria um bom produto se o comercializassem como os selos básicos da Parallax, mas não o fazem. Não é adequado para nenhum propósito não-hobby.
darron
11
Esses chips estão rodando a várias centenas de megahertz. A latência de 1 uS é possível quando programado em C em um processador executando 100 vezes mais lento que esses dispositivos. Você pode fazer algumas coisas bem legais (como iPads e telefones Droid) com processadores equivalentes, mas postar isso como uma alternativa ao AVR de 8 bits na pergunta dificilmente é uma comparação de maçãs para maçãs.
Kevin Vermeer
@reemrevnivek: Dado que o OP queria o Java, consideraria a parte do Ajile apropriada, pois é uma das únicas maneiras razoáveis ​​de executar o Java incorporado (fora de um sistema operacional Linux completo ou algo assim). Se o último parágrafo e os bits TSTIK não estivessem lá, eu até o aprovaria.
darron
2

Minha experiência pessoal é que o código C para programar e começar a usar o AVR é ​​bastante fácil, eu também venho de muitos anos fazendo java e, após cerca de 2 meses de uso de esboços do arduino, deixei o ambiente e fui para o avr-gcc, sites como avrfreaks, é fácil encontrar respostas para problemas comuns. (Eu ainda faço tudo no meu fiel Arduino Duemillenove)

Usar o eclipse para compilar e "implantar", ou seja, gravar no chip, também é bom, pois não preciso lidar com outro IDE

Eu acho que é realmente mais difícil entender seus registros, registros de 16 bits e lê-los na ordem apropriada, interrupções, temporizadores, PWM de hardware, do que a própria linguagem de programação.

webclimber
fonte
1

Embora eu geralmente seja do campo "aprenda C e entenda o que os processadores realmente fazem" no que diz respeito ao trabalho incorporado, vale ressaltar que um pequeno chip de braço não é muito mais caro que um AVR e é quase plausível posição para lidar com tarefas simples em cima de uma jvm.

Chris Stratton
fonte
1

O NanoVM é uma Java Virtual Machine projetada para executar em microcontroladores AVR de 8 bits.

(a partir da página inicial)

Não é uma Java VM com todos os recursos e nunca será. Sempre será limitado a um pequeno subconjunto da linguagem java e das bibliotecas java padrão e a alguns métodos específicos de aplicativos. Além disso, não se destina a substituir o C como a maneira padrão de programar microcontroladores. É menos flexível e tem um desempenho mais baixo que os programas C ou assembler.

O NanoVM é uma maneira de fornecer uma interface de programação limitada mas controlável para um dispositivo baseado em microcontrolador. Com a maioria do código mais específico do hardware fazendo parte do próprio NanoVM, o usuário pode se concentrar no próprio aplicativo. Se um usuário receber um dispositivo equipado com o NanoVM, ele não precisará pensar no próprio hardware. Além disso, ele não precisa de nenhum compilador específico de destino ou algo parecido. Tudo o que ele precisa é de um compilador java padrão e o NanoVMTool, que está escrito em java. Portanto, toda a cadeia de desenvolvimento funciona em qualquer dispositivo que tenha um compilador java e possa executar o código java. Com a abstração de hardware fornecida pelo NanoVM, o usuário nem precisa se preocupar com o tipo de microcontrolador no qual o alvo se baseia.

Toby Jaffey
fonte
1

Não é exatamente Java - ou 8 bits, mas há um interpretador Javascript disponível para microcontroladores ARM de baixa potência chamado Espruino .

Gordon Williams
fonte