Hi, ich programmiere mit dem AVR Studio (4.13) und WinAVR 20070122 und
würde gerne Funktionen aus der Proycon AVRlib verwenden. Aber ich habe
es noch nicht geschafft das die drei Produkte zusammenarbeiten. Nach
Möglichkeit möchte ich die Makefiles vom AVR Studio generieren lassen
und keine externen verwenden. Was kann ich da tun?
Hat keiner einen Vorschlag? Mir würde es ja schon helfen wenn die AVRlib
überhaupt erstmal mit der aktuellen Version von WinAVR zusammenarbeitet.
Wenn ich die Beispiele compiliere kommen jede Menge Fehlermeldungen.
Nichtmal basictest.c krieg ich compilierte (vom PN2 aus). Hab die
Fehlermeldungen mal angehängt.
Ist die Proycon Lib so verbaut das man die mit dem GCC4.1 nicht mehr
verwenden kann oder mache ich was falsch?
> avr-gcc basiciotest.o -Wl,-Map=basiciotest.map,--cref -mmcu=atmega163 -o
basiciotest.elf
Soweit ich das überblicke, fehlt dem Programm (*.elf) der C-Startupcode
(Vektoren, DATA+BSS Sektionen,...) und die C-Library. Das Programm
besteht im Moment nur aus dem Objektfile vom basiciotest. Es ist
natürlich, dass sich avr-objcopy daran verschluckt.
Wie sieht es aus, wenn du zuerst versuchst die Proycon AVRlib an sich zu
übersetzen, um die benötigte C-Library und den Startup-Code fürs
Zusammenlinken mit deinem Beispiel zu erhalten?
Gibt es ein eigenes Makefile für die Erstellung der Proycon AVRlib?
Wenn du die Library übersetzt hast, musst du anschliessend das Makefile
für dein Beispiel so abändern, dass die frisch erzeugte Library mit
eingebunden wird. Du kannst dich dabei an den Makefiles von Beispielcode
orientieren, die die avr-libc einbinden.
Nein, ein Makefile für die gesamte Lib hab ich nicht gefunden. Außerdem
würde es doch keinen Sinn ergeben alles zu compilieren. Dann hab ich
doch sämtliche Libs spezifisch für einen bestimmten AVR compiliert,
oder?
Außerdem wird bei dem basiciotest nicht wirklich Gebrauch von der Lib
gemacht. Hab das Beispiel mal gepackt und angehängt.
Die Datei avrproj_make ist eigentlich im Library Verzeichnis AVRlib\make
abgelegt. Die Umgebungsvariable $(AVRLIB) ist gesetzt.
Die Lib macht schon komische Sachen
Null Problemo. Dein Beispiel funktioniert. Schau mal nach, die ganze
ELF, HEX, COF, MAP, LST Bande ist vorhanden. Nur das EEP drückt sich.
Und das ist auch der Unterschied zwischen WinAVR 20060125 und WinAVR
20070122.
avr-objcopy aus dem alten WinAVR meldet keinen Fehler, wenn keine EEPROM
Daten da sind, aber die neue tut es. Weil aber der Fehler vom neuen
avr-objcopy kommt, unterbricht make die Abarbeitung des makefile und der
letzte Schritt - die Anzeige des Code und Speicherverbrauchs durch
avr-size - fällt aus.
Das ist aber nicht schlimm, sondern nur ein Schönheitsfehler. Du kannst
ja das avr-size von Hand aufrufen (würde ich machen)...
1
avr-size basiciotest.elf
...oder das avrproj_make anpassen (würde ich nicht machen). Die anderen
Warnungen sind pillepalle und vernachlässigbar.
Die ganzen "dependecies" sind Vorabeinstellungen, falls du die
Funktionen aus der Library verwendest. Angenommen du verwendest die
Timer-Funktionen, dann änderst du makefile an dieser Stelle
SRC = $(TRG).c $(AVRLIB)/timer.c
Und durch die "dependecies" im makefile weiss make, dass es timer.o
machen muss und wie es das machen muss und dass es beide *.o Dateien zum
fertigen Programm zusammenbinden muss.
>avr-objcopy aus dem alten WinAVR meldet keinen Fehler, wenn keine EEPROM>Daten da sind, aber die neue tut es. Weil aber der Fehler vom neuen>avr-objcopy kommt, unterbricht make die Abarbeitung des makefile und der>letzte Schritt - die Anzeige des Code und Speicherverbrauchs durch>avr-size - fällt aus.
Man kann auch einfach ein Byte im Eeprom definieren. Hab es gerade
ausprobiert. Kostet ansonsten keinen zusätzlichen Speicher. Aber er
beendet den Compilerlauf ohne Fehler.
Aber jetzt nochmal zurück zum AVR Studio. Ich hab mir die neueste
Version (4.13) installiert. Die unterstützt die neue Version des AVR
GCC. Wenn ich aber ein Beispiel von der AVRlib compiliere (zb a2dtest.c)
erhalte ich folgende Ausgabe:
make: *** No rule to make target `..//C/Programme/AVRlib/rprintf.c', needed by `rprintf.o'. Stop.
6
Build failed with 1 errors and 0 warnings...
Das AVR Studio erzeugt das Makefile automatisch (habe ich angehängt).
Wenn ich das original Makefile vom Example verwende funktioniert es
(logischerweise). Aber da ich ein fauler Mensch bin würde ich gerne die
Möglichkeit des AVR Studio nutzen das Makefile automatisch erzeugen zu
lassen. Vielleicht kann mir noch jemand bei der Lösung dieses Problems
helfen
Das Dummybyte im EEPROM ist auch eine elegante Lösung ;-)
Beim AVR Studio 4.13 kann ich dir nicht so weiterhelfen, weil ich das
wieder runtergeworfen habe. Es lief als Betaversion miprä mit
Windows98SE und als Releaseversion gar nicht mehr. Das XML-Parsing
zerhaut bei meinem Rechner furchtbar den Speicher mit der Folge, dass
mir die Exceptions an den unmöglichsten Stellen um die Ohren fliegen.
Dieser Ausschnitt aus makefile zeigt, dass AVR Studio von der Position
im Objektverzeichnis ausgeht. Von dort ein Verzeichnis hoch (..) und
dann kommt die Konfusion mit dem Laufwerksbuchstaben...
a2dtest.o: ../a2dtest.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
rprintf.o: ..//C/Programme/AVRlib/rprintf.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<
Wie hast du es gemacht, dass die C-Files so im makefile stehen? Hast du
die C-Files im Dateibaum-Fenster des AVR Studio in den Ordner Source
aufgenommen?
Mir fällt nur als Worst-Case die Umschiffung des Problems ein: Vermeide
einen Laufwerkswechsel zwischen normalen Sourcefiles und Libraryfiles.
D.h. Schaffe die AVRLIB z.B. auch auf dein J: Verzeichnis.
Stefan wrote:
> Soweit ich das überblicke, fehlt dem Programm (*.elf) der> C-Startupcode (Vektoren, DATA+BSS Sektionen,...) und die> C-Library. ...
Du überblickst das falsch. Das wäre der Fall gewesen, wenn er avr-ld
direkt auf diese Weise aufgerufen hätte. Er hat aber den
Compilertreiber avr-gcc benutzt, und der kümmert sich um Startupcode
und Bibliothek.
> Das Dummybyte im EEPROM ist auch eine elegante Lösung ;-)
Nein, es ist eine sehr unelegante.
Entweder kommentierst du das EEPROM-Handling aus dem Makefile raus,
wenn du es nicht brauchst, oder aber du schreibst vor den Aufruf des
avr-objcopy, mit dem die EEPROM-Datei erzeugt werden soll, ein
Minuszeichen (direkt nach dem TAB). Schließlich kannst du es noch
richtig schick lösen mit
1
avr-objcopy ... || echo "There appears to be no EEPROM data to copy."
> Du überblickst das falsch. Das wäre der Fall gewesen, wenn er avr-ld> direkt auf diese Weise aufgerufen hätte. Er hat aber den> Compilertreiber avr-gcc benutzt, und der kümmert sich um Startupcode> und Bibliothek.
Ja, das war ein Denkfehler von mir. Ich dachte, die Procyon AVRlib sei
ein kompletter Ersatz für die avr-libc. Ist sie aber nicht. Sie ist eine
Sammlung von zusätzlichen Funktionen. Das habe ich gestern gesehen, als
ich selbst das Beispielprojekt übersetzt habe.