ELinux - Praktische Übungen

Letzte Änderung 2024-04-02

Hubert Högl

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

Link zur Veranstaltung: http://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.

Auf dem Hostrechner sollte am Anfang 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

Aufpassen: Manche Linux Distributionen verwenden nur 9600 Baud. Die Gerätedatei muss angepasst werden.

Welchen Vorteil hat diese Konsole im Vergleich mit der ssh Verbindung über USB bzw. Netzwerkkabel?

(HOST.3)

Eine Netzwerkverbindung zwischen Hostrechner und BBB herstellen.

(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”: http://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 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

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, ifconfig, iwconfig, wpa_supplicant)

  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

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

    3. GPIOs über libgpiod ansteuern

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

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

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

    GPIOs werden in Molloy, Kap. 6 behandelt.

  3. Machen Sie ein einfaches Programm zum Ansteuern der seriellen Schnittstelle in C/C++ und Python. Sie sollten die Schnittstelle öffnen, ein paar Zeichen schreiben und danach lesen, am Ende wieder schliessen. Man sollte den Code mit einer simplen Verbindung zwischen dem TX- (senden) und RX-Signal testen können.

    Hilfreich sind folgende Texte:

    Der UART wird in Molloy, Kap. 8 behandelt.

  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

Das soll ein Gerüst für einen Server werden, der automatisch nach dem Booten startet (über systemd). 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 auch einen Logging-Mechanismus haben.

10.2 Einfacher Webserver

Das Python Programm “Simple Webserver” herunterladen und auf das BBB kopieren (leider noch in Python 2 - bitte gerne als Übung für Python 3 umschreiben!). 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 (am besten) 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.

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

Zusatz 2024: Schreiben Sie den “Simple Webserver” am besten gleich in eine kompilierte Sprache um, z.B. Rust oder Go.

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) http://derekmolloy.ie/beaglebone, http://exploringbeaglebone.com

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