ELinux - Praktische Übungen

Letzte Änderung 2024-05-19

Hubert Högl

H. Högl, 2016, 2017, 2018, 2021, 2022, 2024

Link zur Veranstaltung: https://hhoegl.informatik.hs-augsburg.de/hhwiki/EmbeddedLinux

1 Cross-Kompilierung

Versuchen Sie die folgenden Programme auf dem x86 PC für die Zielplattform ARM zu kompilieren. Es muss nicht immer klappen! Als Cross-Toolchain verwenden Sie die mit Crosstool-NG selber kompilierte oder eine beliebige andere bereits fertig kompilierte Toolchain.

Literatur

2 Bauteile und Schnittstellen auf dem BBB

(BAU.1)

Machen Sie sich mit den wichtigsten Bauteilen und Schnittstellen auf dem BBB vertraut.

Bild von H. Hoegl
Siehe [2]

3 Hostrechner

(HOST.1)

Sie brauchen einen Arbeitsplatzrechner (“Host”), der unter GNU/Linux läuft. Über diesen Rechner greifen Sie auf das BBB zu. Dieses Linux kann auch virtuell z.B. über VirtualBox installiert sein, geeignete Images gibt es unter https://www.osboxes.org/debian.

Eine weitere Alternative ist das WSL2 Subsystem von Windows zu verwenden. Sie finden eine Anleitung unter https://hhoegl.informatik.hs-augsburg.de/es2/doc/Installation.html (am Anfang). Damit man in WSL2 fremde Dateisysteme wie ext4 mounten kann muss man den WSL Kernel neu kompililieren, eine Anleitung ist unter https://hhoegl.informatik.hs-augsburg.de/es2/doc/WSL-Kernel.txt.

Auf dem Hostrechner sollte installiert werden:

Üben Sie das Arbeiten auf der Kommandozeile! (siehe [3] und [4])

(HOST.2)

Schliessen Sie einen UART-zu-USB Adapter an der 6-poligen Pfostenleiste auf dem BBB an, so dass man die Konsole auf dem Hostrechner sehen kann. Ein Terminalprogramm starten mit

$ picocom -b 115200 /dev/ttyUSB0

oder

$ microcom -s 115200 -p /dev/ttyUSB0

microcom hat voreingestellt 115200 Baud, man müsste also in dem Beispiel nicht die -s Option angeben.

Wichtige Punkte:

Auch der RPi hat zwei Anschlusspins für einen externen USB-zu-UART Adapter. Sie müssen diesen aber erst in der Konfiguration einschalten. Sie finden dazu Tutorials im Netz.

(HOST.3)

Eine Netzwerkverbindung zwischen Hostrechner und BBB herstellen.

Verwenden Sie nur Kommandozeilenwerkzeuge wie ip, iw, nmcli.

(HOST.4)

  1. Mounten Sie das Homeverzeichnis des BBB mit sshfs auf dem Hostrechner.

  2. Installieren Sie auf dem Hostrechner eine Cross-GCC Toolchain und kompilieren Sie ein kleines Demoprogramm. Übertragen Sie es mit scp auf das BBB und führen Sie es aus. Die einzelnen Programme des Cross-GCC haben den Präfix arm-none-linux-gnueabihf-.

    Auf Ubuntu und verwandten Linuxen gibt es das Paket gcc-arm-linux-gnueabi. Das ist der einfachste Weg um zu einer Toolchain zu kommen. Eine Alternative ist “Crosstool-NG”: https://crosstool-ng.github.io (so macht es MELP). Ein dritter Weg ist die “Linaro Toolchain”, https://www.linaro.org/downloads.

    Falls Sie einen C Compiler auf dem BBB haben, kompilieren Sie das Programm auch nativ und testen Sie es.

    Lit.: MELP, Kap. 2, Learning About Toolchains

4 Das BBB in Betrieb nehmen

Normalerweise sollte im eMMC Speicher des BBB ein lauffähiges Debian Linux vorhanden sein. Falls das BBB nicht aus dem eMMC Speicher bootet, installieren Sie zunächst den eMMC Speicher neu, oder sie stecken eine MicroSD-Karte mit Linux in den Kartenhalter.

