Microcontrôleur avec API Java

10

Mon équipe matérielle prévoit d'utiliser un microcontrôleur Atmel AVR 8 bits pour un futur projet.

Pour autant que je sache, il doit être programmé en C. J'ai trouvé une JVM pour AVR, bien qu'elle soit plus limitée que les bibliothèques C natives d'Atmel.

Pouvez-vous me suggérer un microcontrôleur 8 bits qui prend en charge Java?

PS. Je ne connais pas C et je suis inexpérimenté en programmation microprocesseur.

sterz
la source
28
Disons que quelqu'un vendait une grosse jupe flottante et de longs bâtons qu'ils ont dit que vous pourriez utiliser avec votre voiture pour aller pêcher sur un lac. Après avoir lutté pendant trois jours pour le mettre, vous obtenez environ 15 pieds dans le lac avant que votre voiture ne bascule et coule. Ton père va être vraiment énervé. Vous aviez abandonné le magasin de bateaux local avec un joli canoë. Le canoë est le compilateur C du micro, et la voiture flottante avec des bâtons est Java sur un microcontrôleur 8 bits. Heureusement, cela ne s'est pas produit ... vous nous demandez où vous pouvez trouver les flotteurs. Alors, en tant que papa, permettez-moi de dire "À quoi pensez-vous?! Obtenez un canoë!"
darron
6
J'ai du mal à visualiser la voiture à jupe flottante avec des bâtons. Avez-vous des photos?
endolith
8
@darron - Cela ne devrait-il pas être un big_floating_skirtobjet qui implémente l' boatinterface dans le org.buoyantpackage, et des poleobjets, qui ont une sorte de modèle d'héritage bizarre avec java.netlequel je ne me souviens pas maintenant (mais qui est clairement décrit dans l'UML)?
Kevin Vermeer
2
@sterz: Je pense que sans fond de microprocesseur, il est parfaitement compréhensible que vous n'ayez pas réalisé à quel point Java est déplacé sur un micro 8 bits. Désolé si mon premier commentaire avait l'air dur ... Un simple "Ne fais pas ça" semblait bien trop faible.
darron
1
@darron: merci pour l'analogie "tirer sur les oiseaux avec un canon"
sterz

Réponses:

32

Si vous êtes inexpérimenté dans le domaine de la programmation des microprocesseurs / microcontrôleurs, vous devriez probablement apprendre le C en premier, afin de pouvoir comprendre quand et pourquoi Java est un mauvais choix pour la plupart des projets de microcontrôleurs.

Avez-vous lu les restrictions sur la machine virtuelle Java que vous avez liée? Il comprend les problèmes suivants:

  • Aussi peu que 512 octets de mémoire de programme (pas Ko, et certainement pas Mo)
  • Aussi peu que 768 octets de RAM (où vont vos variables. Vous êtes limité à 768 caractères de chaînes par cette restriction.)
  • Environ 20 000 opcodes Java par seconde sur 8 Mhz AVR.
  • Comprend uniquement java.lang.Object, java.lang.System, java.io.PrintStream, java.lang.StringBuffer, une classe de contrôle JVM et une classe IO native. Vous ne pourrez pas faire une importation java.util. *; et obtenez toutes les classes qui ne figurent pas dans cette liste.

Si vous ne savez pas ce que ces restrictions signifient, assurez-vous d'avoir un plan B s'il s'avère que vous ne pouvez pas réellement faire le projet avec Java en raison des restrictions d'espace et de vitesse.

Si vous voulez toujours utiliser Java, peut-être parce que vous vous attendez à ce que l'appareil soit programmé par beaucoup de gens qui ne connaissent que Java, je vous suggère fortement d'obtenir un matériel plus gros, probablement quelque chose qui exécute Linux embarqué. Voir cette page d'Oracle pour quelques spécifications à utiliser pour exécuter la JVM intégrée, dans la FAQ de leur discussion, ils recommandent un minimum de 32 Mo de RAM et 32 ​​Mo de Flash. C'est environ 32 000 fois la RAM et 1 000 fois le flash de l'AVR que vous regardez. La page Java Embedded Intro d' Oracle explique plus en détail les restrictions de la JVM. Leur ton de voix est, comme vous pouvez le deviner, beaucoup plus compatible avec Java que le mien. Sachez que ce type de matériel est beaucoup plus difficile à concevoir qu'un AVR 8 bits.

Je suis un étudiant en génie informatique avec une mineure en informatique. Le département CS de mon université a bu le Java Kool-aid, donc beaucoup d'étudiants du programme d'ingénierie ne connaissent que Java (ce qui est une triste situation pour un programmeur, apprenez au moins du Python ou du C ++ si vous ne le faites pas). voulez apprendre le C ...), alors un de mes professeurs a publié une feuille de triche C pour les étudiants ayant un an d'expérience Java. C'est seulement 75 pages; Je vous suggère de le lire ou de le parcourir avant de prendre une décision. À mon avis, C est le langage le plus efficace, le plus durable et le plus professionnel pour développer un projet intégré.

