Forum: Compiler & IDEs Problem eigene Bibliothek zu erzeugen


von Christian Rattat (Gast)


Lesenswert?

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

von Christian Rattat (Gast)


Lesenswert?

Ach ja, hatte ein paar Daten vergessen:

Gebaut wird unter Windows mit avr-gcc 3.4.3 in einer Dos-Box

von Christian Rattat (Gast)


Lesenswert?

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???

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

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.

von Christian Rattat (Gast)


Lesenswert?

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

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Hm, naja, bis auf die Spaces im Pfad ist eigentlich nichts auffälliges
dabei (oder ich bin zu blind)...

von Christian Rattat (Gast)


Lesenswert?

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?

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Ä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.

von Christian Rattat (Gast)


Lesenswert?

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).

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

Wenn -O0 klappt und -Os nicht dann fehlt meistens irgendwo ein volatile
vor einer Variablen.

Matthias

von Christian Rattat (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.