Raspberry-Pi-Programme per Crosscompiling auf dem PC bauen

© zhudifeng, 123RF

Kreuzweise

Der Raspberry Pi ist ein sehr erfolgreicher Rechner für Bastler und interessante Projekte. Was dem Kleinen jedoch nach wie vor fehlt, sind Rechenleistung und Speicher. Besonders Entwickler wünschen sich etwas mehr Leistung zum zügigen Kompilieren von Programmen. Mit Crosscompiling bauen Sie RasPi-Programme ohne große Wartezeiten am PC und führen diese dann auf dem Raspberry Pi aus.

Der Raspberry Pi gibt bekanntlich einen prima Bastelcomputer ab. Nur in wenigen Disziplinen bremst der RasPi die oft hochfliegenden Vorhaben aus: In Sachen Rechenleistung gibt es im Alltag zwar kaum mehr etwas an seiner CPU auszusetzen, wer jedoch rechenintensive Projekte im Kopf hat oder spezielle Software für das RasPi-System übersetzen möchte, der braucht Geduld.

Geschickt wäre es nun, langwierige Rechenaufgaben wie das Kompilieren von Software auf einen leistungsfähigen Computer auszulagern. Das ist insbesondere sinnvoll, wenn Sie an der Software noch entwickeln und den Build-Prozess immer wieder neu anstoßen müssen. Dabei gilt es jedoch, die unterschiedlichen Rechnerarchitekturen zu überwinden: Im Inneren des Raspberry Pi arbeitet eine ARM-CPU, das Herz klassischer PCs stammt hingegen aus der x86-Familie. Per Crosscompiling gelingt der Spagat zwischen den zwei Welten.

Skriptsprachen und Bytecode

Das ist jedoch nicht bei jedem Programm beziehungsweise bei jeder Programmiersprache sinnvoll. Skriptsprachen wie Perl, Python, Ruby, PHP oder Shellskripte interpretiert das System während der Laufzeit. Solche Programme können Sie direkt auf den RasPi kopieren und dort ausführen. Wenig Probleme machen auch mit Java programmierte Anwendungen. Ein in den maschinenunabhängigen Bytecode übersetztes Java-Programm lässt sich auf jeder Architektur ausführen – es braucht dafür nur die richtige Java-Laufzeitumgebung.

Als ähnlich flexibel erweisen sich in Mono/.NET geschriebene Anwendungen – allerdings erst auf den zweiten Blick. Ein "Hello World" ist in Mono schnell geschrieben (Listing 1) und entsprechend Listing 2 ebenso schnell in eine ausführbare Datei übersetzt. Für das Linux-System liegt das Programm danach jedoch als PE32 executable (console) Intel 80386, [...] vor. Was nun? Im Raspberry Pi steckt ja bekanntlich keine Intel-CPU, sondern ein ARM-Prozessor. In diesem Fall gibt es nun aber keinen Grund zur Sorge, hier irrt sich ganz einfach das file-Kommando.

Listing 1

 

class HelloWorldProgram {
  public static void Main() {
    System.Console.WriteLine("Hello, world!");
  }
}

Listing 2

 

$ mcs helloworld.cs   # Übersetzen des Programms
$ file helloworld.exe # Ergebnis der Übersetzung?
helloworld.exe: PE32 executable (console) Intel 80386, Mono/.Net assembly, for MS Windows
$ mono helloworld.exe # Programm ausführen
Hello, world!

Das Ergebnis eines kompilierten Mono-Programms ist nicht x86-spezifisch, sondern eine Common Language Infrastructure (CLI) – ähnlich wie bei Java ein CPU-unabhängiger Bytecode. Die aus dem Kompiliervorgang hervorgehende EXE-Datei lässt sich einfach auf einen RasPi kopieren und problemlos mit mono helloworld.exe ausführen. Disassemblieren Sie die Datei mittels monodis helloworld.exe, dann unterscheidet sich das Ergebnis auf einem PC bis auf wenige Kommentare nicht von dem auf einem Raspberry Pi.

