Kampis Elektroecke

VisualGDB zum Entwickeln von Anwendungen für den Raspberry Pi unter Windows

Mittlerweile programmiere ich seit 10 Jahren und in dieser Zeit habe ich eine ganze Menge Entwicklungsumgebungen verwenden müssen bzw. dürfen (AVR-Studio, Bascom IDE, Arduino IDE, Eclipse in allen Formen und Farben, etc.) und keine Entwicklungsumgebung hat mir (bisher) so gut gefallen wie Visual Studio von Microsoft. Viele Leute nennen die Entwicklungsumgebung überladen und langsam, was stimmen mag, allerdings bringt die Entwicklungsumgebung auch eine Menge Werkzeuge mit. Nichts desto trotz ist Visual Studio meine Lieblingsumgebung, einfach weil die Codevervollständigung, der Debugger und das ganze Handling sehr gut sind. Gut, mittlerweile gibt es auch Visual Studio Code, das eine entschlackte Version von Visual Studio darstellt, aber das soll mal ignoriert werden…

Umsomehr hat mich der Hinweis eines externen Ingenieurs in der Firma erfreut, dass es für Visual Studio ein Plugin gibt, mit denen man Anwendungen für den Raspberry Pi (also ARM-Prozessoren) und andere Systeme erstellen kann: VisualGDB.

Also habe ich mir die Erweiterung mal angeschaut und ich muss sagen, ich bin richtig begeistert. Der normale Komfort von Visual Studio, gepaart mit einem gut zu bedienenden Cross Compiler und Remote-Debugger. Einziges “Manko” ist der Preis von mind. 80 €, welcher aber auf Grund der Qualität des Produktes durchaus angemessen ist.

Schauen wir es uns mal genauer an…

Ein kurzer Einblick in VisualGDB:

Wie bereits erwähnt, handelt es sich bei VisualGDB um ein Plugin, welches die Entwicklung von Software für andere Prozessorarchitekturen und deren Remote-Debugging (oder auch Targets genannt) auf einem Windows-PC, dem sogenannten Host, ermöglicht. Nach dem Erwerb dieses Plugins wird es ganz normal installiert und sobald ein neues Projekt angelegt werden soll, offenbart sich eine neue Kategorie von Templates:

Der Linux Project Wizard ist genau das was man benötigt um Anwendungen für den Raspberry Pi zu entwicklen. Wird dieses Template ausgewählt, gelangt man zu einem weiteren Fenster, wo diverse Projekteinstellungen ausgewählt werden können:

In meinem Beispiel möchte ich eine einfache C++11 Anwendung mit dem CMake Buildsystem bauen (wichtig ist den Haken in dem Kästchen zu entfernen…). Auch Qt Anwendungen sind ohne Probleme machbar und sehr leicht zu erstellen (mache ich noch einen weiteren Bericht drüber).

Wenn die Auswahl bestätigt wird, gelangt man zu den Target-Einstellungen. Hier wird die SSH-Verbindung zu dem Target-System konfiguriert. Als Ziel wird hier mein Raspberry Pi gewählt:

Wenn man vermeiden möchte, dass Bibliotheken etc. auf dem Target installiert werden sollen, so kann auch ein dritter PC als Build-System angegeben werden. Dann wird der Code auf dem Windows-Rechner entwickelt, auf dem zweiten Rechner kompiliert und auf dem Target ausgeführt. Dadurch kann es vermieden werden, große und viele Bibliotheken auf dem Target abzulegen.

Die Auswahl kann mit Finish bestätigt werden. Nun beginnt VisualGDB damit die Verbindung zu überprüfen und alle notwendigen Dateien vom Target zu downloaden.

VisualGDB lädt Kernelsources, Header-Files und Bibliotheken vom Target und verwendet diese zum Kompilieren. Das kompilierte Programm wird anschließend auf das Target geladen und ausgeführt. Nun ist das Projekt fertig konfiguriert und kann für die Entwicklung verwendet werden.

OpenCV als Beispiel für den Einsatz von VisualGDB

Das ganze habe ich mal mit OpenCV auf meinem Raspberry Pi getestet. Dafür habe ich auf dem Raspberry Pi OpenCV installiert:

In dem fertigen Projekt wird dann die CMakeList.txt Datei geöffnet und wie folgt angepasst:

Über Projekt → VisualGDB Project Properties wird nun unter IntelliSense Directories mittels Edit Remote Cache… der Cache, also der Speicherort für die, vom Target heruntergeladenen, Dateien angepasst und die angezeigten Verzeichnisse hinzugefügt:

Die Verzeichnisse werden direkt nach dem Anlegen heruntergeladen, weshalb der ganze Vorgang etwas dauern kann. Unter Debug settings wird dann noch der Pfad der X11 Ausgabe eingestellt:

