logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Uruchamianie aplikacji linuxowych na mikrokontrolerach STM32

ghost666 09 Gru 2021 15:53 1842 5
  • Uruchamianie aplikacji linuxowych na mikrokontrolerach STM32
    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ę:

    ./qvfb -width 480 -height 272 -nocursor


    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:

    ./configure -opensource -confirm-license -debug \
                -embedded -qt-gfx-qvfb -qvfb \
                -no-javascript-jit -no-script -no-scripttools \
                -no-qt3support -no-webkit -nomake demos -nomake examples


    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:

    ./examples/animation/animatedtiles/animatedtiles -qws -display QVFb: 0


    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).

    $ valgrind --tool = massif --massif-out-file = animatedtiles.massif. / examples / animation / animatedtiles / animatedtiles -qws -fullscreen
    $ ms_print animatedtiles.massif> animatedtiles.out


    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):

    $. / 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.out


    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/

    Fajne? Ranking DIY
    O autorze
    ghost666
    Tłumacz Redaktor
    Offline 
    Fizyk z wykształcenia. Po zrobieniu doktoratu i dwóch latach pracy na uczelni, przeszedł do sektora prywatnego, gdzie zajmuje się projektowaniem urządzeń elektronicznych i programowaniem. Od 2003 roku na forum Elektroda.pl, od 2008 roku członek zespołu redakcyjnego.
    https://twitter.com/Moonstreet_Labs
    ghost666 napisał 11960 postów o ocenie 10197, pomógł 157 razy. Mieszka w mieście Warszawa. Jest z nami od 2003 roku.
  • #2 19755330
    coberr
    Poziom 20  
    ghost666 napisał:
    Okazało się, że ta aplikacja potrzebuje sterty o wielkości około 2,7MB

    nie no panie GHOST666 - tu już żes pan przegiął paleczkę...
    sterty... nie no proszę...
  • #3 19755643
    knivre
    Poziom 14  
    coberr napisał:
    nie no panie GHOST666 - tu już żes pan przegiął paleczkę...
    sterty... nie no proszę...


    ale o co chodzi? To jest poprawnie

    Cytat:
    And found out that the application needed a heap size of about 2.7 MB heap size.
  • #5 19756899
    ghost666
    Tłumacz Redaktor
    coberr napisał:
    im chodziło o "stos" :)



    Ależ nie, im chodziło o stertę. Stos i sterta to dwie różne rzeczy

    https://pl.m.wikipedia.org/wiki/Stos_(informatyka)
    https://pl.m.wikipedia.org/wiki/Sterta_(informatyka)
  • #6 19757152
    coberr
    Poziom 20  
    kuźwa - czego to informatyczne ameby nie wymyślą - w takim razie ja sie musze chyba douczyć:) (słowo "heap" tez definiowane może być jako stos)
REKLAMA