Forum: Compiler & IDEs Compilevorgang klappt nicht / Error1


von Alex Janssen (Gast)


Lesenswert?

Hallo,

ich habe versucht, verschiedene Projekte auf einem WinAVR von Dezember
2005 zu compilieren. Es kommt meist:

lcd.c:48: error: address of register variable 'tmp1' requested
lcd.c:52: error: address of register variable 'tmp2' requested
make: *** [lcd.o] Error 1

oder es kommt:

experiment.c:15:20: avr/io.h: No such file or directory
experiment.c:16:23: avr/delay.h: No such file or directory
experiment.c:17:24: avr/signal.h: No such file or directory
experiment.c:18:27: avr/interrupt.h: No such file or directory
make: *** [experiment.o] Error 1

Was geht da schief? Ich bin noch ziemlicher Anfänger in GCC und finde
den Fehler einfach nicht. Was bedeutet Error 1?

Danke!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Error 1 heißt, dass sich der Compiler mit einem Fehlerstatus von
1 beendet hat.  0 ist OK, alles andere ist ein Fehler.  Was
der Fehler ist, wird durch diesen Code nicht beschrieben, aber
natürlich sehr wohl durch die von dir zitierten Fehlermeldungen.

Die ersten Fehlermeldungen sprechen eigentlich für sich.  Wenn
man eine Variable als "register" deklariert, kann man nicht
anschließend vom Compiler verlangen, dass er davon eine
(Speicher-)Adresse bildet (d. h. man darf auf so eine Variable
nicht den &-Operator anwenden).

Die Fehlermeldungen von experiment.c deuten auf ein
Installationsproblem deines Compilers hin.  avr/io.h usw. sind
Headerdateien, die zur avr-libc gehören, die werden normalerweise
zusammen mit dem Compiler installiert.  Irgendwie findet der
Compiler diese nicht.

von Peter Fleury (Gast)


Lesenswert?

>>WinAVR von Dezember 2005 zu compilieren

Es gibt kein offizieller WinAVR vom Dezember 2005,
die neueste Version ist vom 25.1.2006

http://winavr.sourgeforge.net

von Peter Fleury (Gast)


Lesenswert?

Ja man sollte die URL noch richtig schreiben...
http://winavr.sourceforge.net/

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Letztens war jemand im Chat und hatte das gleiche Problem.
Als er mir die Codezeile gezeigt hat, kam dabei raus, daß diese
Fehlermeldung entsteht, wenn auf eine 'register' Variable ein
sbi()/cbi()... ausgeführt wird. Vermutlich alte Software mit
Kompatibilitätsmakros verwendet...

von Alex Janssen (Gast)


Lesenswert?

Genau das wars, Oldbug! Ich hab auch da auch einen Verweis auf ein sbi()
Makro gefunden. Als ich dann versucht habe, die deprecated Functions
wieder in die sfr_defs.h einzubauen, hat das leider auch zu keinem
anderen Ergebnis geführt. Komisch eigentlich, oder?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Don't touch vendor header files.  Deine Änderungen werden
beim nächsten Update gebügelt.

Was willst du nun aber?  Davon abgesehen, dass die Umsetzung
eines sbi() in ,,richtigem'' C ja nun wirklich nicht schwierig
ist, diese Makros waren auch zu Zeiten, da sie noch Sinn hatten,
nur auf einem IO-Port definiert (noch dazu nur auf einem Teil
davon).  Warum sollte man sowas also auf eine als register
deklarierte Variable anwenden wollen?

von Alex Janssen (Gast)


Lesenswert?

Ich weiß das alles leider nicht: Ich hab hier einige (viele) ältere
Projekte, die ich neu kompilieren muß. Mehr nicht, aber auch nicht
weniger. Es geht also mir nicht um Sinn und Zweck, sondern nur darum,
den Compiler dazu zu bringen, den alten Kram zu akzeptieren. Also habe
ich aus einer alten WinAVR die Makros extrahiert und eingebunden. Nur:
Warum werden sie icht erkannt?

von Rolf Magnus (Gast)


Lesenswert?

> Wenn man eine Variable als "register" deklariert, kann man nicht
> anschließend vom Compiler verlangen, dass er davon eine
> (Speicher-)Adresse bildet (d. h. man darf auf so eine Variable
> nicht den &-Operator anwenden).

Ist das in C so festgelegt? Immerhin wäre so eine Operation auf AVRs
durchaus möglich, da auch die Register in den Adressraum eingeblendet
sind.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Ist das in C so festgelegt?

Ja, 6.5.3.2 Address and indirection operators:

Constraints

The operand of the unary & operator shall be ...
... an lvalue that designates an object that is not
a bit-field and is not declared with the register
storage-class specifier.

Ich weiß, dass es beim AVR theoretisch gehen würde, der dürfte
aber so beinahe der einzige Prozessor sein, der das kann.
Insofern könnte der GCC ja zumindest von einem nicht als
register deklarierten Objekt sogar die Adresse bilden, wenn er
es trotzdem in einem Register hält, aber ich fürchte, dass er
selbst dies nicht kann, weil an eine derartige Möglichkeit
nie jemand gedacht hat.

von Alex Janssen (Gast)


Lesenswert?

Also ich habs gerade getestet: Unter GCC 3.4.1 klappt die Kompilierung,
unter 3.4.3 tut sie es nicht. Die include/avr-Verzeichnisse der beiden
Versionen unterscheiden sich offenbar stark. Kann das der Grund sein?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ohne konkreten Code können wir hier nur spekulieren.

Wie geschrieben, sbi und cbi waren auch früher nur legal
auf IO-Register anwendbar, dafür sollten auch heute noch
die replacement macros funktionieren.  Wenn bei dir jetzt
irgendwas nicht mehr tut, hast du Code, der nie legal
war, aber dann musst du das schon mal auf das kleinste
reproduzierbare Stückchen einkreisen und dieses hier
posten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.