12 BFP Entwurf Eingebetteter Systeme Freeflight! Sommersemester 2012 Cross-Compilieren für die AR.drone 2012/06/21 Michael Engel Informatik 12 TU Dortmund
Überblick Cross-Compiler Beispielcode Laufen lassen 12, 2011-2 -
Cross-Compiler Problem: normaler Compiler (z.b. gcc) erzeugt Code für die Architektur, auf der er läuft z.b. x86 oder (bei uns) x64 Die AR.drone hat aber einen ARM926-Prozessor: Unterschiedlicher Befehlssatz Unterschiedliche Breiten von Datentypen Aber: Sehr ähnliches Betriebssystem (Linux) Compiler benötigt, der Code für ARM926 erzeugt! 12, 2011-3 -
Cross-Compiler (2) Cross-Compiler: Läuft auf Host-Plattform x Erzeugt Code für Target-Plattform y Definition der Plattform als Triplets: Für die AR.drone: arm none linux gnueabi Format: CPUarchitektur-Hersteller-OS-ABI Hier ein Quadrupel wegen verschiedener ABIs, die Linux für ARM unterstützt Innerhalb einer Architektur werden verschiedene Prozessorvarianten unterstützt (ARM7, ARM9,...) Triplet wird als Prefix für Compiler-Tools verwendet: arm none linux gnueabi g++ arm none linux gnueabi ld (usw.) 12, 2011-4 -
Cross-Compiler (3) Welche CPU nutzt die AR.drone genau? Verbindung aufbauen: telnet 192.168.0.1 cat /proc/cpuinfo Processor : ARM926EJ S rev 5 (v5l) BogoMIPS : 233.47 Features : swp half thumb fastmult edsp java CPU implementer : 0x41 CPU architecture: 5TEJ CPU variant : 0x0 CPU part : 0x926 CPU revision : 5 Cache type : write back Cache clean : cp15 c7 ops Cache lockdown : format C Cache format : Harvard I size : 32768 I assoc : 4 I line length : 32 I sets : 256 D size : 16384 D assoc : 4 D line length : 32 D sets : 128 Hardware : Mykonos Parrot platform Revision : 0904 Serial : 0000000000000000 12, 2011-5 -
ARM-Architektur Was bedeuten die Bezeichnungen? Verschiedene ARM-Entwicklungsstufen: ARMvx Anfang der ARM-Entwicklung 1983 bei Acorn: ARMv1-Prototyp ARMv2: erste kommerzielle Variante: 1986 8 MHz Implementierung: ARM2, ARM3 ARMv3: 1989 4 kb Cache, 25 MHz, 12 MIPS Implementierung: ARM6, ARM7 (z.b. Apple Newton) ARMv4: ARM7TDMI, StrongARM, ARM9TDMI ARMv5: ARM7EJ, ARM9E, ARM10E Aktuell: ARMv7 (Cortex A): bis 2 GHz... Processor : ARM926EJ S rev 5 (v5l) Features : swp half thumb fastmult edsp java CPU architecture: 5TEJ 12, 2011-6 -
ARM-Architektur (2) 32-Bit RISC-Architektur Load/Store 16 32-Bit-Register + Shadow-Register Dezizierte Register: R15 = PC R14 = LR (Rückspr.adr.) R13 = SP Erweiterungen möglich für: Floating-Point Vektor-Ops 12, 2011-7 -
ARM-Architektur (3) Verschiedene ARM-Architekturvarianten unterscheiden sich in: Mikroarchitektur (Piplelinestufen) Cache-Architektur Unterstützer Befehlssatz ARM-Befehlssätze ARM32: 32-Bit-Befehle THUMB: 16-Bit-Befehle, nur 8 Register nutzbar, Ergänzung zu 32-Bit-Befehlen: kompakt, spart Speicher THUMB2: kompakter 16/32-Bit-Befehlssatz, eigenständig nutzbar ARM926EJ-S: ARM32 + THUMB, kein THUMB2, kein FP, keine Vektor-Ops Processor : ARM926EJ S rev 5 (v5l) Features : swp half thumb fastmult edsp java CPU architecture: 5TEJ 12, 2011-8 -
Crosscompilieren für ARM Cross-Compiler selber bauen ist aufwändig, fehleranfällig und dauert... Fertige Crosscompiler existieren Für ARM z.b. CodeSourcery g++ Toolchain für ARM: http://www.mentor.com/embedded software/sourcery tools/sourcerycodebench/editions/lite edition/ Angabe der Zielarchitektur auf der Compiler-Befehlszeile: arm none linux gnueabi gcc march=armv5 c foo.c...ergibt... $ file foo.o foo.o: ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), not stripped Praktischerweise erzeugt die Standardeinstellung (ohne -march) bereits funktionierenden Code :-) 12, 2011-9 -
Beispielprogramm Quelle: https://github.com/ardrone Navboard: ardrone/navboard Navboard driver and demo getting raw data from the navboard and converting it to realworld units Zwei C-Sourcedateien, ein Header: main_navboard.c Aufruf Initialisierung, Schleife liest Messwerte navboard.c Kalibrierung (flat trim), Init, Werte lesen navboard.h struct für Navigation, Funktionsprototypen Zwei weitere Files benötigt: util.c Hilfsfunktionen: Taste lesen, Zeit (in µs) liefern gpio.c Setzen von gpio-pins über Tool gpio und system-aufruf Bauen mit (siehe make.bat): arm none linux gnueabi g++ o navboard../util/util.c../gpio/gpio.c navboard.c main_navboard.c 12, 2011-10 -
Beispielprogramm navboard.h: struct nav_struct { u16 size; u16 seq; // +0x00 Size of the following data (always 0x2C) // +0x02 Sequence number, increases every update u16 acc[3]; // +0x04 Raw data (10 bit) of the accelerometers multiplied by 4 u16 gyro[3]; gyros. X,Y=IDG, Z=Epson // +0x0A Raw data for the gyros, 12 bit A/D converted voltage of the u16 gyro_110[2]; // +0x10 4.5x Raw data (IDG), gyro values with another resolution (see IDG 500 datasheet) u16 acc_temp; // +0x14 Accs temperature startup value 120 @ 25C, rising to 143 u16 gyro_temp; // +0x16 XYGyro temperature (IDG), 12 bit A/D converted voltage of IDG's temperature sensor startup value 1532 @ 25C, rising to 1572 u16 vrefepson; of the Epson sensor u16 vrefidg; of the IDG sensor // +0x18 ZGyro v_ref (Epson), 12 bit A/D converted reference voltage // +0x1A XYGyro v_ref (IDG), 12 bit A/D converted reference voltage u16 us_echo; // +0x1C bit15=1 echo pulse transmitted, bit14 0 first echo. Value 30 = 1cm. min value: 784 = 26cm... u16 checksum; // +0x1E Checksum = sum of all values except checksum (22 values) 12, 2011-11 -
Laufen lassen! Übertragen des eigenen Programms: ftp 192.168.0.1 ftp> bin ftp> put navboard AR.drone verwendet Steuerprogramm mit dem kreativen Namen program.elf Steuerprogramm benutzt alle Ressourcen muss vor Start eigener Programm beendet werden: telnet 192.168.0.1 killall program.elf Programm ausführbar machen und starten: chmod +x navboard./navboard 12, 2011-12 -
Laufen lassen! Übertragen des eigenen Programms: ftp 192.168.0.1 ftp> bin ftp> put navboard AR.drone verwendet Steuerprogramm mit dem kreativen Namen program.elf Steuerprogramm benutzt alle Ressourcen muss vor Start eigener Programm beendet werden: telnet 192.168.0.1 killall program.elf Programm ausführbar machen und starten: chmod +x navboard./navboard 12, 2011-13 -
Eigener Code auf der AR.drone Weitere Beispiele für Ansteuerung von Sensoren und Aktuatoren unter: https://github.com/ardrone Wichtige Punkte für eigenen Code: ARM926 der AR.drone läuft mit nur 468 MHz Keine Unterstützung für Hardware-Fließkommazahlen In Software emuliert (soft-fp), daher sehr langsam AR.drone hat nur 128 MB RAM Ansonsten: Netzwerk-Verbindungen auch lokal machbar Entsprechende Ports auf localhost (127.0.0.1) öffnen Erstmal mit Original-Flugsoftware laufen lassen Eigenes Programm steuert AR.drone wie gehabt über UDP 12, 2011-14 -