Linux w systemach Embedded ( embeddedlinuxded | 28 hours )

Prerequisites:

-

Overview:

Szkolenie dla wszystkich zainteresowanych rozwijaniem projektów opartych o Embedded Linux. Daje solidną wiedzę i bazę do pogłębiania wiedzy. Uczestnicy szkolenia będą w stanie zaplanować, rozpocząć i rozwijać własny projekt.

Course Outline:

Dzień 1. Linux w systemach wbudowanych - budowa systemu

  • Wprowadzenie do Linuksa Embedded – "w pigułce" (kompilacja, cross-kompilacja dla systemów wbudowanych, struktura kodu jądra i narzędzi, praca z systemem kontroli wersji GIT, moduły jądra). Cross-toolchain - budowa, planowanie i dobór narzędzi deweloperskich, typowe rozwiązania, problemy i błędy (toolchain zbudowany samodzielnie vs. Gotowy)
  • Uruchamianie urządzenia: Power-on-reset, bootloader pierwszego poziomu, u-boot i inne (Barebox)
  • Uruchamianie jądra Linux.
  • Główny system plików - przygotowanie, zawartość - Busybox - narzędzia i skrypty.
  • profilowanie procesu startu i jego optymalizacja
  • cross-kompilacja aplikacji – dobre praktyki

Po tej części:

Uczestnicy będą w stanie samodzielnie zaplanować dobór odpowiednich narzędzi (toolchain-a) dla danych urządzeń i zadań. Poznają budowę systemu Embedded Linux i sposób jego uruchamiania. Samodzielnie zbudują system bazowy.

Ćwiczenia:

Ta seria ćwiczeń polega na sukcesywnej kompilacji poszczególnych elementów systemu i uruchamianiu ich na urządzeniu w celu zrozumienia z czego składa się i jak działa system.

  • posługiwanie się cross-kompilatorem (z linii poleceń), konfiguracja systemu do pracy z cross-kompilatorem (ścieżki, sysroot, dodatkoe pakiety i biblioteki).
  • kompilacja bootloadera – u-boot i uruchomenie go z wykorzystaniem procedury Recovery (start urządzenia bez wgranego firmware-u)
  • uruchomienie urządzenia z karty SD (formatowanie karty, automatyzacja procesu) kompilacja jądra Linux i uruchomienie go na urządzeniu (u-boot ładuje jądro z karty SD, z tftp)
  • konfiguracja i parametryzacja u-boot-a (zmienne, skrypty)
  • przygotowanie systemu bazowego (Busybox), skryptów startowych, uruchomienie kompletnego systemu
  • opcjonalnie: samodzielne przygotowanie toolchain-a, praca z crosstool-ng, typowe problemy

Dzień 2. Automatyzacja pracy, wprowadzenie do programowania w jądrze.

  • Yocto - konfiguracja, receptury, use-case, dostosowanie narzędzi do własnych potrzeb
  • systemy plików na urządzenia blokowe i NAND
  • Przechowywanie danych: urządzenia blokowe (SD, eMMC), pamięci NAND
  • Systemy plików: NFS, JFFS2, UBI, systemy plików dla urządzeń blokowych
  • automatyczne i manualne aktualizacje systemu na urządzeniu - planowoanie i konfiguracja systemu budowania
  • inne systemy budowania dystrybucji i pakietów dla systemów embedded: (krótko), OpenWRT (omówienie + skrypty), gotowe systemy: Debian, Ubuntu
  • Konfiguracja Eclipse do pracy z BSP i kodem źródłowym jądra.
  • wprowadzenie do programowania sterowników urządzeń (licencje, dobre praktyki)
  • moduły jądra (podstawowy kontener opakowujący kod)
  • model urządzeń systemu Linux: znakowe, blokowe, sieciowe

Po tej części:

Uczestnicy będą potrafili posługiwać się narzędziami: Buildroot i Yocto i przy ich pomocy tworzyć własną dystrybucję systemu (minimalistyczną i zoptymalizowaną do konkretnego zastosowania). Będą w stanie dodawać własne skrypty i narzędzia oraz aktualizować wersje pakietów.

Skonfigurują środowisko pracy (Eclipse) i użyją go podczas pracy z kodem źródłowym jądra.

Ćwiczenia:

  • kompilacja systemu przy pomocy Buildroot-a, wybór wersji jądra, programów, dodawanie własnych komponentów (serwer SSH, serwer WWW)
  • kompilacja systemu przy pomocy Yocto-a, wybór wersji jądra, programów, dodawanie własnych komponentów (serwer SSH, serwer WWW)
  • konfiguracja sieci: hotplug Ethernet (ifplugd), automatyczne podłączanie sieciowego systemu plików NFS
  • konfiguracja sieci USB (urządzenie jako klient USB)
  • konfiguracja Eclipse do cross-kompilacji i pracy z kodem źródłowym jądra oraz do zdalnego debugowania programów
  • kompilacja modułów – prosty moduł, moduł z parametrami (chodzi o poznanie specyfiki pracy z kodem)

