mikrocontroller.net

Forum: Compiler & IDEs Problem eigene Bibliothek zu erzeugen


Autor: Christian Rattat (Gast)
Datum:

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

Autor: Christian Rattat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, hatte ein paar Daten vergessen:

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

Autor: Christian Rattat (Gast)
Datum:

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

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

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

Autor: Christian Rattat (Gast)
Datum:

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

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

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

Autor: Christian Rattat (Gast)
Datum:

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

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

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

Autor: Christian Rattat (Gast)
Datum:

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

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Matthias

Autor: Christian Rattat (Gast)
Datum:

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

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.