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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.