Hallo, hat mal jemand versucht, eigene Tool-Bibliotheken für AVR (WinAVR) zu schreiben, in denen sich z.B. UART-Routinen, LCD-Routinen usw. befinden? Immer die ganzen Sourcen per #include einzubinden, ist ja umständlich und das Compilieren geht langsam. Habe noch keinen Überblick, wie man Link-Module erstellt und in Bibliotheken verpackt und diese dann ins eigene Projekt so übernimmt, daß AVR Studio die benötigten Module so einbindet wie die Systemmodule auch. Kann mir jemand auf die Sprünge helfen? Vielen Dank schon mal. Günter
Wenn du die ganzen Sourcen per #include einbindest machst du was falsch. Eigentlich bindet man per #include nur Headerdateien ein in denen kein Code steht.
damit ist die Frage aber leider nicht beantwortet; interessieren würde mich das Thema auch, da ich *.h mit Code, auch im Wissen, dass es nicht ganz korrekt ist, immer komplett einbinde und compiliere. Jens
Die Frage war durchaus korrekt beantwortet: Wenn man den Code nicht in *.h datein reinschreibt sondern in separate *.c dateien, dann macht der Compiler nix anderes als jede *.c Datei in eine Objektdatei zu übersetzen. Der Linker geht dann nur noch durch und linkt diese Objekte zusammen (löst noch offene Sprünge in andere Funktionen auf). Damit der Compiler im Vorfeld prüfen kann, ob eine Funktion korrekt verwendet wird, braucht er einen Prototyp (aus den Headerdateien). Ich habs selbst noch nie versucht, aber: - schreib deine "bibliothek" in eine eigene Datei. - schreib deine prototyp-deklarationen in eine headerdatei. - übersetze sie (nur übersetzen, nicht linken und nicht assemblieren) - schreib dein hauptprogramm, und nutze die header dateien und funktinen deiner bibliothek - übersetze es, eventuell musst du dem linker noch mitteilen, was er alles dazulinken soll. Nach dem Prinzip sollte es eigentlich funktionieren. Gruß Andreas
man ar Ist aber bei den kleinen Prozzis immer so eine Sache da man sich wohl kaum eine Superluxuslibary zusammenbasteln will um keinen Platz zu verschwenden. Ausserdem sind die Rechner doch so schnell das sie alles was in nem avr passt in Sekunden uebersetzt haben, zumal ja auch immer nur das File uebersetzt wird an dem man gerade was geaendert hat. Jedenfalls wenn man make verstanden hat. .-) Olaf
Im Headerfile hat Code eigentlich nichts zu suchen. Du mußt Dein Makefile entsprechend anpassen, daß andere .c Dateien auch compiliert und zu Deinem main-File gelinkt werden. Im Anhang ist ein kleines Beispiel. Wichtig ist, daß Du im Makefile bei SRC die zu compilierenden Dateien angibst.
>damit ist die Frage aber leider nicht beantwortet; >interessieren würde mich das Thema auch, da ich *.h mit Code, auch im >Wissen, dass es nicht ganz korrekt ist, immer komplett einbinde und >compiliere. Das wollte ich erst mal nachprüfen Also in h Dateien kein Code! Diese werden auch weiterhin #include(iert) deine Funktionen schreibst du in eine extra .c Datei die prototypen etc. in eine .h. (nochmals kein Code!) die c kompilierst du und hast eine Object Datei diese kannst du in eine Library reinnehmen. Der Unterschied zwischen einer Object-Datei und einer Library ist in erster Linie das in einer Library mehrere Object Dateien sein können. (Oh,Oh dafür wird es Prügel geben) Problem ist folgendes eine Objectdatei wird immer komplett reingenommen. Um keine Codeverschwendung zu machen schreibt man daher fast jede funktion in eine eigene .c Datei die kompiliert wird und fast dann die ganzen Objektdateien zu einer Library zusammen. Diese Library ist dem Linker anzugeben und die entsprechenden Prototypen müssen mit .h Files dem Programm bekannt gemacht werden.
BOAH Leute, Wie oft soll denn jetzt noch jemand sagen "in .h Dateien bitte kein Code.. blablablabla".. Also wenn ich den Threadstarter richtig verstehe, will er fertige Bibliotheken machen. Also eben nicht solche, die als .c/.h Datei vorliegen.
@Simon: Das hat Wolfram doch gerade erklärt. Die .h-Datei brauchst du trotzdem für den Compiler.
Hallo, danke für die schnellen Postings. Wie man im Prinzip Bibliotheken anlegt, was Linkmodule sind, daß kein Code in der h steht usw. weiß ich alles. Habe das ja unzählig oft bei anderen Prozessorsystemen schon gemacht (dort habe ich natürlich einige Zeit aufwenden müssen, um z.B. Batch-Files zusammenzubasteln, die Bibliotheken frisch aufbauen etc.; bei dieser neuen Prozessor-Familie möchte ich Zeit sparen durch konkrete Tipps). Aber hier geht's ja um Details, nämlich: WO schreibe ich WAS in das Makefile rein, und wo definiere ich mein "personalisiertes" Makefile, damit es auch verwendet wird? Bisher hatte ich ja (wie wahrscheinlich die meisten anderen auch) das Makefile, das es natürlich gibt, noch nie angefaßt, weil man das unter AVR Studio und WinAVR zunächst (!) mal garnicht braucht. Nur wenn man weiter voranschreitet und sich Tool-Bibliotheken aufbauen möchte, braucht man es, und das ist JETZT. Sourcen habe ich bis jetzt mit Include deswegen eingebunden, damit die Support-Funktionen nicht alle im main-Programmfile stehen. So kann man's besser pflegen. Aber die im Einzelfall benötigten Funktionen per Linker einzubinden, ist natürlich viel besser, weil dabei das System selbst dafür sorgt, daß genau nur die Funktionen eingebunden werden, die man auch verwendet, und nicht, wie jetzt, immer alles (bzw. das, was man aus der Include-Liste nicht manuell rauslöscht). Danke, Dirk, für Dein Beispiel. Werde es mir jetzt anschauen und gucken, wo Du im Makefile etwas gegen das Standard-File verändert hast. Wolfram, danke auch Dir - genau wie Du es beschreibst, mache ich es bei anderen Prozessoren. Vielen Dank auch an die anderen - jeder Beitrag ist willkommen. Günter
Das hättest du auch gleich sagen können, es klang so, als wenn das deine erste Lib ist. Also der librarian des gcc ist avr-ar ,wie schon oben erwähnt mit dem man ar. Der gibt mit Option --help seinen Syntax an. Da du abkürzen willst. Zum benutzen der Library nimm Avrstudio,trage unter Project Options->library dein Lib die du benutzen willst ein und exportiere das Makefile. Ansonsten findest du auch im Projektverzeichnis das verwendete Makefile. Das sollte dir alle Fragen zur Verwendung beantworten.
Hallo, Wolfram, danke. Ich verstehe es so, daß man die Command Line Tools verwendet, also avr-ar.exe etc. Mache ich gleich mal. Kann man eine Bibliothek auch komplett innerhalb des AVR Studio erstellen, also so, daß man beispielsweise ein Projekt eröffnet, dort im Sourcen-Baum alle die c-Files angibt, die in der Bibliothek enthalten sein sollen? Was meinst Du mit "exportiere das Makefile"? Ich verstehe die Arbeitsweise des AVR Studio ja so, daß dieses zum Compilieren aus den Projektoptionen ein davon abgeleitetes spezialisiertes Makefile erstellt. Ist es so?
>Kann man eine Bibliothek auch komplett innerhalb des AVR Studio >erstellen, also so, daß man beispielsweise ein Projekt eröffnet, dort >im Sourcen-Baum alle die c-Files angibt, die in der Bibliothek >enthalten sein sollen? Ich glaube nicht, die Unterstützung ist erst seit der letzten Version drin und Winavr und Avrstudio sind getrennte Projekte. Du hast aber eine komplette Unix-umgebung mitinstalliert (mit Winavr) Insoweit stehen dir sämtliche shellbefehle zur Verfügung und das ist um einiges mächtiger als dos Batchdateien. Die einarbeitungszeit lohnt sich durchaus wenn du sonst viel Zeit in Batchprogrammierung zum zusammenstellen deiner LIB gesteckt hast. Was meinst Du mit "exportiere das Makefile"? es gibt einen Menupunkt "export Makefile" ich glaube unter Build noch nie selbst benutzt... sonst schau ins Projektverzeichnis im Unterordner ist das Makefile 3. ja
ok, ich habs auch verstanden. Bei Verwendung des makefiles trage ich unter SRC = $(TARGET).c die zugehörigen Bibliotheken ein und in die header kommen nur die zugehörigen Prototypen. So hab ichs auch Verwendung von PN als IDE gemacht. Nach Umstieg auf AVR-Studio wollte dies (ohne Verwendung eines externen makefiles) jedoch nicht mehr so recht gelingen. Daher die Krücke mit *.h inkl. source. Nun stellt sich mir die Frage, wie AVR-Studio ohne externes makefile die Verknüpfung von blabla.h zu blabla.c herstellt? Oder seh ich da den Wald vor Bäumen nicht? Jens
@Jens500 >Bei Verwendung des makefiles trage ich unter SRC = $(TARGET).c die >zugehörigen Bibliotheken ein und in die header kommen nur die >zugehörigen Prototypen. falsch, in deine .c files kommt das Programm als c-source in .h kommen die prototypen und Deklarationen im Makefile gibst du an welche .c Dateien alle zu deinem Projekt gehören damit sie kompiliert werden und der Linker fügt alles zu einem Programm zusammen. Solltest du noch irgendwelche externen Funktionen aus Bibliotheken benutzen so musst du dies dem Linker sagen damit er diesen Programmcode auch dazu linkt, sonst gibts ein undefined reference Wenn du das ganze so wie du angibst gemacht hättest ,hättest du nicht ein Programm hinbekommen ,da make mit einem Fehler abgebrochen hätte. gcc will nunmal c-Code compilieren und keine Binaer Dateien verarbeiten. >Nun stellt sich mir die Frage, wie AVR-Studio ohne externes makefile >die Verknüpfung von blabla.h zu blabla.c herstellt? gar nicht dazu dient nämlich das Keyword #include im c file
@Wolfram da hab ich mich wohl ein wenig missverständlich ausgedrückt. Ansonsten, wie Du schon richtig sagst, hätte keins meiner Projekte funktioniert. Und die tuns alle ganz ortdentlich inkl. lcd.h pwm.h timer.h adc. etc... >gar nicht >dazu dient nämlich das Keyword #include im c file das wars wohl was ich im AVR-Studio immer ausgelassen habe. Fazit : nicht nur über bits shiften nachdenken, sondern auch mal das übergeordnete Thema in Ruhe beleuchten. Asche auf mein Haupt.
Hallo, ich würde das Thema Makefile hier gern noch mal aufnehmen. Ich möchte die avrlib (http://members.home.nl/jmnieuwkamp1/AVRlib/) einbinden, um ein LCD über einen I2C-Bus anzusteuern. Nun besteht die avrlib nur aus *.c und *.h-Files. Innerhalb der avrlib gibt es auch ein Beispiel für i2c, welches ich versuche in AVR Studio zu compilieren + linken. Die Fehlermeldung ist z.B. "../i2ctest.c:51: undefined reference to `uartInit'", was darauf zurückzuführen ist, dass keine Object-Files der Bibliotheks-Funktionen erzeugt werden. Bei dem Beispiel wird ein Makefile mitgeliefert, der u.a. folgende Zeile enthält: "uart.o : uart.c uart.h global.h" Er definiert also, woraus die Object-Files erstellt werden. Diesen Makefile kann ich aber in AVR Studio nicht verwenden, oder? Wie mache ich es dann? (Ich bin noch ziemlicher Neuling (Student) - sowohl in C-Programmierung als auch Mikrocontroller-Programmierung...)
Du gehst im AVR-STudio in die linke Pane (dort wo die Fileansicht ist). Über 'Source-Files' klickst du mit der rechten Maustaste, wählst aus: 'add existing source file(s)' und zeigst dem Ding wo die 'uart.c' liegt. Das wars. Beim nächsten build wird uart.c mitkompiliert und das Ergebnis ins Programm mit eingelikt.
grenze deinen Fehler ein: 1. gehe ins Verzeichnis des Beispiels und probiere dort ein Make AUF DER KOMMANDOZEILE 2. In Avrstudio kannst du auch externe Makefiles verwenden wenn 1. klappt, kannst du ja mal dies einstellen
Vielen Dank für Eure schnellen Antworten! Also über die Kommandozeile funktioniert's. WO stelle ich in AVR Studio ein, dass er nen externen Makefile nehmen soll?
>WO stelle ich in AVR Studio ein, dass er nen externen Makefile nehmen
soll?
Schaust du auch gelegentlich selbst nach, wenn was nicht funktioniert?
Ein Startpunkt zur Suche wären die Projektoptionen...
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.