Letzte Änderung 2022-04-04T11:17+02:00
H. Högl, 2016, 2017, 2018, 2021, 2022
Link zur Veranstaltung: http://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.
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.
Auf dem Hostrechner sollte am Anfang installiert werden:
ssh und scp Client
Ein Terminal-Emulator (picocom, microcom, pyserial-miniterm, …)
apt install picocom
)Ein Terminal-Multiplexer (tmux). Diesen sollten sie auch auf dem BBB installieren, da sie dort keine grafische Benutzeroberfläche haben.
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
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)
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”: 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
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
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, ifconfig, iwconfig,
wpa_supplicant)
“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
Tastendruck wird als Event über sysfs erkannt und schaltet LED ein und aus
GPIOs über libgpiod ansteuern
http://hhoegl.informatik.hs-augsburg.de/elinux/kurs/memo-07.pdf
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.
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.
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
Das soll ein Gerüst für einen Server werden, der automatisch nach dem Booten startet (über systemd). Mögliche Programmiersprachen sind C, C++, Python, Go und Rust. Der Server sollte auch einen Logging-Mechanismus haben.
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 in
den letzten Jahren Andreas Tschirner verwendet, der das Elinux Praktikum
betreut hat.
http://hhoegl.informatik.hs-augsburg.de/elinux/kurs/Simple-Webserver
Im gitlab Repository
https://r-n-d.informatik.hs-augsburg.de:8080/hubert.hoegl/elinux.git
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.org/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