PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verstehe Fehlermeldung nicht



bergowitch
18.02.2006, 17:29
Hallo,
ich habe einfach mal aus einem anderen Beitrag diese Sleep-Funktion kopiert.


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:


#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

linux_80
18.02.2006, 17:41
Hallo,
normalerweise wird F_CPU im Makefile definiert, deshalb wird beim compiliern geschimpft !

warning: "F_CPU" redefined

askazo
18.02.2006, 20:57
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

bergowitch
18.02.2006, 21:50
Hallo,

Einfach das define vor das include setzen, dann sollte es funktionieren.
Genau das wars. so funktioniert es.
Vielen Dank
Gruß Stefan

bergowitch
18.02.2006, 21:53
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 !?

ruediw
18.02.2006, 22:14
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.

SprinterSB
18.02.2006, 23:22
...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.