Une autre alternative à considérer est le framework Arduino . Il utilise une version allégée du langage de câblage , qui est comme C ++ sans objets ni en-têtes. Il peut fonctionner sur de nombreuses puces AVR, ce n'est certainement pas limité à leur matériel. Cela vous donnera une courbe d'apprentissage plus facile que de sauter directement en C.

En conclusion,
Marteau d'or XKCD
texte Alt: Il m'a fallu cinq essais pour trouver le bon, mais j'ai réussi à sauver notre soirée - sinon le bateau - à la fin.

Kevin Vermeer
la source
5
Une de mes bandes dessinées préférées que j'ai jamais appréciée.
Kortuk
1
Mmm, cool-aide. +1
tyblu
Je me demande comment cette JVM se compare aux "Java iButtons" qui étaient disponibles il y a quelques décennies?
supercat
Le lien @kevin "C Cheat sheet" ne fonctionne pas! Veuillez mettre à jour!
charansai
6

L'environnement de programmation le plus populaire pour l'AVR Atmel est Arduino . Le langage Arduino est un sous-ensemble de C ++.

Les "croquis" / programmes Arduino semblent syntaxiquement très similaires à Java. Le langage de câblage dont Arduino dérive a des implémentations en C ++ ( Arduino ), Java ( Processing ) et Javascript ( processing.js ).

Les deux langues partagent le même style de déclaration, les constructions de boucles et les opérateurs arithmétiques en raison de leur ascendance commune dans Algol68. En règle générale, tous les objets dans Arduino sont déclarés globalement ou sur la pile, comme Java, les fonctions membres sont appelées avec l' .opérateur (par exemple LED.flash()).

Le langage sera très familier à un programmeur Java - mais, surtout, les croquis Arduino sont compilés en code natif qui s'exécute à pleine vitesse avec un accès matériel complet. Ceci est essentiel pour tirer le meilleur parti de votre microcontrôleur.

Voici l' API .

Arduino fournit tout ce dont vous avez besoin pour démarrer: un matériel à faible coût, un environnement de développement intégré gratuit et un chargeur de démarrage (vous pouvez donc charger du code via USB / série).