Anschließend wird das Fenster mittels OK geschlossen.

Ein weiterer Vorteil von VisualGDB ist, dass Bildschirminhalte vom Target direkt auf dem Entwicklungssystem angezeigt werden können. Alles was dafür benötigt wird, ist die Software XMing. Nach dem Download und der Installation der Software, wird der Speicherort der XMing.exe unter Extras → Optionen → VisualGDB → General → Tools eingetragen:

Nun wird nur noch etwas Code benötigt:

Der Code kann nun ganz normal kompiliert und mittels Debugger gestartet werden. Wenn alles korrekt eingerichtet ist, erhält man die Ausgabe des Raspberry Pi auf seinen Windows-Rechner, aber das Programm läuft auf dem Raspberry Pi:

That´s all. Mit den entsprechenden Cross Compilern etc. kann VisualGDB auch für andere Plattformen eingesetzt werden. Alles was dafür benötigt wird ist ein Target mit einem GDB-Server und der entsprechende Cross Compiler. Ich finde die Lösung definitiv sehr gelungen (geht übrigens ähnlich gut mit Python) und es ist für mich eine brauchbare Alternative um Code für andere Plattformen zu entwickeln. 

Das komplette Beispielprojekt gibt es in meinem Raspberry Pi Repository zum Download.

Viele Grüße
Daniel

