Mikrokontroler z Java API

10

Mój zespół sprzętowy planuje użyć 8-bitowego mikrokontrolera Atmel AVR do przyszłego projektu.

O ile wiem, musi być zaprogramowany w C. Znalazłem JVM dla AVR, chociaż jest on bardziej ograniczony niż natywne biblioteki C z Atmel.

Czy możesz zasugerować mi 8-bitowy mikrokontroler obsługujący Javę?

PS. Nie znam C i nie mam doświadczenia w programowaniu mikroprocesorowym.

sterz
źródło
28
Powiedzmy, że ktoś sprzedawał dużą pływającą spódnicę i kilka długich kijków, które, jak powiedzieli, można wykorzystać w samochodzie do połowów na jeziorze. Po trzech dniach walczenia, aby go założyć, wjeżdżasz do jeziora na około 15 stóp, zanim samochód przewróci się i zapadnie. Twój tata będzie naprawdę wkurzony. Ominąłeś lokalny sklep z łódkami z ładnym kajakiem. Czółno to kompilator C mikro, a pływający samochód z kijami to Java na 8-bitowym mikrokontrolerze. Na szczęście tak się nie stało ... pytasz nas, gdzie możesz znaleźć pływaki. Tak więc, jako twój tata, pozwól mi powiedzieć „Co myślisz ?! Weź kajak!”
darron
6
Mam problem z wizualizacją patykowatego samochodu z spódnicą. Masz jakieś zdjęcia?
endolith,
8
@darron - Czy nie powinien to być big_floating_skirtobiekt implementujący boatinterfejs w org.buoyantpakiecie oraz poleobiekty, które mają jakiś dziwny wzorzec dziedziczenia, z java.netktórym już nie pamiętam (ale jest to wyraźnie opisane w UML)?
Kevin Vermeer,
2
@sterz: Myślę, że bez tła mikroprocesora jest całkowicie zrozumiałe, że być może nie zdawałeś sobie sprawy z tego, jak naprawdę nie na miejscu jest Java na 8-bitowej mikro. Przepraszam, jeśli mój pierwszy komentarz brzmiał szorstko ... Proste „Nie rób tego” wydawało się zbyt słabe.
darron
1
@darron: dzięki za analogię do „strzelania do ptaków z armaty”
sterz

Odpowiedzi:

32

Jeśli nie masz doświadczenia w dziedzinie programowania mikroprocesorów / mikrokontrolerów, prawdopodobnie powinieneś najpierw nauczyć się języka C, aby zrozumieć, kiedy i dlaczego Java jest złym wyborem dla większości projektów mikrokontrolerów.

Czy przeczytałeś ograniczenia dotyczące JVM, które połączyłeś? Obejmuje następujące problemy:

  • Tylko 512 bajtów pamięci programu (nie KB, a na pewno nie MB)
  • Tylko 768 bajtów pamięci RAM (tam, gdzie idą twoje zmienne. Ograniczenie to ogranicza do 768 znaków ciągów).
  • Około 20 000 kodów Java na sekundę w 8 MHz AVR.
  • Obejmuje tylko java.lang.Object, java.lang.System, java.io.PrintStream, java.lang.StringBuffer, klasę sterującą JVM i rodzimą klasę IO. Nie będzie można wykonać importu java.util. *; i zdobądź wszystkie klasy, których nie ma na tej liście.

Jeśli nie wiesz, co oznaczają te ograniczenia, upewnij się, że masz plan B, jeśli okaże się, że nie możesz faktycznie wykonać projektu z Javą z powodu ograniczeń przestrzeni i prędkości.

Jeśli nadal chcesz korzystać z Javy, być może dlatego, że spodziewasz się, że urządzenie będzie programowane przez wielu ludzi znających tylko Javę, zdecydowanie sugeruję zakup większego sprzętu, prawdopodobnie czegoś, co obsługuje wbudowany system Linux. Zobacz tę stronę Oracle, aby znaleźć specyfikacje do uruchomienia wbudowanej maszyny JVM, w często zadawanych pytaniach do dyskusji zalecają minimum 32 MB pamięci RAM i 32 MB pamięci Flash. To około 32 000 razy więcej pamięci RAM i 10000 razy więcej niż flash AVR, na który patrzysz. Strona Oracle Embedded Intro Intro zawiera bardziej szczegółowe informacje na temat ograniczeń JVM. Ich głos jest, jak można się domyślać, dużo bardziej przyjazny dla Javy niż mój. Należy pamiętać, że tego rodzaju sprzęt jest znacznie trudniejszy do zaprojektowania niż 8-bitowy AVR.

