Hi, ich hab für den atmega128 ein paar Routinen zum Ansteuern eines Displays geschrieben. Das klappt zusammen mit dem normalen Anwendungscode auf dem Gerät einwandfrei, solange ich alles in einem Makefile zusammen compiliere und linke. Nehme ich nun meinen display code und packe den in eine eigene dll (libgfx.a) und binde diese dazu, geht es nicht mehr. Erzeugt wird die lib mit: avr-ar cru lib/libac_graphics.a ac_hitachi.o ac_graphics.o ac_font.o hinzugelinkt einfach mit -lac_graphics Der compile step sieht so aus (beispielhaft für alle files in meiner lib als auch im restlichen code): avr-gcc -c -I. -Iinclude -mmcu=atmega128 -mcall-prologues -Os -O1 -mno-tablejump -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=ac_font.lst -std=gnu89 -Wp,-M,-MP,-MT,ac_font.o,-MF,.dep/ac_font.o.d ac_font.c -o ac_font.o Es muss doch irgendwas damit zu tun haben, dass entweder die lib falsch gebaut oder falsch gebunden wird. Aber ich seh da einfach nichts. Irgendeiner eine Idee, wie ich das hinbekomme? Danke und Grüße, Christian
Ach ja, hatte ein paar Daten vergessen: Gebaut wird unter Windows mit avr-gcc 3.4.3 in einer Dos-Box
Kleiner Fortschritt: Hab mal die .o files aus dem getrennten Lib Projekt direkt dazugelinkt, dann geht's. Kann also nur dir lib Erzeugung sein. Bin ich zu blöd oder was kann man da falsch machen???
Hm, der einzige Unterschied, den ich auf Anhieb zu meiner Vorgehensweise erkennen kann, ist der, daß ich noch den Index des Archives erstellen lasse (Option: s). Vielleicht Postest Du noch die Kommandozeile die Dein ELF erzeugt.
Hi, hier die Kommandozeile vom linker. Ich hab die s Option ebenfalls mal verwendet, das Ergebnis bleibt aber das gleiche. Grüße, Christian avr-gcc -mmcu=atmega128 -I. -I"D:\Private\Projects\SpeedMax\SpeedMax Control Software\20051015\include" -I"D:\Private\Projects\SpeedM ax\SpeedMax Control Software\SpeedMax Graphics\include" -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wst rict-prototypes -Wa,-adhlns=ac_main.o -std=gnu89 -Wp,-M,-MP,-MT,ac_main.o,-MF,.dep/ac_main.elf.d ac_main.o ac_display.o ac_clock.o ac_ hardware.o ac_keyboard.o ac_uart.o --output ac_main.elf -L. -L"C:\Programme\WinAVR\lib" -L"D:\Private\Projects\SpeedMax\SpeedMax Con trol Software\SpeedMax Graphics\lib" -Wl,-Tdata=0x801100,--defsym=__heap_end=0x8090ff -lm -lac_graphics -lc -v -litcl32 -litk32 -Wl ,-Map=ac_main.map,--cref -lgcc
Hm, naja, bis auf die Spaces im Pfad ist eigentlich nichts auffälliges dabei (oder ich bin zu blind)...
Hm, geht mir ebenso. Habe gerade nochmal nachgeschaut. Der avr-ar den ich verwende sagt mir folgendes über sich GNU ar 2.15 + coff-avr-patch (20030831) Ist da irgendwas faul? Ar macht doch m.E. nichts weiter, als ein archiv mit den Files zu bauen. Die Files kann ich direkt linken, dann läufts. Ich hab noch ein weiteres Phänomen. Wenn ich die Objects aus der Lib mit -Os übersetze, geht ebenfalls nichts mehr. Gibt es da irgendwelche Einschränkungen bzgl. Optimierung beim avr-gcc oder beim ATMega128?
Ähem, jetzt wo Du es sagst:
>avr-gcc -c -I. -Iinclude -mmcu=atmega128 -mcall-prologues -Os -O1
-Os und -O1
Ausserdem könnte es sein, daß Du irgendwelche Delay-loops eingebaut
hast, die der Compiler einfach wegoptimiert. Für sowas solltest Du
avr/delay.h verwenden.
Nee, das war nur ein compile Versuch um die Optimierung zu testen. Bei den eigentlichen Tests mit der Lib verwende ich für alle Files nur -O0, also komplett ohne Optimierung. Hab auch gerade nochmal sicherheitshalber nachgeschaut. Ich hab das Programm mal ordentlich abgespeckt und ausser der Hardware Initialisierung, Tastaturabfrage und Grafikausgabe ist nun nichts mehr drin. Delays gibt es in dem Code nirgendwo in Form einer Schleife oder sowas. Um zeitgesteuerte Tasks abzuarbeiten nutze ich den Timerinterrupt und einige Zähler. Für die Synchronisierung der Grafikfunktionen per SPI habe ich Schleifen, die das Statusregister abfragen (sowas in der Form "while ((*StatusReg) & 0x80);"), aber die sollten ja nun nicht wegoptimiert werden. Ich bin echt am verzweifeln mit dem Zeugs. Mit der Lib das kann ch noch verkraften aber die Optimierung tut weh, da mir der Speicher ausgeht und den ATMega2560 bekomme ich erst demnächst. (Wenn überhaupt; die Atmel Jungs haben sich dazu noch nicht genau geäussert aber gesagt, wir würden die bald bekommen).
Hi Wenn -O0 klappt und -Os nicht dann fehlt meistens irgendwo ein volatile vor einer Variablen. Matthias
Tausend Dank!!! Volatile war der richtige Tipp und nun geht es mit -Os problemlos. :-) Nun muss ich nochmal schauen, ob die Lib dann vielleicht auch schon funktioniert.
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.