Forum: Compiler & IDEs Eigene Bibliotheken für WinAVR


von Günter R. (galileo14)


Lesenswert?

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

von Wolfram (Gast)


Lesenswert?

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.

von Jens500 (Gast)


Lesenswert?

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

von Baitronic (Gast)


Lesenswert?

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

von Olaf (Gast)


Lesenswert?

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

von Dirk D. (dirkd)


Angehängte Dateien:

Lesenswert?

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.

von Wolfram (Gast)


Lesenswert?

>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.

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von Rahul (Gast)


Lesenswert?

@Simon: Das hat Wolfram doch gerade erklärt.
Die .h-Datei brauchst du trotzdem für den Compiler.

von Günter R. (galileo14)


Lesenswert?

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

von Marc M. (bytewood) Benutzerseite


Lesenswert?

abo

von Wolfram (Gast)


Lesenswert?

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.

von Günter R. (galileo14)


Lesenswert?

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?

von Wolfram (Gast)


Lesenswert?

>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

von Jens500 (Gast)


Lesenswert?

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

von Wolfram (Gast)


Lesenswert?

@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

von Jens500 (Gast)


Lesenswert?

@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.

von Ulrike (Gast)


Lesenswert?

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...)

von Karl heinz B. (kbucheg)


Lesenswert?

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.

von Wolfram (Gast)


Lesenswert?

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

von Ulrike (Gast)


Lesenswert?

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?

von Wolfram (Gast)


Lesenswert?

>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...

von Ulrike (Gast)


Lesenswert?

Hab ich übersehen - 'tschuldigung!

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.