Mikrocontroller mit Java API

10

Mein Hardwareteam plant, für ein zukünftiges Projekt einen Atmel AVR 8-Bit-Mikrocontroller zu verwenden.

Soweit ich weiß, muss es in C programmiert werden. Ich habe eine JVM für AVR gefunden, obwohl sie eingeschränkter ist als die nativen C-Bibliotheken von Atmel.

Können Sie mir einen 8-Bit-Mikrocontroller vorschlagen, der Java unterstützt?

PS. Ich kenne C nicht und bin unerfahren in der Mikroprozessorprogrammierung.

sterz
quelle
28
Angenommen, jemand hat einen großen schwimmenden Rock und einige lange Stangen verkauft, von denen er sagte, Sie könnten mit Ihrem Auto an einem See angeln. Nachdem Sie drei Tage lang gekämpft haben, um es anzuziehen, gelangen Sie ungefähr 15 Fuß in den See, bevor Ihr Auto umkippt und sinkt. Dein Vater wird wirklich sauer sein. Sie waren mit einem schönen Kanu am örtlichen Bootsladen vorbeigekommen. Das Kanu ist der C-Compiler des Mikros, und das schwimmende Auto mit Stöcken ist Java auf einem 8-Bit-Mikrocontroller. Zum Glück ist das nicht passiert ... Sie fragen uns, wo Sie die Wagen finden können. Also, als dein Vater, lass mich sagen "Was denkst du?! Hol dir ein Kanu!"
Darron
6
Ich habe Probleme, mir das schwimmende Rockauto mit Stöcken vorzustellen. Hast du irgendwelche Bilder?
Endolith
8
@darron - Sollte das nicht ein big_floating_skirtObjekt sein, das die boatSchnittstelle im org.buoyantPaket implementiert , und poleObjekte, die ein seltsames Vererbungsmuster haben, an java.netdas ich mich jetzt nicht erinnern kann (das aber in der UML klar beschrieben ist)?
Kevin Vermeer
2
@sterz: Ich denke, ohne Mikroprozessor-Hintergrund ist es vollkommen verständlich, dass Sie möglicherweise nicht bemerkt haben, wie fehl am Platz Java auf einem 8-Bit-Mikro wirklich ist. Tut mir leid, wenn mein erster Kommentar hart klang ... Ein einfaches "Tu das nicht" schien viel zu schwach.
Darron
1
@darron: danke für die Analogie "Vögel mit einer Kanone schießen"
sterz

Antworten:

32

Wenn Sie im Bereich der Programmierung von Mikroprozessoren / Mikrocontrollern unerfahren sind, sollten Sie wahrscheinlich zuerst C lernen, damit Sie verstehen, wann und warum Java für die meisten Mikrocontroller-Projekte eine schlechte Wahl ist.

Haben Sie die Einschränkungen für die von Ihnen verlinkte JVM gelesen? Es enthält die folgenden Probleme:

  • Nur 512 Bytes Programmspeicher (nicht KB und definitiv nicht MB)
  • Nur 768 Byte RAM (wohin Ihre Variablen gehen. Durch diese Einschränkung sind Sie auf 768 Zeichenfolgen beschränkt.)
  • Ungefähr 20.000 Java-Opcodes pro Sekunde auf einem 8-MHz-AVR.
  • Enthält nur java.lang.Object, java.lang.System, java.io.PrintStream, java.lang.StringBuffer, eine JVM-Steuerungsklasse und eine native E / A-Klasse. Sie können java.util nicht importieren. *; und alle Klassen erhalten, die nicht in dieser Liste enthalten sind.

Wenn Sie nicht wissen, was diese Einschränkungen bedeuten, stellen Sie sicher, dass Sie einen Plan B haben, wenn sich herausstellt, dass Sie das Projekt aufgrund der Platz- und Geschwindigkeitsbeschränkungen nicht mit Java ausführen können.

Wenn Sie immer noch mit Java arbeiten möchten, vielleicht weil Sie erwarten, dass das Gerät von vielen Leuten programmiert wird, die nur Java kennen, würde ich dringend empfehlen, größere Hardware zu erwerben, wahrscheinlich etwas, auf dem Embedded Linux ausgeführt wird. Auf dieser Seite von Oracle finden Sie einige Spezifikationen, auf die Sie zugreifen können, um die eingebettete JVM auszuführen. In den häufig gestellten Fragen (FAQ) werden mindestens 32 MB RAM und 32 MB Flash empfohlen. Das ist ungefähr das 32.000-fache des RAM und das 1.0000-fache des Flashs des AVR, den Sie betrachten. Auf der Java Embedded Intro- Seite von Oracle werden die Einschränkungen der JVM ausführlicher beschrieben. Ihr Tonfall ist, wie Sie sich vorstellen können, viel Java-freundlicher als meiner. Beachten Sie, dass diese Art von Hardware viel schwieriger zu entwerfen ist als ein 8-Bit-AVR.

