Forum: Mikrocontroller und Digitale Elektronik AVR-GCC Problem mit Bitmanipulation long int


von Klaus-Bärbel (Gast)


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

von Karl M. (Gast)


Lesenswert?

Hallo,

frag dich bitte mal, was dieser Operator "||" macht.

von Karl M. (Gast)


Lesenswert?


von Karl M. (Gast)


Lesenswert?

Was da steht ist im endefekt:
1
event_memory = event_memory & (~(1));
2
event_memory = event_memory & 0xfe;

von Meister Eder (Gast)


Lesenswert?

Klaus-Bärbel schrieb:
> Den Ersten, der schreibt "Vor
> dem Bildschirm" fress ich zum Mittagessen

Mahlzeit.
Ist aber leider wieder die Lösung.

"||"-> ist eine logisches ODER richtig wäre hier "|"

von Karl M. (Gast)


Lesenswert?

Klaus-Bärbel schrieb:
> (Den Ersten, der schreibt "Vor
> dem Bildschirm" fress ich zum Mittagessen...)

Oder, andere schreiben, der µC macht nur dass, was der Operator am 
Bildschirm befiehlt... (Smily)

von Klaus-Bärbel (Gast)


Lesenswert?

Karl M. schrieb:
> Hallo,
>
> frag dich bitte mal, was dieser Operator "||" macht.

facepalm...
...okay, das Problem saß doch vor dem Bildschirm...

von Karl M. (Gast)


Lesenswert?

Klaus-Bärbel schrieb:
> facepalm...
> ...okay, das Problem saß doch vor dem Bildschirm...

Nein, nicht notwendig, manchmal sieht man es nicht..

Mach weiter und viel Erfolg!

von STM Apprentice (Gast)


Lesenswert?

Karl M. schrieb:
> Mach weiter und viel Erfolg!

Aba shiften von vorzeichenbehafteten Konstanten oder
Variablen ist scheisse .....

von abc.def (Gast)


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.

von Walter T. (nicolas)


Lesenswert?

Zugegeben: Bis 30 ist es kein Problem, aber ich würde mich ja wohler 
fühlen, wenn da vorzeichenlose Einsen nach links geschoben werden, also
1
  1UL<<31

von Klaus-Bärbel (Gast)


Lesenswert?

Karl M. schrieb:
> Nein, nicht notwendig, manchmal sieht man es nicht..
>
> Mach weiter und viel Erfolg!

Danke!

Gruß,
Klaus

von Klaus-Bärbel (Gast)


Lesenswert?

STM Apprentice schrieb:
> Aba shiften von vorzeichenbehafteten Konstanten oder
> Variablen ist scheisse .....

Ah. _uint32_t ist also vorzeichenbehaftet... . Ok.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Klaus-Bärbel schrieb:
> _uint32_t ist also vorzeichenbehaftet.

Nö. Aber 1L ist vorzeichenbehaftet. Und 1L wird hier herumgeshiftet.

von STM Apprentice (Gast)


Lesenswert?


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.