Od systemów wbudowanych do inteligentnych produktów oczekuje się coraz większej funkcjonalności. Można to łatwo osiągnąć dzięki Linuksowi, który oferuje oprogramowanie do wszechstronnego zastosowania. Jednakże Linux wymaga dość dużych zasobów sprzętowych, w szczególności pamięci, więc platforma docelowa będzie zazwyczaj dość droga i może charakteryzować się dużym zużyciem energii. Z drugiej strony nowoczesne mikrokontrolery (MCU) mają sporo zasobów, które wystarczają do wielu inteligentnych zadań. Korzystając z systemu operacyjnego czasu rzeczywistego (RTOS), takiego jak Embox RTOS umożliwiającego zastosowanie oprogramowania Linux wszędzie, w tym wraz z mikrokontrolerami, programiści mogą łatwiej tworzyć inteligentne urządzenia, które są tańsze i zużywają mniej energii.
W poniższym artykule omówione zostanie postępowanie mające na celu uruchomienie podstawowej aplikacji Qt na wbudowanym mikrokontrolerze z systemem Embox RTOS. Używamy dwóch jednordzeniowych płytek opartych na układach z rdzeniem ARM Cortex-M7 (zegar 216 MHz): STM32F746g-Discovery i STM32F769i-Discovery. Oba wyposażone są w ekrany dotykowe o rozdzielczości odpowiednio: 480 × 272 oraz 800 × 480.
Możliwe jest uruchomienie standardowego przykładu Qt pod nazwą: „moveblocks” na STM32F746-Discovery. Można, jednak pójść dalej i zainicjować motyw wraz z ekranem dotykowym, wybierając inny standardowy przykład: „animatedtiles”. To dość ładny motyw, który prezentuje się fajnie, nawet na komputerach stacjonarnych — jest interaktywny, dzięki czemu można użyć ekranu dotykowego, a także wygląda jak animacja 3D.
Autorzy artykułu chcieli się dowiedzieć, czy mikrokontroler z rodziny STM32 może zapewnić wystarczającą wydajność obliczeniową do uruchomienia tego rodzaju aplikacji. „Nie byliśmy pewni, czy szybkość tego mikrokontrolera będzie należyta, aby ta scena renderowania była płynna, ponieważ, jak się dowiedzieliśmy, nawet odświeżanie ekranu w przypadku wyświetlacza 800 × 480 jest kosztowną obliczeniowo operacją” — piszą autorzy.
Budowa aplikacji
Przede wszystkim aplikacja zbudowana zostanie jako część Embox. Najprostszym sposobem na to jest stworzenie aplikacji dla QEMU, który jest emulatorem typu open-source. Korzystanie z QEMU oznacza, że nie musimy w tym przypadku dbać o zużycie pamięci. Pomoże nam to w upewnieniu się, że wszystkie niezbędne komponenty są dostępne. Po uruchomieniu: „animatedtiles” na QEMU z łatwością dodamy niezbędne składowe do plików konfiguracyjnych dla układu STM32.
Pierwsze uruchomienie na płytce docelowej
Pomyślnie uruchomiono: „animatedtiles” na płytce docelowej STM32F746G-Discovery, jednakże zauważono, że ekran został wyrenderowany tylko w górnej połowie. Oczywiście można by próbować rozwiązać ten problem poprzez natychmiastowe debugowanie na płycie, ale jest prostszy sposób — można najpierw uruchomić i debugować przykład w środowisku Linux.
Debugowanie na hoście
Aby uruchomić ten przykład i debugować aplikację potrzebna jest jedynie sama biblioteka Qt, a także QVFB, która jest aplikacją Qt i udostępnia wirtualny ekran. Możliwe jest zbudowanie QVFB zgodnie z opisem w oficjalnej dokumentacji. A następnie uruchomienie QVFB z wymaganą rozdzielczością ekranu (480 × 272 dla STM32F746G-Discovery). Wystarczy wydać komendę:
Powinno być możliwe, także zbudowanie biblioteki Qt z osadzonym profilem, a mianowicie z opcją: „-embedded”. Metoda ta jest przeznaczona do uruchamiania Qt bez X11 lub istniejących środowisk graficznych, zamiast tego zostanie użyty QWS (Qt Windowing System). Wyłączone są również inne niepotrzebne opcje i moduły. Wynikowy wiersz konfiguracji jest następujący:
Na koniec zbudujemy i uruchomimy: „animatedtiles”. Etap tworzenia jest taki sam jak dla Qt (qmake; make;). Podczas inicjowania aplikacji należy określić QVFB jako wyświetlacz:
W ten sposób widzimy to samo zdjęcie ponownie tylko w górnej połowie ekranu. W kodzie źródłowym (examples/animation/animatedtiles/main.cpp) można zauważyć, że aplikacja zaczyna się od: „view-> show()”, co oznacza, że nie jest w trybie pełnoekranowym. Sugeruje to, że aplikacja nie pracuje w trybie pełnoekranowym, dlatego wystarczy odrobinę zmodyfikować kod: „animatedtiles”, dodając opcję: „-fullscreen”.
Uruchamianie na STM32F746-Discovery
Aplikacja została zmodyfikowana i zbudowana ponownie w Embox celem sprawdzenia, czy pomyślnie działa na QEMU. Jednak, kiedy zainicjowano aplikację na docelowej płytce otrzymaliśmy błąd: „Brak pamięci”. Oznacza to, że rozmiar sterty w naszej konfiguracji nie jest wystarczający dla tej aplikacji. Wykorzystano zaawansowane narzędzia programistyczne w systemie Linux, aby rozwiązać problem, tj. oszacować wymagany rozmiar sterty. W pierwszej kolejności zastosowano aplikację Valgrind, czyli narzędzie do debugowania i badania zużycia pamięci, Massif to profiler sterty (i jest częścią Valgrind).
Okazało się, że ta aplikacja potrzebuje sterty o wielkości około 2,7MB. Po ustawieniu rozmiaru na 3MB w konfiguracji Embox i ponownym uruchomieniu programu wszystko działało z powodzeniem w trybie pełnoekranowym.
Uruchomienie na STM32F769I-Discovery
Wypróbowano też aplikację na podobnej płytce, ale z większym wyświetlaczem. W tym przykładzie użyto modułu STM32F769I-Discovery z rozdzielczością wyświetlania 800 × 480. W danym ujęciu wymaga on prawie 1MB tylko dla bufora ramki w trybie kolorowym (16-bitowy kolor -800 x 480 x 2 = 768000), jednak na samej płytce jest wystarczająco dużo (16MB) zewnętrznej pamięci SDRAM, toteż nie stanowi to problemu.
Uruchomiono QVFb z nową rozdzielczością (800 × 480):
I użyto Valgrind jak poprzednio, aby oszacować wymaganą wielkość sterty:
Okazało się, że aplikacja potrzebuje około 6MB. Skonfigurowano rozmiar sterty pod 6MB i pomyślnie uruchomiono: „animatedtiles” na płytce STM32F769I.
Źródło: https://www.embedded.com/running-a-linux-application-on-stm32-mcus/
W poniższym artykule omówione zostanie postępowanie mające na celu uruchomienie podstawowej aplikacji Qt na wbudowanym mikrokontrolerze z systemem Embox RTOS. Używamy dwóch jednordzeniowych płytek opartych na układach z rdzeniem ARM Cortex-M7 (zegar 216 MHz): STM32F746g-Discovery i STM32F769i-Discovery. Oba wyposażone są w ekrany dotykowe o rozdzielczości odpowiednio: 480 × 272 oraz 800 × 480.
Możliwe jest uruchomienie standardowego przykładu Qt pod nazwą: „moveblocks” na STM32F746-Discovery. Można, jednak pójść dalej i zainicjować motyw wraz z ekranem dotykowym, wybierając inny standardowy przykład: „animatedtiles”. To dość ładny motyw, który prezentuje się fajnie, nawet na komputerach stacjonarnych — jest interaktywny, dzięki czemu można użyć ekranu dotykowego, a także wygląda jak animacja 3D.
Autorzy artykułu chcieli się dowiedzieć, czy mikrokontroler z rodziny STM32 może zapewnić wystarczającą wydajność obliczeniową do uruchomienia tego rodzaju aplikacji. „Nie byliśmy pewni, czy szybkość tego mikrokontrolera będzie należyta, aby ta scena renderowania była płynna, ponieważ, jak się dowiedzieliśmy, nawet odświeżanie ekranu w przypadku wyświetlacza 800 × 480 jest kosztowną obliczeniowo operacją” — piszą autorzy.
Budowa aplikacji
Przede wszystkim aplikacja zbudowana zostanie jako część Embox. Najprostszym sposobem na to jest stworzenie aplikacji dla QEMU, który jest emulatorem typu open-source. Korzystanie z QEMU oznacza, że nie musimy w tym przypadku dbać o zużycie pamięci. Pomoże nam to w upewnieniu się, że wszystkie niezbędne komponenty są dostępne. Po uruchomieniu: „animatedtiles” na QEMU z łatwością dodamy niezbędne składowe do plików konfiguracyjnych dla układu STM32.
Pierwsze uruchomienie na płytce docelowej
Pomyślnie uruchomiono: „animatedtiles” na płytce docelowej STM32F746G-Discovery, jednakże zauważono, że ekran został wyrenderowany tylko w górnej połowie. Oczywiście można by próbować rozwiązać ten problem poprzez natychmiastowe debugowanie na płycie, ale jest prostszy sposób — można najpierw uruchomić i debugować przykład w środowisku Linux.
Debugowanie na hoście
Aby uruchomić ten przykład i debugować aplikację potrzebna jest jedynie sama biblioteka Qt, a także QVFB, która jest aplikacją Qt i udostępnia wirtualny ekran. Możliwe jest zbudowanie QVFB zgodnie z opisem w oficjalnej dokumentacji. A następnie uruchomienie QVFB z wymaganą rozdzielczością ekranu (480 × 272 dla STM32F746G-Discovery). Wystarczy wydać komendę:
./qvfb -width 480 -height 272 -nocursorPowinno być możliwe, także zbudowanie biblioteki Qt z osadzonym profilem, a mianowicie z opcją: „-embedded”. Metoda ta jest przeznaczona do uruchamiania Qt bez X11 lub istniejących środowisk graficznych, zamiast tego zostanie użyty QWS (Qt Windowing System). Wyłączone są również inne niepotrzebne opcje i moduły. Wynikowy wiersz konfiguracji jest następujący:
./configure -opensource -confirm-license -debug \
-embedded -qt-gfx-qvfb -qvfb \
-no-javascript-jit -no-script -no-scripttools \
-no-qt3support -no-webkit -nomake demos -nomake examplesNa koniec zbudujemy i uruchomimy: „animatedtiles”. Etap tworzenia jest taki sam jak dla Qt (qmake; make;). Podczas inicjowania aplikacji należy określić QVFB jako wyświetlacz:
./examples/animation/animatedtiles/animatedtiles -qws -display QVFb: 0W ten sposób widzimy to samo zdjęcie ponownie tylko w górnej połowie ekranu. W kodzie źródłowym (examples/animation/animatedtiles/main.cpp) można zauważyć, że aplikacja zaczyna się od: „view-> show()”, co oznacza, że nie jest w trybie pełnoekranowym. Sugeruje to, że aplikacja nie pracuje w trybie pełnoekranowym, dlatego wystarczy odrobinę zmodyfikować kod: „animatedtiles”, dodając opcję: „-fullscreen”.
Uruchamianie na STM32F746-Discovery
Aplikacja została zmodyfikowana i zbudowana ponownie w Embox celem sprawdzenia, czy pomyślnie działa na QEMU. Jednak, kiedy zainicjowano aplikację na docelowej płytce otrzymaliśmy błąd: „Brak pamięci”. Oznacza to, że rozmiar sterty w naszej konfiguracji nie jest wystarczający dla tej aplikacji. Wykorzystano zaawansowane narzędzia programistyczne w systemie Linux, aby rozwiązać problem, tj. oszacować wymagany rozmiar sterty. W pierwszej kolejności zastosowano aplikację Valgrind, czyli narzędzie do debugowania i badania zużycia pamięci, Massif to profiler sterty (i jest częścią Valgrind).
$ valgrind --tool = massif --massif-out-file = animatedtiles.massif. / examples / animation / animatedtiles / animatedtiles -qws -fullscreen
$ ms_print animatedtiles.massif> animatedtiles.outOkazało się, że ta aplikacja potrzebuje sterty o wielkości około 2,7MB. Po ustawieniu rozmiaru na 3MB w konfiguracji Embox i ponownym uruchomieniu programu wszystko działało z powodzeniem w trybie pełnoekranowym.
Uruchomienie na STM32F769I-Discovery
Wypróbowano też aplikację na podobnej płytce, ale z większym wyświetlaczem. W tym przykładzie użyto modułu STM32F769I-Discovery z rozdzielczością wyświetlania 800 × 480. W danym ujęciu wymaga on prawie 1MB tylko dla bufora ramki w trybie kolorowym (16-bitowy kolor -800 x 480 x 2 = 768000), jednak na samej płytce jest wystarczająco dużo (16MB) zewnętrznej pamięci SDRAM, toteż nie stanowi to problemu.
Uruchomiono QVFb z nową rozdzielczością (800 × 480):
$. / qvfb -width 800 -height 480 -nocursor &I użyto Valgrind jak poprzednio, aby oszacować wymaganą wielkość sterty:
$ valgrind --tool = massif --massif-out-file = animatedtiles.massif. / examples / animation / animatedtiles / animatedtiles -qws -fullscreen
$ ms_print animatedtiles.massif> animatedtiles.outOkazało się, że aplikacja potrzebuje około 6MB. Skonfigurowano rozmiar sterty pod 6MB i pomyślnie uruchomiono: „animatedtiles” na płytce STM32F769I.
Źródło: https://www.embedded.com/running-a-linux-application-on-stm32-mcus/
Fajne? Ranking DIY
