Compilevorgang klappt nicht / Error1

Gast #363507
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!
Moderator Persönliche Seite #363508
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.
Gast #363512
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?
Moderator Persönliche Seite #363513
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?
Gast #363514
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?
Gast #363515
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.
Moderator Persönliche Seite #363516
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.
Gast #363517
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?
Moderator Persönliche Seite #363518
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren