www.mikrocontroller.net

Forum: Compiler & IDEs Typabhängiges Linken


Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Ulrich (Gast)
Datum:

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau!

Autor: Hans-jürgen Herbert (hjherbert) Benutzerseite
Datum:

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

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.