Forum: Mikrocontroller und Digitale Elektronik define mit abhängigkeit


von markus jung (Gast)


Lesenswert?

wie kann ich soetwas machen?

#define A y=4
#define B y=5

#define ERSETZE(x) ? ?


ERSETZE(0);//diese zeile wird im c code geschrieben
A;
y=4;   //soll letztendlich ausgeführt werden

ERSETZE(1);//diese zeile wird im c code geschrieben
B;
y=5;   //soll letztendlich ausgeführt werden

ich möchte in abhängigkeit des parameters x ein bestimmtes define 
"anwählen" ist dies möglich?

Gruß,
markus

von Karl H. (kbuchegg)


Lesenswert?

Ich denke du suchst gerade nach einer möglichst eleganten "Wie schiesse 
ich mir selber ins Knie" Lösung.

Sprich: Ich glaube du gehst dein Problem falsch an.
Was ist dein eigentliches Problem?

(Deine Problemlösung scheitert daran, dass der Präprozessor keine 
anderen unausgewerteten Präprozessoranweisungen eintauschen kann.
Es gibt zwar
#ifdef
#if
aber das hilft dir in dem Fall nicht viel.

Eventuell könnte man mit einer Kombination aus #define #undef #include 
und #if was erreichen (spukt nur so als Gedanke bei mir im Kopf rum).

: Wiederhergestellt durch User
von Rene H. (Gast)


Lesenswert?

Wie wäre es mit:

#define ERSETZE(b) b == 0 ? y = 4 : y = 5

von markus jung (Gast)


Lesenswert?

#define ON            |=
#define OFF           &=~
#define P3            3

#define PORTB_P3_ON   PORTB ON (1<<P3)
#define PORTB_P3_OFF  PORTB OFF(1<<P3)

#define PORTB_P3(x)   ????

PORTB_P3(0);
PORTB_P3(1);

ich wollte die lösungen mit bitfeldern/unions usw. umgehen. Ich denke 
diese shift methode ist immer noch die (schnellste) auch wenn ich noch 
nicht nachgesehen habe was bei einer lösung mit einem bitfeld 
letztendlich aus dem code wird....

PORTB.7=0; //als beispiel

letztendlich kommt es mir darauf an, möglichst flexibel vieles zuvor 
einstellbar zu machen, und dennoch keinen assembler auswuchs mehr 
deswegen zu erzeugen...

gruß,
markus

von markus jung (Gast)


Lesenswert?

dann könnte ich also schreiben:

#define ON            |=
#define OFF           &=~
#define P3            3

#define PORTB_P3_ON   PORTB ON (1<<P3)
#define PORTB_P3_OFF  PORTB OFF(1<<P3)

#define PORTB_P3(x)   x==0 ? PORTB_P3_OFF : PORTB_P3_ON

PORTB_P3(0);   //PB PIN 3 aus
PORTB_P3(1);   //PB PIN 3 an

ist das jetzt alles blödsinnig, oder ergibt es einen sinn.

gruß,
markus

von Benedikt K. (benedikt)


Lesenswert?

markus jung schrieb:

> ich wollte die lösungen mit bitfeldern/unions usw. umgehen. Ich denke
> diese shift methode ist immer noch die (schnellste) auch wenn ich noch
> nicht nachgesehen habe was bei einer lösung mit einem bitfeld
> letztendlich aus dem code wird....

Da wird genau das gleiche draus:
sbi/cbi

von Karl H. (kbuchegg)


Lesenswert?

markus jung schrieb:
> dann könnte ich also schreiben:
>
> #define ON            |=
> #define OFF           &=~
> #define P3            3
>
> #define PORTB_P3_ON   PORTB ON (1<<P3)
> #define PORTB_P3_OFF  PORTB OFF(1<<P3)
>
> #define PORTB_P3(x)   x==0 ? PORTB_P3_OFF : PORTB_P3_ON
>
> PORTB_P3(0);   //PB PIN 3 aus
> PORTB_P3(1);   //PB PIN 3 an

Ja. Aber der Laufzeitvergleich von x bleibt nach wie vor drinn. Es sei 
denn der Optimizer wirft ihn raus (was er könnte und wahrscheinlich auch 
tun wird)

Dein eigentliches Ziel, dass

  PORTB_P3(0)

zu

  PORTB &= ( 1 << 3 );

expandiert, hast du so noch nicht erreicht. Allerdings stehen die 
Chancen gut, dass im Endeffekt nach ein paar Optimizerdurchgängen genau 
das herauskommt.

von markus jung (Gast)


Lesenswert?

@benedikt

das hoffe ich dann immer nur, danke für die bestätigung.

@KHB
...hast du so noch nicht erreicht

1)warum nicht?Das habe ich noch nicht ganz verstanden

2)kann x eigentlich auch eine variable sein!?

also ich will das natürlich nicht, aber gesetz dem fall es wäre eine...

es soll übrigens natürlich

PORTB &=~ ( 1 << 3 ); daraus werden.

gruß,
markus

von Karl H. (kbuchegg)


Lesenswert?

markus jung schrieb:
>
> 1)warum nicht?Das habe ich noch nicht ganz verstanden

Nachdem der Präprozessor seinen Teil erledigt hat, bleibt
1
    ...
2
    0==0 ? PORTB &=~ (1 << 3) : PORTB |= (1<<3);
3
    ...

übrig.
Es obliegt jetzt dem Optimizer zu erkennen, dass 0==0 immer wahr ist und 
der ganze Ausdruck daher zu
1
     PORTB &=~ (1 << 3);

vereinfacht werden kann. Eventuell wird er auch eine Warnung schmeissen: 
"Comparison always true" oder so ähnlich.

> 2)kann x eigentlich auch eine variable sein!?

in dem Fall ja.

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.