18730
Kommentar:
|
18960
|
Gelöschter Text ist auf diese Art markiert. | Hinzugefügter Text ist auf diese Art markiert. |
Zeile 422: | Zeile 422: |
- Erstes Kapitel aus dem Buch *The Art of Debugging* | - Erstes Kapitel aus dem Buch *The Art of Debugging* (45 Seiten) |
Zeile 448: | Zeile 448: |
GDB vervollständigt viele Eingaben durch Drücken der Tablulator Taste. | GDB vervollständigt viele Eingaben durch Drücken der Tablulator Taste. Jedes Kommando kann verkürzt eingegeben werden, solange es eindeutig ist. Zum Beispiel ``br`` statt ``breakpoint``. In GDB bekommt man einen Hilfetext durch das ``help`` Kommando:: (arm-gdb) help breakpoint |
Embedded Systems II (WS18/19)
Inhalt
1 News
Erfahrungen aus dem zweiten Praktikum am 24.10 (Gruppe 2, V1):
Das "starter" Beispiel sollte bei allen funktionieren. Man holt es mit:
git clone https://r-n-d.informatik.hs-augsburg.de:8080/es2-nucl476/starter
Das Kommando es --ide sollte alle benötigten Fenster öffnen. Bitte auch den gdb Debugger testen, wie lange die Zeit dauert um mit dem step Kommando (kurz s) das Programm zeilenweise auszuführen.
Mit es -c findet man heraus, was bei der Installation nocht fehlt. Sollten die udev Regeln fehlen, dann dies hier ausfuehren:
# Udev Regel installieren sudo cp `es -p`/etc/49-stlinkv2-1.rules /etc/udev/rules.d/ sudo cp `es -p`/etc/99-openocd.rules /etc/udev/rules.d/ sudo cp `es -p`/etc/100-saleae-logic.rules /etc/udev/rules.d/
Es kann sein, dass auf Linux kein C Compiler installiert ist. Das löst man, indem man das Paket build-essential installiert.
Kann Probleme beim Kompilieren von openocd machen: Im virtuellen Linux, das Herr Schäferling für TI zusammengestellt hat, ist bereits der GCC für ARM vorinstalliert. Diesen Compiler nicht verwenden. Das Paket heisst gcc-arm-none-eabi, man löscht es mit apt remove gcc-arm-none-ebi. Wir verwenden statt dessen den gcc-arm von Launchpad, den man unter /opt installieren soll. Genaueres unter http://hhoegl.informatik.hs-augsburg.de/es2/eside/eside.html#id5.
Das Setzen der PATH Umgebungsvariable sollten sich manche nochmal anschauen:
Siehe den neuen Abschnitt GDB Befehle.
Erfahrungen, die wir beim ersten Praktikum am 17.10. (Gruppe 1, V1) gemacht haben:
Wo ist eigentlich der Versuch 1? Man holt ihn zunächst mit "git clone":
git clone https://r-n-d.informatik.hs-augsburg.de:8080/EmbSys2/v1
Der Aufgabentext ist in v1/doc/v1.rst.
Klonen in gitlab geht bei manchen nicht, obwohl der oeffentliche ssh Schluessel richtig in gitlab abgelegt wurde. Es hilft, wenn man einfach das Kommando ssh-add eingibt.
Die Werkzeuge funktionieren auch auf einem virtuellen Linux, das auf einem Windows 10 oder auf einem Linux als Host-Betriebssystem laeuft. Die beiden getesteten Rechner hatten USB3 Ports. Man muss in Virtualbox die Ports auf USB3 stellen, damit das Debuggen ueber USB schnell geht. Wie schnell der USB Zugriff ueber USB2 Ports geht, wurde nicht getestet.
Im Aufgabentext und in den Quelltexten von Versuch 1 waren die Angaben der Seitenzahlen in denManuals meist um ein paar Seiten falsch. Das habe ich korrigiert. Die Referenzen haben nun die Versionsnummer der Dokumente eingebaut, z.B. [RM0351R6] (= Rev. 6). Bitte mit git pull die Aenderungen holen.
Wo sind eigentlich die Dokumente zu den Angaben im Aufgabentext und in den Quelltexten, z.B. [RM0351R6]? Die Dokumente sind im Ordner es2home/Texte/. In ``es2home/index.html findet man Links auf die Dokumente.
Keim Kompilieren von OpenOCD 0.10.0 muss man bei manchen Linuxen vorher noch das Paket pkg-config installieren.
Das Paket openocd, das es in den meisten Linux Distributionen gibt, soll nicht installiert werden. Es hat meist die Version 0.9.0. Bei dieser Version wird nicht das L476-Nucleo Board unterstuetzt. Es bleibt also nur, die Version 0.10.0 selber zu kompilieren und zu installieren.
Wer Vim kennenlernen moechte, der sollte das Kommando vimtutor starten. Wenn Vim noch gar nicht installiert ist, sollte man ihn zunaechst installieren mit: sudo apt install vim.
Fuer den Editor kate gibt es ein ctags Plugin:
https://docs.kde.org/trunk5/en/applications/kate/kate-application-plugin-ctags.html
2 Organisatorisches
Ablauf
Die Veranstaltung Embedded System II findet wöchentlich am Mittwoch Nachmittag ab 14 Uhr statt. Am Anfang ist eine 90-minütige Vorlesung, danach finden zwei Blöcke Praktikum statt.
Wöchentliches Praktikum
Für das Praktikum werden die TeilnehmerInnen der Veranstaltung in zwei Gruppen G1 und G2 geteilt, die im wöchentlichen Wechsel im Praktikum sein werden. In jeder Gruppe werden Teams gebildet mit zwei bis drei TeilnehmerInnen.
Die Aufgaben sollen in der zweiwöchigen Vorbereitungszeit gründlich vorbereitet werden, so dass beim Praktikumstermin die Aufgaben fertiggestellt und abgenommen werden können. In der zweiwöchigen Nachbereitungszeit soll der Bericht aktualisiert werden.
Die Bewertung der Aufgaben erfolgt nach den Ampelfarben: Grün steht für die erfolgreiche Abgabe, gelb steht für Nacharbeit und rot gibt es für fehlende Abgaben. Das Praktikum ist nicht bestanden bei zwei oder mehr roten Abgaben. Zwei mal gelb steht für einmal rot.
Im Praktikum herrscht Anwesenheitspflicht!
Bericht
Jedes Team schreibt von Anfang an einen Bericht über das Praktikum. Bei jedem Praktikumstermin wird der Fortschritt des Berichtes kontrolliert. Am Ende der Veranstaltung (siehe Zeitplan) wird der komplette Bericht abgegeben. Damit eine individuelle Notenvergabe erfolgen kann, müssen die von den jeweiligen Teammitglieder geschriebenen Abschnitte im Bericht kenntlich gemacht werden.
Es gibt ein Gerüst für den Bericht im Format Restructured Text bzw. Sphinx. Der Bericht soll ein einheitliches Deckblatt für alle Projektgruppen haben.
Für das Fritzing Werkzeug (http://fritzing.org) habe ich das STM32 Nucleo Board und ein kleines Steckbrett nebeneinander platziert:
- Fritzing Datei (.fzz): http://hhoegl.informatik.hs-augsburg.de/es2/img/es2-template.fzz
- PNG Bild: http://hhoegl.informatik.hs-augsburg.de/es2/img/es2-template_bb.png
Diese Vorlage dürfen Sie gerne in Ihrem Bericht verwenden.
Finale Abgabe
Der Bericht muss spätestens am Stichtag (siehe Zeitplan) bis Mitternacht von allen Teams in elektronischer Form abgeschickt werden an <Hubert.Hoegl@hs-augsburg.de>.
Klausur
Die erfolgreiche Teilnahme am Praktikum ist die Bedingung für die Teilnahme an der Klausur. Vergangene Klausuren finden Sie unter
3 Kursmaterial
In diesem Semester werde ich alle für den Kurs benötigten Dateien in einem Archiv verpacken. Der Download-Link ist
http://hhoegl.informatik.hs-augsburg.de/es2/nonfree/es2home.tar.gz
Ein paar Online-Texte sind hier:
- Skript http://hhoegl.informatik.hs-augsburg.de/es2/skript
- ESIDE Dokumentation (mit Installationsanleitung)
- Anleitung "Berichte mit Sphinx schreiben" http://hhoegl.informatik.hs-augsburg.de/dva/sphinxbericht/
4 Zeitplan
4.1 10.10.2018
Vorlesung: Motivation, Einführung
Vorfuehrung: Demo-Programm "starter", nur unter Verwendung von freien Kommandozeilenwerkzeugen in mehreren Terminal-Fenstern.
Praktikum: Es gibt eine Einführung in die Linux Kommandozeile mit git, sphinx, tmux, picocom. Findet nur an diesem Tag auch im M1.02 statt!
4.2 17.10.2018
Vorlesung: Organisation des Hauptspeichers, "Sections", Abbildung der Bestandteile eines C Programmes auf die Sections, Debuggen mit GDB, häufig verwendete Funktionsbloecke im STM32L4.
Vorführung des Beispielprogrammes "starter": https://r-n-d.informatik.hs-augsburg.de:8080/es2-nucl476/starter
Hausaufgabe: Lacamera, Kap. 1 und 2 (insgesamt 49 Seiten)
Praktikum: Gruppe 1 beginnt mit Versuch 1 im G2.16.
4.3 24.10.2018
Vorlesung: Gegenüberstellung "bare metal" und Programmierung mit CubeL4 + libc. Aufbau der Cube Bibliothek (HAL, LL, BSP, Beispiele, CMSIS). Tags erzeugen von allen Quelltexten mit es -t (Konfiguration in .eside/tagsconf.py). Standard C Bibliothek benötigt syscalls.c, da kein Betriebssystem-Kernel vorhanden ist. Projekte in es2-nucl476/cube_demos in Vim betrachtet. Navigation mit tags. Startup-Code in Assembler startup_stm32l476xx.s (von CMSIS), Interrupt-Handler stm32l4xx_it.c, System-Initialisierung in system_stm32l4xx.c.
Hausaufgabe: Yiu, Kap. 1, 2, 17
Praktikum: Gruppe 2 beginnt mit Versuch 1
4.4 31.10.2018
Vorlesung: Es geht haupsächlich um die Funktionsblöcke im Mikrocontroller, die wichtig bei der Initialisierung sind: RCC, PWR, GPIO/Alternate Functions. Zusätzlich bei Interrupts: NVIC, SCB, SYSCFG, EXTI.
Praktikum: Gruppe 1 gibt Versuch 1 ab und beginnt mit Versuch 2.
4.5 7.11.2018
Vorlesung: Kommentar zum bisherigen Stand der Praktikumsberichte; Demonstration des Beispielprojektes gpio-intr-cmsis: Praktisches Beispiel zu den eher theoretischen Erläuterungen von der letzten Veranstaltung. Das Programm ist auf der CMSIS Abstraktionsebene geschrieben. Es erzeugt einen Interrupt beim Drücken der User-Taste. Der Interrupt führt zum Umschalten der grünen LED.
https://r-n-d.informatik.hs-augsburg.de:8080/es2-nucl476/gpio-intr-cmsis
Praktikum: Gruppe 2 gibt Versuch 1 ab und beginnt mit Versuch 2.
4.6 14.11.2018
Vorlesung: System handler, SysTick, bus fault, usage fault, hard fault, integer division by zero, FPU division by zero interrupt, SVC handler.
https://r-n-d.informatik.hs-augsburg.de:8080/es2-nucl476/syshandler-cmsis
Praktikum: Gruppe 1 gibt Versuch 2 ab und beginnt mit Versuch 3.
4.7 21.11.2018
Vorlesung: Hier ging es hauptsächlich um Parallelität:
- https://r-n-d.informatik.hs-augsburg.de:8080/es2-nucl476/taskswitch
- https://r-n-d.informatik.hs-augsburg.de:8080/es2-nucl476/shared-data-problem
Praktikum: Gruppe 2 gibt Versuch 2 ab und beginnt mit Versuch 3.
4.8 28.11.2018
Vorlesung: Low-power
Beispielprogramm: https://r-n-d.informatik.hs-augsburg.de:8080/EmbSys2/stm32cubel4/tree/master/examples/PWR/PWR_ModesSelection
Lit.:
- http://hhoegl.informatik.hs-augsburg.de/es2/prog/keil_grobe_energyeff.pdf (S. 1-9)
- Elecia white, Making Embedded Systems, chap. 10 "Reducing Power Consumption" (siehe Lit. in Skript)
- STM32L4 ultra-low-power features overview (AN4621), 2017
- STM32L4 Reference Manual, chap. 5.3 "Low-power modes"
Praktikum: Gruppe 1 gibt Versuch 3 ab.
4.9 5.12.2018
Vorlesung: Evaluierung (Ausfüllen der Formulare), Rückmeldung zu den Berichten.
Praktikum: Gruppe 2 gibt Versuch 3 ab.
4.10 12.12.2018
Vorlesung: Besprechung der Evaluierung; Klausurvorbereitung.
Praktikum: Zeit für Nachholer.
4.11 19.12.2018
Finale Abgabe der Berichte bis spätestens 24 Uhr.
5 Praktikum
5.1 Vorbereitung
- git bzw. gitlab, sphinx, tmux, picocom
- Editieren in Linux: vim, emacs, gedit, atom, sublime, ...
- GNU Tools
- Tipps zur Linux Administration, z.B. lsusb, udev Regeln und weitere
- Vorbereiten des Hostrechners
- Installation der "eside"
5.2 Versuch 1
"Bare metal" Programmierung des STM32L476. Fragen zum Nucleo Board, zur GCC Toolchain, zum Startup Code, zur seriellen Schnittstelle. Das Git Repository zum Versuch 2 ist hier:
https://r-n-d.informatik.hs-augsburg.de:8080/EmbSys2/v1
Video "Getting started with STM32L4": https://youtu.be/myx_UKe0SSU (ca. 1:20)
5.3 Versuch 2
Programmierung mit der STM32Cube Bibliothek
6 Empfohlene Literatur
Joseph Yiu, The Definitive Guide to ARM® Cortex®-M3 and Cortex®-M4 Processors, 3rd Edition, Newnes 2013.
Daniele Lacamera, Embedded Systems Architecture, Packt Publishing, 2018.
http://proquest.tech.safaribooksonline.de/book/software-engineering-and-development/9781788832502
Carmine Noviello, Mastering the STM32 Microcontroller, Leanpub 2016.
Rüdiger R. Asche, Embedded Controller. Grundlagen und praktische Umsetzung für industrielle Anwendungen, Springer 2016.
Freier Download für Hochschulangehörige von https://link.springer.com.
Geoffrey Brown, Discovering the STM32 Microcontroller, 2016 (free book)
Elecia White, Making Embedded Systems, O'Reilly 2011.
http://proquest.tech.safaribooksonline.de/book/programming/9781449308889
7 Tutorials
Linux
Tmux Tutorials
- http://hhoegl.informatik.hs-augsburg.de/es2/tmux/tmux-lj-3-2016.pdf
- https://danielmiessler.com/study/tmux
Vim Tutorials
- Quick Reference http://hhoegl.informatik.hs-augsburg.de/vim/vim_quick_reference_card.pdf
- Vim for C Programmers http://hhoegl.informatik.hs-augsburg.de/vim/vim-for-c-programmers.pdf
- Derek Wyatt's Vim Tutorial Videos http://derekwyatt.org/vim/tutorials/
- OpenVIM interactive tutorial http://www.openvim.com/tutorial.html
- Steve Oualline, Vim Book ftp://ftp.vim.org/pub/vim/doc/book/vimbook-OPL.pdf
- Swaroop CH, A Byte of Vim, https://vim.swaroopch.com
- Jesse Goerz, Beginner's guide to Vi Improved (vim), http://newbiedoc.sourceforge.net/text_editing/vim.html.en
- http://vim-adventures.com
- https://vimgifs.com
GDB Tutorials
Erstes Kapitel aus dem Buch The Art of Debugging (45 Seiten)
Peter J. Salzman's GDB tutorial: http://hhoegl.informatik.hs-augsburg.de/es2/gnu/gdb (die originale Seite http://www.dirac.org/linux/gdb ist nicht mehr erreichbar)
RMS's GDB tutorial: http://www.unknownroad.com/rtfm/gdbtut
Git
- Freies Pro Git Buch https://git-scm.com/book/de/v2
8 GDB Befehle
Alle Demo-Projekte enthalten eine GDB Startup Datei .eside/gdbinit.
GDB immer im "Text User Interface" Modus starten (Option --tui, siehe Makefile).
GDB vervollständigt viele Eingaben durch Drücken der Tablulator Taste. Jedes Kommando kann verkürzt eingegeben werden, solange es eindeutig ist. Zum Beispiel br statt breakpoint.
In GDB bekommt man einen Hilfetext durch das help Kommando:
(arm-gdb) help breakpoint
Breakpoints ausgeben:
(arm-gdb) info br Num Type Disp Enb Address What 1 breakpoint keep y 0x0800015e in main at main.c:47
Breakpoints kann man löschen mit del <Num>. Man kann sie auch deaktivieren/aktivieren mit disable <Num> und enable <Num>. Mit cont führt man das Programm bis zum nächsten Breakpoint (oder bis zum Programmende) aus.
Breakpoint z.B. auf Funktion toggle_led() setzen: br toggle_leds. Die Funktionsnamen vervollständigt GDB durch die TAB Taste. Man kann auch Zeilennummern verwenden, z.B. br 192.
Variablen ausgeben mit p <variable>.
Lokale Variable ausgeben mit <Funktion>::<Variable>:
(arm-gdb) p main::loopcnt $2 = 0x4e
Adressen von globalen Variablen ausgeben am Beispiel von globavar:
(arm-gdb) p &globvar $1 = (int *) 0x2000000c <globvar>
Anregung: Definieren Sie Variablen in unterschiedlichen Speicherabschnitten und finden Sie die Adressen:
int g_bss; int g_data = 4; uint8_t g_array[] = {2, 14, 29, 7, 0}; const int g_cdata = 5;
Ordnen Sie die gefundenen Adressen in die Abschnitte des Linker-Scripts ein. Schauen Sie sich in diesem Zusammenhang auch das GCC Werkeug arm-none-eabi-nm an. Es findet Adressen in ausführbaren Programmen.
Displays. Man kann sich mit display Variablen und Register automatisch nach jedem Breakpoint anzeigen lassen:
br 192 display hADCxConvertedData_Temperature_DegreeCelsius
Ausgeben des Speichers ("memory dump"). Die Variable g_data hat den Wert 4. Aufpassen: Das Kommando x/1xw g_data interpretiert den Wert von g_data als Adresse auf den Speicher! Der meist gewünschte Output wird erst durch x/1xw &g_data erreicht.
(arm-gdb) x/1xw g_data 0x4: 0x080001c5 (arm-gdb) x/1xw &g_data 0x20000000 <g_data>: 0x00000004
Geben Sie alle Elemente von g_array aus. Dazu müssen Sie das Kommando x modifizieren, eine Hilfe bekommen Sie durch (arm-gdb) help x.
Variable auf neuen Wert setzen:
(arm-gdb) set var g_bss = 21
GDB "Oberfläche" auf mehrere Fenster umschalten, in denen der C Quelltext, die Assemblerbefehle und die Kommandos stehen:
(arm-gdb) C-x 2
Die Angabe C-x 2 bedeutet: zunächst Steuerung-x drücken, Finger weg, dann die 2 drücken. Mehrfaches C-x 2 schaltet verschiedene Ansichten durch.
Programm wieder von Anfang an ausführen:
(arm-gdb) monitor reset halt (arm-gdb) continue
In gdbinit gibt es dazu das selbst definierte Kommando debug-program.
Watchpoints unterbrechen den Programmablauf, wenn eine Variable geschrieben oder gelesen wird:
(arm-gdb) watch hADCxConvertedData_Temperature_DegreeCelsius
Kommandos mit Breakpoints verknüpfen. Das folgende Beispiel legt ein print Kommando für den Breakpoint Nr. 5 an. Es können auch mehrere Kommandos vor dem end aufgenommen werden. Nach jedem Breakpoint Nr. 5 wird die Kommando-Liste abgearbeitet.
commands 5 p hADCxConvertedData_Temperature_DegreeCelsius end
Bedingte Breakpoints, zusätzlich mit Kommandoliste:
set $tmp = hADCxConvertedData_Temperature_DegreeCelsius b 192 if $tmp != hADCxConvertedData_Temperature_DegreeCelsius commands set $tmp = hADCxConvertedData_Temperature_DegreeCelsius p hADCxConvertedData_Temperature_DegreeCelsius continue end
GDB Kommandos lassen sich in eine Textdatei schreiben und auf dem GDB Prompt mit source``ausführen: ``(arm-gdb) source gdbcmd.