11 Kommentare

  1. Hallo Daniel

    ich muss mich mit dem Raspberry und Linux beschäftigen und komme auf keinen grünen Zweig. Nach Jahren mit Windows ist der Umstieg mehr als nervend. 1000sende Möglichkeiten zig Beschreibungen, wo keine wirklich hilfreich ist oder nicht passt. Alle schaffen es nur bis zum “Hallo Welt” und dann ist Schluss. Das hatte ich auch schon alleine geschafft.
    Inzwischen bin ich beim Visual Studio und VisualGDB angekommen, und das Blinken auf dem Rasp ist alles was ich momentan hinbekomme. Was mir fehlt ist z.B. eine Beschreibung welche Objekte oder Libs ich einsetzen muss, um auf dem Raspberry mit VisualGDB oder einfach nur mit dem Visual Studio unter Linuxprojekte, eine grafische Oberfläche hinzubekommen. Vielleich hast du da einen oder mehrere Links oder eine Buchempfehlung.

    Viele Grüße Rainer

    1. Hallo Reiner,

      hast du mal bei Sysprogs auf der Seite geschaut? Die haben eigentlich ganz gute Tutorials um mit VisualGDB und dem Raspberry Pi klar zu kommen.

      https://visualgdb.com/w/tutorials/category/tutorials/linux/raspberry_pi/

      Für eine grafische Oberfläche kann man z. B. Qt verwenden:

      https://visualgdb.com/tutorials/raspberry/qt5/

      Der Vorteil an Qt ist zudem, dass du den Code auch auf Windows entwickeln kannst (wenn du nichts Linuxspezifisches wie z. B. “/dev/null” als Pfad verwendest) und das Programm direkt auf dem Raspberry Pi installieren kannst.

      Hilft dir das weiter? Falls nicht, kannst du mir auch direkt ne Mail schreiben :)

      Gruß
      Daniel

      1. Moin Daniel
        Hatte schon einmal geschrieben aber der Post ist hier nicht erschienen, also nochmal.
        Danke erst einmal, für die schnelle Antwort :)

        Wenn ich deinem 2ten Link folge komme ich dort bis zum Punkt 5
        dort wird dann mit der Fehlermeldung

        Downloaded C:\Users\rainer\AppData\Local\Temp\tmpB235.tmp
        Preparing to install C:\Users\rainer\AppData\Local\Temp\tmpB235.tmp to d:\SysGCC\raspberry\Qt\v5…
        Creating d:\SysGCC\raspberry\Qt\v5…
        Cannot install QT5 tools for cross-compilation: Unknown package file signature

        abgebrochen. Was kann da falsch sein was wird gebraucht.

        Grüße Rainer

        1. Hallo Rainer,

          ich muss die Posts auch freigeben (ist sonst zu viel Spam…).
          Da kann ich dir jetzt so aus dem Stehgreif auch nicht helfen. Ich muss das mal bei mir im Visual Studio ausprobieren, aber ich meine mit Qt 5 hatte ich auch immer Probleme. Nimm doch mal eine ältere Version von Qt (das kannst du ganz am Anfang beim Erstellen des Projektes auswählen) und probier es damit mal. Andernfalls muss ich dich ein paar Tage vertrösten, weil ich das Problem definitiv nicht heute angehen kann und somit erst Freitag, bzw. Samstag drauf schauen kann.

          Gruß
          Daniel

  2. Hi Daniel

    OK danke, nur kein Stress, ich versuchs erstmal weiter. Hätte ja sein können das du mir meine Dummheit sofort aus dem Stehgreif um die Ohren haust :D

    Gruß Rainer

    1. Hallo Rainer,

      ggf. ist Qt 5 für den Raspberry Pi noch nicht verfügbar, sodass man es sich selber kompilieren muss. Ich denke du hast weniger Probleme, wenn du auf eine 4er Version wechselst (oder brauchst du zwingend Qt 5?). Probier mal diese Anleitung :)

      https://visualgdb.com/tutorials/raspberry/qt-cross/

      Ich meine nämlich mich erinnern zu können, dass man Qt 5 auch nicht über den Paketmanager installieren kann, sondern komplett bauen muss. Aber wie gesagt, ich teste es mal aus :)

      Gruß
      Daniel

    2. Hallo Rainer,

      ich habe mir gerade ein Qt4 Projekt mit C++11 mit GNU Extensions erstellt und es kompiliert bekommen. Du benötigst aber XMing um den Desktopinhalt vom Raspberry Pi auf deinem Windows PC angezeigt zu bekommen. Das kannst du im Projekt unter “VisualGDB Project Properties” und dann “Debug settings” anpassen (ganz unten “Remote X11…”). Das Bild direkt auf dem Raspberry Pi anzeigen klappt irgendwoe nicht. Da muss ich mal schauen ob ich den Fehler finde.

      Gruß
      Daniel

  3. Hallo Daniel

    Sorry das ich erst jetzt antworte.
    Danke, das du dir die Mühe gemacht hast, ich werde es ausprobieren.
    Das das Bild nicht auf deinem Rasp erscheint, beruhigt mich irgendwie, bin also doch nicht völlig falsch davor.

    Grüße Rainer

    1. Hallo Rainer,

      das ist ja “nur” die Debugausgabe, die auf deinem Rechner erscheint. Auf dem Raspberry ist das Programm ja dennoch lauffähig (kannst es mal ausprobieren…das wird standardmäßig in den /tmp Ordner auf dem Raspberry geschoben).
      Weswegen eine Ausgabe auf dem Raspberry Monitor nicht funktioniert weiß ich leider nicht. Da muss man ggf. mal beim Support nachfragen.

      Gruß
      Daniel

  4. Hallo Daniel

    Ja, mit QT4 hat es jetzt geklappt, habe sogar das Fenster auf dem Raspberry, und konnte es dort auch bedienen.
    Bin das Tutorial von oben, durchgegangen, und klappte diesmal ohne Probleme, warum keine Ahnung. Was mich beunruhigte. Dann habe ich mir meine misslungenen Projekte noch mal angeschaut und festgestellt, das ich oben in der Zeile von Visual Studio wo angegeben wie erstellt werden soll -> “Debug oder Relase -> x86/x64 -> Lokaler Windows Debugger” bei der funktionierenden Version steht, bei den nicht funktionierenden
    “Debug -> VisualGDB -> Windows Remote Debugger” , stand. Vielleicht war ja das der Fehler.
    Warum allerdings bei mir das Fenster auf dem Raspberry zu sehen ist und bei dir nicht, keine Ahnung, noch nicht :) Kann natürlich sein das es bei mir nur Zufall war.
    Dann kommt gleich meine nächste Frage, auf dem Raspberry mit dem QT Creator, konnte man seine Fenster und Bedienelemente, wie unter Visual C#, so schön zusammenklicken, das geht jetzt mit Visual Studio nicht, oder?
    Und nochmal Danke für deine Unterstützung.

    Grüsse Rainer

    1. Hallo Reiner,

      wunderbar. Freut mich, wenn es jetzt funktioniert. Ich weiß nicht was du für eine VisualGDB Version hast. Ggf. ist deine neuer als meine (meine Lizenz ist schon paar Jahre alt, wodurch neue Versionen nicht enthalten sind). Ggf. ist das auch das “Problem”. Aber kann natürlich auch am Debugger liegen. Ich weiß jetzt nicht was bei mir ausgewählt war…

      Ne, in Visual Studio kannst du die GUI nicht direkt zusammenklicken. Das ist das unschöne an der VS Studio Integration von Qt. Du brauchst dafür den Qt Designer (müsste bei der Installation mit dabei sein). Daher braucht man immer zwei Programme, wenn man Qt in VS nutzt, was ich persönlich super doof finde und daher VS nicht für Qt verwende.

      Im Qt Createor besteht die Möglichkeit, dass man ain Remotetarget mit anderem Compiler einstellen kann (musst ein neues Kit dafür machen). Wie es genau funktioniert weiß ich allerdings nicht. Bei mir hat es nie wirklich funktioniert, wobei ich da auch nicht viel Zeit reingesteckt habe.

      Gruß
      Daniel

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.