mikrocontroller.net

Forum: Compiler & IDEs Bedingter Compile bei GCC


Autor: Gary (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo -
ich habe ein Parametrier-Funktion die eine ganze Latte von
Parametern hat und in deren Abhängigkeit Register unterschiedlich
belegt.
Um den Code zu verkleinern würde ich diese Parameter gerne als
#define im Header einbauen und abhängig von deren WERTEN bestimmte
Zeilen compilieren oder nicht...
Beispiel:
#define Parameter1 AFFE
Code:
#if Parameter1 == AFFE
  ......
#endif
Nun meine Frage - geht sowas beim GCC?
Die Abfrage nimmt er zwar an - aber anscheinend compiliert er einfach
alle Zeilen die mit den #if's eingeschlossen sind unabhängig von den
Werten.
Vielen Dank für eure Antworten,
Gary

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der C-Präprozessor rechnet mit Integerzahlen (im Format des
Targets, also 16-bit-Integers beim AVR-GCC, falls kein Suffix
angegeben ist).  Damit geht

#if Parameter1 == AFFE

nicht, aber

#if Parameter1 == 0xAFFE

Autor: Gary (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörg,

vielen Dank ... kleines Missverständniss :o)

AFFE war hier einfach als String gedacht, d.h konkret habe ich

#define Parameter1 TRUE
#define Parameter2 5

#if Parameter1 == TRUE
aber auch Zahlenwerte
#if Parameter2 == 5

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TRUE ist keine Zahl (sofern nicht ein #define TRUE 1 voranging).
Strings kannst du nicht vergleichen, ich schrob doch, dass nach
dem #if ein integer-Ausdruck erwartet wird.

#if Parameter1 == TRUE

ist eine unsinnige Formulierung.  Schreib bitte einfach

#if Parameter1

Es gilt die übliche C-Notation: wenn Parameter1 0 ist, ist der
Ausdruck false, sonst true.  (Wenn Parameter1 nicht definiert
ist, wird es für diesen Zweck wie 0 behandelt, mit der Ausnahme,
dass es bei -Wundef eine Warnung gibt.)

Autor: Michael J. (jogibaer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein ähnliches Problem.

Ich habe so eine Art Systemtimerfunktion, wo ich benötigte Zeiten per
Timer erzeuge und dem Programm zu Verfügung stelle.

Je nach Prozessor ( Mega 8 , 32, 128 ) habe ich etwas unterschiedliche
Timer bzw. Register.

Ich möchte das z.B. so erledigen:

#if ATMEGA8

Registersowieso = Parameter sowieso
u.s.w.

#endif

#if ATMEGA32

Registersowieso = Parameter sowieso
u.s.w.

#endif


#if ATMEGA128

Registersowieso = Parameter sowieso
u.s.w.

#endif

Ich müßte vorher dann nur schreiben
#define ATMEGA32 = 1


Funktioniert das so, oder muß ich dies andersmachen ?
Wie kann man sowas am besten lösen ?
Ich denke mal, der Sinn müßte klar sein.


Jogibär

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ausprobieren.

Ich würde es so machen


#ifdef ATMEGA8
#define TIMER_REG  TCCR1B
#define TIMER_VAL  ( 1 << CS12 ) | ( 1 << CS10 )
#endif

#ifdef ATMEGA32
#define TIMER_REG  TCCR0
#define TIMER_VAL  ( 1 << CS02 ) | ( 1 << CS00 )
#endif

#ifdef ATMEGA128
#define TIMER_REG  TCCR2
#define TIMER_VAL  ( 1 << CS12 ) | ( 1 << CS00 )
#endif

int main()
{
   TIMER_REG = TIMER_VAL;


je nachdem, ob jetzt vorher mal ein
#define ATMEG8
gegeben wurde, oder ein
#define ATMEGA32
oder
#define ATMEGA128

wird die Textersetzung von

  TIMER_REG = TIMER_VAL

anders gemacht.

Ich würde übrigens nicht meine eigenen Konstanten (ATMEGA8
usw. dafür verwenden, sondern die, die dier Compiler auch
dafür benutzt.
Schau einfach mal in io.h rein. Dort wird je nach Prozessor
ein spezifisches ioxxx.h inkludiert. Die Technik von
dort kannst du wunderbar übernehmen.

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.