Jestem studentem inżynierii komputerowej z nieletnią informatyką. Dział CS mojego uniwersytetu wypił program Java Kool-help, więc wielu studentów programu inżynierskiego zna tylko Javę (co jest dla programisty smutną sytuacją, przynajmniej naucz się języka Python lub C ++, jeśli nie chcę się uczyć C ...), więc jeden z moich profesorów opublikował Ściągacz C dla studentów z rocznym doświadczeniem w Javie. To tylko 75 stron; Sugeruję przeczytanie lub przejrzenie go przed podjęciem decyzji. Moim zdaniem C jest najbardziej wydajnym, trwałym i profesjonalnym językiem, w którym można opracować osadzony projekt.

Inną alternatywą do rozważenia jest platforma Arduino . Wykorzystuje uproszczoną wersję z Wiring języku, który jest jak C ++ bez obiektów lub nagłówków. Może działać na wielu układach AVR, zdecydowanie nie jest ograniczony do ich sprzętu. Zapewni to łatwiejszą krzywą uczenia się niż skakanie prosto do C.

Podsumowując,
Złoty Młot XKCD
tekst alternatywny: zajęło mi pięć prób znalezienia właściwej, ale w końcu udało mi się uratować naszą noc - jeśli nie łódkę - na końcu.

Kevin Vermeer
źródło
5
Jeden z moich ulubionych komiksów, które mi się podobały.
Kortuk,
1
Mmm, pomocnik. +1
tyblu,
Zastanawiam się, jak ta JVM wypada w porównaniu z „Java iButtons”, które były dostępne kilkadziesiąt lat temu?
supercat
@kevin „C Ściągawka” link nie działa! Proszę zaktualizować!
charansai
6

Najpopularniejszym środowiskiem programistycznym dla Atmel AVR jest Arduino . Język Arduino jest podzbiorem C ++.

„Szkice” / programy Arduino wydają się bardzo podobne do Java. Język Wiring, z którego wywodzi się Arduino, ma implementacje w C ++ ( Arduino ), Java ( Przetwarzanie ) i JavaScript ( przetwarzanie.js ).

Oba języki mają ten sam styl deklaracji, konstrukcje pętli i operatory arytmetyczne ze względu na ich wspólne pochodzenie w Algol68. Zazwyczaj wszystkie obiekty w Arduino są deklarowane globalnie lub na stosie, więc podobnie jak Java, funkcje składowe wywoływane są przez .operatora (np. LED.flash()).

Język będzie bardzo dobrze znany programistom Java - ale, co ważne, szkice Arduino są kompilowane w natywny kod, który działa z pełną prędkością i pełnym dostępem do sprzętu. Ma to kluczowe znaczenie dla jak najlepszego wykorzystania mikrokontrolera.

Oto API .

Arduino zapewnia wszystko, czego potrzebujesz: tani sprzęt, bezpłatne zintegrowane środowisko programistyczne i bootloader (dzięki czemu możesz ładować kod przez USB / szeregowy).

Toby Jaffey
źródło
3
Mówiąc ściślej, jest to (najprawdopodobniej) najpopularniejsze środowisko programistyczne wśród hobbystów, ale niekoniecznie we wszystkich programistach AVR.
pfyon
2
Twierdzę, że Arduino jest najpopularniejsze pod względem liczby użytkowników, ale nie liczby dostarczonych jednostek produktu zawierających oprogramowanie układowe Arduino. Istnieje wielu użytkowników Arduino
Toby Jaffey,
1
Chociaż „szkice” są kompilowane, szybkość dostępu IO można znacznie poprawić za pomocą C lub asemblera.
tyblu,
1
C ++ i Java wyglądają zupełnie inaczej. („Arduino” to po prostu C ++ z dziwaczną strukturą do ukrywania niektórych technicznych bitów.)
Nick T
2
@Jason S „Szkice” Arduino / programy wyglądają bardzo podobnie do Javy ”
Toby Jaffey,
4

