Forum: Mikrocontroller und Digitale Elektronik Eclipse & AVR, mehrere Projekte mit verschiedenen Prozessoren


von Conny G. (conny_g)


Lesenswert?

Hallo alle,

ich benutze Eclipse zur AVR-Entwicklung und ich werde inzwischen 
wahnsinnig mit den Projektabhängigkeiten, das klappt hinten und vorne 
nicht richtig.

Ich mache das aktuell so:
- AVR Programme mit: New Project > C++ Project > AVR Cross Target 
Application
- Libraries (Uart, Fifo, etc.), die ich in mehreren Projekten verwenden 
will mit: New Project > C++ Project > AVR Cross Target Static Library

Damit gibt es folgende Probleme:
- ich muss bei jeder Library immer die Target Hardware angeben, d.h. 
wenn ich Projekt wechsle (und das eine andere Target Hardware hat, also 
Atmega8 > Attiny45), dann muss ich bei den Libraries auch das Target 
umstellen, sehr unpraktisch
- ich muss immer beim AVR Programm-Project beim AVR Linker extra 
einstellen welche Objects (*.o) er sich woher holen soll aus den 
Library-Projekten, ich wundere mich, dass es keinen Weg gibt, dass die 
automatisch gefunden werden

Ich tue nun schon eine ganze Zeit rum und finde keine bessere Lösung. 
Gibt es einen besseren Weg die Libraries auf eine Weise abzulegen, dass 
die obigen Probleme entfallen, also:
- die Target Hardware-Einstellung wird beim Compile einfach vom 
referenzierenden Parent-Projekt übernommen
- die .o werden einfach im Parent-Projekt abgelegt und damit passt auch 
immer die Target Hardware der .o's

Danke für Eure Tipps,
Konrad

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Dann nutz eben nicht so eine Bloatware wie eclipse!

Nimm zB Programmers Notepad, schön schlank und bei Winavr dabei.
AVR Modell stellste im makefile ein und schreibst urnochn include der 
libs ins Program, läuft.

von Conny G. (conny_g)


Lesenswert?

Das wäre theoretisch eine Möglichkeit, habe ich auch schon dran gedacht.
Aber ich habe mich in jahrelanger Anwendung von Eclipse in Java so an 
die Komfortfunktionen gewöhnt, dass ich nicht darauf verzichten möchte.
Zugegebenermassen funktioniert es für C nicht ebenso gut, aber trotzdem 
ist es komfortabler als Texteditor.

von Cyblord -. (cyblord)


Lesenswert?

Martin Wende schrieb:
> Dann nutz eben nicht so eine Bloatware wie eclipse!
>
> Nimm zB Programmers Notepad, schön schlank und bei Winavr dabei.
> AVR Modell stellste im makefile ein und schreibst urnochn include der
> libs ins Program, läuft.

Du bist ein Vogel. Moderne Tools gehören heute dazu. Niemand entwickelt 
ernsthaft mehr so wie du das beschreibst. Das ist weder effizienter noch 
hat es andere Vorteile. Damit gibt man nur zu dass man mit modernen 
Tools überfordert und nicht lernbereit ist.

gruß cyblord

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Seh ich ja grade wie Toll und einfach das ist ;)

von Conny G. (conny_g)


Lesenswert?

Jeder wie er mag :-)

Hat denn noch jemand einen konstruktiven Tipp für mich?

von Michael K. (Gast)


Lesenswert?

Martin Wende schrieb:
> Seh ich ja grade wie Toll und einfach das ist ;)

Ob Eclipse für AVR-Progammierung gut geeignet ist weiß ich nicht, aber 
mit Codeblocks z.B. kann ich schon ganz gut arbeiten.

Allerdings fehlen mir in Codeblocks noch ein paar Sachen, die z.B. 
Java-IDEs haben. Trotzdem kann es mehr als ein Texteditor. Mir reicht 
das als Grund, es zu verwenden :)

42m

von Drobel (Gast)


Lesenswert?

cyblord ---- schrieb:

> Moderne Tools gehören heute dazu.

Das hast du vollkommen recht.

> ich benutze Eclipse zur AVR-Entwicklung und ich werde inzwischen
> wahnsinnig mit den Projektabhängigkeiten, das klappt hinten und vorne
> nicht richtig.

Jede Klappse wird dir das bestätigen.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Kannst dir ja noch AVR STudio angucken so als konstruktiver Vorschlag ;)
Kann dazu aber nich viel sagen, nur mal angesehen und dann nie 
verwendet.

von Josef D. (jogedua)


Lesenswert?

Häufig sind ja von Projekt zu Projekt neben CPU-Takt und Typ ja noch 
weitere Änderungen in den „Libs“ erforderlich, z.B. die Belegung der 
IO-Ports oder die Baudrate oder der TWI-Takt, …

Dazu muss man aus den Dateien der „Libs“ auf die h-Dateien aus dem 
Projekt zugreifen können.

Meine Lösung sieht so aus:

In jedem Projekt (-Ordner)  gibt es eine Datei _Options.h für allgemeine 
Einstellungen sowie eine _Io.h für die Zuordnung der Hardware.

Die Quelltexte der „Libs“ liegen in einem Ordner (mit Unterordnern) auf 
gleicher Ebene zu den Projekt-Ordnern, z.B. Libs.  Bei Bedarf enthalten 
die *.h- und *.c- Dateien „#include _Options.h“ und /oder „#include 
_Io.h“ für die Äbhängigkeiten vom Projekt.