Ich bin ein Student der Informatik mit einem Nebenfach Informatik. Die CS-Abteilung meiner Universität hat die Java-Kool-Hilfe getrunken, daher kennen viele Studenten des Ingenieurprogramms nur Java (was für einen Programmierer ein trauriger Zustand ist, lernen Sie zumindest Python oder C ++, wenn Sie dies nicht tun Ich möchte C lernen ...), also hat einer meiner Professoren einen C-Spickzettel für Studenten mit einem Jahr Java-Erfahrung veröffentlicht. Es sind nur 75 Seiten; Ich schlage vor, Sie lesen oder überfliegen es, bevor Sie eine Entscheidung treffen. Meiner Meinung nach ist C die effizienteste, dauerhafteste und professionellste Sprache, um ein eingebettetes Projekt zu entwickeln.

Eine weitere zu berücksichtigende Alternative ist das Arduino- Framework. Es wird eine abgespeckte Version der Wiring- Sprache verwendet, die C ++ ohne Objekte oder Header ähnelt. Es kann auf vielen AVR-Chips laufen, es ist definitiv nicht auf deren Hardware beschränkt. Es gibt Ihnen eine einfachere Lernkurve als nur direkt in C zu springen.

Abschließend
XKCD Golden Hammer
Alt-Text: Ich habe fünf Versuche unternommen, den richtigen zu finden, aber am Ende habe ich es geschafft, unsere Nacht - wenn nicht das Boot - zu retten.

Kevin Vermeer
quelle
5
Einer meiner Lieblings-Comics, die ich je genossen habe.
Kortuk
1
Mmm, cooler Helfer. +1
Tyblu
Ich frage mich, wie diese JVM mit den "Java iButtons" verglichen wird, die vor ein paar Jahrzehnten verfügbar waren.
Supercat
@ kevin "C Spickzettel" Link funktioniert nicht! Bitte aktualisieren!
Charansai
6

Die beliebteste Programmierumgebung für den Atmel AVR ist Arduino . Die Arduino-Sprache ist eine Teilmenge von C ++.

Arduino "Skizzen" / Programme erscheinen syntaktisch sehr ähnlich zu Java. Die Wiring Sprache , die Arduino ergibt sich aus hat Implementierungen in C ++ ( Arduino ), Java ( Verarbeitung ) und Javascript ( processing.js ).

Beide Sprachen haben aufgrund ihrer gemeinsamen Abstammung in Algol68 denselben Deklarationsstil, dieselben Schleifenkonstrukte und dieselben arithmetischen Operatoren. In der Regel werden alle Objekte in Arduino global oder auf dem Stapel deklariert. Daher werden wie bei Java Mitgliedsfunktionen mit dem .Operator (z. B. LED.flash()) aufgerufen .

Die Sprache ist einem Java-Programmierer sehr vertraut - aber vor allem werden Arduino-Skizzen zu nativem Code kompiliert, der mit voller Geschwindigkeit und vollem Hardwarezugriff ausgeführt wird. Dies ist wichtig, um Ihren Mikrocontroller optimal nutzen zu können.

Hier ist die API .

Arduino bietet alles, was Sie brauchen, um loszulegen: kostengünstige Hardware, eine kostenlose integrierte Entwicklungsumgebung und einen Bootloader (damit Sie Code über USB / Seriell laden können).

Toby Jaffey
quelle
3
Genauer gesagt ist es (höchstwahrscheinlich) die beliebteste Programmierumgebung bei Hobbyisten, aber nicht unbedingt bei allen AVR-Entwicklern.
Pfyon
2
Ich würde behaupten, dass Arduino nach Anzahl der Benutzer am beliebtesten ist, aber nicht nach Anzahl der Produkteinheiten, die mit Arduino-Firmware ausgeliefert werden. Es gibt viele Arduino-Benutzer da draußen
Toby Jaffey
1
Obwohl "Skizzen" kompiliert werden, kann die E / A-Zugriffsgeschwindigkeit mithilfe von C oder Assembly erheblich verbessert werden.
Tyblu
1
C ++ und Java sehen für mich ganz anders aus. ("Arduino" ist nur C ++ mit einer bizarren Include-Struktur, um einige der technischen Details zu verbergen.)
Nick T
2
@ Jason S "Arduino" Skizzen "/ Programme scheinen Java sehr ähnlich zu sein"
Toby Jaffey
4

