JAVA dla mikrokontrolerów STM32 – zobacz jakie to wygodne

Obecnie nikogo nie dziwią już serwery webowe i aplikacje wyposażone w bogate, graficzne interfejsy użytkownika działające na mikrokontrolerach. W przenoszeniu aplikacji między platformami pomagają coraz liczniejsze systemy operacyjne, a współczesne kompilatory pozwoliły na zastąpienie asemblera językiem C, a nawet językami obiektowymi, jak Java czy C++. Właśnie w tym kierunku podążyła firma IS2T dostarczając Butterfly OS, czyli zestaw narzędzi umożliwiających połączenie języków Java i C w mikrokontrolerach rodziny STM32.

Butterfly OS zapewnia szereg narzędzi programistycznych oraz bibliotek ułatwiających tworzenie złożonych aplikacji dla systemów wbudowanych opartych na mikrokontrolerach rodziny STM32. Wśród nich wymienić warto biblioteki do komunikacji (m.in. WiFi, Bluetooth, USB, itp.), biblioteki i narzędzia wspomagające tworzenie zaawansowanych interfejsów użytkownika opartych o wyświetlacze graficzne, panele dotykowe i przyciski, a także biblioteki matematyczne wspomagające obliczenia.

Aplikacje podzielone są na dwie warstwy. Pierwsza z nich napisana jest w języku C i obejmuje sterowniki peryferii i urządzeń zewnętrznych, obsługę przerwań oraz opcjonalny system czasu rzeczywistego (obsługiwane są między innymi FreeRTOS, RTX, µc/OS). Wyższa warstwa obejmuje wspomniane biblioteki i główną aplikację napisaną w Javie, działającą na maszynie wirtualnej stworzonej przez firmę IS2T.

Do uruchomienia aplikacji napisanej w Javie niezbędna jest maszyna wirtualna (JVM). Stanowi ona środowisko uruchomieniowe w którym działają aplikacje kompilowane do odpowiedniego kodu bajtowego. Dzięki takiemu rozwiązaniu aplikacje napisane w tym języku mogą być uruchamiane na każdym urządzeniu z zainstalowaną maszyną wirtualną. Niestety wymagania sprzętowe oficjalnej JVM dostarczanej przez Oracle przekraczają możliwości prostych mikrokontrolerów. Programiści z firmy IS2T znaleźli na to sposób implementując własną maszynę wirtualną Javy.

Rys. 1. Schemat blokowy środowiska MicroEJ firmy IS2T

Platforma dostarczana przez IS2T wymaga do działania zaledwie 28 kB pamięci Flash i 1 kB pamięci RAM. Zawiera maszynę wirtualną, biblioteki standardowe, matematyczne, graficzne oraz komunikacyjne. Schemat blokowy platformy przedstawiono na rysunku 1.

Ogromną zaletą platformy MicroEJ jest jej dostępność dla wielu różnych architektur, systemów operacyjnych (w tym Linuksa, Androida i kilku systemów czasu rzeczywistego) i kompilatorów, zarówno płatnych (Keil/ARM, IAR), jak i darmowego GCC. Dzięki temu raz napisane aplikacje mogą być uruchamiane na wielu urządzeniach, co gwarantuje pełną elastyczność w tworzeniu oprogramowania i zapewnia komfort pracy programistom systemów embedded zbliżony do pracy nad aplikacjami wysokopoziomowymi. Listę wspieranych systemów można znaleźć na stronie producenta http://www.is2t.com/products/specifications.

Pisząc nowe aplikacje można wykorzystać stary kod napisany w Javie. Implementacja MicroEJ jest zgodna z J2SE i zawiera podstawowe biblioteki: java.io, java.lang, java.util, java.lang.annotation, java.lang.ref oraz java.lang.reflect, natomiast kod bajtowy jest generowany przy użyciu standardowego kompilatora Javy. Oczywistym ograniczeniem są zasoby użytego mikrokontrolera, przez co nie każda aplikacja przygotowana dla komputerów PC będzie mogła być uruchomiona na platformie MicroEJ.

