mikrocontroller.net

Forum: Compiler & IDEs Compilevorgang klappt nicht / Error1


Autor: Alex Janssen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Fleury (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Fleury (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja man sollte die URL noch richtig schreiben...
http://winavr.sourceforge.net/

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Alex Janssen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Alex Janssen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex Janssen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.