Erste Kontakte mit dem BBB (serielle Schnittstelle, Zugriffsrechte, udev, eMMC beschreiben, Debian updaten)

Häufig benötigte Kommandos

  1. Einloggen

  2. Bootmeldungen des BBB betrachten (dmesg)

  3. Welches Linux haben Sie? (Typ, Version)

  4. Useraccount mit adduser einrichten (auf keinen Fall immer als Root arbeiten!)

  5. Systemzeit setzen mit date und ntpdate

  6. Machen Sie sich mit systemd vertraut.

    Übersicht: https://www.linuxtrainingacademy.com/systemd-cheat-sheet

  7. Gehen Sie mit ssh und http auf das Board.

  8. Dateien mit scp zwischen Host und Target übertragen

  9. Vom Target aus über den Hostrechner eine Netzwerkverbindung
    in das Internet herstellen (ip, iw, nmcli)

  10. “Erforschen” Sie das Linux auf dem BBB über die ssh oder Konsolenverbindung:

  11. System auf der Kommandozeile u.a. mit procfs erforschen (ls, ps, tree, cat, less, vi, uname, mount, df, du, fdisk, …)

  12. Admin Kommandos entwirren

    https://hhoegl.informatik.hs-augsburg.de/elinux/kurs/linux_admin_cmds.pdf

5 Flash Speicher

  1. Wie behandelt man eine rohe SD Karte mit fdisk und mkfs.vfat bzw. mkfs.ext4, so dass man darauf ein bootfähiges Linux installieren kann?

  2. Wie bootet man von der SD Karte?

  3. Wie kann man den eMMC Speicher komplett neu mit einem Linux beschreiben? Vorher sollte man ein Backup des aktuellen eMMC Speicher machen!

    Tipp: Es geht mit einem “Flasher Image”, das man unter https://beagleboard.org/latest-images bekommt.

6 Das U-Boot

  1. Welche Subsysteme kann U-Boot verwalten?

  2. Stoppen Sie den Bootvorgang durch sofortiges Drücken der Leertaste in der Konsole bei einem Reboot, so dass Sie auf dem U-Boot Prompt landen.

  3. Beschreiben Sie den Bootvorgang (ROM, SPL/MLO, U-Boot, Kernel)

  4. Wozu dienen /boot/uEnv.txt und /boot/SOC.sh?

  5. U-Boot kann auch mit Device Trees umgehen (.dtb, .dtbo Dateien). Auch der Kernel braucht diese Device Trees. Wozu wird diese ganze Device Tree Sache überhaupt gebraucht? Siehe das Verzeichnis /boot/dtbs/4.19.94-ti-r42 (oder ähnlich).

  6. Kompilieren Sie den U-Boot Bootloader aus den aktuellen git Quellen und updaten Sie ihn auf dem Board.

  7. Alternative “Barebox” - wo liegen die Unterschiede zu U-Boot?

    https://www.pengutronix.de/de/software/barebox.html

Lit.:

7 Schnittstellen

  1. Demo für Pin Ein-/Ausgabe

    https://hhoegl.informatik.hs-augsburg.de/elinux/kurs/democode

  2. Einfache I/O Demo mit LED und Taste am BBB.

    Mögliche Aufgabenvarianten sind

    1. GPIO ueber sysfs einlesen (polling/interrupt) und ausgeben. Diese Methode ist aber schon veraltet.

    2. Tastendruck wird als Event über sysfs erkannt und schaltet LED ein und aus

    3. GPIOs über libgpiod ansteuern (modern!)

      https://hhoegl.informatik.hs-augsburg.de/elinux/kurs/memo-07.pdf

      Welche maximale Frequenz kann beim Umschalten der GPIO Pins erreicht werden? Das kann man z.B. mit einem Oszilloskop oder mit dem Saleae Logikanalysator messen.

    4. Ein Demo-Gerätetreiber fängt den Tastendruck als Interrupt ab und schaltet die LED ein und aus.

      https://derekmolloy.ie/writing-a-linux-kernel-module-part-1-introduction

    GPIOs werden in Molloy, Kap. 6 behandelt.

  3. Die serielle Schnittstelle per selbstgeschriebenen Programm ansprechen.

    Verwenden Sie eine Sprache ihrer Wahl. Effiziente Sprachen zur Systemprogrammierung wie C, Rust, Go wären am besten geeignet, bei den meisten gut ausgestatteten Boards wie BBB und RPi geht aber auch Python.

    Ein möglicher Anwendungsfall ist z.B. das U-Boot über ein Programm auf dem Hostrechner fernzusteuern, d.h. das Programm übernimmt ihre normalerweise interaktiven Tastendrücke.

    Eine andere Anwendung wäre es, das Programm zum Steuern der seriellen Schnittstelle auf dem BBB/RPi laufen zu lassen und einen freien UART anzusteuern. Sie sollten z.B. mal die Schnittstelle öffnen, ein paar Zeichen schreiben und danach lesen. Man kann eine simple Kabelbrücke zwischen TX und RX Pin stecken um die Funktion zu testen.

    Der UART wird in Molloy, Kap. 8 behandelt.

    Auch hilfreich ist der HOWTO https://tldp.org/HOWTO/Serial-Programming-HOWTO

  4. Machen Sie sich mit den Bussen I2C und SPI vertraut. Beide werden in Molloy, Kap. 8 behandelt.

    Auch der 1-Wire Bus wäre interessant (z.B. Temperatursensor DS18B20).

Lit.: MELP, Kap. 12: Prototyping with Breakout Boards

8 Build-Umgebungen

Das Aufgaben stammen aus MELP, ch. 6 “Selecting a Build System”.

  1. Bauen Sie ein Root-Filesystem mit Kernel und U-Boot aus den folgenden Distributionen:

    Installieren Sie es auf einer MicroSD-Karte und testen Sie es auf dem BBB. Es soll auch der Bootloader U-Boot und die Cross-Toolchain dabei entstehen.

  2. Aufgaben mit dem Kernel in der Bau-Umgebung

  3. Aufgaben mit dem Root Filesystem in der Bau-Umgebung

9 Aufgaben mit dem Raspberry Pi

  1. Quade, Kunst, Gerätetreiber als Kernel-Modul implementieren, Linux Magazin 11.2020.

    https://hhoegl.informatik.hs-augsburg.de/elinux/kt/kt-112/kt-112.pdf

  2. Quade, Kunst, Zeitverwaltung im Linux Kernel, Kern-Technik #113, Linux Magazin 1.2021

    https://hhoegl.informatik.hs-augsburg.de/elinux/kt/kt-113/kt-113.pdf

  3. Quade, Kunst, Industrial-IO, Kern-Technik #115, Linux Magazin 5.2021 (Kernel für Raspberry Pi 4 mit IIO Subsystem wird konfiguriert)

    https://hhoegl.informatik.hs-augsburg.de/elinux/kt/kt-115/kt115-iio.pdf

  4. Quade, Kunst, Treiber für ein virtuelles Industrial-IO Gerät, Kern-Technik #116, 7.2021

    https://hhoegl.informatik.hs-augsburg.de/elinux/kt/kt-116/kt-116.pdf

  5. Quade, Kunst, Sensoren am RPi4 über IIO anschliessen, Kern-Technik #117, 9.2021

    https://hhoegl.informatik.hs-augsburg.de/elinux/kt/kt-117/kt-117.pdf

  6. Quade, Kunst, RISC-V auf QEMU, Kern-Technik #119, Linux Magazin 9.2021

    https://hhoegl.informatik.hs-augsburg.de/elinux/kt/kt-119/kt-119.pdf

  7. Quade, Kunst, RPi4 ohne SD Karte über Netzwerk booten, Kern-Technik #120, Linux Magazin 3.2022

    https://hhoegl.informatik.hs-augsburg.de/elinux/kt/kt-120/kt-120.pdf