Toby Jaffey
la source
3
Pour être plus précis, c'est (très probablement) l'environnement de programmation le plus populaire auprès des amateurs, mais pas nécessairement parmi tous les développeurs d'AVR.
pfyon
2
Je dirais que l'Arduino est le plus populaire par le nombre d'utilisateurs, mais pas par le nombre d'unités de produit expédiées contenant le firmware Arduino. Il y a beaucoup d'utilisateurs Arduino
Toby Jaffey
1
Bien que les "esquisses" soient compilées, la vitesse d'accès aux E / S peut être considérablement améliorée à l'aide de C ou de l'assemblage.
tyblu
1
C ++ et Java me semblent très différents. ("Arduino" est juste du C ++ avec une structure d'inclusion bizarre pour cacher certains des éléments techniques.)
Nick T
2
@Jason S "Arduino" sketches "/ programmes semblent très similaires à Java"
Toby Jaffey
4

Je tiens à préciser que je n'en ai jamais utilisé auparavant, mais il y en avait un il y a un an appelé Javelin. Il est possible que Parallax les ait acquis ou quelque chose comme ça, car maintenant le seul qui apparaît est le "Javelin Stamp". Il y a des années, il y avait aussi une entreprise appelée Velocity Semiconductor, qui a fait un remplacement (supposément) pour les modules de base de Rabbit Semiconductor, et il y avait une JVM en matériel, mais cette entreprise a apparemment disparu. Bonne chance dans votre recherche!

Dave
la source
4

Sun Microsystems avait l'habitude de créer une plate-forme appelée Sun Spot, qui était essentiellement une plate-forme Java intégrée. Maintenant, évidemment, Sun Microsystems n'est plus là (Oracle les a achetés), mais il semble que vous pouvez toujours acheter Sun Spots - http://www.sunspotworld.com/products/ . Je ne suis pas grand sur l'idée d'utiliser Java dans un environnement embarqué (mauvais niveau d'abstraction pour le travail à mon humble avis) mais cela semble être la plate-forme embarquée la plus naturelle pour Java. Notez les spécifications de ces choses - elles sont robustes à 180 MHz / 512k RAM, et elles ne sont pas bon marché à 400 $ pour un kit de démarrage.

Je serai donc un deuxième ou un troisième pour les intervenants de plaidoyer Arduino à cette question. Il existe une communauté d'enfer pour vous soutenir si vous avez besoin d'aide. Et si vous avez besoin de matériel périphérique, recherchez "Boucliers Arduino" sur Google et soyez étonné - vous pouvez faire n'importe quoi, des servomoteurs de contrôle à sauter sur un réseau sans fil 802.11 avec la bonne combinaison de boucliers. Ce n'est pas pratique d'apprendre le C (le pointeur dit quoi!?) Sans un peu de temps de pratique, mais vous pouvez commencer à écrire des croquis Arduino en un rien de temps ... Vous pouvez également obtenir de "vraies" plates-formes Arduino autour de 30 $ et des clones (par exemple RBBB ou DorkBoard) pour moins de 15 $.

vicatcu
la source
ah oui, j'ai vu ça à la Maker Faire il y a deux ans! Appareil assez cool.
Dave
La fonctionnalité qui tue pour SunSpots n'est pas Java, mais les fonctionnalités sans fil intégrées leur permettant de communiquer entre elles. Si vous voulez être conscients les uns des autres ou avoir une communication sans fil facile avec le port d'attache, c'est très, très bien.
Thorbjørn Ravn Andersen
3

Parallax crée le Javelin Stamp , un CoM (Computer-on-Module) qui exécute une JVM.

C'est 60 $ et exécute une flamboyante ~ 8 500 instructions Java / sec.

De plus, le PCB est rose (vraiment!)

Connor Wolf
la source
2

Les systèmes Ajile produisent une variété de puces Java et de cartes d'évaluation natives intégrées en temps réel.

Ils exécutent du java en métal nu. C'est très agréable.

www.ajile.com fabrique les puces et les planches d'évaluation.

www.systronix.com vend une variété de matériel java intégré.

J'ai utilisé AJ-100 d'ajile pour un travail exigeant, ils sont très agréables à travailler. Et non, ils ne sont pas aussi bon marché qu'un avr, mais ils traitent les données comme un pentium bas de gamme.

Les puces d'Ajiles répondent aux interruptions (latence d'interruption) en moins de 1 microseconde.