Im Projekt-Ordner wird ein „Linked Folder“ auf diesen Ordner Libs 
angelegt.  Damit gehören ALLE Dateien aus dem Ordner Libs und dessen 
Unterordnern zum Projekt (ggf. kann/muss man hier über „Resource 
Configurations, Exclude from Build“ eingreifen; oder man regelt das über 
die _Options.h per  #define…).
Man kann mit dem Editor so auf die Dateien zugreifen, als ob sie im 
Projekt-Ordner lägen.  Änderungen an diesen Dateien gelten aber auch für 
anderer Projekte, die obigen „Linked Folder“ enthalten, da sie 
physikalisch ja nur einmal vorhanden sind.  (Wenn ein solches Projekt 
während der Änderung geschlossen war, merkt Eclipse nach dem nächsten 
Öffnen, dass eine Abweichung vorliegt; bei der Version Indigo muss man 
dann manuell „F5-Refresh“ ausführen, bevor man an den Dateien 
weiterarbeiten kann).

In den Settings des Projektes unter C/C++ Build, Settings, AVR Compiler, 
Directories, Include Paths die Pfade hinzufügen (entsprechend angepasst; 
${ProjName} ist eine Eclipse-Variable; auf diese Weise ist es möglich, 
ein Projekt zu kopieren und umzubenennen, ohne den Pfad ändern zu 
müssen):
D:/Eclipse/WorkspaceAvr/${ProjName} und
D:\Eclipse\WorkspaceAvr\Libs
(die Slash und Backslash haben sich bei mir aus unerfindlichen Gründen 
so ergeben;)

Zum Sichern eines Entwicklungsstandes oder einer fertigen Version zippe 
ich den Projekt-Ordner (um den Projekt-Namen zu haben) und ziehe dann 
noch den Libs-Ordner in die Zip-Datei.

von Conny G. (conny_g)


Lesenswert?

@Josef
Jaaaaaa, das klingt nach der Lösung, die ich gesucht habe!! Vielen Dank!
Bin auch gerade eben dabei mich dorthin zu tasten, hätte aber sicher 
noch einige Stunden gebraucht da anzukommen. Hatte zuletzt Project 
Dependencies versucht und die Libs als Static Library Projekt 
eingestellt, aber das hat diverse Probleme (jeder Build mit anderer 
Hardware-Plattform überschreibt im /Release oder /Debug der Lib die .o's 
und beim Platformwechsel immer komplett neu builden mit der Gefahr, dass 
irgendwo doch noch nicht gecleant ist usw.)
Gleich mal ausprobieren, grade dabei ein neues Projekt aufzusetzen und 
hätte jetzt schon wieder alle Libs umstellen müssen auf die neue 
Hardware etc. nerv

von Conny G. (conny_g)


Lesenswert?

Weiss ja nicht, wie das hier im Forum gemacht wird ... aber wäre sowas 
nicht ein Thema für ein Tutorial?
"Best practise: Wie setze ich einen Multiprojekt-Workspace in Eclipse 
für AVR auf"
Hat mich bisher viel Zeit gekostet mich mit mehreren Projekten 
rumzuschlagen...

von Conny G. (conny_g)


Lesenswert?

@Josef
Das sieht super aus, jetzt habe ich alle Object files unter meinem 
Project und nicht unter den Libs, hervorragend!

Jetzt hab ich grad noch ein Problemchen:
es gibt z.B. in mehreren Dateien einen bestimmten Interrupt-Handler, 
damit bekomme ich jetzt vom Linker Fehlermeldungen wie:

buzzer.c:(.text+0x22): multiple definition of `__vector_3'
./libs/ppsend/ppSend.o:ppSend.c:(.text+0x234): first defined here

Wobei er aber natürlich beim jeweiligen Projekt nicht alle .c-Files 
mitlinken sollte, brauche ja nur einen Teil der Libs. Müsste ja nichtmal 
compiliert werden.
Was wäre eine elegante Lösung hierfür?

Meintest Du das mit dem Exclude Resources oder den #define's?

von Conny G. (conny_g)


Lesenswert?

Bin begeistert, das geht super. Compiliert viel schneller als in 
separaten Projekten und ich habe den Eindruck der Code Size ist auch 
kleiner.

Habe jetzt die nicht benötigten Libs über rechte Maustaste auf das 
Lib-Verzeichnis > Resource Configurations > Exclude from build... 
herausgenommen, geht recht gut und ist auch nicht aufwändig zu machen.

von Josef D. (jogedua)


Lesenswert?

Konrad G. schrieb:

> Meintest Du das mit dem Exclude Resources oder den #define's?

genau. Das "Exclude..." geht ja nur mit Dateien, die schon existieren. 
Ist ein Projekt fertig und man fügt für ein neues Projekt eine 
(.c-)Datei in Libs dazu, dann wird die beim nächsten compilieren des 
fertigen Projekts auch mit eingebaut (mit den oben genannten Problemen).
Deshalb bin ich dazu übergegangen, in allen *.c-Dateien im Prinzip 
folgende Konstruktion zu verwenden:
XXXX.h-Datei:
#include "_Options.h"
#ifdef USE_XXXX  // wird in _Options.h definiert oder nicht
#  define USES_XXXX 1
// + ggf. weitere Default-Werte etc.
#else
#  define USES_XXXX 0
#endif

XXXX.c-Datei:
#include "XXXX.h"
#if USES_XXXX
  //... gesamter Rest der ursprünglichen c-Datei
#endif

von Conny G. (conny_g)


Lesenswert?

Ok, da warte ich mal darauf bis mich das das erste Mal nervt und 
überlege mir das. Momentan möcht ich lieber nicht alle c-files komplett 
#ifdef'en...

Besten Dank, Josef, hast mir sehr weitergeholfen und mir viele Stunden 
rumprobieren erspart.

VG,
Konrad

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.