Letzte Änderung 2024-05-19
H. Högl, 2016, 2017, 2018, 2021, 2022, 2024
Link zur Veranstaltung: https://hhoegl.informatik.hs-augsburg.de/hhwiki/EmbeddedLinux
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.
bootterm
utelnetd-0.1.11
socat-1.7.4.3
curl 7.82.0 (autotools und cmake)
netcat
tmux3.2a
libwebsockets (cmake)
lighttpd
Kann gebaut werden mit
Literatur
MELPv3, Kap. 2 (Toolchains)
Automake Manual, Kap. 2: “An Introduction to the Autotools”
https://www.gnu.org/software/automake/manual/html_node/index.html
John Calcote, Autotools, No Starch Press, 2nd ed 2019 (O’Reilly).
https://learning.oreilly.com/library/view/autotools-2nd-edition/9781098122577
Kasper Siig, Using Autotools to Configure, Make, and Install a Program, 2021, https://earthly.dev/blog/autoconf
(BAU.1)
Machen Sie sich mit den wichtigsten Bauteilen und Schnittstellen auf dem BBB vertraut.
(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:
ssh und scp Client
Ein Terminal-Emulator (picocom, microcom, bootterm, pyserial-miniterm, …)
apt install picocom
)Ein Terminal-Multiplexer (tmux). Diesen sollten sie auf dem Hostrechner und auch auf dem BBB installieren.
Material zu tmux:
Eine gcc “Cross-Toolchain”
Ü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:
root
Rechten auf die
serielle Schnittstelle kommen. Das sollten Sie vermeiden. Was müssen Sie
dann tun?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
.
Mit USB Kabel zwischen BBB und Hostrechner
Mit Kabel über eth Schnittstelle zwischen BBB und Hausnetz oder zwischen BBB und Hostrechner
Mit WiFi, z.B. über einen USB WiFi Adapter. Ich kann den TPLINK TL-WN725N USB Adapter empfehlen. Dieser muss in die USB Host-Schnittstelle des BBB gesteckt werden.
(HOST.4)
Mounten Sie das Homeverzeichnis des BBB mit sshfs
auf dem Hostrechner.
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
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
Einloggen
Bootmeldungen des BBB betrachten (dmesg)
Welches Linux haben Sie? (Typ, Version)
Useraccount mit adduser
einrichten (auf keinen Fall
immer als Root arbeiten!)
Systemzeit setzen mit date
und
ntpdate
Machen Sie sich mit systemd
vertraut.
Übersicht: https://www.linuxtrainingacademy.com/systemd-cheat-sheet
timedatectl
Gehen Sie mit ssh
und http
auf das
Board.
Dateien mit scp
zwischen Host und Target
übertragen
Vom Target aus über den Hostrechner eine Netzwerkverbindung
in das Internet herstellen (ip, iw, nmcli)
“Erforschen” Sie das Linux auf dem BBB über die ssh oder Konsolenverbindung:
System auf der Kommandozeile u.a. mit procfs
erforschen (ls, ps, tree, cat, less, vi, uname, mount, df, du, fdisk,
…)
Admin Kommandos entwirren
https://hhoegl.informatik.hs-augsburg.de/elinux/kurs/linux_admin_cmds.pdf
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?
Wie bootet man von der SD Karte?
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.
Welche Subsysteme kann U-Boot verwalten?
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.
Beschreiben Sie den Bootvorgang (ROM, SPL/MLO, U-Boot, Kernel)
Wozu dienen /boot/uEnv.txt
und
/boot/SOC.sh
?
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).
Kompilieren Sie den U-Boot Bootloader aus den aktuellen git Quellen und updaten Sie ihn auf dem Board.
Alternative “Barebox” - wo liegen die Unterschiede zu U-Boot?
Lit.:
Demo für Pin Ein-/Ausgabe
https://hhoegl.informatik.hs-augsburg.de/elinux/kurs/democode
Einfache I/O Demo mit LED und Taste am BBB.
Mögliche Aufgabenvarianten sind
GPIO ueber sysfs einlesen (polling/interrupt) und ausgeben. Diese Methode ist aber schon veraltet.
Tastendruck wird als Event über sysfs erkannt und schaltet LED ein und aus
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.
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.
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
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
Das Aufgaben stammen aus MELP, ch. 6 “Selecting a Build System”.
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.
Aufgaben mit dem Kernel in der Bau-Umgebung
Aufgaben mit dem Root Filesystem in der Bau-Umgebung
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
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
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
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
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
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
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
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/.
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
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.
[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