Forum: Mikrocontroller und Digitale Elektronik M16C: Tasking Manager: Projekt mit mehreren .c - Files?!


von Simon (Gast)


Lesenswert?

Hallo zusammen,
ich benutze ein Entwicklungsboard von Glyn mit einem Controller aus der
M16C-Familie.
Es wird der Tasking Manager (TM) mit NC30 als Compiler und KD30 als
Debugger benutzt.
Folgendes Problem:
Ich habe ein größeres Projekt und möchte meine main.c aufsplitten, da
sie zu groß wird. Z.B. möchte ich eine functions.c anlegen in der meine
Funktionen ausgelagert werden.
Ferner habe ich mehrer Header-Dateien wie z.B. die SFR62.h oder die
selbstangelegte Globals.h.
Ich lege mir also eine funtions.c an, kopiere die Funktionen rein und
speichere sie. Dann füge ich sie im Projekt Editor ein.
So weit so gut, wenn ich nun compiliere gibt es in dieser Datei eine
Fehlermeldung, da ich meine Headerdateien in dieser nicht includiert
habe.  (In main.c habe ich sie includiert.)
Includiere ich sie ebenfalls in functions.c kommt es wiederum zu einer
Fehlermeldung: "multiple defiened...".
An dieser Stelle weiß ich nicht mehr weiter, da es sich um einen
(kleinen) Teufelskreis handelt...
Normalerweise versucht man diese Mehrfachincludierungen doch mit diesem
Gerüst in den Headerdateien abzufangen?!:

#ifndef GLOBALS
#define GLOBALS
.
.
.
#endif

Scheint aber nicht zu functionieren...

In diesem Zusammenhang eine Frage zum Projekt Editor:
An welcher Stelle muß ich meine funtions.c einfügen? Direkt unter
main.c oder in den übergeordneten Ordner? Und muß ich dann in den
functions.c-Ordner alle gebrauchten Headers einfügen? Habe schon einige
Zeit daran rumgespielt, bin aber zu keinem Ergebnis gekommen.

Wäre nett wenn jemand von euch mir weiterhelfen kann...

Danke!

von Simon (Gast)


Lesenswert?

Weiß denn wirklich niemand einen Lösung, ich bin hier echt am
verzweifeln. Da geht wieder der ganze Vormittag drauf weil man an einem
kleinen Softwareproblem nicht weiterkommt....

von Olaf (Gast)


Lesenswert?

Dein Problem besteht wohl eher darin das du mal C lernen solltest.

Du kannst selbstverstaendlich deinen Source aufteilen. Diese Teile
muessen dann natuerlich einzeln uebersetzt werden und werden vom linker
zusammengefuegt.
Und selbstverstaendlich kannst du vollkommen problemlos deine
Headerdateien in jeder der Sourcedateien einlesen.

Lediglich wenn du eine globale Variable in dem eigenen Headerfile des
ausgelagerten Source erzeugst solltest du mit Include dafuer sorgen das
sie in den anderen Files als "extern" declariert wird.
Ausserdem solltest du den Funktionskopf der externen Funktionen nochmal
in der Headerdatei deklarieren damit du sie von deinem Hauptprogramm
aufrufen kannst.

Olaf

von Sebastian (Gast)


Lesenswert?

@Simon:
Warum benutzt du die TM Entwicklungsumgebung? Es gibt von Renesas die
HEW4 Entwicklungsumgebung welche wesentlich besser und aktueller ist!

von Simon (Gast)


Lesenswert?

ok, ich dachte zwar ich könnte C programmieren.... aber ich werde es mal
probieren, danke.

TM benutzen wir weil unser "Auftraggeber" es uns vorgeschlagen hat.
Fande es aber seid dem ersten Tag eher bescheiden.

Werde jetzt mal HEW ausprobieren. Runterladen kann ich aber nur HEW3.1,
auch ok?

von Sebastian (Gast)


Lesenswert?

Die HEW3.1 ist auch ok. Bei der HEW4 ist die aktuelle Version des NC30
Compilers schon eingebunden.

