-         

Ergebnis 1 bis 7 von 7

Thema: Verstehe Fehlermeldung nicht

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    22.11.2003
    Beiträge
    214

    Verstehe Fehlermeldung nicht

    Anzeige

    Hallo,
    ich habe einfach mal aus einem anderen Beitrag diese Sleep-Funktion kopiert.
    Code:
    void Sleep( uint16_t timeInMs )
    {
        uint16_t loopCnt = timeInMs>>3;
    
        while( loopCnt )
        {
            _delay_ms(8);
            loopCnt--;
        }
    }
    diese benötigt #include <util/delay.h> wo wiederrum F_CPU deiniert sein sollte.
    Ich wollte nun meine Frequenz einbauen und habe einfach im Hauptfile (das einzige in dem mein code ist) diese Zeile eingefügt:
    Code:
    #define F_CPU 8000000UL
    wenn ich mit make das file compile gibt es zwar keine Fehlermeldung aber dies Warnung:
    In file included from mein_motor-included_sleep.c:11:
    C:/Roboter/WINAVR/avr/include/util/delay.h:136:3: warning: #warning "F_CPU not defined for <util/delay.h>"
    mein_motor-included_sleep.c:13:1: warning: "F_CPU" redefined
    C:/Roboter/WINAVR/avr/include/util/delay.h:137:1: warning: this is the location of the previous definition
    Kann mir jemand diesen Fehler erklären und vor allem die Verbesserung verraten?
    Danke
    Gruß
    Stefan

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,
    normalerweise wird F_CPU im Makefile definiert, deshalb wird beim compiliern geschimpft !
    warning: "F_CPU" redefined

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Wenn ich das richtig sehe, steht das include in Zeile 11 und das define erst danach in Zeile 13. So stolpert der Compiler also erst über die Header-Datei, in der F_CPU schon benutzt wird, obwohl es noch nicht definiert ist. Dann enddeckt er erst die Definition und meckert diese als "redefined" an, weil das Makro ja schon in der Header-Datei benutzt wurde und eigentlich definiert sein müsste...

    Einfach das define vor das include setzen, dann sollte es funktionieren.

    askazo

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    22.11.2003
    Beiträge
    214
    Hallo,
    Einfach das define vor das include setzen, dann sollte es funktionieren.
    Genau das wars. so funktioniert es.
    Vielen Dank
    Gruß Stefan

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    22.11.2003
    Beiträge
    214
    Ps: Verstehe ich das richtig, dass die include Dateien in der Reihenfolge in der sie stehen compiliert werden? Also müssen aufeinander folgende include Dateinen genau in der richtigen Reihenfolge stehen !?

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.12.2005
    Ort
    Tann / ZH
    Alter
    61
    Beiträge
    264
    Ja, genauso ist es..
    Wenn Library A auf Funktionen der Library B zugreifen muss,
    so muss Library A ***Nach*** Library B im Quelltext eingefügt werden.
    Ausser Du machst eine Vorwärts-Deklaration...

    Deshalb ist meist die 1. Library die, die den Typ des uC definiert.
    Dort werden nur Konstanten definiert.
    MfG
    Ruedi

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    ...nicht ganz. Die Linkreihenfolge ist nicht davon abhängig, wie die Funktionen aufgerufen werden, sondern eben davon, wie die Linkreihenfolge ist

    Das #include macht nur einen reinen Textersatz. Es kopiert den Inhalt der angegebenen Datei in die Datei hinein, wo es steht.

    Mit #define definiert man ebenso nur einen rein textuellen Ersatz. Das F_CPU wird überall, wo es steht, durch 8000000L (oder was auch immer) ersetzt.

    Wenn es dann mehrere Variablen-Definitionen oder Defines gibt, wird gemeckert.

    ...und mach dir auch klar, was der Unterschied zwischen einer Variablen-Definition und einer Variablen-Deklaration ist!

    Bei Include-Dateien sollte es eigentlich nicht auf die Reihenfolge ankommen -- wenn sie richtig gemacht sind.

    Im übrigen ist eine Header-Datei keine Bibliothek im Sinne von C (wie etwa die libc oder libm), das führt oft zu Verwirrungen.
    Disclaimer: none. Sue me.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •