AVR-GCC Problem mit Bitmanipulation long int

Gast #5746022
Lesenswert?

Hallo,

entweder bin ich blind,oder der GCC übersetzt folgende Anweisung nicht 
korrekt, bzw. nicht in das, was ich will:

event_memory ist _uint32_t. Aus folgendem Ausdruck:
1
event_memory = event_memory & (~((1L<<1) || (1L<<2)  || (1L<<4) || (1L<<3) || (1L<<5)||(1L<<25)));

macht der Compiler das hier:
1
00000865  LDS R24,0x011D    Load direct from data space 
2
00000867  LDS R25,0x011E    Load direct from data space 
3
00000869  LDS R26,0x011F    Load direct from data space 
4
0000086B  LDS R27,0x0120    Load direct from data space 
5
0000086D  ANDI R24,0xFE    Logical AND with immediate 
6
0000086E  STS 0x011D,R24    Store direct to data space 
7
00000870  STS 0x011E,R25    Store direct to data space 
8
00000872  STS 0x011F,R26    Store direct to data space 
9
00000874  STS 0x0120,R27    Store direct to data space

Wenn ich mich nicht täusche, lädt er alle vier Byte, verundet aber nur 
das unterste.

Kann man den Compiler irgendwei dazu bringen, das richtig zu machen? 
Oder liegt das Problem wo ganz anders? (Den Ersten, der schreibt "Vor 
dem Bildschirm" fress ich zum Mittagessen...)

Gruß,
Klaus-Bärbel
Gast #5746113
Lesenswert?

mit

#define bitSet(a,b) (a |= (1<<b))
#define bitClear(a,b) (a &= ~(1 << b))
#define bitClr(a,b) (a &= ~(1 << b))
#define bitTest(a,b) (a & (1 << b))

und dann:

bitClear(event_memory,1); // alle anderen hier auch, der Compiler 
optimiert das schon

wär das nicht passiert

Bestimmt kommt jetzt ein shitstorm. Ich weiß, der Rest der Welt liebt 
diese Gedankenknoten, ich habe aber noch nicht verstanden warum man sich 
vom Compiler nicht helfen lassen sollte.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren