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!
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.
>>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
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...
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?
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?
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?
> 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.
> 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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.