Linux w systemach Embedded ( embeddedlinuxded | 28 hours )
-
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.
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