Hardwareprogrammierung auf RaspberryPI mit C++



  • Hallo und Guten Abend,

    ich bin gerade dabei mich in die Programmierung unter Linux mit dem RaspberryPI einzuarbeiten. Als einfachen Einstieg möchte ich eine Leuchtdiode ein- und ausschalten.

    Ich nutze dazu die Beispielprogramme der Seite http://www.open.com.au/mikem/bcm2835/. Das Beispiel blink.c, welches in der Konsole kompiliert und ausgeführt wird funktioniert ohne Probleme.

    Nun möchte ich aber in Eclipse programmieren und habe dazu folgenden Quelltext geschrieben :

    /*
     * main.cpp
     *
     *  Created on: 6 Jan 2013
     *      Author: pi
     */
    
    // Headerdateien einbinden
    #include </usr/include/bcm2835/bcm2835.h>
    
    // digitales Ausgabepin deklarieren
    #define GREENLED RPI_GPIO_P1_11
    
    int main()
    {
            // Hardware initialsieren
            if (bcm2835_init())
            {
                    // Initialisierung erfolgreich, also PIN als Ausgang freigeben
                    bcm2835_gpio_fsel(GREENLED, BCM2835_GPIO_FSEL_OUTP);
    
                    // Leuchtdiode zehn Mal blinken lassen
                    for (int index = 0; index < 10; index++)
                    {
                            // Leuchtdiode einschalten
                            bcm2835_gpio_write(GREENLED, HIGH);
    
                            // t = 500ms warten
                            bcm2835_delay(500);
    
                            // Leuchtdiode wieder ausschalten
                            bcm2835_gpio_write(GREENLED, LOW);
    
                            // erneut t = 500ms warten
                            bcm2835_delay(500);
                    }
    
                    // Hardware deinitialisieren
                    bcm2835_close();
    
                    // Rücksprung
                    return 0;
            } else
            {
                    // Fehler bei Initialisierung
    
                    return 1;
            }
    }
    

    Nun zu meinem Problem. Ich bekomme die Fehlermeldung "undefined refernce to 'bcm2835_init()'", etc. Also für alle Funktionsaufrufe, die diese Hardware betreffen. Nun stehe ich auf dem Schlauch, die notwendige Headerdatei habe ich eingebunden. In ihr sind die Funktionen über den Befehl "external" deklariert. Wieso funktioniert die C-Variante in der Konsole? Muss ich weitere Dateien einbinden?

    Vielleicht kann mir jemand von euch einen Tipp geben, vielen Dank im voraus.

    lg Torsten



  • Du hast scheinbar vergessen die Bibliothek, die diese Funktionen zur Verfügung stellt, zu linken. Wie sieht denn dein Konsolenbefehl für die Kompilierung aus? Wenn du nicht weisst nach welchen Libs du suchen musst, aber erfolgreich in der Konsole kompilieren konntest, dann kannst du dort die namen der Bibliotheken ablesen. Wie man unter Eclipse zusätzliche Abhängigkeiten einstellt weiss ich nicht, aber es gibt sicher eine Anleitung im I-net. (schließlich bist du ja nicht der einzige der CDT nutzt)



  • Die c-Datei wird wie folgt kompiliert und gestartet :

    gcc -o blink -l rt blink.c -l bcm2835
    sudo ./blink

    Es wird wahrscheinlich etwas mit "bcm2835" zu tun haben, oder? Ich bin eben auch Linux Neueinsteiger und blicke mit der Konsole noch nicht so ganz durch.

    lg Torsten



  • "undefined reference" ist eine Fehlermeldung des Linkers. Da kannst Du Header einbinden wie Du willst. Dem Linker wird es egal sein.

    Eine extern-Deklaration sagt dem Compiler, dass es die Funktion gibt. Du musst eben mit dem Flag -l dem Linker sagen, dass er die entsprechende Bibliothek einbinden soll. -lrt und -lbcm2835 sind offensichtlich die Linker-Flags, die Du brauchst. Schau mal, wo Du das in Eclipse eintragen kannst.



  • Dieser Thread wurde von Moderator/in nman aus dem Forum Linux/Unix in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Vielen Dank für die Hilfe, nach ein bisschen experimentieren funktioniert es jetzt. Ich glaube ich muss mich langsam mal mit der Geschichte "kompilieren, linken, etc." beschäftigen 🙂

    lg Torsten


Anmelden zum Antworten