Chcę wyjaśnić, że nie korzystałem z nich wcześniej, ale przed laty istniała nazwa Javelin. Możliwe, że Parallax je nabył lub coś takiego, ponieważ teraz pojawia się tylko „Pieczęć oszczepu”. Wiele lat temu istniała także firma Velocity Semiconductor, która (rzekomo) zastąpiła moduły podstawowe Rabbit Semiconductor i miała sprzętową maszynę JVM, ale ta firma najwyraźniej zniknęła. Powodzenia w wyszukiwaniu!

Dave
źródło
4

Firma Sun Microsystems tworzyła platformę o nazwie Sun Spot, która była zasadniczo wbudowaną platformą Java. Teraz oczywiście nie ma już Sun Microsystems (Oracle je kupił), ale wygląda na to, że nadal możesz kupić Sun Spots - http://www.sunspotworld.com/products/ . Nie przepadam za pomysłem używania Javy w środowisku osadzonym (zły poziom abstrakcji dla zadania imho), ale wydaje się, że jest to najbardziej naturalna platforma osadzona dla Javy. Zwróć uwagę na specyfikację tych rzeczy - są to wytrzymałe pamięci RAM 180 MHz / 512 kB i nie są tanie w cenie 400 USD za zestaw startowy.

Będę więc drugą lub trzecią osobą udzielającą odpowiedzi na pytanie Arduino. Istnieje jedna społeczność, która może cię wspierać, jeśli potrzebujesz pomocy. A jeśli potrzebujesz sprzętu peryferyjnego, poszukaj w Google „Arduino Shields” i daj się zaskoczyć - możesz zrobić wszystko, od sterowania serwosilnikami po przeskoczenie w sieci bezprzewodowej 802.11 z odpowiednią kombinacją osłon. Nauka języka C (wskaźnik mówi co !?) nie jest praktyczna, ale możesz zacząć pisać szkice Arduino w mgnieniu oka ... Możesz także uzyskać „prawdziwe” platformy Arduino za około 30 USD i klony (np. RBBB lub DorkBoard) za mniej niż 15 USD.

vicatcu
źródło
Ach tak, widziałem to w Maker Faire dwa lata temu! Całkiem fajne urządzenie.
Dave
Zabójczą funkcją SunSpots nie jest Java, ale wbudowane funkcje bezprzewodowe pozwalające im komunikować się ze sobą. Jeśli chcesz mieć świadomość siebie lub łatwą komunikację bezprzewodową z bazą domową, to bardzo, bardzo miło.
Thorbjørn Ravn Andersen
3

Paralaksa składa się o Javelin Stamp , CoM (Computer-on-Module), który obsługuje JVM.

Kosztuje 60 USD i wykonuje błyskawicznie ~ 8500 instrukcji Java / s.

Ponadto PCB jest różowe (Naprawdę!)

Connor Wolf
źródło
2

Systemy Ajile tworzą różnorodne wbudowane układy java w czasie rzeczywistym i płyty ewaluacyjne.

Prowadzą goły metal java. To bardzo przyjemne.

www.ajile.com tworzą żetony i ewaluacyjne tablice.

www.systronix.com sprzedaje różne wbudowane urządzenia Java.

Używałem AJ-100 od ajile do wymagającej pracy, są bardzo przyjemne w pracy. I nie, nie są tak tanie jak AVR, ale przetwarzają dane jak tanie pentium.

Układy Ajilesa reagują na przerwania (opóźnienie przerwania) w czasie krótszym niż 1 mikrosekunda.

