www.mikrocontroller.net

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


Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

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

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sebastian (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier der Link für den NC30 und HEW4:

http://eu.renesas.com/fmwk.jsp?cnt=quicklink_updat...

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sebastian: Danke für den Link!!

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon (Gast)
Datum:

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

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich gebs auf....

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

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

globals.h
#ifndef GLOBALS_H_INCLUDED
#define GLOBALS_H_INCLUDED
extern int globFoo;
extern globBar;
#endif

modul1.c
#include "globals.h"

modul2.c
#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

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

bei globBar fehlt natürlich noch der Datentyp.

Matthias

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Super, werde ich auf jeden Fall noch ausprobieren!!!

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Matthias

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey, es läuft!!!! Cool, danke euch!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.