Das kurze "Hello World"-Programm liefert noch ein weiteres gutes Argument, warum man nicht direkt am RasPi entwickeln möchte, sondern die Entwicklung nach Möglichkeit auslagert: Während ein herkömmlicher Laptop (Intel Core i5-2430M mit 2,40 GHz) das Programm in etwa 0,1 Sekunden übersetzt, braucht das Kompilieren auf einem RasPi 2 satte 10 Sekunden. Noch stärker macht sich das beim Bauen des Java-Programms bemerkbar: Der PC erledigt diese Aufgabe in rund 0,7 Sekunden, der RasPi braucht etwas mehr als 11 Sekunden.

Crosscompiler

Nun greifen viele Entwickler von Open-Source-Programmen jedoch nach wie vor gerne zu höheren Programmiersprachen wie C oder C++, im mathematisch-wissenschaftlichen Bereich auch zu Fortran. Die dafür nötigen GNU-Compiler unterstützen zahlreiche CPU-Architekturen und eignen sich daher gut zum Crosskompilieren. Für den Raspberry Pi gibt es passende Crosscompiler [1], die Sie bei den meisten Distributionen allerdings nicht im Paketmanagement finden.

Optimierung für den RasPi 2

Im Raspberry Pi 2 steckt im Vergleich zum ersten RasPi ein wesentlich modernerer Prozessor. Während im RasPi 1 eine ARMv6-CPU arbeitet, schlägt im Inneren des Nachfolgemodells das Herz eines ARMv7. Um eine Anwendung auf das neue Modell zu optimieren, müssen Sie den Crosscompiler anweisen, Assemblerbefehle für diese CPU zu erzeugen. Das Ergebnis läuft auf einem RasPi 2 daraufhin ein wenig schneller, führt auf einem RasPi der ersten Generation jedoch nur zur Fehlermeldung Illegal instruction. Dem C/C++- und Fortran-Compiler geben Sie dafür die Optionen -mcpu=cortex-a7 -mfpu=neon mit. Bei Google Go setzen Sie über die Umgebungsvariable export GOARM=7 den entsprechenden Schalter.

Für die Installation müssen Sie Git auf dem System einspielen (in der Regel über das gleichnamige Paket) und die Raspberry-Tools aus dem GitHub ausbuchen (Listing 3). Das Kommando holt hier nicht ein Archiv von einer Webseite oder einem FTP-Server ab, sondern lädt direkt den aktuellen Entwickler-Code aus dem Versionsverwaltungssystem. Das Ergebnis landet in einem neuen Unterordner mit dem Namen tools/. Rufen Sie das Git-Kommando also in Ihrem Home-Verzeichnis auf, oder – mit Root-Rechten ausgestattet – in /opt/, dem Ordner für an der Paketverwaltung vorbei installierte Programme.

Listing 3

 

$ git clone https://github.com/raspberrypi/tools.git

Die Compiler und die sonstigen Tools wie Linker, Assembler, Hilfsprogramme – die sogenannte Toolchain – stecken in den in Listing 4 aufgeführten Verzeichnissen. Der erste Ordner enthält den nativen Crosscompiler für Gleitkomma-Operationen ohne numerischen Coprozessor ("soft float"), der zweite den Compiler für Operationen mit Gleitkomma-Coprozessor (hard float) [2]. Im dritten Verzeichnis finden sich die Linaro-Crosscompiler für 32-Bit-Rechner, im vierten die Crosscompiler für 64-Bit-Rechner.

Listing 4

 

tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/
tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/
tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/

Am besten nehmen Sie das Verzeichnis mit den gewünschten Compilern in den Pfad auf, bei Bedarf auch alle. Je nach Linux-Distribution und eingesetzter Shell bearbeiten Sie dazu ~/.profile oder ~/.bashrc und erweitern die PATH-Variable über entsprechende export-Anweisungen. Das Beispiel aus Listing 5 beschränkt sich auf die jeweils unter /opt/ abgespeicherten Hard-Float-Compiler und den Crosscompiler für 64-Bit-Systeme.

Listing 5

 

[...]
export PATH=$PATH:/opt/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/
export PATH=$PATH:/opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/
[...]