von Sebastian (Gast)


Lesenswert?


von Simon (Gast)


Lesenswert?

@Olaf:
Ich glaube ich habe noch nicht ganz verstanden wie du es meinst. Ich
möchte einen eigenen Header nur für globale Variablen anlegen. Diesen
Header möchte ich dann in main.c und functions.c aufrufen.

Wie genau deklariere ich den Header als extern? In main.c z.B.
#include extern "globals.h"??

Danke.

von Simon (Gast)


Lesenswert?

@Sebastian: Danke für den Link!!

von Olaf (Gast)


Lesenswert?

Definiere in deiner main.c ein #define WHERE

In deiner Header-Datei schreibst du dann:

#ifdef WHERE
define EXT
#ifelse
#define EXT extern
#endif


EXT int variable;

von Simon (Gast)


Lesenswert?

Danke, das hat mir schon weitergeholfen, aber so richtig klappen tut dat
noch nicht.
Ich schreibe dir es noch mal ganz ganz ausführlich ;)

globals.h:

#ifdef WHERE
#define EXT

#else      //ifelse gibt es nicht?!
#define EXT extern
#endif

EXT int variable;    //Was macht diese Zeile

//globale Variablen:
unsigned long cnts;
.
.
.





main.c:

#define WHERE      //so korrekt?

#include "math.h"
#include "sfr62.h"
#include "globals.h"  //das soll meine Headerdatei sein

void main (void)
{
.
.
}

function.c:   //globale Variablen werden auch hier benutz

#define WHERE

#include "sfr62.h"
#include "globals.h"

void init (void)
{
.
.
.


Ich hoffe du hast dies verstanden und kannst mir genau sagen wo meine
Fehler sind. Ich sags mal so: Im Studium haben wir wenig mit globalen
Variablen gearbeitet, deshalb kenne ich mich nicht so aus. Kennst du
Quellen wo dieses Problem explizit behandelt wird?

von Olaf (Gast)


Lesenswert?

Dein Problem ist da du nicht weisst was die die Defines machen und was
extern bedeutet. Mach den define in funktion.h weg und schreibe vor
jede globale Variable ein EXT.

Olaf

von Simon (Gast)


Lesenswert?

Deshalb habe ich dich ja auch nach Quellen gefragt, würde gerade
erfahren was die defines und extern wirklich bedeutet.

von Simon (Gast)


Lesenswert?

Ich gebs auf....

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

wenn du globale Variablen nutzen willst dann geh folgendermaßen vor:

globals.c
1
int globFoo = 0815;
2
int globBar = 666;

globals.h
1
#ifndef GLOBALS_H_INCLUDED
2
#define GLOBALS_H_INCLUDED
3
extern int globFoo;
4
extern globBar;
5
#endif

modul1.c
1
#include "globals.h"

modul2.c
1
#include "globals.h"

usw.

Du mußt dann nur dafür sorgen das dein Buildtool alle C-Dateien
kompiliert und zu einem Binary zusammenlinkt.

Matthias

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

bei globBar fehlt natürlich noch der Datentyp.

Matthias

von Simon (Gast)


Lesenswert?

Hey Super, werde ich auf jeden Fall noch ausprobieren!!!

von Simon (Gast)


Lesenswert?

Leider funzt es immer noch nicht so richtig. Habe alles genauso befolgt
wie du es beschrieben hast.
Compiliert (NC30) wird auch alles richtig, beim linken (LN30) gibt es
dann Probleme.
Ich schreib mal die Meldungen:

now processing pass 1
processing ".\ncrt0.r30"
processing ".\MAIN.r30"
.
.
processing ".\globals.r30"
processing "Libraries"
! ERROR(ln30): .\MAIN.r30 : '_NachschwingerZaehler' is multiple
defined
.
.
.
.

Hast du noch eine Idee dazu?

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

Keine Ahnung was da jetzt noch Probleme macht. Ohne den Code zu sehen
kann ich nichts dazu sagen.

Matthias

von Simon (Gast)


Lesenswert?

Hey, es läuft!!!! Cool, danke euch!

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.