10 Programmieraufgaben

10.1 Kleiner Server (Daemon)

Anwendungen auf einem Embedded Linux Rechner werden meist in Server verpackt, die nach dem Booten automatisch über systemd gestartet werden. Mögliche Programmiersprachen sind Rust, Go, C, C++. Natürlich könnte man auch Python oder Javascript (Node) verwenden, jedoch haben diese Sprachen im Vergleich zu Compilersprachen einen hohen Resourcenverbrauch. Der Server sollte idealerweise auch einen Logging-Mechanismus haben.

Ein simples Gerüst in Python ist unter https://hhoegl.informatik.hs-augsburg.de/elinux/kurs/daemon-py/ zu finden.

Besser als das Python Gerüst wäre einen Daemon in Rust zu schreiben. Dafür gibt es z.B. das “daemonize” Crate https://github.com/knsd/daemonize/.

10.2 Einfacher Webserver

Hier geht es darum, auf dem Embedded Linux Board einen minimalistischen Webserver laufen zu lassen, über den man Steuerungsaufgaben von einem Webbrowser aus erledigen kann. Ein paar Anregungen sind:

Es ist nicht nötig, gleich einen ausgewachsenen Server wie Nginx oder gar Apache zu installieren. Möglich wäre z.B. Rust (Axum Framework), Go (Gin Framework) oder Python mit Flask. Beim Frontend können Sie ganz elementar in HTML arbeiten oder z.B. ein kleines JavaScript Framework wie z.B. preact (https://preactjs.com) verwenden.

Der Embedded Linux Rechner kann auch über andere Prototkolle mit der Aussenwelt in Verbindung stehen, z.B. MQTT oder Webhooks.

Das Python Programm “Simple Webserver” sollte man höchstens als Anregung verstehen - also am besten nicht verwenden. Es ist sehr primitiv und auch noch in Python 2 geschrieben. Die beiliegende Service Unit installieren und vorher eventuell anpassen. Dabei nicht als Root arbeiten. Testen, ob man es mit systemctl starten und stoppen kann. Auch mal testweise als Dienst einrichten, der gleich beim Booten gestartet wird. Den Server auf dem BBB ansprechen vom Hostrechner aus über einen interaktiven Webbrowser (z.B. Firefox) und auch über Kommandozeilentools wie curl, wget, netcat oder https://httpie.org. Im Doc-Header von web_server.py steht, wie es über curl geht, verwenden Sie aber auch alternativ mal httpie. Abschliessend eigene Ideen in den Server einbauen. Woher das Skript stammt weiss ich nicht mehr, es hat vor vielen Jahren Andreas Tschirner verwendet, der das Elinux Praktikum betreut hat.

https://hhoegl.informatik.hs-augsburg.de/elinux/kurs/Simple-Webserver

10.3 Zeitliches Verhalten programmieren (“Echtzeit”)

Im gitlab Repository

https://gitlab.informatik.hs-augsburg.de/hhoegl/elinux/material

finden Sie ein paar Beispiele die demonstrieren, wie man zeitliches Verhalten in Linux programmiert. Vollziehen Sie die Beispiele in den Verzeichnissen timing und bbb-rt-test/rt-demos nach.

11 Literatur

[1] Vasquez, Simmonds, Mastering Embedded Linux Programming (MELP), 3rd ed, Packt 2021. https://learning.oreilly.com/library/view/mastering-embedded-linux/9781789530384

[2] Bone101 https://beagleboard.github.io/bone101/Support/bone101

[3] LPIC Essentials https://www.tuxcademy.org/media/lxes

[4] Brian Ward, How Linux Works, 3rd edition, No Starch Press, 2021. https://learning.oreilly.com/library/view/how-linux-works/9781098128913

[5] Derek Molloy, Exploring the Beagle Bone Black (EtBBB) https://derekmolloy.ie/beaglebone, http://exploringbeaglebone.com

[6] BeagleBone Black System Reference Manual (99 Seiten) https://hhoegl.informatik.hs-augsburg.de/elinux/bbb/BBB_SRM.pdf