Ich möchte klarstellen, dass ich noch nie einen benutzt habe, aber vor einem Jahr gab es den Speer. Es ist möglich, dass Parallax sie erworben hat oder so, denn jetzt taucht nur noch der "Speer-Stempel" auf. Vor Jahren gab es auch eine Firma namens Velocity Semiconductor, die (angeblich) die Kernmodule von Rabbit Semiconductor ersetzte und eine JVM in Hardware hatte, aber diese Firma ist anscheinend verschwunden. Viel Glück bei deiner Suche!

Dave
quelle
4

Sun Microsystems hat früher eine Plattform namens Sun Spot erstellt, die im Grunde eine eingebettete Java-Plattform war. Jetzt gibt es Sun Microsystems offensichtlich nicht mehr (Oracle hat sie gekauft), aber anscheinend können Sie immer noch Sun Spots kaufen - http://www.sunspotworld.com/products/ . Ich bin nicht besonders begeistert von der Idee, Java in einer eingebetteten Umgebung zu verwenden (falsche Abstraktionsebene für den Job imho), aber dies scheint die natürlichste eingebettete Plattform für Java zu sein. Beachten Sie die technischen Daten zu diesen Dingen - sie sind Hochleistungs-RAM mit 180 MHz / 512 KB und für 400 US-Dollar für ein Starter-Kit nicht billig.

Also werde ich ein zweiter oder dritter der Arduino Advocacy-Antwortenden auf diese Frage sein. Es gibt eine verdammt gute Community, die Sie unterstützt, wenn Sie Hilfe benötigen. Und wenn Sie Peripherie-Hardware benötigen, schauen Sie bei Google nach "Arduino Shields" und lassen Sie sich überraschen - Sie können alles tun, von Servo-Steuermotoren bis hin zu einem drahtlosen 802.11-Netzwerk mit der richtigen Kombination von Shields. Es ist nicht praktisch, C (Zeiger sagt was!?) Ohne Übungszeit zu lernen, aber Sie können in kürzester Zeit mit dem Schreiben von Arduino-Skizzen beginnen ... Sie können auch "echte" Arduino-Plattformen für etwa 30 USD und Klone (z. B. RBBB oder DorkBoard) für unter 15 US-Dollar.

vicatcu
quelle
ah ja, das habe ich vor zwei Jahren auf der Maker Faire gesehen! Ziemlich cooles Gerät.
Dave
Die Killer-Funktion für SunSpots ist nicht Java, sondern das integrierte drahtlose Material, mit dem sie miteinander kommunizieren können. Wenn Sie sich gegenseitig bewusst werden oder eine einfache drahtlose Kommunikation mit der Heimatbasis wünschen, ist das sehr, sehr schön.
Thorbjørn Ravn Andersen
3

Parallax macht den Javelin Stamp zu einem CoM (Computer-on-Module), auf dem eine JVM ausgeführt wird.

Es kostet 60 US-Dollar und führt unglaubliche 8.500 Java-Anweisungen pro Sekunde aus.

Auch die Platine ist rosa (Wirklich!)

Connor Wolf
quelle
2

Ajile-Systeme stellen eine Vielzahl nativer eingebetteter Java-Chips und Evaluierungskarten in Echtzeit her.

Sie laufen Bare-Metal-Java. Es ist sehr angenehm.

www.ajile.com machen die Chips und Bewertungsbretter.

www.systronix.com verkauft eine Vielzahl von eingebetteter Java-Hardware.

Ich habe AJ-100 von Ajile für anspruchsvolle Arbeiten verwendet. Es ist sehr schön, mit ihnen zu arbeiten. Und nein, sie sind nicht so billig wie ein AVR, aber sie verarbeiten Daten wie ein Low-End-Pentium.

Ajiles 'Chips reagieren auf Interrupts (Interrupt-Latenz) in weniger als 1 Mikrosekunde.

