#language de #format rst ============================ Embedded Systems Anleitungen ============================ .. contents:: Inhalt .. sectnum:: 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 `_ RTLAB-Remote ------------ Einloggen ````````` VPN Verbindung zur Hochschule aufbauen ``ssh @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. 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 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 Programm flashen und ausführen `````````````````````````````` ``$ make flash`` 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. 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. 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. GNU Toolchain für 64-Bit Linux ------------------------------ Die GNU ARM Embedded Toolchain findet man hier: https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads 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. 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: * http://hhoegl.informatik.hs-augsburg.de/es2/estool/estool.html * https://r-n-d.informatik.hs-augsburg.de:8080/hubert.hoegl/estool/-/blob/master/estool/doc/quickref.pdf 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``! "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) 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