Embedded Systems Anleitungen
Inhalt
1 Test der virtuellen Maschine
20. Oktober 2020
Ich habe den Test auf einem Notebook Lenovo T420 gemacht (Core i5). Als Host-Betriebssystem ist ebenfalls Xubuntu Linux 20.04.1 installiert.
Anleitung zum Einrichten der VM
http://ti-wiki.informatik.hs-augsburg.de/doku.php?id=rt-labor_rtvm
Virtualbox 6.1.14
Gastbetriebsystem: Xubuntu Linux (Ubuntu 20.04.1 LTS "focal")
Immer als gewöhnlicher User "rtlabor" arbeiten. Für Administrationsaufgaben immer nur kurzzeitig Superuser (root) werden.
Praktisch: Clipboard zwischen Host- und Gastbetriebssystem einrichten (VM Settings -> General -> Advanced -> Shared Clipboard : auf "bidirectional" setzen)
Software-Updater starten ("Aktualisierungsverwaltung")
Pakete nachinstallieren (gdb benötigt diese):
- libncurses5
- libpython2 (es kann auch sein, dass dieses Paket bei Ihnen libpython2.7 heisst!)
- python3-docutils (das Programm rst2html.py wird in manchen Makefiles benoetigt)
USB Anschluss für den OpenOCD in VirtualBox konfigurieren durch Einrichten eines USB Filters. Können Sie auch erst mal überspringen, falls Sie noch kein Board haben.
Die Ausgabe des Kommandos lsusb auf der VM muss folgende Zeile enthalten:
Bus 002 Device 005: ID 0483:374b STMicroelectronics ST-LINK/V2.1
Die Datei ~/.tmux-conf muss richtig ~/.tmux.conf heissen! Also umbenennen, wenn Sie mit tmux arbeiten möchten. Der Inhalt kann gerne nach Geschmack angepasst werden. In meiner Vorgabe ist der Standard Kommando-Präfix Ctrl-b durch Ctrl-z ersetzt!
Auch ~/.vimrc anpassen, wenn man möchte.
Einen ssh Schlüsselpaar anlegen. Ich habe das mit dem Aufruf von ssh-keygen -t ed25519 erledigt, so wie das in
https://r-n-d.informatik.hs-augsburg.de:8080/help/ssh/README#generating-a-new-ssh-key-pair
beschrieben ist. Der öffentliche Schlüssel (~/.ssh/id_ed25519.pub) muss in gitlab eingetragen werden. Nur wenn man das gemacht hat, kann man ein git Repository per ssh://... klonen.
Das estool Programm updaten:
Git Repo klonen:
git clone ssh://git@r-n-d.informatik.hs-augsburg.de:2222/hubert.hoegl/estool.git
Installieren, bzw Updaten wegen der -U Option:
cd estool pip3 install -U .
Der Update erfolgt mit User Rechten, da die Installation im Home-Verzeichnis unter ~/.local liegt.
Es muss danach mindestens folgende Version ausgegeben werden:
rtlabor@rtvm:~$ estool --version ESTOOL version 0.25 (2020-10-22)
Beispiel "starter" testen (vorher das Nucleo Board anstecken!):
cd ~/es2/starter git pull # Updaten estool --start-oocd # OpenOCD im Hintergrund starten. Siehe auch --ask-oocd make # kompilieren make flash # Programm auf STM32 uebertragen. USB Verbindung zum Board muss funktionieren. # Ab hier läuft das Programm auf dem STM32 make gdb # Debugger starten. Verlassen mit "q" oder "quit" estool --stop-oocd # OpenOCD beenden
Im Gitlab ist das Beispiel unter https://r-n-d.informatik.hs-augsburg.de:8080/es2/es2-nucl476/starter zu finden.
Wer im gdb schon mal eine kleine Übung machen möchte, der kann "n [RET]" eingeben, also ein n (= next) und die Eingabetaste ("Return"). Damit wird die nächste Quelltextzeile im Debugger ausgeführt. Danach gibt man nur noch wiederholt [RET] ein, um Zeilen auszuführen.
So sah das ungefähr aus: Desktop mit gdb
2 RTLAB-Remote
2.1 Einloggen
VPN Verbindung zur Hochschule aufbauen
ssh <rzlogin>@rtlab-remote.informatik.hs-augsburg.de
In ~/.bashrc aufnehmen:
export PATH=/opt/openocd-dev/bin:/opt/gcc-arm-none-eabi-9-2020-q2-update/bin:$PATH . /opt/py_venv3.8.3/bin/activate
Datei einlesen mit . ~/.bashrc. Nun sollte das Kommando estool zur Verfügung stehen.
2.2 Beispiel "starter" von gitlab holen und kompilieren
git clone ssh://git@r-n-d.informatik.hs-augsburg.de:2222/es2/es2-nucl476/starter.git
Dazu muss vorher der öffentliche ssh Schlüssel in gitlab eingetragen worden sein.
In das Verzeichnis starter wechseln mit cd starter
Das Programm mit make kompilieren. Die Ausgabe sollte so ausschauen:
(py_venv3.8.3) hhoegl@gorilla:~/gorilla/starter$ make [MKDIR] obj mkdir -p obj [CC] startup.c arm-none-eabi-gcc -g3 -Wall -Wpedantic -Wextra -std=gnu99 -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -c -o obj/startup.o Src/startup.c [CC] osc.c arm-none-eabi-gcc -g3 -Wall -Wpedantic -Wextra -std=gnu99 -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -c -o obj/osc.o Src/osc.c [CC] usart.c arm-none-eabi-gcc -g3 -Wall -Wpedantic -Wextra -std=gnu99 -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -c -o obj/usart.o Src/usart.c [CC] itoa.c arm-none-eabi-gcc -g3 -Wall -Wpedantic -Wextra -std=gnu99 -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -c -o obj/itoa.o Src/itoa.c [CC] main.c arm-none-eabi-gcc -g3 -Wall -Wpedantic -Wextra -std=gnu99 -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -c -o obj/main.o Src/main.c arm-none-eabi-gcc -TSTM32L476RG_FLASH.ld -Wl,-Map,main.map -nostdlib -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -nostartfiles -o main.elf obj/startup.o obj/osc.o obj/usart.o obj/itoa.o obj/main.o [SIZE] main.elf arm-none-eabi-size main.elf text data bss dec hex filename 1280 8 1572 2860 b2c main.elf arm-none-eabi-objcopy -Obinary main.elf main.bin arm-none-eabi-objdump -S main.elf > main.lst
2.3 Board mit estool verwalten
Prüfen
$ estool --bs-check Board server running No board reserved
Reservieren
Die Boards werden durch die Zahlen 0, 1, 2, 3 gekennzeichnet. Das erste Board hat also die Id 0. Man kann nur ein Board zu einer Zeit reservieren.
$ estool --bs-reserve Reserved board 0 for user hhoegl Started Openocd (pid 2382)
Prüfen
$ estool --bs-check Board server running Board 0 reserved for user hhoegl Openocd is running (pid=2382, telnet_port=4445 gdb_port=3334) Usage time: 2/20 min Board Access (use VPN!): - Webcam (Video Stream): http://141.82.48.195:8091 - Saleae Logic (VNC): 141.82.48.195:5901 - Nucleo serial port: /dev/rtlab/nucleo1_tty
Freigeben
$ estool --bs-free Freeing board 0 for user hhoegl
Board zurücksetzen
$ estool --bs-erc reset
Eingänge einlesen
$ estool --bs-erc leds
Ausgänge setzen
$ estool --bs-erc buttons=8 # user button druecken ... $ estool --bs-erc buttons=0 # ... und wieder loslassen
Ausgänge lesen
$ estool --bs-erc buttons
2.4 Programm flashen und ausführen
$ make flash
2.5 Serielle Schnittstelle
Die serielle Schnittstelle zum Ziel-Mikroprozessor wird über die Gerätedatei geöffnet, die beim Kommando --bs-check als "Nucleo serial port: ..." angezeigt wird. Wenn diese Gerätedatei z.B. /dev/rtlab/nucleo1_tty ist, dann kann man auf dem Server das Kommando
$ picocom -b 9600 /dev/rtlab/nucleo1_tty
verwenden. Die Zahl 9600 ist die Baudrate. Sie muss identisch sein mit der Baudrate, die auf dem Mikrocontroller programmiert wurde. Picocom beendet man mit Ctrl-A-X (Ctrl drücken, dann nacheinander A und X).
Es sind ausserdem die Programme minicom und putty installiert.
Es gibt noch eine zweite Möglichkeit: Dazu gibt man einfach estool --termemu ein. Das wird im Makefile beim Target make serial verwendet. In diesem Fall ist das Kommando in .estool/estool.yaml vorkonfiguriert. Der übliche Eintrag in dieser Datei ist:
termemu-command: [picocom, -b, '9600', --quiet, '{termemu_device}']
Den Platzhalter {termemu_device} füllt estool selber aus mit der aktuellen Gerätedatei zur seriellen Schnittstelle. Man kann dieses Kommando jederzeit ändern. Wichtig ist, dass man die korrekte Schreibweise (eckige Klammern, Komma) einhält.
2.6 Board über Webcam betrachten
VPN Verbindung zur Hochschule aufbauen.
Den Webcam-Videostrom betrachtet man z.B. mit vlc:
vlc http://141.82.48.195:8091
Hinweis: Der genaue URL wird von estool --bs-check ausgegeben, falls Board reserviert wurde.
2.7 GUI des Saleae Logikanalysators betrachen
Das Programm Logic läuft auf dem rtlab-remote Rechner.
Einen VNC Client installieren, z.B. Tiger-VNC oder Remmina.
Tiger VNC: apt install tigervnc-viewer tigervnc-common
VPN Verbindung zur Hochschule aufbauen
$ vncviewer 141.82.48.195:5901
Als Passwort mypasswd eingeben.
Hinweis: IP-Nummer und Port wird von estool --bs-check ausgegeben, falls Board reserviert wurde.
3 GNU Toolchain für 64-Bit Linux
Die GNU ARM Embedded Toolchain findet man hier:
Die aktuelle Version (10/2020) ist gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2.
Installation in /opt mit
sudo tar -C /opt -jxvf gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2
Umgebungsvariable PATH setzen in ~/.bashrc:
export PATH=$PATH:/opt/gcc-arm-none-eabi-9-2020-q2-update/bin
Zum Debuggen werden wir den arm-none-eabi-gdb-py verwenden, dazu muss man noch das Paket python2-dev installieren.
Auf dem rtlab-remote Server läuft das Programm boardserver im Hintergrund, es erledigt alle Sachen die beim Reservieren und Freigeben der Boards nötig sind. Der Quelltext (Python) ist frei, siehe
https://r-n-d.informatik.hs-augsburg.de:8080/hubert.hoegl/boardserver
Auch estool kann man sich ansehen, siehe
https://r-n-d.informatik.hs-augsburg.de:8080/hubert.hoegl/estool
Für Verbesserungen und Fehlerberichte bin ich immer dankbar.
4 Kurzanleitung zur Installation von estool und openocd
Virtuelle Umgebung in Python einrichten ("es2_pyenv"):
$ python -m venv es2_pyenv $ cd es2_pyenv $ . bin/activate # Zum Verlassen später "deactivate" eingeben
Quelltext von estool holen
git clone https://r-n-d.informatik.hs-augsburg.de:8080/hubert.hoegl/estool.git cd estool
Installation anstossen
sudo python3 -m pip install --upgrade .
Danach ist estool in der virtuellen Umgebung es2_pyenv installiert.
OpenOCD holen, konfigurieren, bauen und installieren
wget http://hhoegl.informatik.hs-augsburg.de/es2/tools/openocd-code.tar.gz tar zxvf openocd-code.tar.gz cd openocd-code # Achtung: hier evtl. Pakete "pkg-config" und "libusb-1.0-0-dev" nachinstallieren ./configure --enable-stlink --prefix=/opt/openocd-dev/ make sudo make install # PATH Umgebungsvariable in ~/.bashrc um /opt/openocd-dev/bin erweitern # Udev Regel installieren cp `estool -p`/etc/49-stlinkv2-1.rules /etc/udev/rules.d/ cp `estool -p`/etc/99-openocd.rules /etc/udev/rules.d/ cp `estool -p`/etc/100-saleae-logic.rules /etc/udev/rules.d/ # Pruefen, ob alle Vorbedingungen erfuellt sind estool -c # Demo-Projekt holen git clone https://r-n-d.informatik.hs-augsburg.de:8080/es2-nucl476/starter.git cd starter make make flash
Hinweis zu den OpenOCD Versionen
Die originale Version 0.10.0 (Download von https://sourceforge.net/projects/openocd) hat das Problem mit "-Werror" im Makefile. Damit die Kompilierung funktioniert, muss man -Werror entfernen. Ausserdem wird in der OpenOCD Konfigurationsdatei der Debug Adapter "stlink-v2-1" genannt. Das sieht man in der folgenden Zeile:
source [find interface/stlink-v2-1.cfg]
Wenn man eine neuere Version des OpenOCD verwendet (z.B. aus git: https://repo.or.cz/w/openocd.git), dann besteht das Problem mit -Werror nicht mehr. Ausserdem heisst der Debug Adapter dann "stlink", die Zeile in der Konfigurationsdatei ist dann
source [find interface/stlink.cfg]
Mit der früher verwendeten Zeile bekommt man eine Warnmeldung:
WARNING: interface/stlink-v2-1.cfg is deprecated, please switch to interface/stlink.cfg
Doku:
5 Eine .rst Datei nach .html übersetzen
- Das Paket python3-docutils installieren.
- Das Kommando rst2html5.py v1.rst v1.html ausführen.
Bei manchen Distributionen heisst das Programm nicht rst2html5.py sondern nur rst2html5!
6 "User Button" drücken auf dem RT-Lab Remote Server
Der Knopfdruck des User Button wird durch den ERC (ESP8266) simuliert. Dazu muss man folgende zwei estool Kommandos eingeben:
estool --bs-erc buttons=8 # Druecken der Taste (log. 0) estool --bs-erc buttons=0 # Loslassen Taste (log. 1)
7 Rekursive Suche in Verzeichnissen
Zum Beispiel mit rg Kommando ("ripgrep", https://github.com/BurntSushi/ripgrep). Ist auf dem RTLab-Remote Server installiert.
Suche nach dem String "EXTI" in allen .c und .h Dateien in und unter dem aktuellen Verzeichnis:
rg -g '*.[ch]' EXTI
Kommandoübersicht: https://www.philipdaniels.com/blog/2019/ripgrep-cheatsheet