Forum: Mikrocontroller und Digitale Elektronik _delay_ms in mehreren c-Files - wo F_CPU definieren?


von Alex V. (bastel_alex) Benutzerseite


Lesenswert?

Hallo zusammen,

die Frage hier dürfte der Mehrheit wohl eher ein Lächeln abgewinnen aber 
ich steige nicht ganz durch:

Einfaches Projekt
- main.c
- functions.c
- functions.h

die main.c sowie die functions.h rufen die _delay_ms() aus der 
<util/delay.h> auf.

Bisher habe ich immer in meiner main.c die F_CPU definiert für die delay 
funktion.

Nun wollte ich aber in der functions.c auch die _delay_ms benutzen. Hier 
wird mir dann der Fehler ausgegeben, die F_CPU sei nicht definiert.

Wo definiere ich denn die F_CPU, damit das ganze global bekannt ist?

Ich dachte sowas macht man dann in der functions.h, die in die main.c 
und die functions.c eingebunden wird. In dem Fall bekomme ich aber 
trotzdem eine missing definition error...?

Grüße
Alex

von Falk B. (falk)


Lesenswert?

@ Alex v. L. (bastel_alex) Benutzerseite

>Bisher habe ich immer in meiner main.c die F_CPU definiert für die delay
>funktion.

Pack es in eine main.h, welche überall per #inlcude eingebunden wird.

>Ich dachte sowas macht man dann in der functions.h, die in die main.c
>und die functions.c eingebunden wird. In dem Fall bekomme ich aber
>trotzdem eine missing definition error...?

Dann hast du möglicherweise die Reihenfolge der includes nicht beachtet.

von Oliver S. (oliverso)


Lesenswert?

Oder übergib es per Compileroption -D

So machen es die AVR Studios auch.

Oliver

von Alex V. (bastel_alex) Benutzerseite


Lesenswert?

Falk Brunner schrieb:
> Dann hast du möglicherweise die Reihenfolge der includes nicht beachtet.

Danke Falk, das habe ich grade bei einigem Herumprobieren auch 
herausgefunden.

Habe es jetzt in der functions.h definiert (die ist ja in main.c und 
functions.c eingebunden) und die headerdatei immer VOR dem 
<util/delay.h> eingebunden.

von Fabian O. (xfr)


Lesenswert?

Ist aber Murks, weil dann überall als erstes functions.h eingebunden 
werden muss, um die Delay-Funktionen nutzen zu können.

Nimm lieber den Compilerschalter:
1
-DF_CPU=8000000

von Falk B. (falk)


Lesenswert?

@ Fabian O. (xfr)

>Ist aber Murks,

Nö, das ist eine von mehreren Möglichkeiten.

>weil dann überall als erstes functions.h eingebunden
>werden muss, um die Delay-Funktionen nutzen zu können.

Wo ist das Problem? Bringt dich die EINE Zeile um? Ausserdem braucht man 
für die Delay-Funktionen so oder so das passende include!

von Fabian O. (xfr)


Lesenswert?

Falk Brunner schrieb:
> Wo ist das Problem? Bringt dich die EINE Zeile um?

Es ist eine unnötige Abhängigkeit mehr. Wenn ich den Code in einem 
anderen Projekt einbinden will, brauche ich da auch wieder eine 
"functions.h". Oder ich muss den Code kopieren und abändern. Damit habe 
ich zwei inkompatible Versionen, die ich pflegen muss. Außerdem muss die 
Reihenfolge der Inkludes stimmen, damit es funktioniert.
=> Unnötige Komplexität, unnötige Fehlerquelle => Murks.

> Ausserdem braucht man
> für die Delay-Funktionen so oder so das passende include!

Richtig, "delay.h". Aber nicht "functions.h".

von Falk B. (falk)


Lesenswert?

@ Fabian O. (xfr)

>Es ist eine unnötige Abhängigkeit mehr.

Bitte?

> Wenn ich den Code in einem
>anderen Projekt einbinden will, brauche ich da auch wieder eine
>"functions.h".

Das war nur ein Beispiel. Da F_CPU eine gloabe Funktion ist, würe ich 
sie eher in eine andere Headerdatei platzieren.

> Oder ich muss den Code kopieren und abändern.

Nö, der CODE ändert sich ein bisschen, BESTENFALLS die Zeile mit dem 
include. Packe ich die in jedem Projekt aber in main.h, nicht mal das.

> Damit habe
>ich zwei inkompatible Versionen, die ich pflegen muss. Außerdem muss die
>Reihenfolge der Inkludes stimmen, damit es funktioniert.

In einem C-Prgramm muss die Logik so oder so stimmen, damit es 
funktioniert.

>=> Unnötige Komplexität, unnötige Fehlerquelle => Murks.

;-)

von Svenska (Gast)


Lesenswert?

> Das war nur ein Beispiel. Da F_CPU eine gloabe Funktion ist, würe ich
> sie eher in eine andere Headerdatei platzieren.

Naja, ich betrachte F_CPU eher als hardwareabhängige(!) Konstante und 
damit passt sie gut ins Makefile (gleich neben den CPU-Typen).

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Für mich ist F_CPU auch besser im Makefile aufgehoben bzw. beim Aufruf 
des Compilers mit -DF_CPU=...

Wird z.B. für Timer- und UART-Initialisierung verwendet, und die 
Quelle(n) soll(en) frei von magischen Zahlen sein, da sie mehrfach 
verwendet werden.

: Bearbeitet durch User
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.