Forum: Compiler & IDEs Typabhängiges Linken


von Benedikt K. (benedikt)


Lesenswert?

Ich habe mir ein paar Libraries mit nützlichen, kleinen Funktionen 
gebastelt, so dass diese bei Bedarf automatisch hinzugelinkt werden.
Da die Funktionen recht einfach waren, waren die zu alle AVRs 
kompatibel.
Jetzt habe ich aber Funktionen die je nach AVR (mit 16 bzw 8bit 
Stackpointer) unterschiedlich sind. Wie mache ich das, dass der Linker 
automatisch die richtige Version für den verwendeten AVR linked ?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Geht nicht.  Du kannst es bestenfalls über verschiedene -L-Optionen
steuern.

Du kannst, auch wenn das nicht wirklich dokumentiert ist, den
Stackpointer jedoch immer als 16-bittig betrachten.  Der GCC tut's
auch so, und falls Atmel wirklich mal einen AVR rausbringen sollte,
der das reservierte SPH-Register nicht mehr ignoriert, ist mehr oder
weniger die Hölle los...

von Benedikt K. (benedikt)


Lesenswert?

OK, Danke.
Das mit dem Stack war jetzt nur ein Beispiel. D.h. die 
Standardbibliotheken sind also so allgemein geschrieben, so dass sie auf 
jedem AVR lauffähig sind ?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nein, die avr-libc klassifiziert nach den groben Typgruppen (avr2
... avr6). Allerdings ist sie natürlich in der einzigartigen Lage,
dass GCC um die Standardbibliothek weiß und typabhängig wirklich in
unterschiedlichen Verzeichnissen sucht.  Ein derartiger Mechanismus
steht jedoch nicht allgemein für Anwenderbibliotheken zur Verfügung.

von Ulrich (Gast)


Lesenswert?

wenn du z.B. normalerweise nur mit 1MHZ 8MHz 12MHz und 16MHz und 5 
verschiedenen Typen programmierst, könntest du diese 20 Versionen im 
Vorfeld compilieren und z.B. so benennen name_8000000_mega8.o Im 
Makefile kannste dann F_CPU und MCU verwenden um das richtige file zu 
linken.

von Benedikt K. (benedikt)


Lesenswert?

Das heißt also, ich kann verschiedene Versionen machen (genauso wie ich 
es vorhatte) und die Dateien die alle gleich heißen in die AVR3-AVR6 
Verzeichnisse legen, und der Linker nimmt dann die zum entsprechenden 
Typ passende ?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nein, du musst das in deinem Makefile passend beschreiben.

Der Linker (oder besser der Compiler) kann doch keine Ahnung haben, was
du dir bei deiner Namensgebung so gedacht hast.

von Benedikt K. (benedikt)


Lesenswert?

Beispiel:
Ich erzeuge die Bibliotheken libintmath.a für die verschiedenen AVRs, 
kopiere die Dateien in die AVR3, AVR4, AVR5 und AVR6 Verzeichnisse und 
füge in der Makfile -lintmath hinzu. Funktioniert das dann so wie 
gewünscht, dass der Compiler je nach AVR Typ die Dateien aus den 
Unterschiedlichen Verzeichnissen nimmt ?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nein.

Bitte begreif doch, der Compiler weiß nichts von deinen Intentionen.

Du musst ihm das mittels des Makefiles beibringen.  Das wiederum kann
man aber, wie Ulrich bemerkte, halbwegs automatisieren.

von Benedikt K. (benedikt)


Lesenswert?

OK, jetzt habe ichs verstanden: Die Standard Libs haben also einen 
besonderen Status und sind quasi fest im Compiler bzw. Linker verankert.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Genau!

von Hans-jürgen H. (hjherbert) Benutzerseite


Lesenswert?

Hänge doch deine Programme an die vorhandene lib an:

erst eine Sicherung der original-Libs machen

dann etwa so etwas ausführen:

avr-gcc myprog.c -c $(HEAD) -g -mmcu=atmeg32 -Wall -Os -DAVR $(DEFS) $< 
-o myprog.o
avr-ar rc c:/winavr/lib/gcc/avr/4.1.1/avr5\libgcc.a myprog.o
avr-ar t c:/winavr/lib/gcc/avr/4.1.1/avr5\libgcc.a
avr-gcc myprog.c -c $(HEAD) -g -mmcu=attinyxx -Wall -Os -DAVR $(DEFS) $< 
-o myprog.o
avr-ar rc c:/winavr/lib/gcc/avr/4.1.1/avr4\libgcc.a myprog.o
avr-ar t c:/winavr/lib/gcc/avr/4.1.1/avr4\libgcc.a

Jetzt fehlt nach eine Tabelle avr-step-no (avr3 avr4 avr5) zu 
Processortyp

(Hab ich nicht ausprobiert - soll ein Tip sein)

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.