Forum: Mikrocontroller und Digitale Elektronik #define F_CPU


von Joachim .. (joachim_01)


Lesenswert?

In main.c:
#define F_CPU 20000000UL
#include <util/delay.h>

In resolver.c:
#define extern F_CPU 20000000UL

Führt zu:
Error  1  'F_CPU' undeclared (first use in this function)

Wie erklär ich's meinem Compiler?

von Karl H. (kbuchegg)


Lesenswert?

Joachim ... schrieb:
> In main.c:
> #define F_CPU 20000000UL
> #include <util/delay.h>
>
> In resolver.c:
> #define extern F_CPU 20000000UL
>
> Führt zu:
> Error  1  'F_CPU' undeclared (first use in this function)
>
> Wie erklär ich's meinem Compiler?


Falsche Frage.
Richtige Frage: was macht eigentlich #define?


(Nimm das extern raus und kauf dir ein C-Buch)

von Cyblord -. (cyblord)


Lesenswert?

Joachim ... schrieb:
> In main.c:
> #define F_CPU 20000000UL
> #include <util/delay.h>
>
> In resolver.c:
> #define extern F_CPU 20000000UL
>
> Führt zu:
> Error  1  'F_CPU' undeclared (first use in this function)
>
> Wie erklär ich's meinem Compiler?

Noch bessere Frage: Woher bekomme ich ein C Buch?

von Joachim .. (joachim_01)


Lesenswert?

Im Ritchie-Buch hab ich genau zu dem Fall nix gefunden.
Der Fall "extern int" wird behandelt, "#define extern" nicht...

von Jakov K. (jackenkoffer)


Lesenswert?

Kostenloses C-Buch zum Onlinelesen, soviel und sooft du willst:
( war auch meine C-Hilfe ;) )

http://openbook.galileocomputing.de/c_von_a_bis_z/

Gruß,
Jakov

von Joachim .. (joachim_01)


Lesenswert?

Hm... das online-Buch sagt:
Befindet sich die Variable in einer anderen Datei, wird das 
Schlüsselwort extern davor gesetzt. Diese Speicherklasse wird für 
Variablen verwendet, die im gesamten Programm verwendet werden können.

Das heißt, das #define damit nicht abgedeckt wird weil es keine Variable 
ist.
Aber wie umgeh ich das dann?

von Dennis (Gast)


Lesenswert?

Joachim ... schrieb:
> Aber wie umgeh ich das dann?

Programmierst du mit AVR Studio?

von A. M. (am85)


Lesenswert?

Joachim ... schrieb:
> Das heißt, das #define damit nicht abgedeckt wird weil es keine Variable
> ist.
> Aber wie umgeh ich das dann?

Erstelle dir eine Header Datei, die du in beiden *.c Dateien einbindest. 
Dann heißt es aber nur
1
#define F_CPU 20000000UL

Das Schlüsselwort extern gilt nur für Variablen. Über #define erzeugst 
du nur ein Zeichenalias, d. h. an der Stelle, wo du in deinem Code F_CPU 
stehen hast, wird der Compiler später 20000000UL einsetzen. Dahinter 
verbirgt sich also auch keine Speicheradresse, wie bei einer Variable.

von Adib (Gast)


Lesenswert?

#define ist aber keine Variablendefinition, sondern nur eine 
Textersetzung.

Diese führt der C-Präprozessor vor dem Compilerlauf durch.
Dabei wird u.A. der Inhalt der Include-Dateien vor dem Programmtext in 
der .c-Datei reinkopiert.

Bei {#define Schlüsselwort Ersetzung} wird das "Schlüsselwort" überall, 
wo das auftaucht durch "Ersetzung" ersetzt. Das wird gerne genommen, um 
Konstanten numerisch nur einmal festzulegen und dann immer den selben 
Wert im Quellcode zu haben.

In deinem Fall wird immer das extern mit in den Quelltext reinkopiert 
und erzeugt die syntaktischen Fehler an Stellen, wo F_CPU verwendet 
werden.

Gruß, Adib.

von Peter II (Gast)


Lesenswert?

André M. schrieb:
> Erstelle dir eine Header Datei, die du in beiden *.c Dateien einbindest.
> Dann heißt es aber nur

das ist doch alles unsinn - diesen define sollte einmal ein der 
entwicklungsumgebung oder im makefile angegeben werden. Es sollte 
überhaupt nicht in irgendwelchen *.h oder *.cpp dateien stehen.

von A. M. (am85)


Lesenswert?

Peter II schrieb:
> André M. schrieb:
>> Erstelle dir eine Header Datei, die du in beiden *.c Dateien einbindest.
>> Dann heißt es aber nur
>
> das ist doch alles unsinn - diesen define sollte einmal ein der
> entwicklungsumgebung oder im makefile angegeben werden. Es sollte
> überhaupt nicht in irgendwelchen *.h oder *.cpp dateien stehen.

Header sind dafür da, um Programmelemente bereitzustellen, die mehrere 
Programmteile benötigen. Er könnte ja auch eine Variable nehmen, die den 
selben Zweck erfüllt und diese würde er auch in einen Header packen und 
per extern im jeweiligen Programmteil darauf zugreifen. Daher sehe ich 
nicht, waum das unsinn sein soll.

von Shuzz (Gast)


Lesenswert?

Peter II schrieb:
> André M. schrieb:
>> Erstelle dir eine Header Datei, die du in beiden *.c Dateien einbindest.
>> Dann heißt es aber nur
>
> das ist doch alles unsinn - diesen define sollte einmal ein der
> entwicklungsumgebung oder im makefile angegeben werden. Es sollte
> überhaupt nicht in irgendwelchen *.h oder *.cpp dateien stehen.

Genau so sieht's aus.
F_CPU gibt man in einer gescheiten IDE irgenwo in den 
Projekteigenschaften an, das passende #define generiert die IDE dann zur 
Compilezeit und sorgt dafür, dass der Compiler es auch erhält.

von Peter II (Gast)


Lesenswert?

André M. schrieb:
> Daher sehe ich
> nicht, waum das unsinn sein soll.

weil es sich hierbei um eine anpassung an die Hardware handelt. Wenn ich 
einen andere Quarz verwenden will, dann muss ich nicht vorhanden Dateien 
bearbeiten sondern kann einfach meine Projekteinstellungen anpassen. 
Damit bleibt der Quellcode austauschbar.

von A. M. (am85)


Lesenswert?

Peter II schrieb:
> André M. schrieb:
>> Daher sehe ich
>> nicht, waum das unsinn sein soll.
>
> weil es sich hierbei um eine anpassung an die Hardware handelt. Wenn ich
> einen andere Quarz verwenden will, dann muss ich nicht vorhanden Dateien
> bearbeiten sondern kann einfach meine Projekteinstellungen anpassen.
> Damit bleibt der Quellcode austauschbar.

Das ist doch mal ein Argument. So kann ich das voll und ganz 
nachvollziehen ;-)

von Umpa Lumpa (Gast)


Lesenswert?

Und wo stellt man das im Atmel Studio 6 ein?
Habe es noch nicht gefunden.
Im Studio 4.19 wusste ich es.

Gruß aus Heidelberg

P.S.
Es regnet bei 30°C

von Ingo (Gast)


Lesenswert?

Compiler Options, Symbols


Ingo

von Umpa Lumpa (Gast)


Lesenswert?

Hallo Ingo,

vielen Dank, hat funktioniert.

Gruß aus Heidelberg

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.