Overview Software development with Linux Using Multitasking in Microcontrollers URL: http://hlb-labor.de/lehre 1
Chapter 1 Software development under Linux OS 2
Softwareentwicklung mit Linux Was ist Linux? Das Linux Dateisystem Aufsetzen des Betriebssystems Installation von Softwarepaketen Werkzeuge ToolChain_STM32 Versionskontrollsysteme 3
Historie von Linux 1991 begann Linus Torvalds in Helsinki (Finnland) mit der Entwicklung einer Terminal-Emulation, um unter anderem seinen eigenen Computer besser zu verstehen. Mit der Zeit merkte er, dass sich das System immer mehr zu einem Betriebssystem entwickelte und kündigte es daraufhin in der UsenetThemengruppe für das Betriebssystem Minix, comp.os.minix an.[3] Im September desselben Jahres sollte das System dann auf einem Server den Interessierten zur Verfügung gestellt werden. Da der damalige FTP-ServerAdministrator Ari Lemmke mit den von Torvalds vorgesehenen Namen Freax oder Buggix nicht einverstanden war, stellte jener es stattdessen in einem Verzeichnis mit dem Namen Linux zur Verfügung. Torvalds widersetzte sich anfangs dieser Namensgebung, gab seinen Widerstand aber schnell auf, da er nach eigener Aussage eingestehen musste, dass Linux einfach ein besserer Name war. Linux wurde zu dieser Zeit noch unter einer eigenen Lizenz veröffentlicht, welche die kommerzielle Nutzung verbot. Schnell merkte Torvalds aber, dass diese hinderlich war, und entschied sich dazu, allen Entwicklern deutlich mehr Freiraum zu geben. Er und seine Mitautoren stellten daraufhin im Januar 1992 Linux unter die GNU GPL[4]. Somit konnte man Linux in GNU integrieren und dies als das erste freie Betriebssystem vertreiben. Dieser Schritt machte das System für eine noch größere Zahl von Entwicklern interessanter, da es für diese die Modifizierung und Verbreitung vereinfachte. 1996 kündigte Torvalds an, dass er einen Pinguin als Maskottchen für Linux haben wolle, und schrieb einen Wettbewerb aus, aus dem schließlich der populäre Tux hervorging. Quelle: http://de.wikipedia.org/wiki/linux#historische_entwicklung 4
Was ist Linux? Kernel Das Programm init Shells Benutzerverwaltung Grafische Benutzeroberfläche Anwendungen Distributionen Community 5
Der Linux Kernel Oberboss im System Lizensiert unter GNU General Public License 2 Komponenten Speicherverwaltung Gerätetreiber Multitasking Scheduler Interprozesskommunikation Paketfilter (Firewall) Quelle: http://kernel.org/ 6
GNU General Public License 2 Copyleft Prinzip Lizenznehmer: Alle abgeleiteten Werke auch GPL 2 Autor: Darf Werk auch unter anderen Lizenzen veröffentlichen Lizenznehmer muss Quelltext veröffentlichen! Mehrere Gerichtsverfahren gegen Firmen z.b. 2006 Verfahren gegen D-Link http://dejure.org/dienste/vernetzung/rechtsprechung?text=2-6+o+224/06 7
Das Programm /sbin/init Erstes Programm bei jedem Systemstart Startet alle weiteren Programme verwaltet Runlevel 0. System anhalten 1. Einzelbenutzer (meistens root) 2. Mehrbenutzer ohne Netzwerk 3. Mehrbenutzer mit textueller Oberfläche 4. Reserviert/ Unbenutzt 5. Mehrbenutzer mit grafischer Oberfläche 6. Rechner wird neugestartet Befehle (als Superuser) > runlevel > init <N> gibt aktuellen Runlevel aus schaltet in Runlevel <N> 8
Das Linux Dateisystem Dateisystem ist Zentralbibliothek des Rechners Linux Philosophie: Alles ist eine Datei! Laufwerke immer in Ordner eingehängt / ist die Wurzel von allem alles andere darunter Zugriff auf Hardware über virtuelle Dateien Zugriffsrechte/ Schutzbits Versteckte Dateien 9
Laufwerke in Ordnern keine Laufwerkbuchstaben! Einhängen eines Laufwerks mittels mount Benötigt oft Superuser Rechte (sudo) sudo mount /dev/sda2 /media/home Anzeige der Mountpoints mittels df oder mount > df -h Dateisystem rootfs devtmpfs tmpfs /dev/sda1 /dev/sda2 Größe Benut Verf Ben%% Eingehängt auf 20G 18G 2,9G 86% / 984M 228K 984M 1% /dev 990M 1,4M 988M 1% /dev/shm 20G 18G 2,9G 86% / 54G 46G 5,2G 90% /home 10
/ ist die Wurzel Immer ein Laufwerk in / eingehängt => Bei Neuinstallation reicht eine /-Partition alle anderen Datenträger in Unterordnern /-Verzeichnis (Beispiel opensuse) /bin Kommandos für root und normale Benutzer /boot Kernel und für Bootvorgang benötigte Dateien /dev Virtuelles Dateisystem devfs enthält Dateien für Zugriff auf Hardwaregeräte /etc Systemkonfiguration (globale Einstellungen für alle Benutzer) /home Jeder Benutzer für gewöhnlich ein eigenes Verzeichnis /lib Gemeinsam genutzte Programmbibliotheken /media Dynamische Datenträger wie z.b. USB-Sticks, CDROM Laufwerke,... /opt Optional installierte Software (z.b. QtSDK) /proc Virtuelles Dateisystem mit Informationen zum laufenden System /root Das Heimatverzeichnis des Superusers /sbin Befehle zur Systemverwaltung (nur mit Superuser Rechten benutzbar) /sys Virtuelles Dateisystem sysfs eine erweiterte Darstellung von devfs (/dev) /usr Die meisten Anwendungen sind hier installiert /var Variable Informationsdateien und Datenbanken Quelle: http://fibel.org/linux/lfo-0.6.0/node63.html 11
Der Ordner /dev Hardwaregeräte in Form von Dateien sichtbar Vom Kernel mittels devtmpfs automatisch gefüllt Beispieleinträge Ein Eintrag pro Festplatte und pro Partition /dev/sda Festplatte 1 /dev/sda1 Festplatte 1 Partition 1 Serielle Schnittstellen /dev/ttys0 /dev/ttyusb0 /dev/null interne serielle Schnittstelle erster USB-Seriell Wandler schluckt alle eingehenden Zeichen 12
Zugriffsrechte/ Schutzbits Für jede Datei drei Gruppen (E) (G) (A) Eigentümer Gruppe Andere Drei Arten von Schutzbits r darf lesen w darf schreiben x darf ausführen Schutzbits in Textdarstellung EEEGGGAAA > ls -l -rw-r--r-- 1 gregor users 43 11. Okt 13:35 Quellen.txt > chmod g+w Quellen.txt > ls -l -rw-rw-r-- 1 gregor users 43 11. Okt 13:35 Quellen.txt 13
Versteckte Dateien Dateien/ Ordner die mit Punkt beginnen Normalerweise nicht angezeigt Enthalten oft Einstellungen Bei Kopier- /Verschiebeaktionen ignoriert Punkt Einträge anzeigen > ls -al -rw-r--r-- 1 gregor gregor 3973 2011-10-12 09:30.springrc drwx------ 2 gregor gregor 480 2011-08-24 04:18.ssh Punkt Einträge kopieren cp -R \.* Ziel/ Im Dateiimanager versteckte Dateien anzeigen 14
Aufsetzen des Betriebssystems Wir machen uns die Hände schmutzig! Beispiel anhand Distribution Xubuntu http://xubuntu.org/ Installation in VirtualBox Emulator http://virtualbox.org/ 15
Linux Distro herunterladen 32 Bit Version (x86) optimal für Virtualisierung weniger Speicherbedarf einfacher zu emulieren 64 Bit Version (x64) optimal bei nativer Installation 16
Virtuelle Maschine erstellen 17
Namen vergeben 18
1GB RAM mindestens 19
Virtual Disk Image 20
Bootfestplatte erzeugen 21
Feste Größe ist schneller 22
20GB reichen zunächst 23
Zeit für einen Kaffee 24
ISO Image als virtuelle CD 25
Start von virtueller CD 26
Maus befreien: Strg Rechts 27
Inklusive Online Updates 28
Manuelle Partitionierung 29
Neue Partitionstabelle 30
Partition hinzufügen 31
Eine / Partition ist Pflicht! 32
Jetzt installieren 33
Ohne Swap fortfahren Auslagern auf virtuelle Festplatte langsam! Besser mehr Speicher für Maschine 34
Anmeldedaten 35
Ein gutes Passwort wählen GROSS- und kleinbuchstaben Ziffern Sonderzeichen,.! $ % & / ( ) = + Einen leicht zu behaltenen Satz wählen: Mann was der wieder für einen Quatsch sagt Sonderregeln (ein 1, sagen ;) Mwdwf1Q; Insgesamt 8 Zeichen! 36
Das kann dauern! 37
Neustart bestätigen 38
Ein aufgeräumter Desktop 39
Updates suchen 40
Updates installieren 41
Anwendungen installieren Änderungen am System nur als Superuser (root) Verschiedene Optionen Paketmanager Installationsskripte einzelne Pakete Quelltext 42
Der Superuser Ich bin /root, ich darf das! Eigenes Homeverzeichnis /root Darf jede Datei verändern Nur zur Systemkonfiguration Superuser werden > sudo su Etwas als Superuser ausführen > sudo reboot -n 43
Installation per Paketmanager Königlich einfache Bedienung Große Auswahl vorkonfigurierter Softwarepakete Abhängigkeiten automatisch aufgelöst Automatische Updates opensuse: yast, kpackagekit Debian: apt-get, aptitude, synaptic, kpackagekit 44
Installationsskripte Ähnlich Installation unter Windows OS Ausführbares Programm von Webseite Oft Dateinamensendung.run Datei muss ausführbar gemacht werden chmod +x DATEI Eigenschaften/ Dateizugriff im Dateimanager Oft als Superuser starten sudo./datei Beispiele QtCreator Grafikkartentreiber (NVIDA/ AMD) 45
Installation einzelner Pakete Für Fortgeschrittene User Per Suchmaschine suchen Muss zur Distribution passen opensuse, RedHat: sudo rpm install FILE.rpm Debian:.deb Format sudo gdebi FILE.deb Keine automatischen Updates! 46
Installation aus Quellen Pain in the Ass Suchen der richtigen Version neueste Quellen oft instabil Installationsanleitungen oft veraltet Neu kompilieren COMPILE.txt/ INSTALL.txt lesen! Foren durchsuchen Abhängigkeiten von Hand lösen Fehlermeldungen lesen Fehlende Software installieren Installationsscript erstellen (Fortgeschritten) 47
Gasterweiterungen Installieren Ermöglichen Gemeinsame Ordner Geteilter Zwischenspeicher 3D Grafikbeschleunigung Größenänderungen des Fensters 48
Skript nicht ausführbar Typisches Problem ISO Dateisystem hat keine Schutzbits 49
Shell im Ordner starten 50
autorun.sh direkt starten 51
Gasterweiterungen installiert 52
Wieder neustarten 53
Übung: Installieren Linux Distribution eigener Wahl installieren opensuse, Ubuntu/ Kubuntu, Debian, in virtueller Maschine oder als Dualboot System Darauf folgende Software installieren: QtCreator (http://qt.nokia.com/) git yakuake STM32_ToolChain (http://hlb-labor.de/cortexm3) 54
Console Textuelles Eingabeinterface Erste Console 1991 vom Kernel bereitgestellt Ursprünglich Ausgabe direkt in Grafikkartenpuffer Terminal ist Entsprechung unter grafischer Oberfläche Immer noch erreichbar per Strg+F1,... 55
Shell Jede Konsole startet eine Shell Interpretiert menschliche Texteingaben Es gibt verschiedene Shells bash, csh, tcsh, (unterschiedliche Kommandosyntax!) Grundfunktionen Starten von Programmen Ausführen von Skripten Vollständige Programmiersprache Umsetzen von Pipe Anordnungen Bereitstellung von Umgebungsvariablen Umleitung von Textausgaben 56
Shell Jede Konsole startet eine Shell Interpretiert menschliche Texteingaben Es gibt verschiedene Shells bash, csh, tcsh, (unterschiedliche Kommandosyntax!) Grundfunktionen Starten von Programmen Ausführen von Skripten Vollständige Programmiersprache Umsetzen von Pipe Anordnungen Bereitstellung von Umgebungsvariablen Umleitung von Textausgaben 57
Programme starten Goldene Regel: Dateien immer tabben! Ausführbare Datei finden absoluter/ relativer Pfad geht immer > /bin/less Suche im Suchpfad Variable $PATH zu durchsuchende Verzeichnisse > echo $PATH./:/home/gregor/bin:/bin:/opt/QtSDK/QtCreator/bin/:..../ ist aktuelles Verzeichnis 58
Ausführen von Skripten Synonym: Batchdatei Erste Zeile definiert Interpreter #!/bin/bash #!/usr/bin/perl x Bit gesetzt: chmod +x DATEI Keine Dateinamensuffixe unter Linux! Oft aktuelles Verzeichnis nicht im Pfad 59
Shell Programmierung Variablen VARIABLE= WERT echo $VARIABLE Kontrollstrukturen if [ BEDINGUNG ]; then... fi for A in a b c... ; do... done Kein goto in bash! 60
Pipeanordnungen Idee: Kleine Befehle als Werkzeugkasten Kombination einfacher Befehle ist mächtig Pipe ist Verbindung zweier Befehle Pipesymbol ist senkrechter Strich A B Textausgabe von A ist Texteingabe für B cat hallo.txt grep Welt Lange Pipeketten möglich 61
Umgebungsvariablen Jede Shell erbt Variablen von Umgebung Neue Variablen in Elternshell unbekannt Variablen anzeigen: export (Bash) Nur exportierte Variablen weiter vererbt Variablen sterben mit ihrer Shell permanent durch Eintrag in Startup Skript Zuweisung: VARIABLE= Wert 62
Textausgaben umleiten Jedes Programm 1 Eingabestrom: STDIN 2 Ausgabeströme: STDOUT, STDERR Eingabe aus Datei: BEFEHL <DATEI Ausgabe in Datei: Zieldatei überschreiben: BEFEHL >DATEI1 2>DATEI2 An Zieldatei anhängen: BEFEHL >>DATEI1 2>>DATEI2 STDERR nach STDOUT umleiten: 2>&1 63
Shell Startup Skript Bei Start/ Login automatisch ausgeführt /etc/bash.bashrc ~/.bashrc ~/.profile ~/.login Beispiele: Suchpfad zu qtcreator > echo 'export PATH= /opt/qtsdk/qtcreator/bin/:$path' >>~/.bashrc Permanenter alias > echo 'alias ll= ls -lh ' >>~/.bashrc 64
Werkzeuge man cat less find grep gcc/ g++ make openocd gdb 65
Befehl man (1) Textbasiertes Anleitungssystem Ausführliche Beschreibungen Praktisch jeder Befehl beschrieben Programmierhandbuch Tastenzuordnungen Pfeiltasten Blättern / nach Text suchen Beenden q Alternative: info 66
Befehl man (2) Verschiedene Ebenen > man EBENE SCHLÜSSELWORT 1 2 3 4 5 6 7 8 9 Ausführbare Programme oder Shellbefehle Systemaufrufe (Kernelfunktionen) Bibliotheksaufrufe (Funktionen in System-Bibliotheken) Spezielle Dateien (gewöhnlich in /dev Dateiformate und Konventionen, z. B. /etc/passwd Spiele Makropakete und Konventionen, z. B. man(7), groff(7) Systemadministrationsbefehle (in der Regel nur für root) Kernelroutinen [Nicht Standard] > man 1 open > man 2 open 67
Befehl cat Dateiinhalt ausgeben Oft Start einer Pipe > cat DATEI grep FOO less Here-Skript in Shell-/ Perl-Skript cat << END_OF_TEXT Hello World END_OF_TEXT 68
Befehl less Zeigt Dateiinhalt an Interaktives bidirektionales Blättern Suchfunktion: / Beenden: q 69
Befehl find Suchen von Dateien > find STARTPFAD -name MUSTER Viele Optionen zur Suchkonfiguration Verknüpfung mittels -and / -or Expression für jede gefundene Datei Default: -print Externes Programm: -exec BEFEHL {} \; Beispiele: > find /home -name \.* less > find./ -name *.txt -exec less {} \; man find 70
Befehl grep Universeller Suchbefehl Sucht im Eingabestrom nach Muster Gibt alle Zeilen aus, die Muster enthalten Syntax: grep MUSTER DATEI > grep Hallo HalloWelt.txt > cat HalloWelt.txt grep Hallo Kombination mit find > find./ -name *.h grep -n MUSTER man grep 71
Befehl gcc/ g++ Universeller Übersetzer Preprozessor C/ C++ Compiler Linker Assembler Übersetzen: gcc -c DATEI.c Linken: gcc DATEI1.o DATEI2.o -o OUT man gcc (10575 Zeilen) 72
Befehl make Führt makefile aus Umsetzung von Abhängigkeiten Einfache Regeln A.x mittels BEFEHL aus A.y erstellt Gegeben A.y, B.y, C.y, Für Ziel Z: Erstelle A.x, B.x, C.x, Ausnutzung Parallelität: make -jn (N = 2x CPU-Kerne) Für C wesentliche Dateiendungen.s.c.h.o Assembler Quelltext C Quelltext C Headerdatei Objektdatei (aus.c oder.s erstellt) 73
makefile Steuerdatei für make Regeln zur Übersetzung Konfigurationsoptionen Definition von Übersetzungsziele (ZIEL:) Quellverzeichnisse Zu erzeugender Objektdateien Name der Ausgabedatei Übersetzungsoptionen 74
GNU Make Quellen Offizielles Handbuch http://www.gnu.org/software/make/manual/make.pdf Deutsches Tutorial http://www.ijon.de/comp/tutorials/makefile.html 75
ToolChain_STM32 Collection of Scripts Automatically downloads aprox. 500MB Sources patched and compiled Compiler binaries Programmer/ Debugger uc Libraries 76
Features ToolChain Downloaded + installed automatically FreeRTOS Multitasking Scheduler STM-StdPeripheralsLibrary Compiler Suite ARM NONE EABI FTDI Treiber für JTAG Programmer current OpenOCD (snapshot from SVN) multiple Ethernet TCP/IP Stacks LCD-Monitor Text + Graphic Mathematic Fixpoint Library 77
Creating a new project Start the adventure! 1. cd ToolChain_STM32 2../createNewProject.pl TEST FOO 3. cd../test 4. configure Makefiles 5. configure Programmer 6../compile.sh 7. Debug 78
Skript createnewproject.pl./createnewproject PROJECT AUTHOR copies template project Creates new folder in../ Fills in name of project and author Created folder may be moved anywhere 79
Template Project Complete, standalone framework Should run on most Cortex M3 boards Support for QtSDK Editor open file ProjektName.creator from QtCreator Compile: >./compile.sh Missing ToolChain downloaded + installed 80
Makefile Parsed for every compile.sh run Defines how to make things Which object files to compile Where to find.c/.h/.s -files Which constants to define Which files to include Dependencies between build targets 81
Configure Makefile (1) (2) (3) (4) (5) (6) (7) (8) (9) basic constants where to find h-files where to find c-files where to find s-files automagically collect files define ucontroller to use minimize code size phony build targets add some general files 82
Makefile - basic constants Compileroptimizations (-O) O0 O1 O3 Os no Optimizations (for Debugging) simple Optimizations maximal Optimizations creates smallest Binary > man gcc 83
Makefile where to find h-files Header files benötigt für #include gcc Parameter -I definiert einen Includepfad \ am Zeilenende: mit nächster Zeile fortfahren $(INCLUDE_DIRS) enhält viele -I Einträge $(INCLUDE_DIRS) direkt an gcc gegeben Headerfile finden: gcc durchläuft Liste der -I Einträge 84
Makefile where to find c-files C-Sources compiled into separate.o files vpath.%c stores list of folders vpath.%c only used by make Whenever FOO.o should be created Make searches all folders in vpath.%c The first found file FOO.c will be compiled 85
Makefile where to find s-files.s files contain assembler source code Often used for Bootloader vpath %.s stores relative paths of folders Whenever make should compile a FOO.s All folders in vpath %.s are searched First found file FOO.s is being compiled FOO.s FOO.o 86
Makefile collect files Files with certain name suffix.c.cc.cpp.s Only files in same folder as makefile Every found file compiled into corresponding.o file Not required to manually add these files to makefile 87
Makefile - define ucontroller STM32 ucs are separated into classes Classes differ by Required bootcode file Amount of RAM Amount of Flash Memory Functional units (GPIOs, Timer, UARTS,..) 88
Makefile - minimize code size Optimize during Compile & Link GCC can write Funktiones/ Data into separate Sektions of the objektfile Unreferenced sections can be skipped during link stage Important: All used interrupt handlers have to be marked as attribute ((used)) arm-none-eabi-gcc --help=optimizers less man gcc 89
Makefile - phony build targets.phony: clean all Lists all Targets which are no files Avoids ambiguity between build targets and files of same name Example: all, clean 90
Makefile - add general files $(MAIN_OBJS) stores list of all object files to create Every mandatory.c file requires one.o entry in $(MAIN_OBJS)! Exceptions: page Collect Files object files can be added to at any stage of makefile E.g.: MAIN_OBJS += foo.o 91
Makefile Extensions Subfolders in project folder extensions/ Makefile fragments provided by ToolChain No user created/ project related files here! extensions.local/ User created Makefile fragments go here extensions.active/ Symbolic links to extensions/ or extensions.local/ all makefile.* files here are included automatically 92
Folder extensions/ Two types of files makefile.nnn_name Makefile fragment in rank NNN provides some extra settings when activated activate.nnn_name.sh scripts that activate makefile fragments will create one or more links in extensions.active/ some scripts remove interferring links automatically (e.g. activate.100_board_xxx.sh) Added to search PATH Just cd to your project folder and issue: > activate.700_example_threading_queues_led.sh 93
Extensions in different Ranks Extensions, Makefiles, Activate-Scripts Filename shows three digit rank number High ranked extensions depend on extensions with lower rank number Lowest rank: Basic compiler libraries Highest rank: Complex examples ToolChain/ReadMe_Ranks.txt Rule: No rank depends on higher ranks! 94 050 system libraries 100 basic definitions 200 basic libraries 300 public libraries 400 ToolChain libraries 600 simple examples 700 complex examples 999 external tools
Minimal SetUp > activate.600_example_leds.sh Creates out of the egg: makefile.050_compiler_sourcery_g++ makefile.100_board_olimex_p107 makefile.200_std_peripherals_library makefile.300_scheduler_free_rtos makefile.300_scheduler_free_rtos_heap1 makefile.600_example_leds + more in future releases of ToolChain 95
Extension 050_compiler_sourcery_g++ Basic Libraries provided by Compiler Binary compiler suite from CodeSourcery No source code available Outdated (not updated by CodeSourcery) CodeSourcery provides updated commercial compiler suite > activate.050_compiler_sourcery_g++.sh 96
Extension 100_board_XXX Board description CPU type Memory Size and Types Pin definitions One board description is mandatory > activate.100_board_olimex_p107.sh 97
Extension 200_std_peripherals_library Common library to access Peripherals on CortexM3 chips Mandatory for all example projects Required by FreeRTOS > activate.200_std_peripherals_library.sh 98
Extension 300_scheduler_free_rtos Multitasking scheduler Provides inter task communication Mandatory for all example projects Requires exactly one activated from 300_scheduler_free_rtos_heap1 300_scheduler_free_rtos_heap2 300_scheduler_free_rtos_heap3 > activate.300_scheduler_free_rtos.sh 99
Extension 400_debug_registers Provides global variables for certain registers Each variable is a pointer to detailed struct Allows easy reading of individual bit in hardware named access to bitfields in hardware registers > activate.400_debug_registers.sh 100
Extension 400_lcd_320x240_olimex driver for LCD panel on prototype board STM32-LCD from Olimex Basic graphical + text features Makes use of demo code from Olimex > activate.400_lcd_320x240_olimex.sh 101
Extension 400_fix_point_lib Library for Fixed Point mathematic operations CortexM3 CPUs have no Floating Point Unit Fixed Point Math much faster than Floating Point Math in Software Only low loss in accuracy Need to choose range according to application! Documentation/Math/ > activate.400_fix_point_lib.sh 102
Extension 400_network_uip_ste101p Basic TCP/IP network Stack uip Includes demo software from Olimex Requires Protoboard Olimex P107 Only one socket at a time Packet resend to be implemented by application Documentation/Network/ > activate.400_network_uip_ste101p.sh 103
Extension 400_support_adc Simple functions for ADC configuration Configuration of single ADC-channels DMA enabled data transfer into variables single channel, blocking readout > activate.400_support_adc.sh 104
Extension 600_example_leds Simple Multitasking example Two tasks communicate via shared Variables taskbrightness periodically changes brightnes value taskcontrolled creates PWM on pin PB_LED1 to show current brightness > activate.600_example_leds.sh 105
Extension 600_example_lcd Basic example how to use LCD panel on prototype board STM32-LCD from Olimex Shown Features initialize panel set background/ foreground color print single characters at certain positions printf() at certain/ current positions > activate.600_example_lcd.sh 106
Extension 700_example_threading_queues_led Example showing several tasks communicating via queues visualization via two LEDs can run on any board that defines PB_LED1, PB_LED2 > activate.700_example_threading_queues_led.sh 107
Extension 700_example_threading_queues_lcd Example showing several tasks communicating via queues visualization on LCD panel producer task: current value consumer task: current value Queue size > activate.700_example_threading_queues_lcd.sh 108
Extension 700_example_threading_semaphores_led Example showing several tasks communicate via semaphores several producer tasks give varying amount of tags to a semaphore several consumer tasks take one tag each and do something for a while Visualization via two LEDs on PB_LED1, PB_LED2 > activate.700_example_threading_semaphores_led.sh 109
Extension 700_example_threading_semaphores_lcd Example showing several tasks communicate via semaphores several producer tasks give varying amount of tags to a semaphore several consumer tasks take one tag each and do something for a while Visualization on LCD panel two producer tasks six consumer tasks > activate.700_example_threading_semaphores_led.sh 110
Adapting linker script Used when linking all objject files into final binary Defines memory adresses and assignments in the uc Memory divided into areas with attributes Name Access (r ead, w rite, x ecutable) Start Size Sections defined with attributes Name Alignment (1, 2, 4, 8 Bytes) Assigned memory area. is current address counter File stm32.ld contains linker script 111
Configure Programmer Programmer is a hardware device JTAG-Connection between Desktop PC/ Laptop and uc flashes binary file onto uc Allows Incircuit Debugging Must be supported by OpenOCD Example: ARM-USB-TINY-H from Olimex Corp. used programmer defined in _/interface.cfg List of supported programmers to be found in ToolChain/OpenOCD/share/openocd/scripts/interface/ 112
compile.sh./compile.sh downloads + installs missing ToolChain creates symbolic links to installed libraries may activate basic example framework compies current project updates QtCreator/PROJEKT.creator flashes binary onto uc 113
Debugging In which stage does the bug occur During compilation (gcc -c) Syntaxerror Includefile not found.c-datei makefile #02 During linking after compilation Objektfile missing Objektfile from wrong path makefile #09 makefile #03 During runtime Wrong uc chosen Too few/ much RAM Stackoverflow activate correct board stm32.ld xtaskcreate() call 114
Versionskontrollsysteme Erfassung von Änderungen an Dateien Protokollierung von Änderungen Wiederherstellung alter Zustände Archivierung der gesamten Historie Koordinierung des gemeinsamen Zugriffs Verzweigung in mehrere Branches 115
Funktionsweisen Lokale Versionsverwaltung Zentrale Versionsverwaltung Verteilte Versionsverwaltung 116
Lokale Versionsverwaltung Oft nur einzelne Datei versioniert Änderungen in Datei selbst gespeichert Werkzeuge: SCCS, RCS Beispiele Technische Zeichnung mit Änderungsindex 117
Zentrale Versionsverwaltung Als Client-Server System aufgebaut Ein zentraler Server speichert komplette Historie optional: Read-Only Zugriff für Fremduser optional: Web-Interface Entwickler jeweils nur eine Version Zugriff auch per Netzwerk möglich Werkzeuge cvs, svn (OpenSource) AlienBrain, Perforce, Team Foundation,... 118
Verteilte Versionsverwaltung Jeder Entwickler hat komplette Historie Zusätzlich zentraler Server möglich Änderungen zwischen Entwicklern austauschen optional: Read-Only Zugriff für Fremduser optional: Web-Interface Werkzeuge git, GNU arch, Mercurial, Bazaar (OpenSource) BitKeeper 119
Wie Git das? Übersicht Installation Dezentrale Verwaltung Verzweigte Entwicklung Datenaustausch Markierte Revisionen Interoperabilität Web-Interface 120
Git - Übersicht Freie Software Verteilte Versionsverwaltung von Dateien Entwickelt zur Verwaltung des Linux Kernel Quelltextes Betriebsysteme Linux, Solaris, Mac OS X, FreeBSD, Windows (Cygwin, Msysgit, TortoiseGit-Shell) Aktuell eingesetzt in vielen OpenSource Projekten Amarok, Android, BusyBox, Debian, DragonFly BSD, Eclipse, Erlang, Fedora, Git, Gnome, KDE, Qt, Ruby, Kurzanleitung: Webseite: http://hlb-labor.de/git/ http://git-scm.com/ 121
Git - Installation Debian/ Ubuntu sudo apt-get install git opensuse sudo zypper install git Windows http://de.wikipedia.org/wiki/cygwin http://de.wikipedia.org/wiki/tortoisegit 122
Git - Dezentrale Verwaltung Jeder Benutzer hat eigenes Repository > git pull Holt neuesten Stand vom Zentralrepository Kann Merge ausführen! > git commit sichert aktuellen Stand lokal kommentiert aktuellen Stand erzeugt einzigartige Commit-ID (Hexzahl) > git push kopiert neuesten Stand auf Zentralrepository 123
Git - Verzweigte Entwicklung 1/3 4 Verzweigung in der Entwicklung > git checkout -b B1 1 Verzweigung ab einem älteren Zustand > git checkout -b B2 2 1 Verzweigungspunkt: Branchname/ Commit-ID/ Tag Alle verfügbaren Branches auflisten > git branch -r Auf anderen Branch wechseln > git checkout BRANCH_NAME Branch zum Server hochladen > git push origin BRANCH_NAME 124 B1 2 3 2 3 4 B2 5
Git - Verzweigte Entwicklung 2/3 User B > git clone :Repo auf Branch origin master User A > git clone :Repo auf Branch origin master > git checkout -b B1 Branch B1 lokal erstellt Wechsel zu Branch B1 > git push origin B1 Branch auf Server laden > git pull neuer Branch entdeckt > git branch -r alle Branches auflisten > git checkout B1 Wechsel zu Branch B1 125
Git - Verzweigte Entwicklung 3/3 Implizite Verzweigung User A > git commit -a -m C1 User B > git commit -a -m C2 > git push C1 fehlt Impliziter Branch User B > git pull > git commit -a automatischer Merge von C1 User A > git pull A jetzt auf Stand M 126 C C1 C C1 C2 C C1 M C2
Git Datenaustausch 1/2 International durch verschiedene Protokolle Git-Protokoll über TCP Port 9418 SSH (verschlüsselt) HTTP HTTPS FTP rsync EMail (Patches) 127
Git Datenaustausch 2/2 Verschlüsselte Kommunikation per SSH Benutzer erzeugt RSA Schlüsselpaar > ssh-keygen -t rsa -C VORNAME.NACHNAME ~/.ssh/id_rsa ~/.ssh/id_rsa.pub Private Key Public Key Publickey auf Server kopieren Bei Anmeldung wird Private Key benötigt > git clone gitosis@hlb-labor.de:repository Server verschlüsselt Rechenaufgabe mit Public Key Client entschlüsselt mit Private Key und sendet Ergebnis Server akzeptiert Client 128
Git - Markierte Revisionen > git tag MARKIERUNG Definiert Markierung für aktuellen Stand Markierung beschreibt z.b. Releaseversion Markierung später für Branch nutzbar > git tag listet alle Markierungen auf > man git-tag 129
Git - Interoperabilität Git's das auch anders? Kompatibilitätsinterface GNU Arch (git-archimport) svn (git-svn) cvs (git-cvsexportcommit, git-cvsimport git-cvsserver) Darcs (darcs-fastconvert, darcs2git) Quilt (git-quiltimport) manpages 130
Git - Web-Interface Nice looking access to git OpenSource Software (some) gitweb is part of git distribution http://git-scm.com/ ViewGit is a total PHP rewrite http://viewgit.fealdia.org/ CGit written in C http://hjemli.net/git/cgit/ gitalist is written in Perl http://www.gitalist.com/ Existing Webhoster (one) GitHub Closed Source hoster http://github.com/ 131
Chapter 2 Multitasking in Embedded Systems 132
Multitasking in ES What is Singletasking? What is Multitasking? Why Multitasking? Different approaches Realtime Operating Systems FreeRTOS Synchronization Example Project Debugging Multitasking Software 133
What is Singletasking? Do only one thing at a time Most efficient way to solve problems Applicable to every algorithm No management overhead No internal synchronization required Easy to code Busy-wait for I/O No Interrupts 134
Singletasking Example while (1) { if ( Byte = receivebyte() ) { // blocks! Buffer[Index++] = Byte; if ( Index >= MessageSize) { M_t* M = (M_t*) Buffer; switch (M->Type) { case mt_commanda:... case mt_commandb: default: break; } Index = 0; } } } 135
What is Multitasking? Aim for multiple targets Switch context often Management overhead Synchronization required Interrupts required Hard to code/ debug Implicit delays Increased memory usage Implementation difficult for many algorithms 136
Multitasking Example main() { int Queue = xqueuecreate(...); xtaskcreate(receive, Queue, ); xtaskcreate(process, Queue, ); } void Process(int Q) { while (1) { M = (M_t*) xqueuereceive(q); if (M) { switch (M->Type) { case mt_cmda:... case mt_cmdb:... default: break; }}}} void Receive(int Q) { char Buffer[10][100]; int Index = 0; while (1) { char* Writer = &(Buffer[Index,0]); int Remaining = MessageSize; while (Remaining > 0) { if ( Byte = readbyte() ) { // sleeps! *Writer++ = Byte; Remaining--; } xqueuesend(q, &(Buffer[Index,0]);); Index++; if (Index > 99) Index = 0; } } 137
Why Multitasking? Functions spawnable multiple times Eases handling of slow IO Benefits from multiple CPU-cores Only 1 central Timer required Short Interrupt Service Routines Less global variables required 138
No life without Multitasking! Every Embedded System needs MT MT often implemented via Interrupts Complex Service Routines Data Exchange via Global Variables Difficult to debug Typical approach: Super-Loop Periodically starts set of functions Similar to task scheduler 139
Different Approaches Multiprogramming Ancient mechanism for Periheral Access Realized via Terminal Stay Ready (TSR) Cooperative Multitasking Central Scheduler manages Processes Each process grants CPU to other processes Single process can block whole system Preemptive Multitasking Scheduler interrupts each process periodically Requires central Interrupt-Timer Preemptible Multitasking High priority Applications can interrupt others (OS/2, Linux, FreeRTOS) Allows faster response times 140
Realtime Scheduling Definition of Realtime Real-time computing means a hardware + software system that must response within a strict time constraint. Realtime constraint Hard Violation causes hazardous results Firm Infrequent violations tolerable but degrade system's quality of service Soft Usefullness of results degrade after their deadline http://en.wikipedia.org/wiki/real-time_computing 141
FreeRTOS Multitasking Scheduler Premptible Multitasking High triority tasks block low priority ones Inter Thread Communication Semaphores Queues Developed specially for Embedded Systems Open Source FreeWare with Commercial Support Ported to several μc Architectures http://www.freertos.org/ 142
FreeRTOS Queues Base of inter task communication Send message Task A Task Task Interrupt Service Routine Task Call by value Reading from empty queue Function call waits until Queue is filled No CPU time is wasted during Wait 2 1 Task B FreeRTOS Queues 3 143
FreeRTOS - Semaphores Binary Task B Task B Task A Implemented as Queue of fixed size 1 Best suited for inter thread signaling Task B waits until Task A activates once Counting Task A Implemented as Queue of fixed size N Task A can activate B up to N times at once Data in Queue is of no interest FreeRTOS - Semaphores 144
FreeRTOS - Mutex best suited for Resource locking Semaphore + Priority inheritance Non recursive Task A Can be locked only once Recursive Task B thread can lock multiple times must be unlocked as often as being locked FreeRTOS - Mutexes 145
Multithreading with Queues Activate Extensions for Queues example on STM32-P107 > cd extensions.active/ > rm * > ln -s../extensions/makefile.free_rtos. > ln -s../extensions/makefile.example_threading_queues. > ln -s../extensions/makefile.free_rtos. > ln -s../extensions/makefile.example_leds. 146
Multithreading with Queues Activate Extensions for Queues example on STM32-LCD > cd extensions.active/ > rm * > ln -s../extensions/makefile.free_rtos. > ln -s../extensions/makefile.example_threading_queues. > ln -s../extensions/makefile.free_rtos. > ln -s../extensions/makefile.lcd_320x240_olimex. 147
Multithreading with Queues Spawning Tasks Producer threading_start() Consumer Print 148
Multithreading with Queues Communicate via Queues s8_t Column; s8_t Row; char Text[10]; s16_t Value; Producer LED1 6 5 PJ PJ PJ 4 3 Consumer Print enqueue/ dequeue LED2 setport()/ clrport() 149
Multithreading with Semaphores Activate Extensions for Semaphores example on STM32-P107 > activate.700_example_threading_semaphores_led.sh Activate Extensions for Semaphores example on STM32-LCD > activate.700_example_threading_semaphores_lcd.sh 150
Multithreading with Semaphores Spawning Tasks Producer1 Producer2 threading_start() Consumer1 Consumer2 Print 151
Multithreading with Semaphores Communicate via Semaphore enqueue/ dequeue Producer1 Data irrelevant 0-10/s 0-10/s Semaphore Producer2 setport()/ clrport() 5/s 5/s 5/s 5/s Consumer1 LED1 Consumer2 LED2 Consumer3 Consumer4 PJ PJ PJ 152 Print
Debugging Multitasking Software Different types of Memories Multitasking & Stacks objdump 153
Different types of Memories Storage RAM Heap Stack Datatypes Constants Global Variables Local Variables 154
Constants Stored in Flashmemory along code Automatically initialized 0x4000 0000 (initial value contained in binary) Peripherals Reference to value points to 0x2000 0000 address > 0x0800 0000 RAM Example: char* HelloWorld = Hello world ; 155 Hello World 0x0800 0000 Flash
Global Variables Stored in RAM Initialized by code at program start Reference to value points to address > 0x2000 0000 0x4000 0000 Peripherals Example: int V = 42; 0x2000 0000 RAM void main() { V++; } 0x0800 0000 Flash 156
Lokal Variables 157
Multitasking & Stacks Stacks in Singletask Applications Stacks in Multitasking Applications Stacks in FreeRTOS Stackoverflow 158
Debug: objdump 159