Pomimo tego, że programowanie aplikacji odbywa się głównie w języku Java, nic nie stoi na przeszkodzie aby włączyć do projektu wcześniej napisany kod C. W języku tym są także napisane niskopoziomowe sterowniki urządzeń i kod specyficzny dla mikrokontrolera. Dołączanie kodu C jest możliwe dzięki bibliotece SNI (Simple Native Interface), która jest odpowiednikiem JNI (Java Native Interface) dostępnej w standardowej maszynie wirtualnej Java znanej z komputerów PC. Mogłoby się wydawać, że aplikacje napisane w C będą działać znacznie szybciej, jednakże producent MicroEJ zapewnia, że wydajność programów napisanych w obu językach jest porównywalna.

Jako przykład można podać aplikację graficzną z odświeżaniem 50 fps na wyświetlaczu 480×272 z 32-bitową głębią kolorów wykorzystującą tylko 20% mocy obliczeniowej mikrokontrolera STM32F429NIH6.

Aplikacje napisane w Javie mogą korzystać z udogodnień znanych z programowania wysokopoziomowego, takich jak dynamiczna alokacja pamięci, automatyczne zwalnianie zasobów (garbage collection) i pełne wsparcie języka dla programowania obiektowego. Programiści tworzący aplikacje z graficznym interfejsem użytkownika z pewnością docenią możliwości biblioteki graficznej z obsługą ekranów, paneli dotykowych, a także czcionek i tłumaczeń.

Firma IS2T oferuje środowisko programistyczne dla aplikacji pisanych na platformę MicroEJ (o tej samej nazwie). Jest ono zbudowane na popularnym i darmowym IDE – Eclipse (rysunek 2).

Rys. 2. Widok głównego okna środowiska MicroEJ (Eclipse)

Środowisko to umożliwia pisanie i kompilację kodu Javy oraz przygotowanie platformy MicroEJ. Niestety na chwilę obecną nie jest możliwa kompilacja kodu C. Do tego celu należy użyć zewnętrznego kompilatora, niedostarczanego przez IS2T. Na szczęście możliwe jest wygenerowanie plików projektu dla kilku środowisk (m.in. uVision, TrueStudio), dzięki czemu pracę z kodem C można rozpocząć bez konieczności konfigurowania kolejnego projektu. Wsparcie dla GCC umożliwia także pracę z otwartymi toolchainami (np. GNU Tools for ARM + OpenOCD). Istotną informacją może być także dostępność MicroEJ zarówno dla systemu Linux, jak i Windows. Informacje o instalacji dla poszczególnych systemów znaleźć można na stronie IS2T.

 

Rys. 3. Okno symulatora zestawu STM32F429I-DISCO

Jedną z najciekawszych cech środowiska MicroEJ jest możliwość symulacji kodu Javy na PC bez użycia sprzętu. Symulacje można przeprowadzać dla kilku popularnych zestawów ewaluacyjnych, w tym także taniego zestawu STM32F429I-DISCO (rysunek 3), a także definiowanych przez siebie układów zawierających wyświetlacze graficzne, przyciski, diody LED oraz inne peryferia. Pozwala to na testowanie i debugowanie aplikacji bez konieczności programowania mikrokontrolera.

Warto również wspomnieć o przygotowanych platformach MicroEJ z opcją KickStart. Umożliwiają tworzenie aplikacji w Javie i ich uruchamianie na wybranych zestawach ewaluacyjnych bez potrzeby użycia kompilatora C i dodatkowego oprogramowania, poza środowiskiem MicroEJ. W tym przypadku używany jest kompilator Javy i linker stworzony przez IS2T, dzięki któremu możliwe jest uruchomienie aplikacji na maszynie wirtualnej.

Środowisko MicroEJ zawiera także narzędzia, które mogą być szczególnie pomocne przy testowaniu aplikacji. Pierwszym z nich jest Memory Map Analyzer, dzięki któremu można sprawdzić wykorzystanie pamięci RAM oraz Flash przez poszczególne komponenty platformy MicroEJ, aplikacje użytkownika oraz wykorzystane w nich obiekty (rysunek 4).

Rys. 4. Okno narzędzia Memory Map Analizer

Kolejnym narzędziem jest Stack Trace Descriptor przydatny przy odczytywaniu komunikatów błędów zwracanych przez wyjątki w maszynie wirtualnej. Trzecim narzędziem jest Code Coverage Analyzer, który umożliwia sprawdzenie częstości wykonywania poszczególnych kawałków kodu. Heap Dumper z kolei pozwala na zapisywanie chwilowego stanu sterty, w której znajdują się zaalokowane obiekty. Narzędzie to pomaga w wyszukiwaniu wycieków pamięci, przeglądaniu stanu obiektów i optymalizowaniu wykorzystania sterty aplikacji. Ostatnim z opisanych narzędzi jest Test Suite. Umożliwia ono sprawdzanie poprawności aplikacji udostępniając mechanizmy przeprowadzania testów jednostkowych i generując raporty do analizy błędów. Dalsze plany obejmują także kreator GUI dla osób które nie programują na co dzień w Javie, a zajmują się graficzną stroną aplikacji.

Cena rocznej licencji prezentowanego środowiska wynosi ok. 2000 EUR dla mikrokontrolerów produkowanych przez STMicroelectronics, w cenie jest wsparcie techniczne ze strony producenta.

Dodatkowo należy liczyć się z kosztami użycia platformy MicroEJ na każdym urządzeniu. Dla mikrokontrolerów produkowanych przez STMicroelectronics opłata ta wynosi ok. 15% ceny mikrokontrolera i jest już wliczona w cenę układów z sufiksem w oznaczeniu J lub U (np. STM32F072RBTJ).

Możliwość pisania aplikacji na mikrokontrolery w Javie niesie ze sobą wiele korzyści płynących zarówno z możliwości samego języka, jak i dostępnych narzędzi. Java jest językiem czysto obiektowym, a przy tym stosunkowo prostym. Warto więc przyswoić sobie jego podstawy, aby czerpać korzyści z jego użycia, zwłaszcza w aplikacjach graficznych. Dostępność licznych bibliotek w środowisku MicroEJ znacznie przyspiesza produkcję oprogramowania i udostępnia wiele narzędzi wspomagających testowanie i debugowanie aplikacji. Niezaprzeczalną korzyścią jest możliwość tworzenia oprogramowania niezależnego od sprzętu, które dodatkowo można testować w symulatorze.

Środowisko oferowane przez firmę IS2T wymaga użycia dodatkowego oprogramowania do kompilacji kodu napisanego w C. Konieczne jest więc posiadanie kompilatora C – płatnego (Keil, IAR) lub darmowego (GCC). W pierwszym przypadku podnosi to koszty projektu, w drugim wymaga pracy związanej z konfiguracją środowiska. Na szczęście, jak zapewniają twórcy MicroEJ, niebawem pojawi się wersja środowiska z obsługą kompilacji C, dzięki czemu cały projekt będzie można wykonać w obrębie jednego IDE.

Środowisko MicroEJ nie wspiera póki co debugowania aplikacji na platformie docelowej. Mimo, że symulator daje ogromne możliwości i wygodę testowania, nie ma możliwość sprawdzenia jak kod zachowuje się w rzeczywistych warunkach. Autorzy MicroEJ zapewniają jednak, że środowisko w przyszłości będzie wspierać standard JTAG, co umożliwi swobodne debugowanie kodu także na mikrokontrolerach.

Krzysztof Chojnowski

W Polsce dystrybutorem środowiska MicroEJ jest firma Masters (http://www.masters.com.pl/).

Autor: