Java na STM32: sposób na interfejsy GUI w systemach embedded

 

  • Brak RTOS – prosta integracja

Choć systemy operacyjne czasu rzeczywistego (RTOS) stają się coraz bardziej powszechne w 32-bitowych w mikrokontrolerach, wiele aplikacji nadal stosuje proste metody kolejkowania oparte na współpracy. Współpraca polega z reguły na istnieniu automatu, który po kolei wywołuje każde zadanie w określonym czasie. Zadanie musi zostać wykonane w określonym odcinku czasu, aby zapewnić spójność systemu. W takim przypadku maszyna wirtualna Javy musi być wywoływana podobnie, jak wszystkie inne zadania systemu i zwrócić sterowanie przed upływem określonego czasu. W tej sytuacji Java zajmująca się wyłącznie GUI może wykorzystać wielozadaniowość wirtualnego procesora, zachowując kolejność wykonania reszty aplikacji bez zmian, tak jak działała ona przed dodaniem interfejsu graficznego.

 

  • Integracja z systemem czasu rzeczywistego

Dodanie interfejsu do istniejącej aplikacji często wymaga też dodania prostego systemu czasu rzeczywistego. Zazwyczaj system jest wywłaszczający, aby zapewnić szybką reakcję na komendy użytkownika, nawet jeśli w tle są wykonywane inne zadania.

Najbardziej popularna metoda dodania maszyny wirtualnej Javy do istniejącego systemu nosi nazwę ”green threads”. Platforma Javy definiuje wielowątkowe środowisko dla całości Javy, które działa wewnątrz jednego zadania RTOS. Zużycie procesora przez Javę jest w pełni kontrolowane poprzez konfigurację zadania RTOS, co pozwala na prosty arbitraż na poziomie całej aplikacji. Maksymalne zużycie procesora przez Javę jest ustalone, niezależnie od ilości i aktywności poszczególnych wątków Javy (zwanych właśnie „green threads”).

 

Rys. 3. Integracja systemu czasu rzeczywistego i wątków Javy

 

  • Natywny interfejs

Istnieje kilka sposobów na połączenie Javy z C lub ASM w celu uzyskania dostępu do sterowników lub starego oprogramowania. Przyjrzyjmy się prostemu rozwiązaniu o nazwie SNI (ESR012, Simple native Interface). Inną opcją jest JNI, jednak ze względu na znaczną komplikację i zbędne w GUI funkcje, jak na przykład manipulacja obiektami, nie będziemy go omawiać.

 

Rys. 4. Zasady SNI

 

API rozwiązania SNI jest dość proste: umożliwia bezpośrednie wywołanie funkcji C z kody Javy i metod Javy z C. Argumenty typów takich, jak integer czy float mogą służyć do przekazywania danych. Poniżej znajduje się przykładowy kod Javy wywołujący kod C:

 

 

Rozwiązanie ST – STM32 Java SDK

  • Zintegrowane środowisko programistyczne STM32Java oparte na Eclipse

Zestaw narzędzi programistycznych STM32Java został oparty na SDK MicroEJ firmy I2ST, bazującym na środowisku Eclipse. Stanowi on kompletne środowisko programistyczne wspomagające tworzenie aplikacji wbudowanych Java. Daje projektantom możliwość tworzenia prototypów i testowania aplikacji w Javie na symulowanie platformie Java przed zaprogramowaniem ich na urządzeniu wbudowanym z użyciem platformy uruchomieniowej Javy.

 

  • Projektowanie na platformę wbudowaną Java dla mikrokontrolerów STM32F

Podstawowe kryteria, które decydują o wyborze platformy wbudowanej do projektowania interfejsu na układach z serii Cortex M, takich jak mikrokontrolery STM32F, są następujące:

ñ  Niskie zużycie pamięci Flash i RAM

ñ  Duża szybkość wykonywania

ñ  Łatwa integracja ze starym kodem (RTOS oraz oprogramowanie producenta)

Poniżej znajduje się przykład typowej platformy zoptymalizowanej pod kątem mikrokontrolerów STM32 opartych na rdzeniu Cortex-M3/M4. Zapewnia ona kompletną implementację bibliotek graficznych MicroUI oraz MWT. Szczegóły można znaleźć na stronie konsorcjum ESR w specyfikacjach ESR002 oraz ESR011.

 

Rys. 5. Wymagania pamięciowe platformy Java

 

  • Biblioteki ESR: MicroUI oraz MWT

Środowisko STM32Java zawiera dwie biblioteki graficzne Javy: MicroUI (Micro User Interface) oraz MWT (Micro Widget Toolkit). MicroUI obsługuje jeden lub kilka wyświetlaczy znakowych i/ lub punktowy wyświetlacz LCD (czarno-biały), typowe urządzenia w rodzaju wskaźników (dotykowe, wielodotykowe), mysz, przyciski, diody LED i dźwięk. Biblioteka MicroUI została silnie zoptymalizowana pod kątem zużycia procesora: odświeżanie wyświetlacza jest przycinane, gdy tylko wystąpi taka możliwość, zduplikowane zdarzenia są ignorowane, a odświeżanie LCD może zostać dopasowane do aktywności całej aplikacji.

Biblioteka MWT stanowi platformę wyższego poziomu w stosunku do MicroUI. Pozwala zarządzać graficznymi widżetami, kontenerami, wyglądami (layouts) i stylami. Stanowi ona podstawę do tworzenia konkretnych bibliotek widżetów GUI.

 

  • Narzędzia do projektowania interfejsu aplikacji

Front Panel Designer pozwala rozszerzyć symulator platformy Java o dodatki (mocks), które symulują wygląd urządzenia. Dodatek Front Panel może zawierać wyświetlacz LCD, interfejs dotykowy, diody, przyciski itp. Dzięki temu łatwo jest przeprowadzić symulację GUI w środowisku naśladującym prawdziwy sprzęt i sprawdzić wygodę użytkowania oraz renderowanie grafiki na wczesnym etapie projektowania.

Narzędzie Storyboard Designer pozwala szybko zdefiniować możliwe interakcje między człowiekiem a urządzeniem. Grafik ma możliwość zaprojektowania ekranów za pomocą narzędzi do obróbki bitmap. Następnie mogą one zostać zaimportowane do scenopisu (storyboard)  jako sekwencja obrazów. Scenopis jest konstruowany poprzez zdefiniowane możliwych interakcji powiązanym z obszarami na ekranie. Przykładowo, akcje typu kliknięcie, podwójne kliknięcie czy przeciągnięcie można powiązać z konkretnymi akcjami wyświetlanymi w drugim oknie. Tak utworzony konspekt można umieścić w symulatorze (korzystającym z panelu głównego dla zwiększenia realizmu) oraz wyeksportować do urządzenia docelowego.

Aplikacja Font Designer pozwala na projektowanie fontów na różne sposoby: znaki mogą być tworzone od zera lub importowane ze standardowych plików (bitmapy, true-type). Gdy ich wygląd zostanie już określony na poziomie pojedynczych pikseli, można je następnie zgrupować w tablice zgodne ze standardem Unicode. Jest dostępnych kilka funkcji, które pozwalają zoptymalizować wykorzystanie znaków zgodnie z ich faktycznym występowaniem w tekście aplikacji wbudowanej. Dzięki temu można zaoszczędzić miejsce w pamięci zarezerwowane na fonty.

 

Podsumowanie

Technologia Java jest znana jako praktyczne rozwiązanie w przypadku projektowania graficznego interfejsu użytkownika. Java zawiera zarówno cechy języka zorientowanego obiektowo, jak i wirtualny procesor oferujący zaawansowane mechanizmy obsługi zróżnicowanych programów i architektury sterowanej zdarzeniami.

Platformy Java zoptymalizowane pod kątem układów z rdzeniem ARM Cortex-M, takich jak mikrokontrolery STM32F, zajmują niewiele pamięci i cechują się dużą szybkością wykonania dzięki swojej architekturze. Platformy te pozwalają na symulację w celu stworzenia prototypu i testowania GUI. Pozwalają też na łatwą integrację starego kodu w C, takiego jak systemy czasu rzeczywistego i biblioteki. Dzięki temu możliwa jest prosta migracja na bardziej zaawansowane języki w celu realizacji GUI. Przenośność na wiele platform sprzętowych i programowych sprawia, że projektanci mogą skupić się na tworzeniu interfejsu i przenieść go na praktycznie dowolne urządzenie, w tym najprostsze działające na systemie RTOS lub Linux oraz zaawansowane urządzenia z systemem IOS czy Android.

Regis Latawiec, IS2T

O autorze