Tim Williscroft
la source
'ne faites jamais ça sur un système C embarqué' ??? Faire quoi? 1 latence américaine? Haute vitesse? À peine. Je pense que vous oubliez les DSP 1 GHz +, de nombreux ARM et bien d'autres. Beaucoup de gens écrivent pour cela avec juste du métal nu (pas de système d'exploitation, etc.). Je vais vous accorder que ce genre de chose est une façon à moitié rationnelle d'utiliser Java dans un système embarqué (en dehors d'un système d'exploitation complet à l'échelle de Linux) ... bien qu'après avoir jeté un coup d'œil à Systronix, je dirais qu'il semble que vous payez un bonne prime pour ce petit confort. J'irais certainement ARM intégré. De plus, beaucoup de liens vers ces projets hors de Systronix sont morts.
darron
Oh, et TINI est incroyablement stupide. JVM en ROM sur un 8051. J'ai stupidement essayé une voie en arrière quand je voulais un Ethernet facile, et même en C, la chose était juste submergée par le trafic de diffusion d'un LAN d'entreprise normal. Ce serait un bon produit s'ils le commercialisaient comme les tampons de base de Parallax, mais ils ne le font pas. Ce n'est pas adapté à un usage non amateur.
darron
1
Ces puces tournent à plusieurs centaines de mégahertz. La latence 1uS est possible lorsqu'elle est programmée en C sur un processeur fonctionnant 100 fois plus lentement que ces appareils. Vous pouvez faire des choses assez sympas (comme les iPads et les téléphones Droid) avec des processeurs équivalents, mais publier cela comme une alternative à l'AVR 8 bits dans la question n'est guère une comparaison entre pommes.
Kevin Vermeer
@reemrevnivek: Étant donné que l'OP voulait Java, je considérerais la partie Ajile comme appropriée, car c'est l'un des seuls moyens raisonnables d'exécuter Java intégré (en dehors d'un système d'exploitation Linux complet ou quelque chose). Si le dernier paragraphe et les bits TSTIK n'étaient pas là, je le voterais même.
darron
2

Mon expérience personnelle est que le code C pour programmer et démarrer avec AVR est assez facile, je viens également de nombreuses années de java, et après environ 2 mois d'utilisation de croquis en arduino, j'ai abandonné l'environnement et j'ai opté pour avr-gcc, sites comme avrfreaks permettent de trouver facilement des réponses aux problèmes courants. (Je fais toujours tout sur mon fidèle Arduino Duemillenove)

Utiliser eclipse pour compiler et "déployer", c'est-à-dire écrire sur la puce, est également agréable car je n'ai pas à faire face à un autre IDE

Je pense qu'il est en fait plus difficile de se familiariser avec les registres, les registres 16 bits et de les lire dans l'ordre approprié, les interruptions, les temporisateurs, le PWM matériel, que le langage de programmation lui-même.

webclimber
la source
1

Bien que je sois généralement du camp «apprendre C et comprendre ce que les processeurs font réellement» en ce qui concerne le travail intégré, il convient de souligner qu'une puce à petit bras n'est pas beaucoup plus chère qu'un AVR et est presque plausible. position pour gérer des tâches simples sur une jvm.

Chris Stratton
la source
1

NanoVM est une machine virtuelle Java conçue pour fonctionner sur des microcontrôleurs AVR 8 bits.

(depuis la page d'accueil)

Ce n'est pas une machine virtuelle Java complète et elle ne le sera jamais. Il sera toujours limité à un petit sous-ensemble du langage java et des bibliothèques java standard et à quelques méthodes spécifiques à l'application. En outre, il n'est pas destiné à remplacer C comme moyen standard de programmation des microcontrôleurs. Il est moins flexible et a des performances inférieures à celles des programmes C ou assembleur.

La NanoVM est un moyen de fournir une interface de programmation limitée mais contrôlable à un périphérique basé sur un microcontrôleur. La plupart des codes spécifiques au matériel faisant partie de la NanoVM elle-même, l'utilisateur peut se concentrer sur l'application elle-même. Si un utilisateur reçoit un appareil équipé de la NanoVM, il n'est pas obligé de penser au matériel lui-même. De plus, il n'a besoin d'aucun compilateur spécifique ou similaire. Tout ce dont il a besoin est un compilateur java standard et le NanoVMTool qui lui-même est écrit en java. Ainsi, toute la chaîne de développement fonctionne sur n'importe quel appareil doté d'un compilateur java et pouvant exécuter du code java. Avec l'abstraction matérielle fournie par la NanoVM, l'utilisateur n'a même pas à se soucier du type de microcontrôleur sur lequel la cible est basée.

Toby Jaffey
la source
1

Ce n'est pas tout à fait Java - ou 8 bits, mais il existe un interpréteur Javascript disponible pour les microcontrôleurs ARM de faible puissance appelé Espruino .

Gordon Williams
la source