Forum: Mikrocontroller und Digitale Elektronik C - Bedingte Kompilierung


von Jan H. (janiiix3)


Lesenswert?

Moin,

ist es möglich sich die Berechnung auswerfen zu lassen?
1
#define TIMER_PRESCALER      1024  
2
#define TIMER_MS        50
3
4
#if    TIMER_PRESCALER == 1
5
  #undef TIMER_PRESCALER_gc
6
  #define TIMER_PRESCALER_gc  TC_CLKSEL_DIV1_gc
7
#elif  TIMER_PRESCALER == 2
8
  #undef TIMER_PRESCALER_gc
9
  #define TIMER_PRESCALER_gc  TC_CLKSEL_DIV2_gc
10
#elif  TIMER_PRESCALER == 4
11
  #undef TIMER_PRESCALER_gc
12
  #define TIMER_PRESCALER_gc  TC_CLKSEL_DIV4_gc
13
#elif  TIMER_PRESCALER == 8
14
  #undef TIMER_PRESCALER_gc
15
  #define TIMER_PRESCALER_gc  TC_CLKSEL_DIV8_gc
16
#elif  TIMER_PRESCALER == 64
17
  #undef TIMER_PRESCALER_gc
18
  #define TIMER_PRESCALER_gc  TC_CLKSEL_DIV64_gc
19
#elif  TIMER_PRESCALER == 256
20
  #undef TIMER_PRESCALER_gc
21
  #define TIMER_PRESCALER_gc  TC_CLKSEL_DIV256_gc
22
#elif  TIMER_PRESCALER == 1024
23
  #undef TIMER_PRESCALER_gc
24
  #define TIMER_PRESCALER_gc  TC_CLKSEL_DIV1024_gc
25
#endif 
26
27
#define TIMER_CALC        ((uint16_t( ( ( ( uint32_t )( F_CPU / TIMER_PRESCALER ) ) / 1000 ) * TIMER_MS ))
28
29
#if TIMER_CALC > 0xFFFF
30
  #error  "BLUBB"
31
#endif

von . . (Gast)


Lesenswert?

Ähmm???
Wenn Du sie ausdruckst, wird sie eventuell aus dem Druckerschacht 
ausgeworfen.

von . . (Gast)


Lesenswert?

Du willst TIMER_CALC berechnet haben?
Nein, das ist nicht möglich. :P
Da fehlt uns der Wert F_CPU. ;)

von DPA (Gast)


Lesenswert?

Währe in deinem Fall eventuell static_assert geeignet?
https://en.cppreference.com/w/c/language/_Static_assert

von A. B. (Gast)


Lesenswert?

Die Ausgabe des Ergebnisses geht nicht. Der Schlüssel dazu ist die 
Unterscheidung zwischen Präprozessor und Compiler.

Der Präprozessor ersetzt TIMER_CALC wortwörtlich durch das, was dahinter 
steht, und rechnet nicht etwa das aus. Erst der Compiler analysiert 
überhaupt erst den Ausdruck, und es steht ihm frei, schon bei der 
Kompilierung des Ausdruck zu berechnen (sofern ...), oder aber ihn erst 
zur Laufzeit ausrechnen zu lassen.

Wenn der Ausdruck in einem #if verwendet wird, kann zwar auch der 
Präprozessor ihn auswerten, allerdings mit großen Einschränkungen. Aber 
Ausgeben wie beim printf oder so sind nicht möglich. Dsgl. bei 
static_assert.

PS Das #if TIMER_PRESCALER == 1 ... #endif geht kürzer mit:

#define _TIMER_PRESCALER_gc(pre) TC_CLKSEL_DIV ## pre ## _gc
#define TIMER_PRESCALER_gc(pre) _TIMER_PRESCALER_gc(pre)

und danach etwas wie

int val = TIMER_PRESCALER_gc(TIMER_PRESCALER);

Einfach mal den Präprozessor-Output ansehen (bei gcc mit '-E').

von Bernd B. (microwave-designer)


Lesenswert?

Hallo Jan,

Du möchtest eine Compiler Directive nutzen, um während der "Compilation" 
ein Rechenwert auszudrucken?

Gibt es ein Handbuch zum Compiler? Was sagt das Stichwort "Directive" 
dazu?
Falls Du es nicht gleich findest, versuche einmal Dir aktuelle Uhrzeit 
oder das Datum während der Compilation auszudrucken. Mit 
Rechenergebnissen geht das genauso.

Oder Du guckst in das Listing.

Allerdings rechnen die Compiler nicht immer so viel aus, wie später das 
Target.

Oder habe ich etwas falsch verstanden?

Happy coding!

Bernd

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.