Tim Williscroft
quelle
'Mach das niemals auf einem eingebetteten C-System' ??? Was ist zu tun? 1 US-Latenz? Schnelle Geschwindigkeit? Kaum. Ich denke, Sie vergessen 1 GHz + DSPs, viele ARMs und einige andere. Viele Leute schreiben für diese nur mit Bare-Metal-C (kein Betriebssystem usw.). Ich gebe Ihnen zu, dass diese Art von Dingen eine halbwegs rationale Möglichkeit ist, Java in Embedded (außerhalb eines vollständigen Linux-Betriebssystems) zu verwenden ... obwohl ich nach einem kurzen Blick auf Systronix sagen würde, dass Sie anscheinend a bezahlen gute Prämie für diesen kleinen Komfort. Ich würde auf jeden Fall in Embed Embedded gehen. Außerdem sind viele Links zu diesen Projekten außerhalb von Systronix tot.
Darron
Oh, und TINI ist wahnsinnig dumm. JVM im ROM auf einem 8051. Ich habe es dumm versucht, als ich einfaches Ethernet wollte, und selbst in C wurde das Ding nur vom Broadcast-Verkehr eines normalen Unternehmens-LAN überschwemmt. Es wäre ein gutes Produkt, wenn sie es wie Parallax 'Basic Stamps vermarkten würden, aber das tun sie nicht. Es ist nicht für Nicht-Hobby-Zwecke geeignet.
Darron
1
Diese Chips laufen mit mehreren hundert Megahertz. Eine Latenz von 1uS ist möglich, wenn in C auf einem Prozessor programmiert wird, der 100-mal langsamer als diese Geräte läuft. Sie können einige ziemlich coole Dinge (wie iPads und Droid-Telefone) mit gleichwertigen Prozessoren tun, aber dies als Alternative zum 8-Bit-AVR in der Frage zu veröffentlichen, ist kaum ein Vergleich von Äpfeln zu Äpfeln.
Kevin Vermeer
@reemrevnivek: Angesichts des von OP gewünschten Java würde ich den Ajile-Teil als angemessen erachten, da er eine der einzig vernünftigen Möglichkeiten ist, eingebettetes Java auszuführen (außerhalb eines vollständigen Linux-Betriebssystems oder so etwas). Wenn der letzte Absatz und die TSTIK-Bits nicht da wären, würde ich sie sogar positiv bewerten.
Darron
2

Meine persönliche Erfahrung ist, dass der C-Code zum Programmieren und Starten mit AVR ziemlich einfach ist. Ich komme auch aus vielen Jahren Java und nachdem ich ungefähr 2 Monate lang Arduino-Skizzen verwendet hatte, ließ ich die Umgebung fallen und entschied mich für avr-gcc-Sites wie avrfreaks machen es einfach, Antworten auf häufig auftretende Probleme zu finden. (Ich mache immer noch alles auf meinem vertrauenswürdigen Arduino Duemillenove)

Die Verwendung von Eclipse zum Kompilieren und "Bereitstellen", dh Schreiben auf den Chip, ist ebenfalls hilfreich, da ich mich nicht mit einer anderen IDE befassen muss

Ich denke, es ist tatsächlich schwieriger, sich mit Registern, 16-Bit-Registern und deren Lesen in der richtigen Reihenfolge, Interrupts, Timern und Hardware-PWM vertraut zu machen, als mit der Programmiersprache selbst.

Webclimber
quelle
1

Während ich in der Regel im Bereich "C lernen und verstehen, was Prozessoren tatsächlich tun" bin, wenn es um eingebettete Arbeit geht, sollte darauf hingewiesen werden, dass ein kleiner Armchip nicht viel teurer als ein AVR ist und fast plausibel ist Position, um einfache Aufgaben auf einem JVM zu erledigen.

Chris Stratton
quelle
1

NanoVM ist eine Java Virtual Machine, die für die Ausführung auf 8-Bit-AVR-Mikrocontrollern entwickelt wurde.

(von der Homepage)

Es ist keine voll funktionsfähige Java-VM und wird es auch nie sein. Es wird immer auf eine kleine Teilmenge der Java-Sprache und der Standard-Java-Bibliotheken sowie einige anwendungsspezifische Methoden beschränkt sein. Darüber hinaus soll C nicht als Standardmethode für die Programmierung von Mikrocontrollern ersetzt werden. Es ist weniger flexibel und hat eine geringere Leistung als C- oder Assembler-Programme.

Das NanoVM ist eine Möglichkeit, einem Mikrocontroller-basierten Gerät eine begrenzte, aber steuerbare Programmierschnittstelle bereitzustellen. Da der größte Teil des hardwarespezifischsten Codes Teil der NanoVM selbst ist, kann sich der Benutzer auf die Anwendung selbst konzentrieren. Wenn ein Benutzer ein mit NanoVM ausgestattetes Gerät erhält, muss er nicht über die Hardware selbst nachdenken. Außerdem benötigt er keine zielspezifischen Compiler oder ähnliches. Er benötigt lediglich einen Standard-Java-Compiler und das NanoVMTool, das selbst in Java geschrieben ist. Somit funktioniert die gesamte Entwicklungskette auf jedem Gerät, das über einen Java-Compiler verfügt und Java-Code ausführen kann. Mit der von NanoVM bereitgestellten Hardware-Abstraktion muss sich der Benutzer nicht einmal um den Mikrocontrollertyp kümmern, auf dem das Ziel basiert.

Toby Jaffey
quelle
1

Es ist nicht ganz Java - oder 8 Bit, aber es gibt einen Javascript-Interpreter für ARM-Mikrocontroller mit geringem Stromverbrauch namens Espruino .

Gordon Williams
quelle