Dzień 3. Model urządzeń (sterowników) Linuksa.

  • metody komunikacji proces ↔ jądro (praktyczne przykłady – od flag konfiguracyjnych do efektywnych metod przekazywania dużej ilości danych): procfs, sysfs, debugfs, device files, mmap
  • zarządzanie pamięcią
  • jak Linux widzi sprzęt – komunikacja z urządzeniami
  • model sterowników urządzeń, frameworki i wewnętrzne API jądra
  • dobór i konfiguracja sterowników do urządzeń w systemie embedded
  • Device-Tree - konfiguracja urządzeń platformy
  • współbieżność: synchronizacja, blokady
  • przerwania
  • wejście – wyjście: polling i sterowne przerwaniami

Po tej części:

Uczestnicy będą rozumieć wewnętrzną budowę jądra systemu (programowanie w jądrze polega w dużej mierze na znajomości odpowiednich frameworków oraz układu poszczególnych warstw). Uczestnicy będą w stanie rozszerzać istniejący kod i dostosowywać go do wymagań (dodawać i dostosowywać sterowniki). Otrzymają także dużą ilość gotowych działających przykładów kodu.

Ćwiczenia:

W każdym ćwiczeniu podstawowy "szkielet" kodu jest już gotowy, trzeba dopisać główną funkcję.

  • odczyt-y zapisy do przestrzeni adresowej z programu (/dev/mem)
  • dostęp do fizycznej przestrzeni adresowej w sterowniku (ioremap). Dany jest sterownik, który udostępnia urządzenie znakowe, dopisać funkcje, które zwrócą zawartość rejestrów procesora przy odczycie,
  • j.w. dopisać funkcje, które wyślą dane na port szeregowy przy zapisie
  • Podłączanie urządzenia - na przykładzie termometru 1-wire lub LED. Odczytać ze schematu linię GPIO, znaleźć jej opcje w dokumentacji, ustawić multipleksację przy pomocy Device- Tree, uruchomić sterownik magistrali 1-wire i wykorzystać go w aplikcaji. To urządzenie pokazuje ścieżkę, jaką trzeba przejść podczas definiowania peryferiów własnego urządzenia.
    Pokazana jest również ścieżka debugowania.
  • przerwania – dany jest kod modułu, który włącza LED (out) po wciśnięciu przycisku (in), dostosować go do urządzenia (multipleksacja linii, znalezienie numeru GPIO w kernelu)
  • pomiary opóźnień przy pomocy napisanych wcześniej sterowników - czas reakcji systemu na poszczególnych warstwach i przyczyny problemów.

Dzień 4. Programy przestrzeni użytkownika. Debugowanie aplikacji. Profilowanie systemu.

  • Dokończenie tematów z dnia 3.
    Przykłady zastosowania frameworków w rzeczywistych rozwiązaniach: USB, I2C, 1- wire, SPI urządzenia sieciowe, DMA, PWM. Elementy debugowania jądra.
  • Omówienie wybranych klas sterowników: urządzenia platformy i Device-Tree, urządzenia sieciowe
  • Grafika i wyświetlanie.
  • procesy, wątki
  • planista - działanie, strojenie i konfiguracja, zaawansowane zagadnienia: POSIX RT i segmentacja (cgroup)
  • komunikacja (IPC)
  • biblioteki
  • GUI: QT, GTK
  • serwer HTTP, SSH i inne usługi sieciowe
  • multimedia (kodowanie, dekodowanie dźwięku i obrazu), Gstreamer
  • zdalne debugowanie aplikacji przestrzeni użytkownika przy użyciu Eclipse
  • śledzenie jądra i procesów użytkownika
  • analiza pacy systemu przy pomocy narzędzi graficznych (analiza logów z narzędzi profilowania)

Po tej części:

Uczestnicy otrzymają przeglądową wiedzę na temat interesujących narzędzi, bibliotek i technologii wraz z działającymi przykładami oraz metodami zdalnego debugowania. Opcjonalnie - więcej uwagi można poświęcić przetwarzaniu multimediów (obraz z kamer cyfrowych i analogowych) albo innym wybranym zagadnieniom.

Ćwiczenia:

Polegają na uruchamianiu i modyfikowaniu dostarczonych przykładów kodu i aplikacji.

  • komunikacja z urządzeniem z poziomu przestrzeni użytkownika
  • zdalne debugowanie aplikacji przy użyciu GDB i Eclipse
  • (opcjonalnie) zdalne debugowanie aplikacji przy użyciu QTCreator-a
  • eksperymenty z wyświetlaczami i grafiką 3D
  • uruchomienie i debugowanie serwera RTSP