Forum: Mikrocontroller und Digitale Elektronik #define Problem


von royw (Gast)


Lesenswert?

Hallo ihr Fachmänner/frauen,

ich habe ein Problem mit einer #define Zeile ...

Ich habe folgende Zeilen :
1
#define IS_PQ_TQUOT()      (RAM_EE.T1.StrgAllg & (stProcess_Quelle_0 + stProcess_Quelle_1) == 0x00)
2
#define IS_PQ_TSNGL()      (RAM_EE.T1.StrgAllg & (stProcess_Quelle_0 + stProcess_Quelle_1) == stProcess_Quelle_0)
3
#define IS_PQ_ATTENUATION()  (RAM_EE.T1.StrgAllg & (stProcess_Quelle_0 + stProcess_Quelle_1) == stProcess_Quelle_1)

Nun möchte ich diese defines in meinem Quellcode benutzen z.B. so :
1
if IS_PQ_TQUOT      val = RAM.iTempTop; else
2
if IS_PQ_TSNGL      val = RAM.iTempQuot; else
3
if IS_PQ_ATTENUATION  val = RAM.iAttenuation;

Leider funktioniert das nicht :-(

Nur Warum nicht ?

der Compiler macht denn daraus folgende Zeilen in Assembler :
1
        C$L32:
2
0x91cc:   430F                      CLR.W   R15
3
0x91ce:   930F                      TST.W   R15
4
0x91d0:   2404                      JEQ     (C$L33)
5
0x91d2:   4291       0214 0004      MOV.W   &0x0214,0x0004(SP)
6
0x91d8:   3C0B                      JMP     (C$L35)
7
        C$L33:
8
0x91da:   930F                      TST.W   R15
9
0x91dc:   2404                      JEQ     (C$L34)
10
0x91de:   4291       020E 0004      MOV.W   &0x020e,0x0004(SP)
11
0x91e4:   3C05                      JMP     (C$L35)
12
        C$L34:
13
0x91e6:   930F                      TST.W   R15
14
0x91e8:   2403                      JEQ     (C$L35)
15
0x91ea:   4291       0216 0004      MOV.W   &0x0216,0x0004(SP)

Was natürlich Schwachsinn ist da er bevor vergleicht das R15 erstmal 
löscht ?!

Hat da einer einen Rat für mich was ic hfalsch mache ?

Compiler ist der CCE 3.1 von Ti

Danke schonmal für eure Hilfe

Roy

von royw (Gast)


Lesenswert?

die () hinter den define Namen bitte wegdenken ! Die waren nur ein Test 
...

von Karl H. (kbuchegg)


Lesenswert?

laut C Definition, wird

   A & B == C

als

   A & ( B == C )

angesehen und nicht, wie man vermuten könnte, als

  ( A & B ) == C

Daher: zusätzliche Klammern einfügen
1
#define IS_PQ_TQUOT      ((RAM_EE.T1.StrgAllg & (stProcess_Quelle_0 + stProcess_Quelle_1)) == 0x00)

> Nur Warum nicht ?
Operator Precedence Table studieren
http://www.difranco.net/cop2220/op-prec.htm
Je weiter oben ein Operator in dieser Tabelle steht, desto stärker 
bindet er. Da sind ein paar böse Fallen eingebaut. Eine davon hast du 
jetzt gerade in Aktion bemerkt.

1
if IS_PQ_TQUOT      val = RAM.iTempTop; else
Schreib das nicht so. Sieht für jeden C Kenner seltsam aus und man denkt 
sofort, da passiert irgendetwas Magisches
1
if ( IS_PQ_TQUOT )      val = RAM.iTempTop; else

Auch das else da hinten ist leicht zu übersehen. Bau dir nicht selbst 
Lesefallen in den Code ein, wenn es nicht sein muss
1
  if      ( IS_PQ_TQUOT )       val = RAM.iTempTop;
2
  else if ( IS_PQ_TSNGL )       val = RAM.iTempQuot;
3
  else if ( IS_PQ_ATTENUATION ) val = RAM.iAttenuation;

von royw (Gast)


Lesenswert?

Vielen Dank , jetzt funktionierts .

Roy

von vlad (Gast)


Lesenswert?

Auch erhöht es die lesbarkeit, wenn man solche sachen an sich klammert, 
auch, wenn man sich hundertprozentig sicher ist.

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.