Strona 1 z 1

Kompilacja programu dla samemu przygotowanego systemu

: 22 cze 2019, 16:41
autor: elvis
Jakoś czas temu opisałem jak za pomocą Yocto można przygotować własny obraz systemu (viewtopic.php?f=74&t=514).
Taki obraz jest dużo mniejszy i wydajniejszy niż gotowa dystrybucja, jednak brakuje w nim najważniejszego - własnej aplikacji.
Postaram się krótko i prosto opisać, jak wykorzystać Yocto do przygotowania SDK, czyli zestawu wszystkich niezbędnych narzędzi do pisania i uruchamiania programów.
Zaczynamy jak poprzednio, czyli od skonfigurowania Yocto i skompilowania obrazu. Przy okazji - do obrazu warto dodać interesujące nas biblioteki, np. SDL, czy Qt. Można to też zrobić później.
Żeby można było wygodnie debugować nasz program, musimy dodać opcję "tools-debug" do zmiennej EXTRA_IMAGE_FEATURES, przyda się również dostęp do płytki przez SSH. Dodajemy więc do pliku conf/local.conf dwie linijki:

Kod: Zaznacz cały

EXTRA_IMAGE_FEATURES ?= "debug-tweaks tools-debug"
CORE_IMAGE_EXTRA_INSTALL += "openssh openssh-sftp-server"
Teraz musimy wygenerować obraz i nagrać go na płytkę:

Kod: Zaznacz cały

bitbake core-image-minimal
Do pisania programów będzie potrzebny kompilator, biblioteki i inne narzędzia. Aby je przygotować uruchamiamy:

Kod: Zaznacz cały

bitbake -c populate_sdk core-image-minimal
Po zakończeniu kompilacji gotowy SDK znajdziemy w katalogu tmp/deploy/sdk. Będzie to ogromy (235MB) skrypt shella o nazwie poky-glibc-x86_64-core-image-minimal-aarch64-toolchain-2.6.2.sh lub podobnej. W rzeczywistości jest to plik binarny, tylko zakodowany jako skrypt.
Tak przygotowany SDK musimy zainstalować, co ważne możemy go używać również na innych komputerach. Dzięki temu można raz skompilować SDK, a później używać bez potrzeby wracania do Yocto.
Instalacja to po prostu uruchomienie skryptu:

Kod: Zaznacz cały

sudo tmp/deploy/sdk/poky-glibc-x86_64-core-image-minimal-aarch64-toolchain-2.6.2.sh
Podczas instalacji musimy odpowiedzieć na kilka pytań, najważniejsze to docelowa lokalizacja. Domyślna to /opt/poky/2.6.2.

Praca z konsoli

Jeśli jesteśmy miłośnikami wiersza poleceń, wystarczy że wywołamy skrypt environment-setup-aarch64-poky-linux pisząc:

Kod: Zaznacz cały

source /opt/poky/2.6.2/environment-setup-aarch64-poky-linux
Zmienne powłoki zostaną dostosowane do naszego SDK, więc żeby skompilować program wystarczy napisać:

Kod: Zaznacz cały

${CC} -o hello_world src/main.c
Jednak wiele osób woli nieco bardziej rozbudowane IDE, spróbujemy więc wykorzystać Eclipse do pracy z programem.

Eclipse

Nie jest to jedyne, ani konieczne środowisko do pisania własnych programów, jednak dzięki odpowiedniemu pluginowi jest chyba najłatwiejsze do konfiguracji.
Po pierwsze musimy pobrać samego eclipse-a, najlepiej w wersji dla C/C++ https://www.eclipse.org/downloads/packages/
Następnie uruchamiamy IDE i dodajemy wybieramy opcję Help->Install New Software. Przyciskiem Add dodajemy nową lokalizację wtyczek: http://downloads.yoctoproject.org/relea ... .1/oxygen/

Obrazek

Instalujemy wszystkie pluginy do Yocto, jeśli to konieczne uruchmiamy ponownie Eclipse.
Teraz musimy dodać nasz SDK do Eclipse. Wybieramy opcję Window->Preferences i w kolumnie po lewej zakładkę "Yocto Project SDK".

Obrazek

Konfigurację ustawiamy następująco:
  • Cross Compiler Options - Standalone pre-built toolchain
  • Toolchain Root Location - /opt/poky/2.6.2
  • Sysroot Location - /opt/poky/2.6.2/sysroots/aarch64-poky-linux
Jeśli zainstalowaliśmy SDK w innym miejscu niż /opt/poky/2.6.2 to oczywiście musimy dostosować konfigurację.

Hello world!

Czas przygotować pierwszy projekt. Z menu wybieramy File->New Project... a następnie nasz ulubiony rodzaj projektu, czyli "C Project". W kolejnym kroku wybieramy typ "Yocto Project SDK CMake Project" i "Hello world C CMake Project".

Obrazek

Przykładowy projekt powienien zostać wygenerowany, również kompilacja powinna przebiegać bez problemu:

Obrazek

Uruchamianie i debugowanie

Przygotowany wcześniej obraz systemu nagrywamy na kartę SD i uruchamiamy Khardas-a (o ile nie uruchomiliśmy go jeszcze). Musimy sprawdzić jaki jest jego adres IP, warto też przetestować czy SSH na pewno działa.
Następnie wracamy do Eclipse i z menu Run wybieramy opcję Debug Configurations... będzie nas interesowała wersja "C/C++ Remote Application". Tworzymy i konfigurujemy taką wersję:

Obrazek

W opcji "Remote Absolute File Path for C/C++ Appliaction" wpisujemy pełną nazwę docelowego pliku (na Khardas). Przykładowo /home/root/khardas01.
Najważniejsza jest jednak opcja "Connection", jeśli pierwszy raz łączymy się z płytką to nie musimy utworzyć połączenie przyciskiem "New..."

Obrazek

Podajemy adres IP naszej płytki, nazwę użytkownika (root), wybieramy "Password based authentication" i wpisujemy hasło (domyślnie puste).

Zanim uruchomimy program, musimy jeszcze zmienić nazwę programu do debugowania. Domyślnie jest to gdb, ale my potrzebujemy wersję dla ARM64, czyli aarch64-poky-linux-gdb. Przechodzimy do zakładki Debugger i poprawiamy pole "GDB debugger":

Obrazek

Teraz możemy zapisać ustawienia i uruchomić program :)

Obrazek

Debugowanie działa zupełnie jak przy użyciu ST/Linka i STM32, tylko że zamiast programatora wykorzystywana jest sieć lokalna.

Podsumowanie

Opisany sposób kompilacji może w pierwszej chwili wydawać się skomplikowany, ale po przeklikaniu wszystkich opcji wystarczy po prostu otworzyć Eclipse i wszystko działa bez problemu. Co więcej kody źródłowe mamy na lokalnym dysku, więc łatwo przechowywać je w git-cie lub innym systemie kontroli wersji oraz nie znikną jeśli coś złego stanie się z płytką.
Użycie Yocto sprawia, że wszystki biblioteki są od razu dostępne, więc jeśli dodaliśmy do obrazu np. Qt mamy dostęp do tych bibilotek.
Najważniejsze jest jednak co innego - pracujemy wygodnie, przy porządnym komputerze, a nie małym i powolnym SBC. Kompilacja programów jest błyskawiczna w porównaniu z ARM-em. No i nie musimy mieć na SBC kompilatora.
W sumie to trochę jak na Arduino, czy STM32 - program piszemy na PC, tylko uruchamiamy na docelowym urządzeniu.