Die Compiler und sonstigen Tools unterscheiden sich durch ein Präfix voneinander und somit auch von der Toolchain des Host-Systems: arm-linux-gnueabihf- für die Linaro-Toolchain, arm-bcm2708-linux-gnueabi- für die Soft-Float-Toolchain und arm-bcm2708hardfp-linux-gnueabi- für die Hard-Float-Toolchain. Das ist ein übliches Verfahren bei Crosscompilern; Windows-Crosscompiler nutzen beispielsweise die Nomenklatur i686-w64-mingw32-. Der erste Teil vor dem ersten Bindestrich spezifiziert die CPU, danach folgen das Betriebssystem und bei Bedarf noch genauere Spezifikationen (hardfp, softfp, mingw32 oder cygwin). Erst am Ende folgt dann der eigentliche Befehlsname (gcc, g++, gfortran, strip oder beispielsweise objdump) zum Kompilieren.

Beinhaltet die Pfadvariable der Shell den Crosscompiler, übersetzen Sie nun entsprechend Listing 6 ein kurzes C-Programm wie das übliche helloworld.c (Listing 7) auf Ihrem PC. Das Ergebnis kopieren Sie anschließend auf den Raspberry Pi und führen es dort aus. Auch hier erweist sich der Laptop beim Übersetzen um den Faktor 10 schneller als der RasPi, selbst bei einem so kleinen Programm.

Listing 6

 

$ arm-linux-gnueabihf-gcc -o helloworld helloworld.c

Listing 7

 

#include<stdio.h>
int main() {
  printf("Hello World\n");
  return 0;
}

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 8 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Raspberry Pi Geek kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

Aktuelle Ausgabe

12/2017
Schräge Hacks

Diese Ausgabe als PDF kaufen

Preis € 7,99
(inkl. 19% MwSt.)

Stellenmarkt

Neuigkeiten

  • Neues auf der Heft-DVD

    Nur mit dem optimalen System und der richtigen Software nutzen Sie das volle Potenzial eines Mini-PC. Mit der Heft-DVD erhalten Sie nicht nur die neusten Distributionen für den RasPi und Co., sondern gleichzeitig auch die passenden Programme zu den Artikeln.

  • Digitaler Widerstand

  • 3, 2, 1 … los!

    Ein Countdown ist nicht nur in der Raumfahrt sinnvoll. Mit einem Raspberry Pi und etwas Elektronik zählen Sie die Zeit bis zu einem beliebigen Ereignis optisch eindrucksvoll herunter.

  • Blog out of the box

    Das bei Bloggern beliebte CMS Wordpress kommt besonders Einsteigern mit einer einfachen Oberfläche und aktiven Community entgegen. Mit Blog In A Box setzen Sie ein solches Komplettsystem im Handumdrehen auf einem RasPi auf.

  • Angetestet

    Barefootd 1.4.1 leitet Ports und Verbindungen weiter, schlanke OpenSSH-Alternative Dropbear 2017.75, Httpbench 0.2.2 erfasst Webserver-Reaktionszeiten, Mtr 0.92 kombiniert Traceroute und Ping.

  • Öfter mal was Neues?

    Mit dem neuen Raspbian-Release "Stretch" schlägt die Raspberry Pi Foundation überflüssige technische Kapriolen, die einer auf Bildung und Ausbildung fokussierten Organisation schlecht zu Gesicht stehen, findet Chefredakteur Jörg Luther.

  • Aufgeweckt

    Dank der Chat-Plattform Telegram und einem eigenen Chatbot kommunizieren Sie mit dem Mini-PC selbst durch eine Firewall hindurch.

  • Elektropuzzle

    Das Board PiXtend erweitert den RasPi zu einer leistungsfähigen Steuereinheit. Neben dem Komplett-Kit bietet der Hersteller die Platine als Bausatz an, die Lötprofis viel Spaß bereitet und Einsteigern bei den ersten Schritten in der Elektronik-Welt hilft.

  • Nerds only

    Der Nerd-Wecker weckt – und macht gleichzeitig jede Menge Spaß beim Bauen und Anpassen.

  • Hightech-Halloween

    Ein gestandener Bastler zelebriert Halloween mit allerlei technischem Hokuspokus. Der Raspberry Pi liefert dafür die ideale Ausgangsbasis.