Forum: Compiler & IDEs Mit Präprozessor Variable auf Existenz prüfen


von Benedikt K. (benedikt)


Lesenswert?

Kann man mit dem Präprozessor irgendwie abfragen, ob eine Variable 
existiert?
Ich möchte eine Software schreiben, die auf mehreren verschiedenen 
Controllern einer Familie läuft. Diese besitzen z.B. unterschiedliche 
Anzahlen an Pins, die ich setzen muss.
Also quasi sowas in der Art:
1
#if exists (PORTA)
2
 PORTA=0xFF;
3
#endif
4
5
#if exists (PORTB)
6
 PORTB=0xFF;
7
#endif

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Benedikt K. schrieb:
> Kann man mit dem Präprozessor irgendwie abfragen, ob eine Variable
> existiert?

Nein, der Präprozessor kennt keine Variablen, die kennt erst der
Compiler.

> Also quasi sowas in der Art:
>
1
> #if exists (PORTA)
2
>  PORTA=0xFF;
3
> #endif
4
> 
5
> #if exists (PORTB)
6
>  PORTB=0xFF;
7
> #endif
8
>

Das geht, zumindest beim AVR-GCC/avr-libc, da hier PORTA usw. als
Präprozessor-Makros realisiert sind.  Ist allerdings leider nicht
portabel zu anderen Compilern, zumindest vom IAR weiß ich, dass er
die Definitionen der Ports nicht auf Präprozessor-Ebene macht.
1
#ifdef PORTA
2
...
3
#endif
4
5
/* bzw. */
6
7
#if defined(PORTA)
8
...
9
#endif

von Klaus (Gast)


Lesenswert?

Ich denke das müsste mit #ifdef PORTA funktionieren. Die Registernamen 
sind doch Präprozessormakros. Und das devicespezifische Include, 
definiert nur die vorhandenen Ports.

von Benedikt K. (benedikt)


Lesenswert?

Es handelt sich zwar um einen gcc Compiler, allerdings nicht für den 
AVR, sondern für die dsPICs von Microchip. Dort sind die Register alle 
so deklariert:
1
extern volatile unsigned int  PORTB __attribute__((__sfr__));
Von daher funktioniert #ifdef leider nicht.

Ich könnte zwar den Weg über den Controllernamen gehen und so 
entscheiden welche Ports ich initialisieren muss, da die Anzahl an Ports 
aber kleiner ist als die Anzahl an Controllern wäre mir der andere Weg 
lieber.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Benedikt K. schrieb:

> Ich könnte zwar den Weg über den Controllernamen gehen und so
> entscheiden welche Ports ich initialisieren muss, ...

Es wird dir dann nichts anderes übrig bleiben, als das so zu tun.

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.