Tim Williscroft
źródło
„nigdy nie rób tego we wbudowanym systemie C” ??? Co zrobić? Opóźnienie 1 uS? Wysoka prędkość? Ledwie. Myślę, że zapominasz DSP 1GHz +, dużo ARM i całkiem sporo innych. Wiele osób pisze o tym z czystym metalem C (bez systemu operacyjnego itp.). Przyznaję, że ten rodzaj rzeczy jest w połowie racjonalnym sposobem korzystania z Javy we wbudowanym (poza pełnym systemem operacyjnym Linux-a) ... chociaż po krótkim spojrzeniu na Systronix powiedziałbym, że wydaje się, że płacisz dobra premia za tę niewielką wygodę. Na pewno bym osadził ARM. Wiele linków do tych projektów poza Systronix jest martwych.
darron
Aha, i TINI jest szalenie głupi. JVM w ROM na 8051. Głupio próbowałem w jedną stronę, kiedy chciałem łatwego Ethernetu, a nawet w C sprawa była po prostu zatłoczona przez ruch rozgłoszeniowy normalnej korporacyjnej sieci LAN. Byłby to dobry produkt, gdyby sprzedawali go jak Stemple Basic Parallax, ale tak nie jest. Nie nadaje się do żadnych celów niezwiązanych z hobbystami.
darron
1
Te żetony działają przy kilkuset megahercach. Opóźnienie 1uS jest możliwe, gdy jest zaprogramowane w C na procesorze działającym 100 razy wolniej niż te urządzenia. Możesz robić całkiem fajne rzeczy (takie jak iPady i telefony Droid) za pomocą równoważnych procesorów, ale opublikowanie tego jako alternatywy dla 8-bitowego AVR w pytaniu nie jest prawie porównanie jabłek z jabłkami.
Kevin Vermeer
@reemrevnivek: Biorąc pod uwagę, że OP chciał Java, uważam, że część Ajile jest odpowiednia, ponieważ jest to jeden z niewielu rozsądnych sposobów uruchamiania wbudowanej Java (poza pełnym systemem operacyjnym Linux lub coś takiego). Gdyby nie było ostatniego akapitu i bitów TSTIK, głosowałbym nawet za nim.
darron
2

Moje osobiste doświadczenie jest takie, że kod C do programowania i rozpoczynania pracy z AVR jest dość łatwy, pochodzę również z wielu lat pracy w Javie, a po około 2 miesiącach używania szkiców arduino porzuciłem środowisko i wybrałem avr-gcc, strony jak avrfreaks ułatwiają znalezienie odpowiedzi na typowe problemy. (Nadal robię wszystko na moim zaufanym Arduino Duemillenove)

Używanie Eclipse do kompilacji i „wdrażania”, tj. Zapisu do układu, jest również miłe, ponieważ nie mam do czynienia z innym IDE

Myślę, że tak naprawdę trudniej jest ominąć rejestry, rejestry 16-bitowe i odczytać je w odpowiedniej kolejności, przerwań, timerów, sprzętowego PWM, niż sam język programowania.

wspinacz
źródło
1

Chociaż ogólnie należałbym do obozu „ucz się C i rozumiem, co faktycznie robią procesory”, jeśli chodzi o pracę osadzoną, warto zauważyć, że układ małego ramienia nie jest o wiele droższy niż AVR i jest prawie możliwy pozycja do obsługi prostych zadań na JVM.

Chris Stratton
źródło
1

NanoVM to wirtualna maszyna Java zaprojektowana do pracy na 8-bitowych mikrokontrolerach AVR.

(ze strony głównej)

To nie jest w pełni funkcjonalna Java VM i nigdy nią nie będzie. Zawsze będzie ograniczony do niewielkiego podzbioru języka Java i standardowych bibliotek Java oraz kilku metod specyficznych dla aplikacji. Co więcej, nie ma na celu zastąpienia C jako standardowego sposobu programowania mikrokontrolerów. Jest mniej elastyczny i ma niższą wydajność niż programy C lub asembler.

NanoVM to sposób na zapewnienie ograniczonego, ale kontrolowanego interfejsu programowania dla urządzenia opartego na mikrokontrolerze. Ponieważ większość kodu najbardziej specyficznego dla sprzętu jest częścią samego NanoVM, użytkownik może skupić się na samej aplikacji. Jeśli użytkownik otrzyma urządzenie wyposażone w NanoVM, nie musi myśleć o samym sprzęcie. Co więcej, nie potrzebuje on żadnych kompilatorów specyficznych dla celu itp. Potrzebuje tylko standardowego kompilatora Java i narzędzia NanoVMTool, które samo jest napisane w Javie. W ten sposób cały łańcuch programowania działa na dowolnym urządzeniu, które ma kompilator Java i może uruchamiać kod Java. Dzięki abstrakcji sprzętowej zapewnianej przez NanoVM użytkownik nie musi nawet przejmować się typem mikrokontrolera, na którym opiera się cel.

Toby Jaffey
źródło
1

To nie jest całkiem Java - ani 8 bitów, ale dostępny jest interpreter JavaScript dla mikrokontrolerów ARM o niskiej mocy, zwany Espruino .

Gordon Williams
źródło