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 ?
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...
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 ?
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.
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.
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 ?
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.
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 ?
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.
OK, jetzt habe ichs verstanden: Die Standard Libs haben also einen besonderen Status und sind quasi fest im Compiler bzw. Linker verankert.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.