[1] JAVA i STM32 – ekspresowy kurs programowania z MicroEJ
Uwaga! Wszystkie opublikowane odcinki kursu są dostępne pod >>> adresem.
Nie wierzcie mitom: mikrokontrolery STM32 są doskonałą platformą sprzętową dla programistów lubiących Javę! Jak przekonacie się śledząc nasz kurs, długie czekanie na odpowiedź po pytaniu „Kto tam?” nie dotyczy rozwiązań bazujących na środowisku firmy IS2T…
Od redakcji: na początek wyjaśnienie wstępu dla osób, które nie znają starego dowcipu na temat Javy: pierwsze rozwiązania bazujące na pomyśle interpretacji prekompilowanych programów napisanych w tym języku przez specjalny interpreter, zwany wirtualną maszyną Javy, miały wspólną wadę – były bardzo powolne. Tę powolność komentował popularny dowcip:
Puk puk.
– Kto tam?
(długa cisza)
– Java.
Puk puk.
– Kto tam?
– C++.
Puk puk.
– Assembler.
Programy pisane w Javie nadal nie są oczywiście tak szybkie, jak pisane w asemblerze, ale nie są tak powolne, jak sugeruje cytowany dowcip. Zyskujemy za to wygodę programowania i dostęp do wielu gotowych funkcji, dzięki którym oszczędzamy czas i zwiększamy niezawodność oraz stabilność działania aplikacji. Warto spróbować!
Świat mikrokontrolerów nieustannie ewoluuje, zmiany dotyczą nie tylko sprzętu, ale też programowania i dostępnych narzędzi. Mikrokontrolery 32-bitowe z rdzeniami Cortex-M znajdują się już w ofercie wszystkich czołowych producentów i skutecznie konkurują z architekturami 8-bitowymi pod względem ceny i możliwości. Programiści systemów wbudowanych mają co raz więcej narzędzi – zarówno płatnych, jak i darmowych, dzięki którym ich praca staje się bardziej efektywna, a oprogramowanie może powstawać znacznie szybciej. Obecnie nikogo nie powinny już dziwić serwery webowe i aplikacje wyposażone w bogate, graficzne interfejsy użytkownika działające nawet na najprostszych i najtańszych mikroprocesorach. 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 MicroEJ, czyli zestawu narzędzi umożliwiających połączenie języków Java i C w mikrokontrolerach rodziny STM32.
1. Środowisko programistyczne
MicroEJ 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.
Rys. 1. Schemat blokowy platformy (JPF)
Aplikacje podzielone są na dwie warstwy. Pierwsza z nich, oznaczona w MicroEJ jako BSP, 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). W warstwie tej mogą być użyte biblioteki peryferii dostarczane przez ST, a kod jest w dużej części generowany automatycznie. Do jej kompilacji możemy użyć jednego z popularnych narzędzi: Keil, IAR, GCC.
Wyższa warstwa obejmuje główną aplikację napisaną w Javie, działającą na maszynie wirtualnej (JVM) stworzonej przez firmę IS2T. Jest ona częścią tzw. platformy (JPF – rysunek 1) zawierającej również biblioteki standardowe, matematyczne, graficzne oraz komunikacyjne. Platforma ta wymaga zaledwie 28 kB pamięci Flash i mniej niż 1,5 kB pamięci RAM. Praca z aplikacjami Javy odbywa się w opartym o Eclipse’a środowisku MicroEJ (rysunek 2).
Rys. 2. Okno główne środowiska MicroEJ
Zaletą takiego podejścia jest wyraźna separacja niskopoziomowej warstwy sterowników od logiki i warstwy graficznej wyższego poziomu. Poza tym, pisząc nowe aplikacje można wykorzystać stary kod napisany zarówno w Javie, jak i w C. Implementacja maszyny wirtualnej 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 generowany jest 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 przygotowanej platformie.
Obie warstwy mogą się ze sobą komunikować za pomocą mechanizmów SNI (Simple Native Interface) oraz SP (Shielded Plug).Umożliwiają one wywoływanie funkcji zaimplementowanych w C z poziomu aplikacji Javy, a także asynchroniczne przesyłanie danych pomiędzy warstwami.
2. MicroEJ IDE
Środowisko w którym powstaje kod Javy ma do zaoferowania kilka przydatnych narzędzi. Pierwszym z nich jest symulator kodu Javy na PC bez użycia dodatkowego sprzętu (Rys. 3). Symulacje można przeprowadzać dla kilku dostępnych zestawów ewaluacyjnych, a także definiowanych przez siebie układów zawierających wyświetlacze graficzne, przyciski, diody LED oraz inne peryferia. Symulator umożliwia sprawdzenie logiki aplikacji, protokołów komunikacyjnych (m.in. WiFi, USB) oraj interfejsu graficznego. Pozwala to na testowanie i debugowanie aplikacji bez konieczności programowania mikrokontrolera.
Rys. 3. Środowisko MicroEJ oferuje możliwość symulacji aplikacji na różnych zestawach ewaluacyjnych
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 (rysunek 3), 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 Memory Map Analyzer